@@ -87,54 +87,100 @@ int snd_motu_protocol_v3_set_clock_rate(struct snd_motu *motu,
87
87
return 0 ;
88
88
}
89
89
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 )
92
92
{
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 :
106
95
* src = SND_MOTU_CLOCK_SOURCE_INTERNAL ;
107
- } else if (val == 0x01 ) {
96
+ break ;
97
+ case 0x01 :
108
98
* src = SND_MOTU_CLOCK_SOURCE_WORD_ON_BNC ;
109
- } else if (val == 0x02 ) {
99
+ break ;
100
+ case 0x02 :
110
101
* src = SND_MOTU_CLOCK_SOURCE_SPH ;
111
- } else if (val == 0x10 ) {
102
+ break ;
103
+ case 0x10 :
112
104
* 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 ));
116
115
if (err < 0 )
117
116
return err ;
118
- data = be32_to_cpu (reg );
117
+ options = be32_to_cpu (reg );
119
118
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 )
122
121
* src = SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_A ;
123
122
else
124
123
* src = SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT_A ;
125
124
} else {
126
- if (data & V3_NO_ADAT_OPT_IN_IFACE_B )
125
+ if (options & V3_NO_ADAT_OPT_IN_IFACE_B )
127
126
* src = SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_B ;
128
127
else
129
128
* src = SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT_B ;
130
129
}
131
- } else {
130
+
131
+ break ;
132
+ }
133
+ default :
132
134
* src = SND_MOTU_CLOCK_SOURCE_UNKNOWN ;
135
+ break ;
133
136
}
134
137
135
138
return 0 ;
136
139
}
137
140
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
+
138
184
int snd_motu_protocol_v3_switch_fetching_mode (struct snd_motu * motu ,
139
185
bool enable )
140
186
{
0 commit comments