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