1 // SPDX-License-Identifier: GPL-2.0-only
3 * bebob_proc.c - a part of driver for BeBoB based devices
5 * Copyright (c) 2013-2014 Takashi Sakamoto
10 /* contents of information register */
26 /* may not used in product
35 proc_read_hw_info(struct snd_info_entry
*entry
,
36 struct snd_info_buffer
*buffer
)
38 struct snd_bebob
*bebob
= entry
->private_data
;
41 info
= kzalloc(sizeof(struct hw_info
), GFP_KERNEL
);
45 if (snd_bebob_read_block(bebob
->unit
, 0,
46 info
, sizeof(struct hw_info
)) < 0)
49 snd_iprintf(buffer
, "Manufacturer:\t%.8s\n",
50 (char *)&info
->manufacturer
);
51 snd_iprintf(buffer
, "Protocol Ver:\t%d\n", info
->protocol_ver
);
52 snd_iprintf(buffer
, "Build Ver:\t%d\n", info
->bld_ver
);
53 snd_iprintf(buffer
, "GUID:\t\t0x%.8X%.8X\n",
54 info
->guid
[0], info
->guid
[1]);
55 snd_iprintf(buffer
, "Model ID:\t0x%02X\n", info
->model_id
);
56 snd_iprintf(buffer
, "Model Rev:\t%d\n", info
->model_rev
);
57 snd_iprintf(buffer
, "Firmware Date:\t%.8s\n", (char *)&info
->fw_date
);
58 snd_iprintf(buffer
, "Firmware Time:\t%.8s\n", (char *)&info
->fw_time
);
59 snd_iprintf(buffer
, "Firmware ID:\t0x%X\n", info
->fw_id
);
60 snd_iprintf(buffer
, "Firmware Ver:\t%d\n", info
->fw_ver
);
61 snd_iprintf(buffer
, "Base Addr:\t0x%X\n", info
->base_addr
);
62 snd_iprintf(buffer
, "Max Size:\t%d\n", info
->max_size
);
63 snd_iprintf(buffer
, "Loader Date:\t%.8s\n", (char *)&info
->bld_date
);
64 snd_iprintf(buffer
, "Loader Time:\t%.8s\n", (char *)&info
->bld_time
);
71 proc_read_meters(struct snd_info_entry
*entry
,
72 struct snd_info_buffer
*buffer
)
74 struct snd_bebob
*bebob
= entry
->private_data
;
75 const struct snd_bebob_meter_spec
*spec
= bebob
->spec
->meter
;
77 unsigned int i
, c
, channels
, size
;
82 channels
= spec
->num
* 2;
83 size
= channels
* sizeof(u32
);
84 buf
= kmalloc(size
, GFP_KERNEL
);
88 if (spec
->get(bebob
, buf
, size
) < 0)
91 for (i
= 0, c
= 1; i
< channels
; i
++) {
92 snd_iprintf(buffer
, "%s %d:\t%d\n",
93 spec
->labels
[i
/ 2], c
++, buf
[i
]);
94 if ((i
+ 1 < channels
- 1) &&
95 (strcmp(spec
->labels
[i
/ 2],
96 spec
->labels
[(i
+ 1) / 2]) != 0))
104 proc_read_formation(struct snd_info_entry
*entry
,
105 struct snd_info_buffer
*buffer
)
107 struct snd_bebob
*bebob
= entry
->private_data
;
108 struct snd_bebob_stream_formation
*formation
;
111 snd_iprintf(buffer
, "Output Stream from device:\n");
112 snd_iprintf(buffer
, "\tRate\tPCM\tMIDI\n");
113 formation
= bebob
->tx_stream_formations
;
114 for (i
= 0; i
< SND_BEBOB_STRM_FMT_ENTRIES
; i
++) {
116 "\t%d\t%d\t%d\n", snd_bebob_rate_table
[i
],
117 formation
[i
].pcm
, formation
[i
].midi
);
120 snd_iprintf(buffer
, "Input Stream to device:\n");
121 snd_iprintf(buffer
, "\tRate\tPCM\tMIDI\n");
122 formation
= bebob
->rx_stream_formations
;
123 for (i
= 0; i
< SND_BEBOB_STRM_FMT_ENTRIES
; i
++) {
125 "\t%d\t%d\t%d\n", snd_bebob_rate_table
[i
],
126 formation
[i
].pcm
, formation
[i
].midi
);
131 proc_read_clock(struct snd_info_entry
*entry
,
132 struct snd_info_buffer
*buffer
)
134 static const char *const clk_labels
[] = {
139 struct snd_bebob
*bebob
= entry
->private_data
;
140 const struct snd_bebob_rate_spec
*rate_spec
= bebob
->spec
->rate
;
141 const struct snd_bebob_clock_spec
*clk_spec
= bebob
->spec
->clock
;
142 enum snd_bebob_clock_type src
;
145 if (rate_spec
->get(bebob
, &rate
) >= 0)
146 snd_iprintf(buffer
, "Sampling rate: %d\n", rate
);
148 if (snd_bebob_stream_get_clock_src(bebob
, &src
) >= 0) {
150 snd_iprintf(buffer
, "Clock Source: %s\n",
153 snd_iprintf(buffer
, "Clock Source: %s (MSU-dest: %d)\n",
154 clk_labels
[src
], bebob
->sync_input_plug
);
159 add_node(struct snd_bebob
*bebob
, struct snd_info_entry
*root
, const char *name
,
160 void (*op
)(struct snd_info_entry
*e
, struct snd_info_buffer
*b
))
162 struct snd_info_entry
*entry
;
164 entry
= snd_info_create_card_entry(bebob
->card
, name
, root
);
166 snd_info_set_text_ops(entry
, bebob
, op
);
169 void snd_bebob_proc_init(struct snd_bebob
*bebob
)
171 struct snd_info_entry
*root
;
174 * All nodes are automatically removed at snd_card_disconnect(),
175 * by following to link list.
177 root
= snd_info_create_card_entry(bebob
->card
, "firewire",
178 bebob
->card
->proc_root
);
181 root
->mode
= S_IFDIR
| 0555;
183 add_node(bebob
, root
, "clock", proc_read_clock
);
184 add_node(bebob
, root
, "firmware", proc_read_hw_info
);
185 add_node(bebob
, root
, "formation", proc_read_formation
);
187 if (bebob
->spec
->meter
!= NULL
)
188 add_node(bebob
, root
, "meter", proc_read_meters
);