Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ALSA: firewire-tascam: add proc node to show firmware information

TASCAM FireWire series has certain registers for firmware information.

This commit adds proc node to show the information.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>

authored by

Takashi Sakamoto and committed by
Takashi Iwai
96e5fbb0 6f81ba19

+101 -1
+1 -1
sound/firewire/tascam/Makefile
··· 1 - snd-firewire-tascam-objs := tascam.o 1 + snd-firewire-tascam-objs := tascam-proc.o tascam.o 2 2 obj-$(CONFIG_SND_FIREWIRE_TASCAM) += snd-firewire-tascam.o
+88
sound/firewire/tascam/tascam-proc.c
··· 1 + /* 2 + * tascam-proc.h - a part of driver for TASCAM FireWire series 3 + * 4 + * Copyright (c) 2015 Takashi Sakamoto 5 + * 6 + * Licensed under the terms of the GNU General Public License, version 2. 7 + */ 8 + 9 + #include "./tascam.h" 10 + 11 + static void proc_read_firmware(struct snd_info_entry *entry, 12 + struct snd_info_buffer *buffer) 13 + { 14 + struct snd_tscm *tscm = entry->private_data; 15 + __be32 data; 16 + unsigned int reg, fpga, arm, hw; 17 + int err; 18 + 19 + err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST, 20 + TSCM_ADDR_BASE + TSCM_OFFSET_FIRMWARE_REGISTER, 21 + &data, sizeof(data), 0); 22 + if (err < 0) 23 + return; 24 + reg = be32_to_cpu(data); 25 + 26 + err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST, 27 + TSCM_ADDR_BASE + TSCM_OFFSET_FIRMWARE_FPGA, 28 + &data, sizeof(data), 0); 29 + if (err < 0) 30 + return; 31 + fpga = be32_to_cpu(data); 32 + 33 + err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST, 34 + TSCM_ADDR_BASE + TSCM_OFFSET_FIRMWARE_ARM, 35 + &data, sizeof(data), 0); 36 + if (err < 0) 37 + return; 38 + arm = be32_to_cpu(data); 39 + 40 + err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST, 41 + TSCM_ADDR_BASE + TSCM_OFFSET_FIRMWARE_HW, 42 + &data, sizeof(data), 0); 43 + if (err < 0) 44 + return; 45 + hw = be32_to_cpu(data); 46 + 47 + snd_iprintf(buffer, "Register: %d (0x%08x)\n", reg & 0xffff, reg); 48 + snd_iprintf(buffer, "FPGA: %d (0x%08x)\n", fpga & 0xffff, fpga); 49 + snd_iprintf(buffer, "ARM: %d (0x%08x)\n", arm & 0xffff, arm); 50 + snd_iprintf(buffer, "Hardware: %d (0x%08x)\n", hw >> 16, hw); 51 + } 52 + 53 + static void add_node(struct snd_tscm *tscm, struct snd_info_entry *root, 54 + const char *name, 55 + void (*op)(struct snd_info_entry *e, 56 + struct snd_info_buffer *b)) 57 + { 58 + struct snd_info_entry *entry; 59 + 60 + entry = snd_info_create_card_entry(tscm->card, name, root); 61 + if (entry == NULL) 62 + return; 63 + 64 + snd_info_set_text_ops(entry, tscm, op); 65 + if (snd_info_register(entry) < 0) 66 + snd_info_free_entry(entry); 67 + } 68 + 69 + void snd_tscm_proc_init(struct snd_tscm *tscm) 70 + { 71 + struct snd_info_entry *root; 72 + 73 + /* 74 + * All nodes are automatically removed at snd_card_disconnect(), 75 + * by following to link list. 76 + */ 77 + root = snd_info_create_card_entry(tscm->card, "firewire", 78 + tscm->card->proc_root); 79 + if (root == NULL) 80 + return; 81 + root->mode = S_IFDIR | S_IRUGO | S_IXUGO; 82 + if (snd_info_register(root) < 0) { 83 + snd_info_free_entry(root); 84 + return; 85 + } 86 + 87 + add_node(tscm, root, "firmware", proc_read_firmware); 88 + }
+2
sound/firewire/tascam/tascam.c
··· 113 113 if (err < 0) 114 114 goto error; 115 115 116 + snd_tscm_proc_init(tscm); 117 + 116 118 err = snd_card_register(card); 117 119 if (err < 0) 118 120 goto error;
+10
sound/firewire/tascam/tascam.h
··· 20 20 21 21 #include <sound/core.h> 22 22 #include <sound/initval.h> 23 + #include <sound/info.h> 23 24 24 25 #include "../lib.h" 25 26 ··· 43 42 44 43 const struct snd_tscm_spec *spec; 45 44 }; 45 + 46 + #define TSCM_ADDR_BASE 0xffff00000000ull 47 + 48 + #define TSCM_OFFSET_FIRMWARE_REGISTER 0x0000 49 + #define TSCM_OFFSET_FIRMWARE_FPGA 0x0004 50 + #define TSCM_OFFSET_FIRMWARE_ARM 0x0008 51 + #define TSCM_OFFSET_FIRMWARE_HW 0x000c 52 + 53 + void snd_tscm_proc_init(struct snd_tscm *tscm); 46 54 47 55 #endif