2019-05-29 16:57:59 -07:00
// SPDX-License-Identifier: GPL-2.0-only
2017-03-22 21:30:21 +09:00
/*
* motu - proc . c - a part of driver for MOTU FireWire series
*
* Copyright ( c ) 2015 - 2017 Takashi Sakamoto < o - takashi @ sakamocchi . jp >
*/
# include "./motu.h"
static const char * const clock_names [ ] = {
[ SND_MOTU_CLOCK_SOURCE_INTERNAL ] = " Internal " ,
[ SND_MOTU_CLOCK_SOURCE_ADAT_ON_DSUB ] = " ADAT on Dsub-9pin interface " ,
[ SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT ] = " ADAT on optical interface " ,
[ SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT_A ] = " ADAT on optical interface A " ,
[ SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT_B ] = " ADAT on optical interface B " ,
[ SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT ] = " S/PDIF on optical interface " ,
[ SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_A ] = " S/PDIF on optical interface A " ,
[ SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_B ] = " S/PDIF on optical interface B " ,
2019-10-30 11:09:21 +01:00
[ SND_MOTU_CLOCK_SOURCE_SPDIF_ON_COAX ] = " S/PDIF on coaxial interface " ,
2017-03-22 21:30:21 +09:00
[ SND_MOTU_CLOCK_SOURCE_AESEBU_ON_XLR ] = " AESEBU on XLR interface " ,
[ SND_MOTU_CLOCK_SOURCE_WORD_ON_BNC ] = " Word clock on BNC interface " ,
2019-10-30 17:06:41 +09:00
[ SND_MOTU_CLOCK_SOURCE_SPH ] = " Source packet header " ,
2019-10-30 17:06:40 +09:00
[ SND_MOTU_CLOCK_SOURCE_UNKNOWN ] = " Unknown " ,
2017-03-22 21:30:21 +09:00
} ;
static void proc_read_clock ( struct snd_info_entry * entry ,
struct snd_info_buffer * buffer )
{
struct snd_motu * motu = entry - > private_data ;
const struct snd_motu_protocol * const protocol = motu - > spec - > protocol ;
unsigned int rate ;
enum snd_motu_clock_source source ;
if ( protocol - > get_clock_rate ( motu , & rate ) < 0 )
return ;
if ( protocol - > get_clock_source ( motu , & source ) < 0 )
return ;
snd_iprintf ( buffer , " Rate: \t %d \n " , rate ) ;
snd_iprintf ( buffer , " Source: \t %s \n " , clock_names [ source ] ) ;
}
static void proc_read_format ( struct snd_info_entry * entry ,
struct snd_info_buffer * buffer )
{
struct snd_motu * motu = entry - > private_data ;
const struct snd_motu_protocol * const protocol = motu - > spec - > protocol ;
unsigned int mode ;
struct snd_motu_packet_format * formats ;
int i ;
if ( protocol - > cache_packet_formats ( motu ) < 0 )
return ;
snd_iprintf ( buffer , " tx: \t msg \t fixed \t differed \n " ) ;
for ( i = 0 ; i < SND_MOTU_CLOCK_RATE_COUNT ; + + i ) {
mode = i > > 1 ;
formats = & motu - > tx_packet_formats ;
snd_iprintf ( buffer ,
" %u: \t %u \t %u \t %u \n " ,
snd_motu_clock_rates [ i ] ,
formats - > msg_chunks ,
formats - > fixed_part_pcm_chunks [ mode ] ,
formats - > differed_part_pcm_chunks [ mode ] ) ;
}
snd_iprintf ( buffer , " rx: \t msg \t fixed \t differed \n " ) ;
for ( i = 0 ; i < SND_MOTU_CLOCK_RATE_COUNT ; + + i ) {
mode = i > > 1 ;
formats = & motu - > rx_packet_formats ;
snd_iprintf ( buffer ,
" %u: \t %u \t %u \t %u \n " ,
snd_motu_clock_rates [ i ] ,
formats - > msg_chunks ,
formats - > fixed_part_pcm_chunks [ mode ] ,
formats - > differed_part_pcm_chunks [ mode ] ) ;
}
}
static void add_node ( struct snd_motu * motu , struct snd_info_entry * root ,
const char * name ,
void ( * op ) ( struct snd_info_entry * e ,
struct snd_info_buffer * b ) )
{
struct snd_info_entry * entry ;
entry = snd_info_create_card_entry ( motu - > card , name , root ) ;
2019-02-05 12:34:12 +01:00
if ( entry )
snd_info_set_text_ops ( entry , motu , op ) ;
2017-03-22 21:30:21 +09:00
}
void snd_motu_proc_init ( struct snd_motu * motu )
{
struct snd_info_entry * root ;
/*
* All nodes are automatically removed at snd_card_disconnect ( ) ,
* by following to link list .
*/
root = snd_info_create_card_entry ( motu - > card , " firewire " ,
motu - > card - > proc_root ) ;
if ( root = = NULL )
return ;
2018-05-23 12:20:59 -07:00
root - > mode = S_IFDIR | 0555 ;
2017-03-22 21:30:21 +09:00
add_node ( motu , root , " clock " , proc_read_clock ) ;
add_node ( motu , root , " format " , proc_read_format ) ;
}