1da607e19SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
23c96101fSTakashi Sakamoto /*
33c96101fSTakashi Sakamoto * oxfw_proc.c - a part of driver for OXFW970/971 based devices
43c96101fSTakashi Sakamoto *
53c96101fSTakashi Sakamoto * Copyright (c) 2014 Takashi Sakamoto
63c96101fSTakashi Sakamoto */
73c96101fSTakashi Sakamoto
83c96101fSTakashi Sakamoto #include "./oxfw.h"
93c96101fSTakashi Sakamoto
proc_read_formation(struct snd_info_entry * entry,struct snd_info_buffer * buffer)103c96101fSTakashi Sakamoto static void proc_read_formation(struct snd_info_entry *entry,
113c96101fSTakashi Sakamoto struct snd_info_buffer *buffer)
123c96101fSTakashi Sakamoto {
133c96101fSTakashi Sakamoto struct snd_oxfw *oxfw = entry->private_data;
143c96101fSTakashi Sakamoto struct snd_oxfw_stream_formation formation, curr;
153c96101fSTakashi Sakamoto u8 *format;
163c96101fSTakashi Sakamoto char flag;
175580ba7bSDan Carpenter int i, err;
183c96101fSTakashi Sakamoto
193c96101fSTakashi Sakamoto /* Show input. */
203c96101fSTakashi Sakamoto err = snd_oxfw_stream_get_current_formation(oxfw,
213c96101fSTakashi Sakamoto AVC_GENERAL_PLUG_DIR_IN,
223c96101fSTakashi Sakamoto &curr);
233c96101fSTakashi Sakamoto if (err < 0)
243c96101fSTakashi Sakamoto return;
253c96101fSTakashi Sakamoto
263c96101fSTakashi Sakamoto snd_iprintf(buffer, "Input Stream to device:\n");
273c96101fSTakashi Sakamoto snd_iprintf(buffer, "\tRate\tPCM\tMIDI\n");
283c96101fSTakashi Sakamoto for (i = 0; i < SND_OXFW_STREAM_FORMAT_ENTRIES; i++) {
293c96101fSTakashi Sakamoto format = oxfw->rx_stream_formats[i];
303c96101fSTakashi Sakamoto if (format == NULL)
313c96101fSTakashi Sakamoto continue;
323c96101fSTakashi Sakamoto
333c96101fSTakashi Sakamoto err = snd_oxfw_stream_parse_format(format, &formation);
343c96101fSTakashi Sakamoto if (err < 0)
353c96101fSTakashi Sakamoto continue;
363c96101fSTakashi Sakamoto
373c96101fSTakashi Sakamoto if (memcmp(&formation, &curr, sizeof(curr)) == 0)
383c96101fSTakashi Sakamoto flag = '*';
393c96101fSTakashi Sakamoto else
403c96101fSTakashi Sakamoto flag = ' ';
413c96101fSTakashi Sakamoto
423c96101fSTakashi Sakamoto snd_iprintf(buffer, "%c\t%d\t%d\t%d\n", flag,
433c96101fSTakashi Sakamoto formation.rate, formation.pcm, formation.midi);
443c96101fSTakashi Sakamoto }
453c96101fSTakashi Sakamoto
46b0ac0009STakashi Sakamoto if (!oxfw->has_output)
47b0ac0009STakashi Sakamoto return;
48b0ac0009STakashi Sakamoto
49b0ac0009STakashi Sakamoto /* Show output. */
50b0ac0009STakashi Sakamoto err = snd_oxfw_stream_get_current_formation(oxfw,
51b0ac0009STakashi Sakamoto AVC_GENERAL_PLUG_DIR_OUT,
52b0ac0009STakashi Sakamoto &curr);
53b0ac0009STakashi Sakamoto if (err < 0)
54b0ac0009STakashi Sakamoto return;
55b0ac0009STakashi Sakamoto
56b0ac0009STakashi Sakamoto snd_iprintf(buffer, "Output Stream from device:\n");
57b0ac0009STakashi Sakamoto snd_iprintf(buffer, "\tRate\tPCM\tMIDI\n");
58b0ac0009STakashi Sakamoto for (i = 0; i < SND_OXFW_STREAM_FORMAT_ENTRIES; i++) {
59b0ac0009STakashi Sakamoto format = oxfw->tx_stream_formats[i];
60b0ac0009STakashi Sakamoto if (format == NULL)
61b0ac0009STakashi Sakamoto continue;
62b0ac0009STakashi Sakamoto
63b0ac0009STakashi Sakamoto err = snd_oxfw_stream_parse_format(format, &formation);
64b0ac0009STakashi Sakamoto if (err < 0)
65b0ac0009STakashi Sakamoto continue;
66b0ac0009STakashi Sakamoto
67b0ac0009STakashi Sakamoto if (memcmp(&formation, &curr, sizeof(curr)) == 0)
68b0ac0009STakashi Sakamoto flag = '*';
69b0ac0009STakashi Sakamoto else
70b0ac0009STakashi Sakamoto flag = ' ';
71b0ac0009STakashi Sakamoto
72b0ac0009STakashi Sakamoto snd_iprintf(buffer, "%c\t%d\t%d\t%d\n", flag,
73b0ac0009STakashi Sakamoto formation.rate, formation.pcm, formation.midi);
74b0ac0009STakashi Sakamoto }
753c96101fSTakashi Sakamoto }
763c96101fSTakashi Sakamoto
add_node(struct snd_oxfw * oxfw,struct snd_info_entry * root,const char * name,void (* op)(struct snd_info_entry * e,struct snd_info_buffer * b))773c96101fSTakashi Sakamoto static void add_node(struct snd_oxfw *oxfw, struct snd_info_entry *root,
783c96101fSTakashi Sakamoto const char *name,
793c96101fSTakashi Sakamoto void (*op)(struct snd_info_entry *e,
803c96101fSTakashi Sakamoto struct snd_info_buffer *b))
813c96101fSTakashi Sakamoto {
823c96101fSTakashi Sakamoto struct snd_info_entry *entry;
833c96101fSTakashi Sakamoto
843c96101fSTakashi Sakamoto entry = snd_info_create_card_entry(oxfw->card, name, root);
850c298bdcSTakashi Iwai if (entry)
863c96101fSTakashi Sakamoto snd_info_set_text_ops(entry, oxfw, op);
873c96101fSTakashi Sakamoto }
883c96101fSTakashi Sakamoto
snd_oxfw_proc_init(struct snd_oxfw * oxfw)893c96101fSTakashi Sakamoto void snd_oxfw_proc_init(struct snd_oxfw *oxfw)
903c96101fSTakashi Sakamoto {
913c96101fSTakashi Sakamoto struct snd_info_entry *root;
923c96101fSTakashi Sakamoto
933c96101fSTakashi Sakamoto /*
943c96101fSTakashi Sakamoto * All nodes are automatically removed at snd_card_disconnect(),
953c96101fSTakashi Sakamoto * by following to link list.
963c96101fSTakashi Sakamoto */
973c96101fSTakashi Sakamoto root = snd_info_create_card_entry(oxfw->card, "firewire",
983c96101fSTakashi Sakamoto oxfw->card->proc_root);
993c96101fSTakashi Sakamoto if (root == NULL)
1003c96101fSTakashi Sakamoto return;
1016a73cf46SJoe Perches root->mode = S_IFDIR | 0555;
1023c96101fSTakashi Sakamoto
1033c96101fSTakashi Sakamoto add_node(oxfw, root, "formation", proc_read_formation);
1043c96101fSTakashi Sakamoto }
105