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
,
37 const struct firmware
*asic
);
38 static int check_asic_status(struct echoaudio
*chip
);
41 static int init_hw(struct echoaudio
*chip
, u16 device_id
, u16 subdevice_id
)
45 DE_INIT(("init_hw() - Mona\n"));
46 if (snd_BUG_ON((subdevice_id
& 0xfff0) != MONA
))
49 if ((err
= init_dsp_comm_page(chip
))) {
50 DE_INIT(("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
= &card_fw
[FW_MONA_361_DSP
];
69 chip
->dsp_code_to_load
= &card_fw
[FW_MONA_301_DSP
];
71 chip
->digital_mode
= DIGITAL_MODE_SPDIF_RCA
;
72 chip
->professional_spdif
= FALSE
;
73 chip
->digital_in_automute
= TRUE
;
75 if ((err
= load_firmware(chip
)) < 0)
77 chip
->bad_board
= FALSE
;
79 if ((err
= init_line_levels(chip
)) < 0)
82 err
= set_digital_mode(chip
, DIGITAL_MODE_SPDIF_RCA
);
85 err
= set_professional_spdif(chip
, TRUE
);
87 DE_INIT(("init_hw done\n"));
93 static u32
detect_input_clocks(const struct echoaudio
*chip
)
95 u32 clocks_from_dsp
, clock_bits
;
97 /* Map the DSP clock detect bits to the generic driver clock
99 clocks_from_dsp
= le32_to_cpu(chip
->comm_page
->status_clocks
);
101 clock_bits
= ECHO_CLOCK_BIT_INTERNAL
;
103 if (clocks_from_dsp
& GML_CLOCK_DETECT_BIT_SPDIF
)
104 clock_bits
|= ECHO_CLOCK_BIT_SPDIF
;
106 if (clocks_from_dsp
& GML_CLOCK_DETECT_BIT_ADAT
)
107 clock_bits
|= ECHO_CLOCK_BIT_ADAT
;
109 if (clocks_from_dsp
& GML_CLOCK_DETECT_BIT_WORD
)
110 clock_bits
|= ECHO_CLOCK_BIT_WORD
;
117 /* Mona has an ASIC on the PCI card and another ASIC in the external box;
118 both need to be loaded. */
119 static int load_asic(struct echoaudio
*chip
)
123 const struct firmware
*asic
;
125 if (chip
->asic_loaded
)
130 if (chip
->device_id
== DEVICE_ID_56361
)
131 asic
= &card_fw
[FW_MONA_361_1_ASIC48
];
133 asic
= &card_fw
[FW_MONA_301_1_ASIC48
];
135 err
= load_asic_generic(chip
, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC
, asic
);
139 chip
->asic_code
= asic
;
142 /* Do the external one */
143 err
= load_asic_generic(chip
, DSP_FNC_LOAD_MONA_EXTERNAL_ASIC
,
144 &card_fw
[FW_MONA_2_ASIC
]);
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
);
163 /* Depending on what digital mode you want, Mona needs different ASICs
164 loaded. This function checks the ASIC needed for the new mode and sees
165 if it matches the one already loaded. */
166 static int switch_asic(struct echoaudio
*chip
, char double_speed
)
168 const struct firmware
*asic
;
171 /* Check the clock detect bits to see if this is
172 a single-speed clock or a double-speed clock; load
173 a new ASIC if necessary. */
174 if (chip
->device_id
== DEVICE_ID_56361
) {
176 asic
= &card_fw
[FW_MONA_361_1_ASIC96
];
178 asic
= &card_fw
[FW_MONA_361_1_ASIC48
];
181 asic
= &card_fw
[FW_MONA_301_1_ASIC96
];
183 asic
= &card_fw
[FW_MONA_301_1_ASIC48
];
186 if (asic
!= chip
->asic_code
) {
187 /* Load the desired ASIC */
188 err
= load_asic_generic(chip
, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC
,
192 chip
->asic_code
= asic
;
200 static int set_sample_rate(struct echoaudio
*chip
, u32 rate
)
202 u32 control_reg
, clock
;
203 const struct firmware
*asic
;
206 /* Only set the clock for internal mode. */
207 if (chip
->input_clock
!= ECHO_CLOCK_INTERNAL
) {
208 DE_ACT(("set_sample_rate: Cannot set sample rate - "
209 "clock not set to CLK_CLOCKININTERNAL\n"));
210 /* Save the rate anyhow */
211 chip
->comm_page
->sample_rate
= cpu_to_le32(rate
);
212 chip
->sample_rate
= rate
;
216 /* Now, check to see if the required ASIC is loaded */
218 if (chip
->digital_mode
== DIGITAL_MODE_ADAT
)
220 if (chip
->device_id
== DEVICE_ID_56361
)
221 asic
= &card_fw
[FW_MONA_361_1_ASIC96
];
223 asic
= &card_fw
[FW_MONA_301_1_ASIC96
];
225 if (chip
->device_id
== DEVICE_ID_56361
)
226 asic
= &card_fw
[FW_MONA_361_1_ASIC48
];
228 asic
= &card_fw
[FW_MONA_301_1_ASIC48
];
232 if (asic
!= chip
->asic_code
) {
234 /* Load the desired ASIC (load_asic_generic() can sleep) */
235 spin_unlock_irq(&chip
->lock
);
236 err
= load_asic_generic(chip
, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC
,
238 spin_lock_irq(&chip
->lock
);
242 chip
->asic_code
= asic
;
246 /* Compute the new control register value */
248 control_reg
= le32_to_cpu(chip
->comm_page
->control_register
);
249 control_reg
&= GML_CLOCK_CLEAR_MASK
;
250 control_reg
&= GML_SPDIF_RATE_CLEAR_MASK
;
260 clock
= GML_48KHZ
| GML_SPDIF_SAMPLE_RATE1
;
264 /* Professional mode */
265 if (control_reg
& GML_SPDIF_PRO_MODE
)
266 clock
|= GML_SPDIF_SAMPLE_RATE0
;
269 clock
= GML_32KHZ
| GML_SPDIF_SAMPLE_RATE0
|
270 GML_SPDIF_SAMPLE_RATE1
;
285 DE_ACT(("set_sample_rate: %d invalid!\n", rate
));
289 control_reg
|= clock
;
291 chip
->comm_page
->sample_rate
= cpu_to_le32(rate
); /* ignored by the DSP */
292 chip
->sample_rate
= rate
;
293 DE_ACT(("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 DE_ACT(("set_input_clock:\n"));
307 /* Prevent two simultaneous calls to switch_asic() */
308 if (atomic_read(&chip
->opencount
))
311 /* Mask off the clock select bits */
312 control_reg
= le32_to_cpu(chip
->comm_page
->control_register
) &
313 GML_CLOCK_CLEAR_MASK
;
314 clocks_from_dsp
= le32_to_cpu(chip
->comm_page
->status_clocks
);
317 case ECHO_CLOCK_INTERNAL
:
318 DE_ACT(("Set Mona clock to INTERNAL\n"));
319 chip
->input_clock
= ECHO_CLOCK_INTERNAL
;
320 return set_sample_rate(chip
, chip
->sample_rate
);
321 case ECHO_CLOCK_SPDIF
:
322 if (chip
->digital_mode
== DIGITAL_MODE_ADAT
)
324 spin_unlock_irq(&chip
->lock
);
325 err
= switch_asic(chip
, clocks_from_dsp
&
326 GML_CLOCK_DETECT_BIT_SPDIF96
);
327 spin_lock_irq(&chip
->lock
);
330 DE_ACT(("Set Mona clock to SPDIF\n"));
331 control_reg
|= GML_SPDIF_CLOCK
;
332 if (clocks_from_dsp
& GML_CLOCK_DETECT_BIT_SPDIF96
)
333 control_reg
|= GML_DOUBLE_SPEED_MODE
;
335 control_reg
&= ~GML_DOUBLE_SPEED_MODE
;
337 case ECHO_CLOCK_WORD
:
338 DE_ACT(("Set Mona clock to WORD\n"));
339 spin_unlock_irq(&chip
->lock
);
340 err
= switch_asic(chip
, clocks_from_dsp
&
341 GML_CLOCK_DETECT_BIT_WORD96
);
342 spin_lock_irq(&chip
->lock
);
345 control_reg
|= GML_WORD_CLOCK
;
346 if (clocks_from_dsp
& GML_CLOCK_DETECT_BIT_WORD96
)
347 control_reg
|= GML_DOUBLE_SPEED_MODE
;
349 control_reg
&= ~GML_DOUBLE_SPEED_MODE
;
351 case ECHO_CLOCK_ADAT
:
352 DE_ACT(("Set Mona clock to ADAT\n"));
353 if (chip
->digital_mode
!= DIGITAL_MODE_ADAT
)
355 control_reg
|= GML_ADAT_CLOCK
;
356 control_reg
&= ~GML_DOUBLE_SPEED_MODE
;
359 DE_ACT(("Input clock 0x%x not supported for Mona\n", clock
));
363 chip
->input_clock
= clock
;
364 return write_control_reg(chip
, control_reg
, TRUE
);
369 static int dsp_set_digital_mode(struct echoaudio
*chip
, u8 mode
)
372 int err
, incompatible_clock
;
374 /* Set clock to "internal" if it's not compatible with the new mode */
375 incompatible_clock
= FALSE
;
377 case DIGITAL_MODE_SPDIF_OPTICAL
:
378 case DIGITAL_MODE_SPDIF_RCA
:
379 if (chip
->input_clock
== ECHO_CLOCK_ADAT
)
380 incompatible_clock
= TRUE
;
382 case DIGITAL_MODE_ADAT
:
383 if (chip
->input_clock
== ECHO_CLOCK_SPDIF
)
384 incompatible_clock
= TRUE
;
387 DE_ACT(("Digital mode not supported: %d\n", mode
));
391 spin_lock_irq(&chip
->lock
);
393 if (incompatible_clock
) { /* Switch to 48KHz, internal */
394 chip
->sample_rate
= 48000;
395 set_input_clock(chip
, ECHO_CLOCK_INTERNAL
);
398 /* Clear the current digital mode */
399 control_reg
= le32_to_cpu(chip
->comm_page
->control_register
);
400 control_reg
&= GML_DIGITAL_MODE_CLEAR_MASK
;
402 /* Tweak the control reg */
404 case DIGITAL_MODE_SPDIF_OPTICAL
:
405 control_reg
|= GML_SPDIF_OPTICAL_MODE
;
407 case DIGITAL_MODE_SPDIF_RCA
:
408 /* GML_SPDIF_OPTICAL_MODE bit cleared */
410 case DIGITAL_MODE_ADAT
:
411 /* If the current ASIC is the 96KHz ASIC, switch the ASIC
413 if (chip
->asic_code
== &card_fw
[FW_MONA_361_1_ASIC96
] ||
414 chip
->asic_code
== &card_fw
[FW_MONA_301_1_ASIC96
]) {
415 set_sample_rate(chip
, 48000);
417 control_reg
|= GML_ADAT_MODE
;
418 control_reg
&= ~GML_DOUBLE_SPEED_MODE
;
422 err
= write_control_reg(chip
, control_reg
, FALSE
);
423 spin_unlock_irq(&chip
->lock
);
426 chip
->digital_mode
= mode
;
428 DE_ACT(("set_digital_mode to %d\n", mode
));
429 return incompatible_clock
;