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