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 if (snd_BUG_ON((subdevice_id & 0xfff0) != MONA))
45 return -ENODEV;
46
47 if ((err = init_dsp_comm_page(chip))) {
48 dev_err(chip->card->dev,
49 "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 return err;
75}
76
77
78
79static int set_mixer_defaults(struct echoaudio *chip)
80{
81 chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
82 chip->professional_spdif = FALSE;
83 chip->digital_in_automute = TRUE;
84 return init_line_levels(chip);
85}
86
87
88
89static u32 detect_input_clocks(const struct echoaudio *chip)
90{
91 u32 clocks_from_dsp, clock_bits;
92
93
94
95 clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
96
97 clock_bits = ECHO_CLOCK_BIT_INTERNAL;
98
99 if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_SPDIF)
100 clock_bits |= ECHO_CLOCK_BIT_SPDIF;
101
102 if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_ADAT)
103 clock_bits |= ECHO_CLOCK_BIT_ADAT;
104
105 if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_WORD)
106 clock_bits |= ECHO_CLOCK_BIT_WORD;
107
108 return clock_bits;
109}
110
111
112
113
114
115static int load_asic(struct echoaudio *chip)
116{
117 u32 control_reg;
118 int err;
119 short asic;
120
121 if (chip->asic_loaded)
122 return 0;
123
124 mdelay(10);
125
126 if (chip->device_id == DEVICE_ID_56361)
127 asic = FW_MONA_361_1_ASIC48;
128 else
129 asic = FW_MONA_301_1_ASIC48;
130
131 err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC, asic);
132 if (err < 0)
133 return err;
134
135 chip->asic_code = asic;
136 mdelay(10);
137
138
139 err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_EXTERNAL_ASIC,
140 FW_MONA_2_ASIC);
141 if (err < 0)
142 return err;
143
144 mdelay(10);
145 err = check_asic_status(chip);
146
147
148
149 if (!err) {
150 control_reg = GML_CONVERTER_ENABLE | GML_48KHZ;
151 err = write_control_reg(chip, control_reg, TRUE);
152 }
153
154 return err;
155}
156
157
158
159
160
161
162static int switch_asic(struct echoaudio *chip, char double_speed)
163{
164 int err;
165 short asic;
166
167
168
169
170 if (chip->device_id == DEVICE_ID_56361) {
171 if (double_speed)
172 asic = FW_MONA_361_1_ASIC96;
173 else
174 asic = FW_MONA_361_1_ASIC48;
175 } else {
176 if (double_speed)
177 asic = FW_MONA_301_1_ASIC96;
178 else
179 asic = FW_MONA_301_1_ASIC48;
180 }
181
182 if (asic != chip->asic_code) {
183
184 err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC,
185 asic);
186 if (err < 0)
187 return err;
188 chip->asic_code = asic;
189 }
190
191 return 0;
192}
193
194
195
196static int set_sample_rate(struct echoaudio *chip, u32 rate)
197{
198 u32 control_reg, clock;
199 short asic;
200 char force_write;
201
202
203 if (chip->input_clock != ECHO_CLOCK_INTERNAL) {
204 dev_dbg(chip->card->dev,
205 "Cannot set sample rate - clock not set to CLK_CLOCKININTERNAL\n");
206
207 chip->comm_page->sample_rate = cpu_to_le32(rate);
208 chip->sample_rate = rate;
209 return 0;
210 }
211
212
213 if (rate >= 88200) {
214 if (chip->digital_mode == DIGITAL_MODE_ADAT)
215 return -EINVAL;
216 if (chip->device_id == DEVICE_ID_56361)
217 asic = FW_MONA_361_1_ASIC96;
218 else
219 asic = FW_MONA_301_1_ASIC96;
220 } else {
221 if (chip->device_id == DEVICE_ID_56361)
222 asic = FW_MONA_361_1_ASIC48;
223 else
224 asic = FW_MONA_301_1_ASIC48;
225 }
226
227 force_write = 0;
228 if (asic != chip->asic_code) {
229 int err;
230
231 spin_unlock_irq(&chip->lock);
232 err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC,
233 asic);
234 spin_lock_irq(&chip->lock);
235
236 if (err < 0)
237 return err;
238 chip->asic_code = asic;
239 force_write = 1;
240 }
241
242
243 clock = 0;
244 control_reg = le32_to_cpu(chip->comm_page->control_register);
245 control_reg &= GML_CLOCK_CLEAR_MASK;
246 control_reg &= GML_SPDIF_RATE_CLEAR_MASK;
247
248 switch (rate) {
249 case 96000:
250 clock = GML_96KHZ;
251 break;
252 case 88200:
253 clock = GML_88KHZ;
254 break;
255 case 48000:
256 clock = GML_48KHZ | GML_SPDIF_SAMPLE_RATE1;
257 break;
258 case 44100:
259 clock = GML_44KHZ;
260
261 if (control_reg & GML_SPDIF_PRO_MODE)
262 clock |= GML_SPDIF_SAMPLE_RATE0;
263 break;
264 case 32000:
265 clock = GML_32KHZ | GML_SPDIF_SAMPLE_RATE0 |
266 GML_SPDIF_SAMPLE_RATE1;
267 break;
268 case 22050:
269 clock = GML_22KHZ;
270 break;
271 case 16000:
272 clock = GML_16KHZ;
273 break;
274 case 11025:
275 clock = GML_11KHZ;
276 break;
277 case 8000:
278 clock = GML_8KHZ;
279 break;
280 default:
281 dev_err(chip->card->dev,
282 "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 dev_dbg(chip->card->dev,
291 "set_sample_rate: %d clock %d\n", rate, clock);
292
293 return write_control_reg(chip, control_reg, force_write);
294}
295
296
297
298static int set_input_clock(struct echoaudio *chip, u16 clock)
299{
300 u32 control_reg, clocks_from_dsp;
301 int err;
302
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 chip->input_clock = ECHO_CLOCK_INTERNAL;
316 return set_sample_rate(chip, chip->sample_rate);
317 case ECHO_CLOCK_SPDIF:
318 if (chip->digital_mode == DIGITAL_MODE_ADAT)
319 return -EAGAIN;
320 spin_unlock_irq(&chip->lock);
321 err = switch_asic(chip, clocks_from_dsp &
322 GML_CLOCK_DETECT_BIT_SPDIF96);
323 spin_lock_irq(&chip->lock);
324 if (err < 0)
325 return err;
326 control_reg |= GML_SPDIF_CLOCK;
327 if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_SPDIF96)
328 control_reg |= GML_DOUBLE_SPEED_MODE;
329 else
330 control_reg &= ~GML_DOUBLE_SPEED_MODE;
331 break;
332 case ECHO_CLOCK_WORD:
333 spin_unlock_irq(&chip->lock);
334 err = switch_asic(chip, clocks_from_dsp &
335 GML_CLOCK_DETECT_BIT_WORD96);
336 spin_lock_irq(&chip->lock);
337 if (err < 0)
338 return err;
339 control_reg |= GML_WORD_CLOCK;
340 if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_WORD96)
341 control_reg |= GML_DOUBLE_SPEED_MODE;
342 else
343 control_reg &= ~GML_DOUBLE_SPEED_MODE;
344 break;
345 case ECHO_CLOCK_ADAT:
346 dev_dbg(chip->card->dev, "Set Mona clock to ADAT\n");
347 if (chip->digital_mode != DIGITAL_MODE_ADAT)
348 return -EAGAIN;
349 control_reg |= GML_ADAT_CLOCK;
350 control_reg &= ~GML_DOUBLE_SPEED_MODE;
351 break;
352 default:
353 dev_err(chip->card->dev,
354 "Input clock 0x%x not supported for Mona\n", clock);
355 return -EINVAL;
356 }
357
358 chip->input_clock = clock;
359 return write_control_reg(chip, control_reg, TRUE);
360}
361
362
363
364static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
365{
366 u32 control_reg;
367 int err, incompatible_clock;
368
369
370 incompatible_clock = FALSE;
371 switch (mode) {
372 case DIGITAL_MODE_SPDIF_OPTICAL:
373 case DIGITAL_MODE_SPDIF_RCA:
374 if (chip->input_clock == ECHO_CLOCK_ADAT)
375 incompatible_clock = TRUE;
376 break;
377 case DIGITAL_MODE_ADAT:
378 if (chip->input_clock == ECHO_CLOCK_SPDIF)
379 incompatible_clock = TRUE;
380 break;
381 default:
382 dev_err(chip->card->dev,
383 "Digital mode not supported: %d\n", mode);
384 return -EINVAL;
385 }
386
387 spin_lock_irq(&chip->lock);
388
389 if (incompatible_clock) {
390 chip->sample_rate = 48000;
391 set_input_clock(chip, ECHO_CLOCK_INTERNAL);
392 }
393
394
395 control_reg = le32_to_cpu(chip->comm_page->control_register);
396 control_reg &= GML_DIGITAL_MODE_CLEAR_MASK;
397
398
399 switch (mode) {
400 case DIGITAL_MODE_SPDIF_OPTICAL:
401 control_reg |= GML_SPDIF_OPTICAL_MODE;
402 break;
403 case DIGITAL_MODE_SPDIF_RCA:
404
405 break;
406 case DIGITAL_MODE_ADAT:
407
408
409 if (chip->asic_code == FW_MONA_361_1_ASIC96 ||
410 chip->asic_code == FW_MONA_301_1_ASIC96) {
411 set_sample_rate(chip, 48000);
412 }
413 control_reg |= GML_ADAT_MODE;
414 control_reg &= ~GML_DOUBLE_SPEED_MODE;
415 break;
416 }
417
418 err = write_control_reg(chip, control_reg, FALSE);
419 spin_unlock_irq(&chip->lock);
420 if (err < 0)
421 return err;
422 chip->digital_mode = mode;
423
424 dev_dbg(chip->card->dev, "set_digital_mode to %d\n", mode);
425 return incompatible_clock;
426}
427