1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32static int write_control_reg(struct echoaudio *chip, u32 value, char force);
33static int set_input_clock(struct echoaudio *chip, u16 clock);
34static int set_professional_spdif(struct echoaudio *chip, char prof);
35static int set_digital_mode(struct echoaudio *chip, u8 mode);
36static int load_asic_generic(struct echoaudio *chip, u32 cmd, short asic);
37static int check_asic_status(struct echoaudio *chip);
38
39
40static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
41{
42 int err;
43
44 DE_INIT(("init_hw() - Mona\n"));
45 if (snd_BUG_ON((subdevice_id & 0xfff0) != MONA))
46 return -ENODEV;
47
48 if ((err = init_dsp_comm_page(chip))) {
49 DE_INIT(("init_hw - could not initialize DSP comm page\n"));
50 return err;
51 }
52
53 chip->device_id = device_id;
54 chip->subdevice_id = subdevice_id;
55 chip->bad_board = TRUE;
56 chip->input_clock_types =
57 ECHO_CLOCK_BIT_INTERNAL | ECHO_CLOCK_BIT_SPDIF |
58 ECHO_CLOCK_BIT_WORD | ECHO_CLOCK_BIT_ADAT;
59 chip->digital_modes =
60 ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA |
61 ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL |
62 ECHOCAPS_HAS_DIGITAL_MODE_ADAT;
63
64
65 if (chip->device_id == DEVICE_ID_56361)
66 chip->dsp_code_to_load = FW_MONA_361_DSP;
67 else
68 chip->dsp_code_to_load = FW_MONA_301_DSP;
69
70 if ((err = load_firmware(chip)) < 0)
71 return err;
72 chip->bad_board = FALSE;
73
74 DE_INIT(("init_hw done\n"));
75 return err;
76}
77
78
79
80static int set_mixer_defaults(struct echoaudio *chip)
81{
82 chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
83 chip->professional_spdif = FALSE;
84 chip->digital_in_automute = TRUE;
85 return init_line_levels(chip);
86}
87
88
89
90static u32 detect_input_clocks(const struct echoaudio *chip)
91{
92 u32 clocks_from_dsp, clock_bits;
93
94
95
96 clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
97
98 clock_bits = ECHO_CLOCK_BIT_INTERNAL;
99
100 if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_SPDIF)
101 clock_bits |= ECHO_CLOCK_BIT_SPDIF;
102
103 if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_ADAT)
104 clock_bits |= ECHO_CLOCK_BIT_ADAT;
105
106 if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_WORD)
107 clock_bits |= ECHO_CLOCK_BIT_WORD;
108
109 return clock_bits;
110}
111
112
113
114
115
116static int load_asic(struct echoaudio *chip)
117{
118 u32 control_reg;
119 int err;
120 short asic;
121
122 if (chip->asic_loaded)
123 return 0;
124
125 mdelay(10);
126
127 if (chip->device_id == DEVICE_ID_56361)
128 asic = FW_MONA_361_1_ASIC48;
129 else
130 asic = FW_MONA_301_1_ASIC48;
131
132 err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC, asic);
133 if (err < 0)
134 return err;
135
136 chip->asic_code = asic;
137 mdelay(10);
138
139
140 err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_EXTERNAL_ASIC,
141 FW_MONA_2_ASIC);
142 if (err < 0)
143 return err;
144
145 mdelay(10);
146 err = check_asic_status(chip);
147
148
149
150 if (!err) {
151 control_reg = GML_CONVERTER_ENABLE | GML_48KHZ;
152 err = write_control_reg(chip, control_reg, TRUE);
153 }
154
155 return err;
156}
157
158
159
160
161
162
163static int switch_asic(struct echoaudio *chip, char double_speed)
164{
165 int err;
166 short asic;
167
168
169
170
171 if (chip->device_id == DEVICE_ID_56361) {
172 if (double_speed)
173 asic = FW_MONA_361_1_ASIC96;
174 else
175 asic = FW_MONA_361_1_ASIC48;
176 } else {
177 if (double_speed)
178 asic = FW_MONA_301_1_ASIC96;
179 else
180 asic = FW_MONA_301_1_ASIC48;
181 }
182
183 if (asic != chip->asic_code) {
184
185 err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC,
186 asic);
187 if (err < 0)
188 return err;
189 chip->asic_code = asic;
190 }
191
192 return 0;
193}
194
195
196
197static int set_sample_rate(struct echoaudio *chip, u32 rate)
198{
199 u32 control_reg, clock;
200 short asic;
201 char force_write;
202
203
204 if (chip->input_clock != ECHO_CLOCK_INTERNAL) {
205 DE_ACT(("set_sample_rate: Cannot set sample rate - "
206 "clock not set to CLK_CLOCKININTERNAL\n"));
207
208 chip->comm_page->sample_rate = cpu_to_le32(rate);
209 chip->sample_rate = rate;
210 return 0;
211 }
212
213
214 if (rate >= 88200) {
215 if (chip->digital_mode == DIGITAL_MODE_ADAT)
216 return -EINVAL;
217 if (chip->device_id == DEVICE_ID_56361)
218 asic = FW_MONA_361_1_ASIC96;
219 else
220 asic = FW_MONA_301_1_ASIC96;
221 } else {
222 if (chip->device_id == DEVICE_ID_56361)
223 asic = FW_MONA_361_1_ASIC48;
224 else
225 asic = FW_MONA_301_1_ASIC48;
226 }
227
228 force_write = 0;
229 if (asic != chip->asic_code) {
230 int err;
231
232 spin_unlock_irq(&chip->lock);
233 err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC,
234 asic);
235 spin_lock_irq(&chip->lock);
236
237 if (err < 0)
238 return err;
239 chip->asic_code = asic;
240 force_write = 1;
241 }
242
243
244 clock = 0;
245 control_reg = le32_to_cpu(chip->comm_page->control_register);
246 control_reg &= GML_CLOCK_CLEAR_MASK;
247 control_reg &= GML_SPDIF_RATE_CLEAR_MASK;
248
249 switch (rate) {
250 case 96000:
251 clock = GML_96KHZ;
252 break;
253 case 88200:
254 clock = GML_88KHZ;
255 break;
256 case 48000:
257 clock = GML_48KHZ | GML_SPDIF_SAMPLE_RATE1;
258 break;
259 case 44100:
260 clock = GML_44KHZ;
261
262 if (control_reg & GML_SPDIF_PRO_MODE)
263 clock |= GML_SPDIF_SAMPLE_RATE0;
264 break;
265 case 32000:
266 clock = GML_32KHZ | GML_SPDIF_SAMPLE_RATE0 |
267 GML_SPDIF_SAMPLE_RATE1;
268 break;
269 case 22050:
270 clock = GML_22KHZ;
271 break;
272 case 16000:
273 clock = GML_16KHZ;
274 break;
275 case 11025:
276 clock = GML_11KHZ;
277 break;
278 case 8000:
279 clock = GML_8KHZ;
280 break;
281 default:
282 DE_ACT(("set_sample_rate: %d invalid!\n", rate));
283 return -EINVAL;
284 }
285
286 control_reg |= clock;
287
288 chip->comm_page->sample_rate = cpu_to_le32(rate);
289 chip->sample_rate = rate;
290 DE_ACT(("set_sample_rate: %d clock %d\n", rate, clock));
291
292 return write_control_reg(chip, control_reg, force_write);
293}
294
295
296
297static int set_input_clock(struct echoaudio *chip, u16 clock)
298{
299 u32 control_reg, clocks_from_dsp;
300 int err;
301
302 DE_ACT(("set_input_clock:\n"));
303
304
305 if (atomic_read(&chip->opencount))
306 return -EAGAIN;
307
308
309 control_reg = le32_to_cpu(chip->comm_page->control_register) &
310 GML_CLOCK_CLEAR_MASK;
311 clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
312
313 switch (clock) {
314 case ECHO_CLOCK_INTERNAL:
315 DE_ACT(("Set Mona clock to INTERNAL\n"));
316 chip->input_clock = ECHO_CLOCK_INTERNAL;
317 return set_sample_rate(chip, chip->sample_rate);
318 case ECHO_CLOCK_SPDIF:
319 if (chip->digital_mode == DIGITAL_MODE_ADAT)
320 return -EAGAIN;
321 spin_unlock_irq(&chip->lock);
322 err = switch_asic(chip, clocks_from_dsp &
323 GML_CLOCK_DETECT_BIT_SPDIF96);
324 spin_lock_irq(&chip->lock);
325 if (err < 0)
326 return err;
327 DE_ACT(("Set Mona clock to SPDIF\n"));
328 control_reg |= GML_SPDIF_CLOCK;
329 if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_SPDIF96)
330 control_reg |= GML_DOUBLE_SPEED_MODE;
331 else
332 control_reg &= ~GML_DOUBLE_SPEED_MODE;
333 break;
334 case ECHO_CLOCK_WORD:
335 DE_ACT(("Set Mona clock to WORD\n"));
336 spin_unlock_irq(&chip->lock);
337 err = switch_asic(chip, clocks_from_dsp &
338 GML_CLOCK_DETECT_BIT_WORD96);
339 spin_lock_irq(&chip->lock);
340 if (err < 0)
341 return err;
342 control_reg |= GML_WORD_CLOCK;
343 if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_WORD96)
344 control_reg |= GML_DOUBLE_SPEED_MODE;
345 else
346 control_reg &= ~GML_DOUBLE_SPEED_MODE;
347 break;
348 case ECHO_CLOCK_ADAT:
349 DE_ACT(("Set Mona clock to ADAT\n"));
350 if (chip->digital_mode != DIGITAL_MODE_ADAT)
351 return -EAGAIN;
352 control_reg |= GML_ADAT_CLOCK;
353 control_reg &= ~GML_DOUBLE_SPEED_MODE;
354 break;
355 default:
356 DE_ACT(("Input clock 0x%x not supported for Mona\n", clock));
357 return -EINVAL;
358 }
359
360 chip->input_clock = clock;
361 return write_control_reg(chip, control_reg, TRUE);
362}
363
364
365
366static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
367{
368 u32 control_reg;
369 int err, incompatible_clock;
370
371
372 incompatible_clock = FALSE;
373 switch (mode) {
374 case DIGITAL_MODE_SPDIF_OPTICAL:
375 case DIGITAL_MODE_SPDIF_RCA:
376 if (chip->input_clock == ECHO_CLOCK_ADAT)
377 incompatible_clock = TRUE;
378 break;
379 case DIGITAL_MODE_ADAT:
380 if (chip->input_clock == ECHO_CLOCK_SPDIF)
381 incompatible_clock = TRUE;
382 break;
383 default:
384 DE_ACT(("Digital mode not supported: %d\n", mode));
385 return -EINVAL;
386 }
387
388 spin_lock_irq(&chip->lock);
389
390 if (incompatible_clock) {
391 chip->sample_rate = 48000;
392 set_input_clock(chip, ECHO_CLOCK_INTERNAL);
393 }
394
395
396 control_reg = le32_to_cpu(chip->comm_page->control_register);
397 control_reg &= GML_DIGITAL_MODE_CLEAR_MASK;
398
399
400 switch (mode) {
401 case DIGITAL_MODE_SPDIF_OPTICAL:
402 control_reg |= GML_SPDIF_OPTICAL_MODE;
403 break;
404 case DIGITAL_MODE_SPDIF_RCA:
405
406 break;
407 case DIGITAL_MODE_ADAT:
408
409
410 if (chip->asic_code == FW_MONA_361_1_ASIC96 ||
411 chip->asic_code == FW_MONA_301_1_ASIC96) {
412 set_sample_rate(chip, 48000);
413 }
414 control_reg |= GML_ADAT_MODE;
415 control_reg &= ~GML_DOUBLE_SPEED_MODE;
416 break;
417 }
418
419 err = write_control_reg(chip, control_reg, FALSE);
420 spin_unlock_irq(&chip->lock);
421 if (err < 0)
422 return err;
423 chip->digital_mode = mode;
424
425 DE_ACT(("set_digital_mode to %d\n", mode));
426 return incompatible_clock;
427}
428