• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/sound/pci/echoaudio/
1/****************************************************************************
2
3   Copyright Echo Digital Audio Corporation (c) 1998 - 2004
4   All rights reserved
5   www.echoaudio.com
6
7   This file is part of Echo Digital Audio's generic driver library.
8
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
12   Foundation.
13
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.
18
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,
22   MA  02111-1307, USA.
23
24   *************************************************************************
25
26 Translation from C++ and adaptation for use in ALSA-Driver
27 were made by Giuliano Pochini <pochini@shiny.it>
28
29****************************************************************************/
30
31
32static int write_control_reg(struct echoaudio *chip, u32 value, char force);
33static int set_input_clock(struct echoaudio *chip, u16 clock);
34static int set_professional_spdif(struct echoaudio *chip, char prof);
35static int set_digital_mode(struct echoaudio *chip, u8 mode);
36static int load_asic_generic(struct echoaudio *chip, u32 cmd, short asic);
37static int check_asic_status(struct echoaudio *chip);
38
39
40static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
41{
42	int err;
43
44	DE_INIT(("init_hw() - Gina24\n"));
45	if (snd_BUG_ON((subdevice_id & 0xfff0) != GINA24))
46		return -ENODEV;
47
48	if ((err = init_dsp_comm_page(chip))) {
49		DE_INIT(("init_hw - could not initialize DSP comm page\n"));
50		return err;
51	}
52
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 |
59		ECHO_CLOCK_BIT_ADAT;
60
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;
64		chip->digital_modes =
65			ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA |
66			ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL |
67			ECHOCAPS_HAS_DIGITAL_MODE_ADAT;
68	} else {
69		chip->dsp_code_to_load = FW_GINA24_301_DSP;
70		chip->digital_modes =
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;
75	}
76
77	if ((err = load_firmware(chip)) < 0)
78		return err;
79	chip->bad_board = FALSE;
80
81	DE_INIT(("init_hw done\n"));
82	return err;
83}
84
85
86
87static int set_mixer_defaults(struct echoaudio *chip)
88{
89	chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
90	chip->professional_spdif = FALSE;
91	chip->digital_in_automute = TRUE;
92	return init_line_levels(chip);
93}
94
95
96
97static u32 detect_input_clocks(const struct echoaudio *chip)
98{
99	u32 clocks_from_dsp, clock_bits;
100
101	/* Map the DSP clock detect bits to the generic driver clock
102	   detect bits */
103	clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
104
105	clock_bits = ECHO_CLOCK_BIT_INTERNAL;
106
107	if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_SPDIF)
108		clock_bits |= ECHO_CLOCK_BIT_SPDIF;
109
110	if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_ADAT)
111		clock_bits |= ECHO_CLOCK_BIT_ADAT;
112
113	if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_ESYNC)
114		clock_bits |= ECHO_CLOCK_BIT_ESYNC | ECHO_CLOCK_BIT_ESYNC96;
115
116	return clock_bits;
117}
118
119
120
121/* Gina24 has an ASIC on the PCI card which must be loaded for anything
122interesting to happen. */
123static int load_asic(struct echoaudio *chip)
124{
125	u32 control_reg;
126	int err;
127	short asic;
128
129	if (chip->asic_loaded)
130		return 1;
131
132	/* Give the DSP a few milliseconds to settle down */
133	mdelay(10);
134
135	/* Pick the correct ASIC for '301 or '361 Gina24 */
136	if (chip->device_id == DEVICE_ID_56361)
137		asic = FW_GINA24_361_ASIC;
138	else
139		asic = FW_GINA24_301_ASIC;
140
141	err = load_asic_generic(chip, DSP_FNC_LOAD_GINA24_ASIC, asic);
142	if (err < 0)
143		return err;
144
145	chip->asic_code = asic;
146
147	/* Now give the new ASIC a little time to set up */
148	mdelay(10);
149	/* See if it worked */
150	err = check_asic_status(chip);
151
152	/* Set up the control register if the load succeeded -
153	   48 kHz, internal clock, S/PDIF RCA mode */
154	if (!err) {
155		control_reg = GML_CONVERTER_ENABLE | GML_48KHZ;
156		err = write_control_reg(chip, control_reg, TRUE);
157	}
158	DE_INIT(("load_asic() done\n"));
159	return err;
160}
161
162
163
164static int set_sample_rate(struct echoaudio *chip, u32 rate)
165{
166	u32 control_reg, clock;
167
168	if (snd_BUG_ON(rate >= 50000 &&
169		       chip->digital_mode == DIGITAL_MODE_ADAT))
170		return -EINVAL;
171
172	/* Only set the clock for internal mode. */
173	if (chip->input_clock != ECHO_CLOCK_INTERNAL) {
174		DE_ACT(("set_sample_rate: Cannot set sample rate - "
175			"clock not set to CLK_CLOCKININTERNAL\n"));
176		/* Save the rate anyhow */
177		chip->comm_page->sample_rate = cpu_to_le32(rate);
178		chip->sample_rate = rate;
179		return 0;
180	}
181
182	clock = 0;
183
184	control_reg = le32_to_cpu(chip->comm_page->control_register);
185	control_reg &= GML_CLOCK_CLEAR_MASK & GML_SPDIF_RATE_CLEAR_MASK;
186
187	switch (rate) {
188	case 96000:
189		clock = GML_96KHZ;
190		break;
191	case 88200:
192		clock = GML_88KHZ;
193		break;
194	case 48000:
195		clock = GML_48KHZ | GML_SPDIF_SAMPLE_RATE1;
196		break;
197	case 44100:
198		clock = GML_44KHZ;
199		/* Professional mode ? */
200		if (control_reg & GML_SPDIF_PRO_MODE)
201			clock |= GML_SPDIF_SAMPLE_RATE0;
202		break;
203	case 32000:
204		clock = GML_32KHZ | GML_SPDIF_SAMPLE_RATE0 |
205			GML_SPDIF_SAMPLE_RATE1;
206		break;
207	case 22050:
208		clock = GML_22KHZ;
209		break;
210	case 16000:
211		clock = GML_16KHZ;
212		break;
213	case 11025:
214		clock = GML_11KHZ;
215		break;
216	case 8000:
217		clock = GML_8KHZ;
218		break;
219	default:
220		DE_ACT(("set_sample_rate: %d invalid!\n", rate));
221		return -EINVAL;
222	}
223
224	control_reg |= clock;
225
226	chip->comm_page->sample_rate = cpu_to_le32(rate);	/* ignored by the DSP */
227	chip->sample_rate = rate;
228	DE_ACT(("set_sample_rate: %d clock %d\n", rate, clock));
229
230	return write_control_reg(chip, control_reg, FALSE);
231}
232
233
234
235static int set_input_clock(struct echoaudio *chip, u16 clock)
236{
237	u32 control_reg, clocks_from_dsp;
238
239	DE_ACT(("set_input_clock:\n"));
240
241	/* Mask off the clock select bits */
242	control_reg = le32_to_cpu(chip->comm_page->control_register) &
243		GML_CLOCK_CLEAR_MASK;
244	clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
245
246	switch (clock) {
247	case ECHO_CLOCK_INTERNAL:
248		DE_ACT(("Set Gina24 clock to INTERNAL\n"));
249		chip->input_clock = ECHO_CLOCK_INTERNAL;
250		return set_sample_rate(chip, chip->sample_rate);
251	case ECHO_CLOCK_SPDIF:
252		if (chip->digital_mode == DIGITAL_MODE_ADAT)
253			return -EAGAIN;
254		DE_ACT(("Set Gina24 clock to SPDIF\n"));
255		control_reg |= GML_SPDIF_CLOCK;
256		if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_SPDIF96)
257			control_reg |= GML_DOUBLE_SPEED_MODE;
258		else
259			control_reg &= ~GML_DOUBLE_SPEED_MODE;
260		break;
261	case ECHO_CLOCK_ADAT:
262		if (chip->digital_mode != DIGITAL_MODE_ADAT)
263			return -EAGAIN;
264		DE_ACT(("Set Gina24 clock to ADAT\n"));
265		control_reg |= GML_ADAT_CLOCK;
266		control_reg &= ~GML_DOUBLE_SPEED_MODE;
267		break;
268	case ECHO_CLOCK_ESYNC:
269		DE_ACT(("Set Gina24 clock to ESYNC\n"));
270		control_reg |= GML_ESYNC_CLOCK;
271		control_reg &= ~GML_DOUBLE_SPEED_MODE;
272		break;
273	case ECHO_CLOCK_ESYNC96:
274		DE_ACT(("Set Gina24 clock to ESYNC96\n"));
275		control_reg |= GML_ESYNC_CLOCK | GML_DOUBLE_SPEED_MODE;
276		break;
277	default:
278		DE_ACT(("Input clock 0x%x not supported for Gina24\n", clock));
279		return -EINVAL;
280	}
281
282	chip->input_clock = clock;
283	return write_control_reg(chip, control_reg, TRUE);
284}
285
286
287
288static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
289{
290	u32 control_reg;
291	int err, incompatible_clock;
292
293	/* Set clock to "internal" if it's not compatible with the new mode */
294	incompatible_clock = FALSE;
295	switch (mode) {
296	case DIGITAL_MODE_SPDIF_OPTICAL:
297	case DIGITAL_MODE_SPDIF_CDROM:
298	case DIGITAL_MODE_SPDIF_RCA:
299		if (chip->input_clock == ECHO_CLOCK_ADAT)
300			incompatible_clock = TRUE;
301		break;
302	case DIGITAL_MODE_ADAT:
303		if (chip->input_clock == ECHO_CLOCK_SPDIF)
304			incompatible_clock = TRUE;
305		break;
306	default:
307		DE_ACT(("Digital mode not supported: %d\n", mode));
308		return -EINVAL;
309	}
310
311	spin_lock_irq(&chip->lock);
312
313	if (incompatible_clock) {	/* Switch to 48KHz, internal */
314		chip->sample_rate = 48000;
315		set_input_clock(chip, ECHO_CLOCK_INTERNAL);
316	}
317
318	/* Clear the current digital mode */
319	control_reg = le32_to_cpu(chip->comm_page->control_register);
320	control_reg &= GML_DIGITAL_MODE_CLEAR_MASK;
321
322	/* Tweak the control reg */
323	switch (mode) {
324	case DIGITAL_MODE_SPDIF_OPTICAL:
325		control_reg |= GML_SPDIF_OPTICAL_MODE;
326		break;
327	case DIGITAL_MODE_SPDIF_CDROM:
328		/* '361 Gina24 cards do not have the S/PDIF CD-ROM mode */
329		if (chip->device_id == DEVICE_ID_56301)
330			control_reg |= GML_SPDIF_CDROM_MODE;
331		break;
332	case DIGITAL_MODE_SPDIF_RCA:
333		/* GML_SPDIF_OPTICAL_MODE bit cleared */
334		break;
335	case DIGITAL_MODE_ADAT:
336		control_reg |= GML_ADAT_MODE;
337		control_reg &= ~GML_DOUBLE_SPEED_MODE;
338		break;
339	}
340
341	err = write_control_reg(chip, control_reg, TRUE);
342	spin_unlock_irq(&chip->lock);
343	if (err < 0)
344		return err;
345	chip->digital_mode = mode;
346
347	DE_ACT(("set_digital_mode to %d\n", chip->digital_mode));
348	return incompatible_clock;
349}
350