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