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
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston,
24 *************************************************************************
26 Translation from C++ and adaptation for use in ALSA-Driver
27 were made by Giuliano Pochini <pochini@shiny.it>
29 ****************************************************************************/
32 static int write_control_reg(struct echoaudio
*chip
, u32 value
, char force
);
33 static int set_input_clock(struct echoaudio
*chip
, u16 clock
);
34 static int set_professional_spdif(struct echoaudio
*chip
, char prof
);
35 static int set_digital_mode(struct echoaudio
*chip
, u8 mode
);
36 static int load_asic_generic(struct echoaudio
*chip
, u32 cmd
, short asic
);
37 static int check_asic_status(struct echoaudio
*chip
);
40 static int init_hw(struct echoaudio
*chip
, u16 device_id
, u16 subdevice_id
)
44 if (snd_BUG_ON((subdevice_id
& 0xfff0) != GINA24
))
47 if ((err
= init_dsp_comm_page(chip
))) {
48 dev_err(chip
->card
->dev
,
49 "init_hw - could not initialize DSP comm page\n");
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_ESYNC
| ECHO_CLOCK_BIT_ESYNC96
|
61 /* Gina24 comes in both '301 and '361 flavors */
62 if (chip
->device_id
== DEVICE_ID_56361
) {
63 chip
->dsp_code_to_load
= FW_GINA24_361_DSP
;
65 ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA
|
66 ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL
|
67 ECHOCAPS_HAS_DIGITAL_MODE_ADAT
;
69 chip
->dsp_code_to_load
= FW_GINA24_301_DSP
;
71 ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA
|
72 ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL
|
73 ECHOCAPS_HAS_DIGITAL_MODE_ADAT
|
74 ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_CDROM
;
77 if ((err
= load_firmware(chip
)) < 0)
79 chip
->bad_board
= false;
86 static int set_mixer_defaults(struct echoaudio
*chip
)
88 chip
->digital_mode
= DIGITAL_MODE_SPDIF_RCA
;
89 chip
->professional_spdif
= false;
90 chip
->digital_in_automute
= true;
91 return init_line_levels(chip
);
96 static u32
detect_input_clocks(const struct echoaudio
*chip
)
98 u32 clocks_from_dsp
, clock_bits
;
100 /* Map the DSP clock detect bits to the generic driver clock
102 clocks_from_dsp
= le32_to_cpu(chip
->comm_page
->status_clocks
);
104 clock_bits
= ECHO_CLOCK_BIT_INTERNAL
;
106 if (clocks_from_dsp
& GML_CLOCK_DETECT_BIT_SPDIF
)
107 clock_bits
|= ECHO_CLOCK_BIT_SPDIF
;
109 if (clocks_from_dsp
& GML_CLOCK_DETECT_BIT_ADAT
)
110 clock_bits
|= ECHO_CLOCK_BIT_ADAT
;
112 if (clocks_from_dsp
& GML_CLOCK_DETECT_BIT_ESYNC
)
113 clock_bits
|= ECHO_CLOCK_BIT_ESYNC
| ECHO_CLOCK_BIT_ESYNC96
;
120 /* Gina24 has an ASIC on the PCI card which must be loaded for anything
121 interesting to happen. */
122 static int load_asic(struct echoaudio
*chip
)
128 if (chip
->asic_loaded
)
131 /* Give the DSP a few milliseconds to settle down */
134 /* Pick the correct ASIC for '301 or '361 Gina24 */
135 if (chip
->device_id
== DEVICE_ID_56361
)
136 asic
= FW_GINA24_361_ASIC
;
138 asic
= FW_GINA24_301_ASIC
;
140 err
= load_asic_generic(chip
, DSP_FNC_LOAD_GINA24_ASIC
, asic
);
144 chip
->asic_code
= asic
;
146 /* Now give the new ASIC a little time to set up */
148 /* See if it worked */
149 err
= check_asic_status(chip
);
151 /* Set up the control register if the load succeeded -
152 48 kHz, internal clock, S/PDIF RCA mode */
154 control_reg
= GML_CONVERTER_ENABLE
| GML_48KHZ
;
155 err
= write_control_reg(chip
, control_reg
, true);
162 static int set_sample_rate(struct echoaudio
*chip
, u32 rate
)
164 u32 control_reg
, clock
;
166 if (snd_BUG_ON(rate
>= 50000 &&
167 chip
->digital_mode
== DIGITAL_MODE_ADAT
))
170 /* Only set the clock for internal mode. */
171 if (chip
->input_clock
!= ECHO_CLOCK_INTERNAL
) {
172 dev_warn(chip
->card
->dev
,
173 "Cannot set sample rate - clock not set to CLK_CLOCKININTERNAL\n");
174 /* Save the rate anyhow */
175 chip
->comm_page
->sample_rate
= cpu_to_le32(rate
);
176 chip
->sample_rate
= rate
;
182 control_reg
= le32_to_cpu(chip
->comm_page
->control_register
);
183 control_reg
&= GML_CLOCK_CLEAR_MASK
& GML_SPDIF_RATE_CLEAR_MASK
;
193 clock
= GML_48KHZ
| GML_SPDIF_SAMPLE_RATE1
;
197 /* Professional mode ? */
198 if (control_reg
& GML_SPDIF_PRO_MODE
)
199 clock
|= GML_SPDIF_SAMPLE_RATE0
;
202 clock
= GML_32KHZ
| GML_SPDIF_SAMPLE_RATE0
|
203 GML_SPDIF_SAMPLE_RATE1
;
218 dev_err(chip
->card
->dev
,
219 "set_sample_rate: %d invalid!\n", rate
);
223 control_reg
|= clock
;
225 chip
->comm_page
->sample_rate
= cpu_to_le32(rate
); /* ignored by the DSP */
226 chip
->sample_rate
= rate
;
227 dev_dbg(chip
->card
->dev
, "set_sample_rate: %d clock %d\n", rate
, clock
);
229 return write_control_reg(chip
, control_reg
, false);
234 static int set_input_clock(struct echoaudio
*chip
, u16 clock
)
236 u32 control_reg
, clocks_from_dsp
;
239 /* Mask off the clock select bits */
240 control_reg
= le32_to_cpu(chip
->comm_page
->control_register
) &
241 GML_CLOCK_CLEAR_MASK
;
242 clocks_from_dsp
= le32_to_cpu(chip
->comm_page
->status_clocks
);
245 case ECHO_CLOCK_INTERNAL
:
246 chip
->input_clock
= ECHO_CLOCK_INTERNAL
;
247 return set_sample_rate(chip
, chip
->sample_rate
);
248 case ECHO_CLOCK_SPDIF
:
249 if (chip
->digital_mode
== DIGITAL_MODE_ADAT
)
251 control_reg
|= GML_SPDIF_CLOCK
;
252 if (clocks_from_dsp
& GML_CLOCK_DETECT_BIT_SPDIF96
)
253 control_reg
|= GML_DOUBLE_SPEED_MODE
;
255 control_reg
&= ~GML_DOUBLE_SPEED_MODE
;
257 case ECHO_CLOCK_ADAT
:
258 if (chip
->digital_mode
!= DIGITAL_MODE_ADAT
)
260 control_reg
|= GML_ADAT_CLOCK
;
261 control_reg
&= ~GML_DOUBLE_SPEED_MODE
;
263 case ECHO_CLOCK_ESYNC
:
264 control_reg
|= GML_ESYNC_CLOCK
;
265 control_reg
&= ~GML_DOUBLE_SPEED_MODE
;
267 case ECHO_CLOCK_ESYNC96
:
268 control_reg
|= GML_ESYNC_CLOCK
| GML_DOUBLE_SPEED_MODE
;
271 dev_err(chip
->card
->dev
,
272 "Input clock 0x%x not supported for Gina24\n", clock
);
276 chip
->input_clock
= clock
;
277 return write_control_reg(chip
, control_reg
, true);
282 static int dsp_set_digital_mode(struct echoaudio
*chip
, u8 mode
)
285 int err
, incompatible_clock
;
287 /* Set clock to "internal" if it's not compatible with the new mode */
288 incompatible_clock
= false;
290 case DIGITAL_MODE_SPDIF_OPTICAL
:
291 case DIGITAL_MODE_SPDIF_CDROM
:
292 case DIGITAL_MODE_SPDIF_RCA
:
293 if (chip
->input_clock
== ECHO_CLOCK_ADAT
)
294 incompatible_clock
= true;
296 case DIGITAL_MODE_ADAT
:
297 if (chip
->input_clock
== ECHO_CLOCK_SPDIF
)
298 incompatible_clock
= true;
301 dev_err(chip
->card
->dev
,
302 "Digital mode not supported: %d\n", mode
);
306 spin_lock_irq(&chip
->lock
);
308 if (incompatible_clock
) { /* Switch to 48KHz, internal */
309 chip
->sample_rate
= 48000;
310 set_input_clock(chip
, ECHO_CLOCK_INTERNAL
);
313 /* Clear the current digital mode */
314 control_reg
= le32_to_cpu(chip
->comm_page
->control_register
);
315 control_reg
&= GML_DIGITAL_MODE_CLEAR_MASK
;
317 /* Tweak the control reg */
319 case DIGITAL_MODE_SPDIF_OPTICAL
:
320 control_reg
|= GML_SPDIF_OPTICAL_MODE
;
322 case DIGITAL_MODE_SPDIF_CDROM
:
323 /* '361 Gina24 cards do not have the S/PDIF CD-ROM mode */
324 if (chip
->device_id
== DEVICE_ID_56301
)
325 control_reg
|= GML_SPDIF_CDROM_MODE
;
327 case DIGITAL_MODE_SPDIF_RCA
:
328 /* GML_SPDIF_OPTICAL_MODE bit cleared */
330 case DIGITAL_MODE_ADAT
:
331 control_reg
|= GML_ADAT_MODE
;
332 control_reg
&= ~GML_DOUBLE_SPEED_MODE
;
336 err
= write_control_reg(chip
, control_reg
, true);
337 spin_unlock_irq(&chip
->lock
);
340 chip
->digital_mode
= mode
;
342 dev_dbg(chip
->card
->dev
,
343 "set_digital_mode to %d\n", chip
->digital_mode
);
344 return incompatible_clock
;