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
32
33/* These functions are common for all "3G" cards */
34
35
36static int check_asic_status(struct echoaudio *chip)
37{
38	u32 box_status;
39
40	if (wait_handshake(chip))
41		return -EIO;
42
43	chip->comm_page->ext_box_status = cpu_to_le32(E3G_ASIC_NOT_LOADED);
44	chip->asic_loaded = FALSE;
45	clear_handshake(chip);
46	send_vector(chip, DSP_VC_TEST_ASIC);
47
48	if (wait_handshake(chip)) {
49		chip->dsp_code = NULL;
50		return -EIO;
51	}
52
53	box_status = le32_to_cpu(chip->comm_page->ext_box_status);
54	DE_INIT(("box_status=%x\n", box_status));
55	if (box_status == E3G_ASIC_NOT_LOADED)
56		return -ENODEV;
57
58	chip->asic_loaded = TRUE;
59	return box_status & E3G_BOX_TYPE_MASK;
60}
61
62
63
64static inline u32 get_frq_reg(struct echoaudio *chip)
65{
66	return le32_to_cpu(chip->comm_page->e3g_frq_register);
67}
68
69
70
71/* Most configuration of 3G cards is accomplished by writing the control
72register. write_control_reg sends the new control register value to the DSP. */
73static int write_control_reg(struct echoaudio *chip, u32 ctl, u32 frq,
74			     char force)
75{
76	if (wait_handshake(chip))
77		return -EIO;
78
79	DE_ACT(("WriteControlReg: Setting 0x%x, 0x%x\n", ctl, frq));
80
81	ctl = cpu_to_le32(ctl);
82	frq = cpu_to_le32(frq);
83
84	if (ctl != chip->comm_page->control_register ||
85	    frq != chip->comm_page->e3g_frq_register || force) {
86		chip->comm_page->e3g_frq_register = frq;
87		chip->comm_page->control_register = ctl;
88		clear_handshake(chip);
89		return send_vector(chip, DSP_VC_WRITE_CONTROL_REG);
90	}
91
92	DE_ACT(("WriteControlReg: not written, no change\n"));
93	return 0;
94}
95
96
97
98/* Set the digital mode - currently for Gina24, Layla24, Mona, 3G */
99static int set_digital_mode(struct echoaudio *chip, u8 mode)
100{
101	u8 previous_mode;
102	int err, i, o;
103
104	/* All audio channels must be closed before changing the digital mode */
105	if (snd_BUG_ON(chip->pipe_alloc_mask))
106		return -EAGAIN;
107
108	if (snd_BUG_ON(!(chip->digital_modes & (1 << mode))))
109		return -EINVAL;
110
111	previous_mode = chip->digital_mode;
112	err = dsp_set_digital_mode(chip, mode);
113
114	/* If we successfully changed the digital mode from or to ADAT,
115	 * then make sure all output, input and monitor levels are
116	 * updated by the DSP comm object. */
117	if (err >= 0 && previous_mode != mode &&
118	    (previous_mode == DIGITAL_MODE_ADAT || mode == DIGITAL_MODE_ADAT)) {
119		spin_lock_irq(&chip->lock);
120		for (o = 0; o < num_busses_out(chip); o++)
121			for (i = 0; i < num_busses_in(chip); i++)
122				set_monitor_gain(chip, o, i,
123						 chip->monitor_gain[o][i]);
124
125#ifdef ECHOCARD_HAS_INPUT_GAIN
126		for (i = 0; i < num_busses_in(chip); i++)
127			set_input_gain(chip, i, chip->input_gain[i]);
128		update_input_line_level(chip);
129#endif
130
131		for (o = 0; o < num_busses_out(chip); o++)
132			set_output_gain(chip, o, chip->output_gain[o]);
133		update_output_line_level(chip);
134		spin_unlock_irq(&chip->lock);
135	}
136
137	return err;
138}
139
140
141
142static u32 set_spdif_bits(struct echoaudio *chip, u32 control_reg, u32 rate)
143{
144	control_reg &= E3G_SPDIF_FORMAT_CLEAR_MASK;
145
146	switch (rate) {
147	case 32000 :
148		control_reg |= E3G_SPDIF_SAMPLE_RATE0 | E3G_SPDIF_SAMPLE_RATE1;
149		break;
150	case 44100 :
151		if (chip->professional_spdif)
152			control_reg |= E3G_SPDIF_SAMPLE_RATE0;
153		break;
154	case 48000 :
155		control_reg |= E3G_SPDIF_SAMPLE_RATE1;
156		break;
157	}
158
159	if (chip->professional_spdif)
160		control_reg |= E3G_SPDIF_PRO_MODE;
161
162	if (chip->non_audio_spdif)
163		control_reg |= E3G_SPDIF_NOT_AUDIO;
164
165	control_reg |= E3G_SPDIF_24_BIT | E3G_SPDIF_TWO_CHANNEL |
166		E3G_SPDIF_COPY_PERMIT;
167
168	return control_reg;
169}
170
171
172
173/* Set the S/PDIF output format */
174static int set_professional_spdif(struct echoaudio *chip, char prof)
175{
176	u32 control_reg;
177
178	control_reg = le32_to_cpu(chip->comm_page->control_register);
179	chip->professional_spdif = prof;
180	control_reg = set_spdif_bits(chip, control_reg, chip->sample_rate);
181	return write_control_reg(chip, control_reg, get_frq_reg(chip), 0);
182}
183
184
185
186/* detect_input_clocks() returns a bitmask consisting of all the input clocks
187currently connected to the hardware; this changes as the user connects and
188disconnects clock inputs. You should use this information to determine which
189clocks the user is allowed to select. */
190static u32 detect_input_clocks(const struct echoaudio *chip)
191{
192	u32 clocks_from_dsp, clock_bits;
193
194	/* Map the DSP clock detect bits to the generic driver clock
195	 * detect bits */
196	clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
197
198	clock_bits = ECHO_CLOCK_BIT_INTERNAL;
199
200	if (clocks_from_dsp & E3G_CLOCK_DETECT_BIT_WORD)
201		clock_bits |= ECHO_CLOCK_BIT_WORD;
202
203	switch(chip->digital_mode) {
204	case DIGITAL_MODE_SPDIF_RCA:
205	case DIGITAL_MODE_SPDIF_OPTICAL:
206		if (clocks_from_dsp & E3G_CLOCK_DETECT_BIT_SPDIF)
207			clock_bits |= ECHO_CLOCK_BIT_SPDIF;
208		break;
209	case DIGITAL_MODE_ADAT:
210		if (clocks_from_dsp & E3G_CLOCK_DETECT_BIT_ADAT)
211			clock_bits |= ECHO_CLOCK_BIT_ADAT;
212		break;
213	}
214
215	return clock_bits;
216}
217
218
219
220static int load_asic(struct echoaudio *chip)
221{
222	int box_type, err;
223
224	if (chip->asic_loaded)
225		return 0;
226
227	/* Give the DSP a few milliseconds to settle down */
228	mdelay(2);
229
230	err = load_asic_generic(chip, DSP_FNC_LOAD_3G_ASIC, FW_3G_ASIC);
231	if (err < 0)
232		return err;
233
234	chip->asic_code = FW_3G_ASIC;
235
236	/* Now give the new ASIC some time to set up */
237	msleep(1000);
238	/* See if it worked */
239	box_type = check_asic_status(chip);
240
241	/* Set up the control register if the load succeeded -
242	 * 48 kHz, internal clock, S/PDIF RCA mode */
243	if (box_type >= 0) {
244		err = write_control_reg(chip, E3G_48KHZ,
245					E3G_FREQ_REG_DEFAULT, TRUE);
246		if (err < 0)
247			return err;
248	}
249
250	return box_type;
251}
252
253
254
255static int set_sample_rate(struct echoaudio *chip, u32 rate)
256{
257	u32 control_reg, clock, base_rate, frq_reg;
258
259	/* Only set the clock for internal mode. */
260	if (chip->input_clock != ECHO_CLOCK_INTERNAL) {
261		DE_ACT(("set_sample_rate: Cannot set sample rate - "
262			"clock not set to CLK_CLOCKININTERNAL\n"));
263		/* Save the rate anyhow */
264		chip->comm_page->sample_rate = cpu_to_le32(rate);
265		chip->sample_rate = rate;
266		set_input_clock(chip, chip->input_clock);
267		return 0;
268	}
269
270	if (snd_BUG_ON(rate >= 50000 &&
271		       chip->digital_mode == DIGITAL_MODE_ADAT))
272		return -EINVAL;
273
274	clock = 0;
275	control_reg = le32_to_cpu(chip->comm_page->control_register);
276	control_reg &= E3G_CLOCK_CLEAR_MASK;
277
278	switch (rate) {
279	case 96000:
280		clock = E3G_96KHZ;
281		break;
282	case 88200:
283		clock = E3G_88KHZ;
284		break;
285	case 48000:
286		clock = E3G_48KHZ;
287		break;
288	case 44100:
289		clock = E3G_44KHZ;
290		break;
291	case 32000:
292		clock = E3G_32KHZ;
293		break;
294	default:
295		clock = E3G_CONTINUOUS_CLOCK;
296		if (rate > 50000)
297			clock |= E3G_DOUBLE_SPEED_MODE;
298		break;
299	}
300
301	control_reg |= clock;
302	control_reg = set_spdif_bits(chip, control_reg, rate);
303
304	base_rate = rate;
305	if (base_rate > 50000)
306		base_rate /= 2;
307	if (base_rate < 32000)
308		base_rate = 32000;
309
310	frq_reg = E3G_MAGIC_NUMBER / base_rate - 2;
311	if (frq_reg > E3G_FREQ_REG_MAX)
312		frq_reg = E3G_FREQ_REG_MAX;
313
314	chip->comm_page->sample_rate = cpu_to_le32(rate);	/* ignored by the DSP */
315	chip->sample_rate = rate;
316	DE_ACT(("SetSampleRate: %d clock %x\n", rate, control_reg));
317
318	/* Tell the DSP about it - DSP reads both control reg & freq reg */
319	return write_control_reg(chip, control_reg, frq_reg, 0);
320}
321
322
323
324/* Set the sample clock source to internal, S/PDIF, ADAT */
325static int set_input_clock(struct echoaudio *chip, u16 clock)
326{
327	u32 control_reg, clocks_from_dsp;
328
329	DE_ACT(("set_input_clock:\n"));
330
331	/* Mask off the clock select bits */
332	control_reg = le32_to_cpu(chip->comm_page->control_register) &
333		E3G_CLOCK_CLEAR_MASK;
334	clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
335
336	switch (clock) {
337	case ECHO_CLOCK_INTERNAL:
338		DE_ACT(("Set Echo3G clock to INTERNAL\n"));
339		chip->input_clock = ECHO_CLOCK_INTERNAL;
340		return set_sample_rate(chip, chip->sample_rate);
341	case ECHO_CLOCK_SPDIF:
342		if (chip->digital_mode == DIGITAL_MODE_ADAT)
343			return -EAGAIN;
344		DE_ACT(("Set Echo3G clock to SPDIF\n"));
345		control_reg |= E3G_SPDIF_CLOCK;
346		if (clocks_from_dsp & E3G_CLOCK_DETECT_BIT_SPDIF96)
347			control_reg |= E3G_DOUBLE_SPEED_MODE;
348		else
349			control_reg &= ~E3G_DOUBLE_SPEED_MODE;
350		break;
351	case ECHO_CLOCK_ADAT:
352		if (chip->digital_mode != DIGITAL_MODE_ADAT)
353			return -EAGAIN;
354		DE_ACT(("Set Echo3G clock to ADAT\n"));
355		control_reg |= E3G_ADAT_CLOCK;
356		control_reg &= ~E3G_DOUBLE_SPEED_MODE;
357		break;
358	case ECHO_CLOCK_WORD:
359		DE_ACT(("Set Echo3G clock to WORD\n"));
360		control_reg |= E3G_WORD_CLOCK;
361		if (clocks_from_dsp & E3G_CLOCK_DETECT_BIT_WORD96)
362			control_reg |= E3G_DOUBLE_SPEED_MODE;
363		else
364			control_reg &= ~E3G_DOUBLE_SPEED_MODE;
365		break;
366	default:
367		DE_ACT(("Input clock 0x%x not supported for Echo3G\n", clock));
368		return -EINVAL;
369	}
370
371	chip->input_clock = clock;
372	return write_control_reg(chip, control_reg, get_frq_reg(chip), 1);
373}
374
375
376
377static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
378{
379	u32 control_reg;
380	int err, incompatible_clock;
381
382	/* Set clock to "internal" if it's not compatible with the new mode */
383	incompatible_clock = FALSE;
384	switch (mode) {
385	case DIGITAL_MODE_SPDIF_OPTICAL:
386	case DIGITAL_MODE_SPDIF_RCA:
387		if (chip->input_clock == ECHO_CLOCK_ADAT)
388			incompatible_clock = TRUE;
389		break;
390	case DIGITAL_MODE_ADAT:
391		if (chip->input_clock == ECHO_CLOCK_SPDIF)
392			incompatible_clock = TRUE;
393		break;
394	default:
395		DE_ACT(("Digital mode not supported: %d\n", mode));
396		return -EINVAL;
397	}
398
399	spin_lock_irq(&chip->lock);
400
401	if (incompatible_clock) {
402		chip->sample_rate = 48000;
403		set_input_clock(chip, ECHO_CLOCK_INTERNAL);
404	}
405
406	/* Clear the current digital mode */
407	control_reg = le32_to_cpu(chip->comm_page->control_register);
408	control_reg &= E3G_DIGITAL_MODE_CLEAR_MASK;
409
410	/* Tweak the control reg */
411	switch (mode) {
412	case DIGITAL_MODE_SPDIF_OPTICAL:
413		control_reg |= E3G_SPDIF_OPTICAL_MODE;
414		break;
415	case DIGITAL_MODE_SPDIF_RCA:
416		/* E3G_SPDIF_OPTICAL_MODE bit cleared */
417		break;
418	case DIGITAL_MODE_ADAT:
419		control_reg |= E3G_ADAT_MODE;
420		control_reg &= ~E3G_DOUBLE_SPEED_MODE;	/* @@ useless */
421		break;
422	}
423
424	err = write_control_reg(chip, control_reg, get_frq_reg(chip), 1);
425	spin_unlock_irq(&chip->lock);
426	if (err < 0)
427		return err;
428	chip->digital_mode = mode;
429
430	DE_ACT(("set_digital_mode(%d)\n", chip->digital_mode));
431	return incompatible_clock;
432}
433