2 * bebob_proc.c - a part of driver for BeBoB based devices
4 * Copyright (c) 2013-2014 Takashi Sakamoto
6 * Licensed under the terms of the GNU General Public License, version 2.
11 /* contents of information register */
27 /* may not used in product
36 proc_read_hw_info(struct snd_info_entry
*entry
,
37 struct snd_info_buffer
*buffer
)
39 struct snd_bebob
*bebob
= entry
->private_data
;
42 info
= kzalloc(sizeof(struct hw_info
), GFP_KERNEL
);
46 if (snd_bebob_read_block(bebob
->unit
, 0,
47 info
, sizeof(struct hw_info
)) < 0)
50 snd_iprintf(buffer
, "Manufacturer:\t%.8s\n",
51 (char *)&info
->manufacturer
);
52 snd_iprintf(buffer
, "Protocol Ver:\t%d\n", info
->protocol_ver
);
53 snd_iprintf(buffer
, "Build Ver:\t%d\n", info
->bld_ver
);
54 snd_iprintf(buffer
, "GUID:\t\t0x%.8X%.8X\n",
55 info
->guid
[0], info
->guid
[1]);
56 snd_iprintf(buffer
, "Model ID:\t0x%02X\n", info
->model_id
);
57 snd_iprintf(buffer
, "Model Rev:\t%d\n", info
->model_rev
);
58 snd_iprintf(buffer
, "Firmware Date:\t%.8s\n", (char *)&info
->fw_date
);
59 snd_iprintf(buffer
, "Firmware Time:\t%.8s\n", (char *)&info
->fw_time
);
60 snd_iprintf(buffer
, "Firmware ID:\t0x%X\n", info
->fw_id
);
61 snd_iprintf(buffer
, "Firmware Ver:\t%d\n", info
->fw_ver
);
62 snd_iprintf(buffer
, "Base Addr:\t0x%X\n", info
->base_addr
);
63 snd_iprintf(buffer
, "Max Size:\t%d\n", info
->max_size
);
64 snd_iprintf(buffer
, "Loader Date:\t%.8s\n", (char *)&info
->bld_date
);
65 snd_iprintf(buffer
, "Loader Time:\t%.8s\n", (char *)&info
->bld_time
);
72 proc_read_meters(struct snd_info_entry
*entry
,
73 struct snd_info_buffer
*buffer
)
75 struct snd_bebob
*bebob
= entry
->private_data
;
76 struct snd_bebob_meter_spec
*spec
= bebob
->spec
->meter
;
78 unsigned int i
, c
, channels
, size
;
83 channels
= spec
->num
* 2;
84 size
= channels
* sizeof(u32
);
85 buf
= kmalloc(size
, GFP_KERNEL
);
89 if (spec
->get(bebob
, buf
, size
) < 0)
92 for (i
= 0, c
= 1; i
< channels
; i
++) {
93 snd_iprintf(buffer
, "%s %d:\t%d\n",
94 spec
->labels
[i
/ 2], c
++, buf
[i
]);
95 if ((i
+ 1 < channels
- 1) &&
96 (strcmp(spec
->labels
[i
/ 2],
97 spec
->labels
[(i
+ 1) / 2]) != 0))
105 proc_read_formation(struct snd_info_entry
*entry
,
106 struct snd_info_buffer
*buffer
)
108 struct snd_bebob
*bebob
= entry
->private_data
;
109 struct snd_bebob_stream_formation
*formation
;
112 snd_iprintf(buffer
, "Output Stream from device:\n");
113 snd_iprintf(buffer
, "\tRate\tPCM\tMIDI\n");
114 formation
= bebob
->tx_stream_formations
;
115 for (i
= 0; i
< SND_BEBOB_STRM_FMT_ENTRIES
; i
++) {
117 "\t%d\t%d\t%d\n", snd_bebob_rate_table
[i
],
118 formation
[i
].pcm
, formation
[i
].midi
);
121 snd_iprintf(buffer
, "Input Stream to device:\n");
122 snd_iprintf(buffer
, "\tRate\tPCM\tMIDI\n");
123 formation
= bebob
->rx_stream_formations
;
124 for (i
= 0; i
< SND_BEBOB_STRM_FMT_ENTRIES
; i
++) {
126 "\t%d\t%d\t%d\n", snd_bebob_rate_table
[i
],
127 formation
[i
].pcm
, formation
[i
].midi
);
132 proc_read_clock(struct snd_info_entry
*entry
,
133 struct snd_info_buffer
*buffer
)
135 struct snd_bebob
*bebob
= entry
->private_data
;
136 struct snd_bebob_rate_spec
*rate_spec
= bebob
->spec
->rate
;
137 struct snd_bebob_clock_spec
*clk_spec
= bebob
->spec
->clock
;
138 unsigned int rate
, id
;
141 if (rate_spec
->get(bebob
, &rate
) >= 0)
142 snd_iprintf(buffer
, "Sampling rate: %d\n", rate
);
145 if (clk_spec
->get(bebob
, &id
) >= 0)
146 snd_iprintf(buffer
, "Clock Source: %s\n",
147 clk_spec
->labels
[id
]);
149 if (snd_bebob_stream_check_internal_clock(bebob
,
151 snd_iprintf(buffer
, "Clock Source: %s (MSU-dest: %d)\n",
152 (internal
) ? "Internal" : "External",
153 bebob
->sync_input_plug
);
158 add_node(struct snd_bebob
*bebob
, struct snd_info_entry
*root
, const char *name
,
159 void (*op
)(struct snd_info_entry
*e
, struct snd_info_buffer
*b
))
161 struct snd_info_entry
*entry
;
163 entry
= snd_info_create_card_entry(bebob
->card
, name
, root
);
167 snd_info_set_text_ops(entry
, bebob
, op
);
168 if (snd_info_register(entry
) < 0)
169 snd_info_free_entry(entry
);
172 void snd_bebob_proc_init(struct snd_bebob
*bebob
)
174 struct snd_info_entry
*root
;
177 * All nodes are automatically removed at snd_card_disconnect(),
178 * by following to link list.
180 root
= snd_info_create_card_entry(bebob
->card
, "firewire",
181 bebob
->card
->proc_root
);
184 root
->mode
= S_IFDIR
| S_IRUGO
| S_IXUGO
;
185 if (snd_info_register(root
) < 0) {
186 snd_info_free_entry(root
);
190 add_node(bebob
, root
, "clock", proc_read_clock
);
191 add_node(bebob
, root
, "firmware", proc_read_hw_info
);
192 add_node(bebob
, root
, "formation", proc_read_formation
);
194 if (bebob
->spec
->meter
!= NULL
)
195 add_node(bebob
, root
, "meter", proc_read_meters
);