Commit | Line | Data |
---|---|---|
da607e19 | 1 | // SPDX-License-Identifier: GPL-2.0-only |
4638ec6e TS |
2 | /* |
3 | * motu-proc.c - a part of driver for MOTU FireWire series | |
4 | * | |
5 | * Copyright (c) 2015-2017 Takashi Sakamoto <o-takashi@sakamocchi.jp> | |
4638ec6e TS |
6 | */ |
7 | ||
8 | #include "./motu.h" | |
9 | ||
10 | static const char *const clock_names[] = { | |
11 | [SND_MOTU_CLOCK_SOURCE_INTERNAL] = "Internal", | |
12 | [SND_MOTU_CLOCK_SOURCE_ADAT_ON_DSUB] = "ADAT on Dsub-9pin interface", | |
13 | [SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT] = "ADAT on optical interface", | |
14 | [SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT_A] = "ADAT on optical interface A", | |
15 | [SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT_B] = "ADAT on optical interface B", | |
16 | [SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT] = "S/PDIF on optical interface", | |
17 | [SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_A] = "S/PDIF on optical interface A", | |
18 | [SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_B] = "S/PDIF on optical interface B", | |
0929249e | 19 | [SND_MOTU_CLOCK_SOURCE_SPDIF_ON_COAX] = "S/PDIF on coaxial interface", |
4638ec6e TS |
20 | [SND_MOTU_CLOCK_SOURCE_AESEBU_ON_XLR] = "AESEBU on XLR interface", |
21 | [SND_MOTU_CLOCK_SOURCE_WORD_ON_BNC] = "Word clock on BNC interface", | |
3f58f004 | 22 | [SND_MOTU_CLOCK_SOURCE_SPH] = "Source packet header", |
1ef2ff94 | 23 | [SND_MOTU_CLOCK_SOURCE_UNKNOWN] = "Unknown", |
4638ec6e TS |
24 | }; |
25 | ||
26 | static void proc_read_clock(struct snd_info_entry *entry, | |
27 | struct snd_info_buffer *buffer) | |
28 | { | |
29 | ||
30 | struct snd_motu *motu = entry->private_data; | |
4638ec6e TS |
31 | unsigned int rate; |
32 | enum snd_motu_clock_source source; | |
33 | ||
ff222b7e | 34 | if (snd_motu_protocol_get_clock_rate(motu, &rate) < 0) |
4638ec6e | 35 | return; |
ff222b7e | 36 | if (snd_motu_protocol_get_clock_source(motu, &source) < 0) |
4638ec6e TS |
37 | return; |
38 | ||
39 | snd_iprintf(buffer, "Rate:\t%d\n", rate); | |
40 | snd_iprintf(buffer, "Source:\t%s\n", clock_names[source]); | |
41 | } | |
42 | ||
43 | static void proc_read_format(struct snd_info_entry *entry, | |
44 | struct snd_info_buffer *buffer) | |
45 | { | |
46 | struct snd_motu *motu = entry->private_data; | |
4638ec6e TS |
47 | unsigned int mode; |
48 | struct snd_motu_packet_format *formats; | |
49 | int i; | |
50 | ||
ff222b7e | 51 | if (snd_motu_protocol_cache_packet_formats(motu) < 0) |
4638ec6e TS |
52 | return; |
53 | ||
9883b385 | 54 | snd_iprintf(buffer, "tx:\tmsg\tfixed\ttotal\n"); |
4638ec6e TS |
55 | for (i = 0; i < SND_MOTU_CLOCK_RATE_COUNT; ++i) { |
56 | mode = i >> 1; | |
57 | ||
58 | formats = &motu->tx_packet_formats; | |
59 | snd_iprintf(buffer, | |
60 | "%u:\t%u\t%u\t%u\n", | |
61 | snd_motu_clock_rates[i], | |
62 | formats->msg_chunks, | |
9883b385 TS |
63 | motu->spec->tx_fixed_pcm_chunks[mode], |
64 | formats->pcm_chunks[mode]); | |
4638ec6e TS |
65 | } |
66 | ||
9883b385 | 67 | snd_iprintf(buffer, "rx:\tmsg\tfixed\ttotal\n"); |
4638ec6e TS |
68 | for (i = 0; i < SND_MOTU_CLOCK_RATE_COUNT; ++i) { |
69 | mode = i >> 1; | |
70 | ||
71 | formats = &motu->rx_packet_formats; | |
72 | snd_iprintf(buffer, | |
73 | "%u:\t%u\t%u\t%u\n", | |
74 | snd_motu_clock_rates[i], | |
75 | formats->msg_chunks, | |
9883b385 TS |
76 | motu->spec->rx_fixed_pcm_chunks[mode], |
77 | formats->pcm_chunks[mode]); | |
4638ec6e TS |
78 | } |
79 | } | |
80 | ||
81 | static void add_node(struct snd_motu *motu, struct snd_info_entry *root, | |
82 | const char *name, | |
83 | void (*op)(struct snd_info_entry *e, | |
84 | struct snd_info_buffer *b)) | |
85 | { | |
86 | struct snd_info_entry *entry; | |
87 | ||
88 | entry = snd_info_create_card_entry(motu->card, name, root); | |
0c298bdc TI |
89 | if (entry) |
90 | snd_info_set_text_ops(entry, motu, op); | |
4638ec6e TS |
91 | } |
92 | ||
93 | void snd_motu_proc_init(struct snd_motu *motu) | |
94 | { | |
95 | struct snd_info_entry *root; | |
96 | ||
97 | /* | |
98 | * All nodes are automatically removed at snd_card_disconnect(), | |
99 | * by following to link list. | |
100 | */ | |
101 | root = snd_info_create_card_entry(motu->card, "firewire", | |
102 | motu->card->proc_root); | |
103 | if (root == NULL) | |
104 | return; | |
6a73cf46 | 105 | root->mode = S_IFDIR | 0555; |
4638ec6e TS |
106 | |
107 | add_node(motu, root, "clock", proc_read_clock); | |
108 | add_node(motu, root, "format", proc_read_format); | |
109 | } |