xref: /OK3568_Linux_fs/kernel/sound/firewire/oxfw/oxfw-proc.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * oxfw_proc.c - a part of driver for OXFW970/971 based devices
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2014 Takashi Sakamoto
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include "./oxfw.h"
9*4882a593Smuzhiyun 
proc_read_formation(struct snd_info_entry * entry,struct snd_info_buffer * buffer)10*4882a593Smuzhiyun static void proc_read_formation(struct snd_info_entry *entry,
11*4882a593Smuzhiyun 				struct snd_info_buffer *buffer)
12*4882a593Smuzhiyun {
13*4882a593Smuzhiyun 	struct snd_oxfw *oxfw = entry->private_data;
14*4882a593Smuzhiyun 	struct snd_oxfw_stream_formation formation, curr;
15*4882a593Smuzhiyun 	u8 *format;
16*4882a593Smuzhiyun 	char flag;
17*4882a593Smuzhiyun 	int i, err;
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun 	/* Show input. */
20*4882a593Smuzhiyun 	err = snd_oxfw_stream_get_current_formation(oxfw,
21*4882a593Smuzhiyun 						    AVC_GENERAL_PLUG_DIR_IN,
22*4882a593Smuzhiyun 						    &curr);
23*4882a593Smuzhiyun 	if (err < 0)
24*4882a593Smuzhiyun 		return;
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun 	snd_iprintf(buffer, "Input Stream to device:\n");
27*4882a593Smuzhiyun 	snd_iprintf(buffer, "\tRate\tPCM\tMIDI\n");
28*4882a593Smuzhiyun 	for (i = 0; i < SND_OXFW_STREAM_FORMAT_ENTRIES; i++) {
29*4882a593Smuzhiyun 		format = oxfw->rx_stream_formats[i];
30*4882a593Smuzhiyun 		if (format == NULL)
31*4882a593Smuzhiyun 			continue;
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun 		err = snd_oxfw_stream_parse_format(format, &formation);
34*4882a593Smuzhiyun 		if (err < 0)
35*4882a593Smuzhiyun 			continue;
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 		if (memcmp(&formation, &curr, sizeof(curr)) == 0)
38*4882a593Smuzhiyun 			flag = '*';
39*4882a593Smuzhiyun 		else
40*4882a593Smuzhiyun 			flag = ' ';
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun 		snd_iprintf(buffer, "%c\t%d\t%d\t%d\n", flag,
43*4882a593Smuzhiyun 			    formation.rate, formation.pcm, formation.midi);
44*4882a593Smuzhiyun 	}
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun 	if (!oxfw->has_output)
47*4882a593Smuzhiyun 		return;
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun 	/* Show output. */
50*4882a593Smuzhiyun 	err = snd_oxfw_stream_get_current_formation(oxfw,
51*4882a593Smuzhiyun 						    AVC_GENERAL_PLUG_DIR_OUT,
52*4882a593Smuzhiyun 						    &curr);
53*4882a593Smuzhiyun 	if (err < 0)
54*4882a593Smuzhiyun 		return;
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun 	snd_iprintf(buffer, "Output Stream from device:\n");
57*4882a593Smuzhiyun 	snd_iprintf(buffer, "\tRate\tPCM\tMIDI\n");
58*4882a593Smuzhiyun 	for (i = 0; i < SND_OXFW_STREAM_FORMAT_ENTRIES; i++) {
59*4882a593Smuzhiyun 		format = oxfw->tx_stream_formats[i];
60*4882a593Smuzhiyun 		if (format == NULL)
61*4882a593Smuzhiyun 			continue;
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 		err = snd_oxfw_stream_parse_format(format, &formation);
64*4882a593Smuzhiyun 		if (err < 0)
65*4882a593Smuzhiyun 			continue;
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 		if (memcmp(&formation, &curr, sizeof(curr)) == 0)
68*4882a593Smuzhiyun 			flag = '*';
69*4882a593Smuzhiyun 		else
70*4882a593Smuzhiyun 			flag = ' ';
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 		snd_iprintf(buffer, "%c\t%d\t%d\t%d\n", flag,
73*4882a593Smuzhiyun 			    formation.rate, formation.pcm, formation.midi);
74*4882a593Smuzhiyun 	}
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun 
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))77*4882a593Smuzhiyun static void add_node(struct snd_oxfw *oxfw, struct snd_info_entry *root,
78*4882a593Smuzhiyun 		     const char *name,
79*4882a593Smuzhiyun 		     void (*op)(struct snd_info_entry *e,
80*4882a593Smuzhiyun 				struct snd_info_buffer *b))
81*4882a593Smuzhiyun {
82*4882a593Smuzhiyun 	struct snd_info_entry *entry;
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	entry = snd_info_create_card_entry(oxfw->card, name, root);
85*4882a593Smuzhiyun 	if (entry)
86*4882a593Smuzhiyun 		snd_info_set_text_ops(entry, oxfw, op);
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun 
snd_oxfw_proc_init(struct snd_oxfw * oxfw)89*4882a593Smuzhiyun void snd_oxfw_proc_init(struct snd_oxfw *oxfw)
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun 	struct snd_info_entry *root;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 	/*
94*4882a593Smuzhiyun 	 * All nodes are automatically removed at snd_card_disconnect(),
95*4882a593Smuzhiyun 	 * by following to link list.
96*4882a593Smuzhiyun 	 */
97*4882a593Smuzhiyun 	root = snd_info_create_card_entry(oxfw->card, "firewire",
98*4882a593Smuzhiyun 					  oxfw->card->proc_root);
99*4882a593Smuzhiyun 	if (root == NULL)
100*4882a593Smuzhiyun 		return;
101*4882a593Smuzhiyun 	root->mode = S_IFDIR | 0555;
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun 	add_node(oxfw, root, "formation", proc_read_formation);
104*4882a593Smuzhiyun }
105