1 /****************************************************************************
3 Copyright Echo Digital Audio Corporation (c) 1998 - 2004
7 This file is part of Echo Digital Audio's generic driver library.
9 Echo Digital Audio's generic driver library is free software;
10 you can redistribute it and/or modify it under the terms of
11 the GNU General Public License as published by the Free Software Foundation.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston,
23 *************************************************************************
25 Translation from C++ and adaptation for use in ALSA-Driver
26 were made by Giuliano Pochini <pochini@shiny.it>
28 ****************************************************************************/
31 static int write_control_reg(struct echoaudio
*chip
, u32 value
, char force
);
32 static int set_input_clock(struct echoaudio
*chip
, u16 clock
);
33 static int set_professional_spdif(struct echoaudio
*chip
, char prof
);
34 static int set_digital_mode(struct echoaudio
*chip
, u8 mode
);
35 static int load_asic_generic(struct echoaudio
*chip
, u32 cmd
, short asic
);
36 static int check_asic_status(struct echoaudio
*chip
);
39 static int init_hw(struct echoaudio
*chip
, u16 device_id
, u16 subdevice_id
)
43 if (snd_BUG_ON((subdevice_id
& 0xfff0) != LAYLA24
))
46 if ((err
= init_dsp_comm_page(chip
))) {
47 dev_err(chip
->card
->dev
,
48 "init_hw - could not initialize DSP comm page\n");
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
;
61 ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA
|
62 ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL
|
63 ECHOCAPS_HAS_DIGITAL_MODE_ADAT
;
65 if ((err
= load_firmware(chip
)) < 0)
67 chip
->bad_board
= false;
69 if ((err
= init_line_levels(chip
)) < 0)
77 static int set_mixer_defaults(struct echoaudio
*chip
)
79 chip
->digital_mode
= DIGITAL_MODE_SPDIF_RCA
;
80 chip
->professional_spdif
= false;
81 chip
->digital_in_automute
= true;
82 return init_line_levels(chip
);
87 static u32
detect_input_clocks(const struct echoaudio
*chip
)
89 u32 clocks_from_dsp
, clock_bits
;
91 /* Map the DSP clock detect bits to the generic driver clock detect bits */
92 clocks_from_dsp
= le32_to_cpu(chip
->comm_page
->status_clocks
);
94 clock_bits
= ECHO_CLOCK_BIT_INTERNAL
;
96 if (clocks_from_dsp
& GML_CLOCK_DETECT_BIT_SPDIF
)
97 clock_bits
|= ECHO_CLOCK_BIT_SPDIF
;
99 if (clocks_from_dsp
& GML_CLOCK_DETECT_BIT_ADAT
)
100 clock_bits
|= ECHO_CLOCK_BIT_ADAT
;
102 if (clocks_from_dsp
& GML_CLOCK_DETECT_BIT_WORD
)
103 clock_bits
|= ECHO_CLOCK_BIT_WORD
;
110 /* Layla24 has an ASIC on the PCI card and another ASIC in the external box;
111 both need to be loaded. */
112 static int load_asic(struct echoaudio
*chip
)
116 if (chip
->asic_loaded
)
120 /* Give the DSP a few milliseconds to settle down */
123 /* Load the ASIC for the PCI card */
124 err
= load_asic_generic(chip
, DSP_FNC_LOAD_LAYLA24_PCI_CARD_ASIC
,
129 chip
->asic_code
= FW_LAYLA24_2S_ASIC
;
131 /* Now give the new ASIC a little time to set up */
134 /* Do the external one */
135 err
= load_asic_generic(chip
, DSP_FNC_LOAD_LAYLA24_EXTERNAL_ASIC
,
140 /* Now give the external ASIC a little time to set up */
143 /* See if it worked */
144 err
= check_asic_status(chip
);
146 /* Set up the control register if the load succeeded -
147 48 kHz, internal clock, S/PDIF RCA mode */
149 err
= write_control_reg(chip
, GML_CONVERTER_ENABLE
| GML_48KHZ
,
157 static int set_sample_rate(struct echoaudio
*chip
, u32 rate
)
159 u32 control_reg
, clock
, base_rate
;
161 if (snd_BUG_ON(rate
>= 50000 &&
162 chip
->digital_mode
== DIGITAL_MODE_ADAT
))
165 /* Only set the clock for internal mode. */
166 if (chip
->input_clock
!= ECHO_CLOCK_INTERNAL
) {
167 dev_warn(chip
->card
->dev
,
168 "Cannot set sample rate - clock not set to CLK_CLOCKININTERNAL\n");
169 /* Save the rate anyhow */
170 chip
->comm_page
->sample_rate
= cpu_to_le32(rate
);
171 chip
->sample_rate
= rate
;
175 /* Get the control register & clear the appropriate bits */
176 control_reg
= le32_to_cpu(chip
->comm_page
->control_register
);
177 control_reg
&= GML_CLOCK_CLEAR_MASK
& GML_SPDIF_RATE_CLEAR_MASK
;
189 clock
= GML_48KHZ
| GML_SPDIF_SAMPLE_RATE1
;
193 /* Professional mode */
194 if (control_reg
& GML_SPDIF_PRO_MODE
)
195 clock
|= GML_SPDIF_SAMPLE_RATE0
;
198 clock
= GML_32KHZ
| GML_SPDIF_SAMPLE_RATE0
|
199 GML_SPDIF_SAMPLE_RATE1
;
214 /* If this is a non-standard rate, then the driver needs to
215 use Layla24's special "continuous frequency" mode */
216 clock
= LAYLA24_CONTINUOUS_CLOCK
;
218 base_rate
= rate
>> 1;
219 control_reg
|= GML_DOUBLE_SPEED_MODE
;
224 if (base_rate
< 25000)
227 if (wait_handshake(chip
))
230 chip
->comm_page
->sample_rate
=
231 cpu_to_le32(LAYLA24_MAGIC_NUMBER
/ base_rate
- 2);
233 clear_handshake(chip
);
234 send_vector(chip
, DSP_VC_SET_LAYLA24_FREQUENCY_REG
);
237 control_reg
|= clock
;
239 chip
->comm_page
->sample_rate
= cpu_to_le32(rate
); /* ignored by the DSP ? */
240 chip
->sample_rate
= rate
;
241 dev_dbg(chip
->card
->dev
,
242 "set_sample_rate: %d clock %d\n", rate
, control_reg
);
244 return write_control_reg(chip
, control_reg
, false);
249 static int set_input_clock(struct echoaudio
*chip
, u16 clock
)
251 u32 control_reg
, clocks_from_dsp
;
253 /* Mask off the clock select bits */
254 control_reg
= le32_to_cpu(chip
->comm_page
->control_register
) &
255 GML_CLOCK_CLEAR_MASK
;
256 clocks_from_dsp
= le32_to_cpu(chip
->comm_page
->status_clocks
);
258 /* Pick the new clock */
260 case ECHO_CLOCK_INTERNAL
:
261 chip
->input_clock
= ECHO_CLOCK_INTERNAL
;
262 return set_sample_rate(chip
, chip
->sample_rate
);
263 case ECHO_CLOCK_SPDIF
:
264 if (chip
->digital_mode
== DIGITAL_MODE_ADAT
)
266 control_reg
|= GML_SPDIF_CLOCK
;
267 /* Layla24 doesn't support 96KHz S/PDIF */
268 control_reg
&= ~GML_DOUBLE_SPEED_MODE
;
270 case ECHO_CLOCK_WORD
:
271 control_reg
|= GML_WORD_CLOCK
;
272 if (clocks_from_dsp
& GML_CLOCK_DETECT_BIT_WORD96
)
273 control_reg
|= GML_DOUBLE_SPEED_MODE
;
275 control_reg
&= ~GML_DOUBLE_SPEED_MODE
;
277 case ECHO_CLOCK_ADAT
:
278 if (chip
->digital_mode
!= DIGITAL_MODE_ADAT
)
280 control_reg
|= GML_ADAT_CLOCK
;
281 control_reg
&= ~GML_DOUBLE_SPEED_MODE
;
284 dev_err(chip
->card
->dev
,
285 "Input clock 0x%x not supported for Layla24\n", clock
);
289 chip
->input_clock
= clock
;
290 return write_control_reg(chip
, control_reg
, true);
295 /* Depending on what digital mode you want, Layla24 needs different ASICs
296 loaded. This function checks the ASIC needed for the new mode and sees
297 if it matches the one already loaded. */
298 static int switch_asic(struct echoaudio
*chip
, short asic
)
302 /* Check to see if this is already loaded */
303 if (asic
!= chip
->asic_code
) {
304 monitors
= kmemdup(chip
->comm_page
->monitors
,
305 MONITOR_ARRAY_SIZE
, GFP_KERNEL
);
309 memset(chip
->comm_page
->monitors
, ECHOGAIN_MUTED
,
312 /* Load the desired ASIC */
313 if (load_asic_generic(chip
, DSP_FNC_LOAD_LAYLA24_EXTERNAL_ASIC
,
315 memcpy(chip
->comm_page
->monitors
, monitors
,
320 chip
->asic_code
= asic
;
321 memcpy(chip
->comm_page
->monitors
, monitors
, MONITOR_ARRAY_SIZE
);
330 static int dsp_set_digital_mode(struct echoaudio
*chip
, u8 mode
)
333 int err
, incompatible_clock
;
336 /* Set clock to "internal" if it's not compatible with the new mode */
337 incompatible_clock
= false;
339 case DIGITAL_MODE_SPDIF_OPTICAL
:
340 case DIGITAL_MODE_SPDIF_RCA
:
341 if (chip
->input_clock
== ECHO_CLOCK_ADAT
)
342 incompatible_clock
= true;
343 asic
= FW_LAYLA24_2S_ASIC
;
345 case DIGITAL_MODE_ADAT
:
346 if (chip
->input_clock
== ECHO_CLOCK_SPDIF
)
347 incompatible_clock
= true;
348 asic
= FW_LAYLA24_2A_ASIC
;
351 dev_err(chip
->card
->dev
,
352 "Digital mode not supported: %d\n", mode
);
356 if (incompatible_clock
) { /* Switch to 48KHz, internal */
357 chip
->sample_rate
= 48000;
358 spin_lock_irq(&chip
->lock
);
359 set_input_clock(chip
, ECHO_CLOCK_INTERNAL
);
360 spin_unlock_irq(&chip
->lock
);
363 /* switch_asic() can sleep */
364 if (switch_asic(chip
, asic
) < 0)
367 spin_lock_irq(&chip
->lock
);
369 /* Tweak the control register */
370 control_reg
= le32_to_cpu(chip
->comm_page
->control_register
);
371 control_reg
&= GML_DIGITAL_MODE_CLEAR_MASK
;
374 case DIGITAL_MODE_SPDIF_OPTICAL
:
375 control_reg
|= GML_SPDIF_OPTICAL_MODE
;
377 case DIGITAL_MODE_SPDIF_RCA
:
378 /* GML_SPDIF_OPTICAL_MODE bit cleared */
380 case DIGITAL_MODE_ADAT
:
381 control_reg
|= GML_ADAT_MODE
;
382 control_reg
&= ~GML_DOUBLE_SPEED_MODE
;
386 err
= write_control_reg(chip
, control_reg
, true);
387 spin_unlock_irq(&chip
->lock
);
390 chip
->digital_mode
= mode
;
392 dev_dbg(chip
->card
->dev
, "set_digital_mode to %d\n", mode
);
393 return incompatible_clock
;