xref: /openbmc/linux/sound/firewire/oxfw/oxfw-proc.c (revision da607e19)
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