@@ -87,54 +87,100 @@ int snd_motu_protocol_v3_set_clock_rate(struct snd_motu *motu,
8787 return 0 ;
8888}
8989
90- int snd_motu_protocol_v3_get_clock_source (struct snd_motu * motu ,
91- enum snd_motu_clock_source * src )
90+ static int detect_clock_source_828mk3 (struct snd_motu * motu , u32 data ,
91+ enum snd_motu_clock_source * src )
9292{
93- __be32 reg ;
94- u32 data ;
95- unsigned int val ;
96- int err ;
97-
98- err = snd_motu_transaction_read (motu , V3_CLOCK_STATUS_OFFSET , & reg ,
99- sizeof (reg ));
100- if (err < 0 )
101- return err ;
102- data = be32_to_cpu (reg );
103-
104- val = data & V3_CLOCK_SOURCE_MASK ;
105- if (val == 0x00 ) {
93+ switch (data ) {
94+ case 0x00 :
10695 * src = SND_MOTU_CLOCK_SOURCE_INTERNAL ;
107- } else if (val == 0x01 ) {
96+ break ;
97+ case 0x01 :
10898 * src = SND_MOTU_CLOCK_SOURCE_WORD_ON_BNC ;
109- } else if (val == 0x02 ) {
99+ break ;
100+ case 0x02 :
110101 * src = SND_MOTU_CLOCK_SOURCE_SPH ;
111- } else if (val == 0x10 ) {
102+ break ;
103+ case 0x10 :
112104 * src = SND_MOTU_CLOCK_SOURCE_SPDIF_ON_COAX ;
113- } else if (val == 0x18 || val == 0x19 ) {
114- err = snd_motu_transaction_read (motu , V3_OPT_IFACE_MODE_OFFSET ,
115- & reg , sizeof (reg ));
105+ break ;
106+ case 0x18 :
107+ case 0x19 :
108+ {
109+ __be32 reg ;
110+ u32 options ;
111+ int err ;
112+
113+ err = snd_motu_transaction_read (motu ,
114+ V3_OPT_IFACE_MODE_OFFSET , & reg , sizeof (reg ));
116115 if (err < 0 )
117116 return err ;
118- data = be32_to_cpu (reg );
117+ options = be32_to_cpu (reg );
119118
120- if (val == 0x18 ) {
121- if (data & V3_NO_ADAT_OPT_IN_IFACE_A )
119+ if (data == 0x18 ) {
120+ if (options & V3_NO_ADAT_OPT_IN_IFACE_A )
122121 * src = SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_A ;
123122 else
124123 * src = SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT_A ;
125124 } else {
126- if (data & V3_NO_ADAT_OPT_IN_IFACE_B )
125+ if (options & V3_NO_ADAT_OPT_IN_IFACE_B )
127126 * src = SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_B ;
128127 else
129128 * src = SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT_B ;
130129 }
131- } else {
130+
131+ break ;
132+ }
133+ default :
132134 * src = SND_MOTU_CLOCK_SOURCE_UNKNOWN ;
135+ break ;
133136 }
134137
135138 return 0 ;
136139}
137140
141+ static int v3_detect_clock_source (struct snd_motu * motu , u32 data ,
142+ enum snd_motu_clock_source * src )
143+ {
144+ switch (data ) {
145+ case 0x00 :
146+ * src = SND_MOTU_CLOCK_SOURCE_INTERNAL ;
147+ break ;
148+ case 0x01 :
149+ * src = SND_MOTU_CLOCK_SOURCE_WORD_ON_BNC ;
150+ break ;
151+ case 0x02 :
152+ * src = SND_MOTU_CLOCK_SOURCE_SPH ;
153+ break ;
154+ case 0x10 :
155+ * src = SND_MOTU_CLOCK_SOURCE_SPDIF_ON_COAX ;
156+ break ;
157+ default :
158+ * src = SND_MOTU_CLOCK_SOURCE_UNKNOWN ;
159+ break ;
160+ }
161+
162+ return 0 ;
163+ }
164+
165+ int snd_motu_protocol_v3_get_clock_source (struct snd_motu * motu ,
166+ enum snd_motu_clock_source * src )
167+ {
168+ __be32 reg ;
169+ u32 data ;
170+ int err ;
171+
172+ err = snd_motu_transaction_read (motu , V3_CLOCK_STATUS_OFFSET , & reg ,
173+ sizeof (reg ));
174+ if (err < 0 )
175+ return err ;
176+ data = be32_to_cpu (reg ) & V3_CLOCK_SOURCE_MASK ;
177+
178+ if (motu -> spec == & snd_motu_spec_828mk3 )
179+ return detect_clock_source_828mk3 (motu , data , src );
180+ else
181+ return v3_detect_clock_source (motu , data , src );
182+ }
183+
138184int snd_motu_protocol_v3_switch_fetching_mode (struct snd_motu * motu ,
139185 bool enable )
140186{
0 commit comments