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) != MONA))
47 err = init_dsp_comm_page(chip);
49 dev_err(chip->card->dev,
50 "init_hw - could not initialize DSP comm page\n");
54 chip->device_id = device_id;
55 chip->subdevice_id = subdevice_id;
56 chip->bad_board = true;
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 /* Mona comes in both '301 and '361 flavors */
66 if (chip->device_id == DEVICE_ID_56361)
67 chip->dsp_code_to_load = FW_MONA_361_DSP;
69 chip->dsp_code_to_load = FW_MONA_301_DSP;
71 err = load_firmware(chip);
74 chip->bad_board = false;
81 static int set_mixer_defaults(struct echoaudio *chip)
83 chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
84 chip->professional_spdif = false;
85 chip->digital_in_automute = true;
86 return init_line_levels(chip);
91 static u32 detect_input_clocks(const struct echoaudio *chip)
93 u32 clocks_from_dsp, clock_bits;
95 /* Map the DSP clock detect bits to the generic driver clock
97 clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
99 clock_bits = ECHO_CLOCK_BIT_INTERNAL;
101 if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_SPDIF)
102 clock_bits |= ECHO_CLOCK_BIT_SPDIF;
104 if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_ADAT)
105 clock_bits |= ECHO_CLOCK_BIT_ADAT;
107 if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_WORD)
108 clock_bits |= ECHO_CLOCK_BIT_WORD;
115 /* Mona has an ASIC on the PCI card and another ASIC in the external box;
116 both need to be loaded. */
117 static int load_asic(struct echoaudio *chip)
123 if (chip->asic_loaded)
128 if (chip->device_id == DEVICE_ID_56361)
129 asic = FW_MONA_361_1_ASIC48;
131 asic = FW_MONA_301_1_ASIC48;
133 err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC, asic);
137 chip->asic_code = asic;
140 /* Do the external one */
141 err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_EXTERNAL_ASIC,
147 err = check_asic_status(chip);
149 /* Set up the control register if the load succeeded -
150 48 kHz, internal clock, S/PDIF RCA mode */
152 control_reg = GML_CONVERTER_ENABLE | GML_48KHZ;
153 err = write_control_reg(chip, control_reg, true);
161 /* Depending on what digital mode you want, Mona needs different ASICs
162 loaded. This function checks the ASIC needed for the new mode and sees
163 if it matches the one already loaded. */
164 static int switch_asic(struct echoaudio *chip, char double_speed)
169 /* Check the clock detect bits to see if this is
170 a single-speed clock or a double-speed clock; load
171 a new ASIC if necessary. */
172 if (chip->device_id == DEVICE_ID_56361) {
174 asic = FW_MONA_361_1_ASIC96;
176 asic = FW_MONA_361_1_ASIC48;
179 asic = FW_MONA_301_1_ASIC96;
181 asic = FW_MONA_301_1_ASIC48;
184 if (asic != chip->asic_code) {
185 /* Load the desired ASIC */
186 err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC,
190 chip->asic_code = asic;
198 static int set_sample_rate(struct echoaudio *chip, u32 rate)
200 u32 control_reg, clock;
204 /* Only set the clock for internal mode. */
205 if (chip->input_clock != ECHO_CLOCK_INTERNAL) {
206 dev_dbg(chip->card->dev,
207 "Cannot set sample rate - clock not set to CLK_CLOCKININTERNAL\n");
208 /* Save the rate anyhow */
209 chip->comm_page->sample_rate = cpu_to_le32(rate);
210 chip->sample_rate = rate;
214 /* Now, check to see if the required ASIC is loaded */
216 if (chip->digital_mode == DIGITAL_MODE_ADAT)
218 if (chip->device_id == DEVICE_ID_56361)
219 asic = FW_MONA_361_1_ASIC96;
221 asic = FW_MONA_301_1_ASIC96;
223 if (chip->device_id == DEVICE_ID_56361)
224 asic = FW_MONA_361_1_ASIC48;
226 asic = FW_MONA_301_1_ASIC48;
230 if (asic != chip->asic_code) {
232 /* Load the desired ASIC (load_asic_generic() can sleep) */
233 spin_unlock_irq(&chip->lock);
234 err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC,
236 spin_lock_irq(&chip->lock);
240 chip->asic_code = asic;
244 /* Compute the new control register value */
246 control_reg = le32_to_cpu(chip->comm_page->control_register);
247 control_reg &= GML_CLOCK_CLEAR_MASK;
248 control_reg &= GML_SPDIF_RATE_CLEAR_MASK;
258 clock = GML_48KHZ | GML_SPDIF_SAMPLE_RATE1;
262 /* Professional mode */
263 if (control_reg & GML_SPDIF_PRO_MODE)
264 clock |= GML_SPDIF_SAMPLE_RATE0;
267 clock = GML_32KHZ | GML_SPDIF_SAMPLE_RATE0 |
268 GML_SPDIF_SAMPLE_RATE1;
283 dev_err(chip->card->dev,
284 "set_sample_rate: %d invalid!\n", rate);
288 control_reg |= clock;
290 chip->comm_page->sample_rate = cpu_to_le32(rate); /* ignored by the DSP */
291 chip->sample_rate = rate;
292 dev_dbg(chip->card->dev,
293 "set_sample_rate: %d clock %d\n", rate, clock);
295 return write_control_reg(chip, control_reg, force_write);
300 static int set_input_clock(struct echoaudio *chip, u16 clock)
302 u32 control_reg, clocks_from_dsp;
305 /* Mask off the clock select bits */
306 control_reg = le32_to_cpu(chip->comm_page->control_register) &
307 GML_CLOCK_CLEAR_MASK;
308 clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
311 case ECHO_CLOCK_INTERNAL:
312 chip->input_clock = ECHO_CLOCK_INTERNAL;
313 return set_sample_rate(chip, chip->sample_rate);
314 case ECHO_CLOCK_SPDIF:
315 if (chip->digital_mode == DIGITAL_MODE_ADAT)
317 spin_unlock_irq(&chip->lock);
318 err = switch_asic(chip, clocks_from_dsp &
319 GML_CLOCK_DETECT_BIT_SPDIF96);
320 spin_lock_irq(&chip->lock);
323 control_reg |= GML_SPDIF_CLOCK;
324 if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_SPDIF96)
325 control_reg |= GML_DOUBLE_SPEED_MODE;
327 control_reg &= ~GML_DOUBLE_SPEED_MODE;
329 case ECHO_CLOCK_WORD:
330 spin_unlock_irq(&chip->lock);
331 err = switch_asic(chip, clocks_from_dsp &
332 GML_CLOCK_DETECT_BIT_WORD96);
333 spin_lock_irq(&chip->lock);
336 control_reg |= GML_WORD_CLOCK;
337 if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_WORD96)
338 control_reg |= GML_DOUBLE_SPEED_MODE;
340 control_reg &= ~GML_DOUBLE_SPEED_MODE;
342 case ECHO_CLOCK_ADAT:
343 dev_dbg(chip->card->dev, "Set Mona clock to ADAT\n");
344 if (chip->digital_mode != DIGITAL_MODE_ADAT)
346 control_reg |= GML_ADAT_CLOCK;
347 control_reg &= ~GML_DOUBLE_SPEED_MODE;
350 dev_err(chip->card->dev,
351 "Input clock 0x%x not supported for Mona\n", clock);
355 chip->input_clock = clock;
356 return write_control_reg(chip, control_reg, true);
361 static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
364 int err, incompatible_clock;
366 /* Set clock to "internal" if it's not compatible with the new mode */
367 incompatible_clock = false;
369 case DIGITAL_MODE_SPDIF_OPTICAL:
370 case DIGITAL_MODE_SPDIF_RCA:
371 if (chip->input_clock == ECHO_CLOCK_ADAT)
372 incompatible_clock = true;
374 case DIGITAL_MODE_ADAT:
375 if (chip->input_clock == ECHO_CLOCK_SPDIF)
376 incompatible_clock = true;
379 dev_err(chip->card->dev,
380 "Digital mode not supported: %d\n", mode);
384 spin_lock_irq(&chip->lock);
386 if (incompatible_clock) { /* Switch to 48KHz, internal */
387 chip->sample_rate = 48000;
388 set_input_clock(chip, ECHO_CLOCK_INTERNAL);
391 /* Clear the current digital mode */
392 control_reg = le32_to_cpu(chip->comm_page->control_register);
393 control_reg &= GML_DIGITAL_MODE_CLEAR_MASK;
395 /* Tweak the control reg */
397 case DIGITAL_MODE_SPDIF_OPTICAL:
398 control_reg |= GML_SPDIF_OPTICAL_MODE;
400 case DIGITAL_MODE_SPDIF_RCA:
401 /* GML_SPDIF_OPTICAL_MODE bit cleared */
403 case DIGITAL_MODE_ADAT:
404 /* If the current ASIC is the 96KHz ASIC, switch the ASIC
406 if (chip->asic_code == FW_MONA_361_1_ASIC96 ||
407 chip->asic_code == FW_MONA_301_1_ASIC96) {
408 set_sample_rate(chip, 48000);
410 control_reg |= GML_ADAT_MODE;
411 control_reg &= ~GML_DOUBLE_SPEED_MODE;
415 err = write_control_reg(chip, control_reg, false);
416 spin_unlock_irq(&chip->lock);
419 chip->digital_mode = mode;
421 dev_dbg(chip->card->dev, "set_digital_mode to %d\n", mode);
422 return incompatible_clock;