18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * motu-proc.c - a part of driver for MOTU FireWire series 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (c) 2015-2017 Takashi Sakamoto <o-takashi@sakamocchi.jp> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include "./motu.h" 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_cistatic const char *const clock_names[] = { 118c2ecf20Sopenharmony_ci [SND_MOTU_CLOCK_SOURCE_INTERNAL] = "Internal", 128c2ecf20Sopenharmony_ci [SND_MOTU_CLOCK_SOURCE_ADAT_ON_DSUB] = "ADAT on Dsub-9pin interface", 138c2ecf20Sopenharmony_ci [SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT] = "ADAT on optical interface", 148c2ecf20Sopenharmony_ci [SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT_A] = "ADAT on optical interface A", 158c2ecf20Sopenharmony_ci [SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT_B] = "ADAT on optical interface B", 168c2ecf20Sopenharmony_ci [SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT] = "S/PDIF on optical interface", 178c2ecf20Sopenharmony_ci [SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_A] = "S/PDIF on optical interface A", 188c2ecf20Sopenharmony_ci [SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_B] = "S/PDIF on optical interface B", 198c2ecf20Sopenharmony_ci [SND_MOTU_CLOCK_SOURCE_SPDIF_ON_COAX] = "S/PDIF on coaxial interface", 208c2ecf20Sopenharmony_ci [SND_MOTU_CLOCK_SOURCE_AESEBU_ON_XLR] = "AESEBU on XLR interface", 218c2ecf20Sopenharmony_ci [SND_MOTU_CLOCK_SOURCE_WORD_ON_BNC] = "Word clock on BNC interface", 228c2ecf20Sopenharmony_ci [SND_MOTU_CLOCK_SOURCE_SPH] = "Source packet header", 238c2ecf20Sopenharmony_ci [SND_MOTU_CLOCK_SOURCE_UNKNOWN] = "Unknown", 248c2ecf20Sopenharmony_ci}; 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_cistatic void proc_read_clock(struct snd_info_entry *entry, 278c2ecf20Sopenharmony_ci struct snd_info_buffer *buffer) 288c2ecf20Sopenharmony_ci{ 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci struct snd_motu *motu = entry->private_data; 318c2ecf20Sopenharmony_ci unsigned int rate; 328c2ecf20Sopenharmony_ci enum snd_motu_clock_source source; 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci if (snd_motu_protocol_get_clock_rate(motu, &rate) < 0) 358c2ecf20Sopenharmony_ci return; 368c2ecf20Sopenharmony_ci if (snd_motu_protocol_get_clock_source(motu, &source) < 0) 378c2ecf20Sopenharmony_ci return; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci snd_iprintf(buffer, "Rate:\t%d\n", rate); 408c2ecf20Sopenharmony_ci snd_iprintf(buffer, "Source:\t%s\n", clock_names[source]); 418c2ecf20Sopenharmony_ci} 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_cistatic void proc_read_format(struct snd_info_entry *entry, 448c2ecf20Sopenharmony_ci struct snd_info_buffer *buffer) 458c2ecf20Sopenharmony_ci{ 468c2ecf20Sopenharmony_ci struct snd_motu *motu = entry->private_data; 478c2ecf20Sopenharmony_ci unsigned int mode; 488c2ecf20Sopenharmony_ci struct snd_motu_packet_format *formats; 498c2ecf20Sopenharmony_ci int i; 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci if (snd_motu_protocol_cache_packet_formats(motu) < 0) 528c2ecf20Sopenharmony_ci return; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci snd_iprintf(buffer, "tx:\tmsg\tfixed\ttotal\n"); 558c2ecf20Sopenharmony_ci for (i = 0; i < SND_MOTU_CLOCK_RATE_COUNT; ++i) { 568c2ecf20Sopenharmony_ci mode = i >> 1; 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci formats = &motu->tx_packet_formats; 598c2ecf20Sopenharmony_ci snd_iprintf(buffer, 608c2ecf20Sopenharmony_ci "%u:\t%u\t%u\t%u\n", 618c2ecf20Sopenharmony_ci snd_motu_clock_rates[i], 628c2ecf20Sopenharmony_ci formats->msg_chunks, 638c2ecf20Sopenharmony_ci motu->spec->tx_fixed_pcm_chunks[mode], 648c2ecf20Sopenharmony_ci formats->pcm_chunks[mode]); 658c2ecf20Sopenharmony_ci } 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci snd_iprintf(buffer, "rx:\tmsg\tfixed\ttotal\n"); 688c2ecf20Sopenharmony_ci for (i = 0; i < SND_MOTU_CLOCK_RATE_COUNT; ++i) { 698c2ecf20Sopenharmony_ci mode = i >> 1; 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci formats = &motu->rx_packet_formats; 728c2ecf20Sopenharmony_ci snd_iprintf(buffer, 738c2ecf20Sopenharmony_ci "%u:\t%u\t%u\t%u\n", 748c2ecf20Sopenharmony_ci snd_motu_clock_rates[i], 758c2ecf20Sopenharmony_ci formats->msg_chunks, 768c2ecf20Sopenharmony_ci motu->spec->rx_fixed_pcm_chunks[mode], 778c2ecf20Sopenharmony_ci formats->pcm_chunks[mode]); 788c2ecf20Sopenharmony_ci } 798c2ecf20Sopenharmony_ci} 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_cistatic void add_node(struct snd_motu *motu, struct snd_info_entry *root, 828c2ecf20Sopenharmony_ci const char *name, 838c2ecf20Sopenharmony_ci void (*op)(struct snd_info_entry *e, 848c2ecf20Sopenharmony_ci struct snd_info_buffer *b)) 858c2ecf20Sopenharmony_ci{ 868c2ecf20Sopenharmony_ci struct snd_info_entry *entry; 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci entry = snd_info_create_card_entry(motu->card, name, root); 898c2ecf20Sopenharmony_ci if (entry) 908c2ecf20Sopenharmony_ci snd_info_set_text_ops(entry, motu, op); 918c2ecf20Sopenharmony_ci} 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_civoid snd_motu_proc_init(struct snd_motu *motu) 948c2ecf20Sopenharmony_ci{ 958c2ecf20Sopenharmony_ci struct snd_info_entry *root; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci /* 988c2ecf20Sopenharmony_ci * All nodes are automatically removed at snd_card_disconnect(), 998c2ecf20Sopenharmony_ci * by following to link list. 1008c2ecf20Sopenharmony_ci */ 1018c2ecf20Sopenharmony_ci root = snd_info_create_card_entry(motu->card, "firewire", 1028c2ecf20Sopenharmony_ci motu->card->proc_root); 1038c2ecf20Sopenharmony_ci if (root == NULL) 1048c2ecf20Sopenharmony_ci return; 1058c2ecf20Sopenharmony_ci root->mode = S_IFDIR | 0555; 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci add_node(motu, root, "clock", proc_read_clock); 1088c2ecf20Sopenharmony_ci add_node(motu, root, "format", proc_read_format); 1098c2ecf20Sopenharmony_ci} 110