• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Programming the mspx4xx sound processor family
3  *
4  * (c) 1997-2001 Gerd Knorr <kraxel@bytesex.org>
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19  * 02110-1301, USA.
20  */
21 
22 
23 #include <linux/kernel.h>
24 #include <linux/module.h>
25 #include <linux/slab.h>
26 #include <linux/i2c.h>
27 #include <linux/freezer.h>
28 #include <linux/videodev2.h>
29 #include <media/v4l2-common.h>
30 #include <media/msp3400.h>
31 #include <linux/kthread.h>
32 #include <linux/suspend.h>
33 #include "msp3400-driver.h"
34 
35 /* this one uses the automatic sound standard detection of newer msp34xx
36    chip versions */
37 static struct {
38 	int retval;
39 	int main, second;
40 	char *name;
41 } msp_stdlist[] = {
42 	{ 0x0000, 0, 0, "could not detect sound standard" },
43 	{ 0x0001, 0, 0, "autodetect start" },
44 	{ 0x0002, MSP_CARRIER(4.5), MSP_CARRIER(4.72), "4.5/4.72  M Dual FM-Stereo" },
45 	{ 0x0003, MSP_CARRIER(5.5), MSP_CARRIER(5.7421875), "5.5/5.74  B/G Dual FM-Stereo" },
46 	{ 0x0004, MSP_CARRIER(6.5), MSP_CARRIER(6.2578125), "6.5/6.25  D/K1 Dual FM-Stereo" },
47 	{ 0x0005, MSP_CARRIER(6.5), MSP_CARRIER(6.7421875), "6.5/6.74  D/K2 Dual FM-Stereo" },
48 	{ 0x0006, MSP_CARRIER(6.5), MSP_CARRIER(6.5), "6.5  D/K FM-Mono (HDEV3)" },
49 	{ 0x0007, MSP_CARRIER(6.5), MSP_CARRIER(5.7421875), "6.5/5.74  D/K3 Dual FM-Stereo" },
50 	{ 0x0008, MSP_CARRIER(5.5), MSP_CARRIER(5.85), "5.5/5.85  B/G NICAM FM" },
51 	{ 0x0009, MSP_CARRIER(6.5), MSP_CARRIER(5.85), "6.5/5.85  L NICAM AM" },
52 	{ 0x000a, MSP_CARRIER(6.0), MSP_CARRIER(6.55), "6.0/6.55  I NICAM FM" },
53 	{ 0x000b, MSP_CARRIER(6.5), MSP_CARRIER(5.85), "6.5/5.85  D/K NICAM FM" },
54 	{ 0x000c, MSP_CARRIER(6.5), MSP_CARRIER(5.85), "6.5/5.85  D/K NICAM FM (HDEV2)" },
55 	{ 0x000d, MSP_CARRIER(6.5), MSP_CARRIER(5.85), "6.5/5.85  D/K NICAM FM (HDEV3)" },
56 	{ 0x0020, MSP_CARRIER(4.5), MSP_CARRIER(4.5), "4.5  M BTSC-Stereo" },
57 	{ 0x0021, MSP_CARRIER(4.5), MSP_CARRIER(4.5), "4.5  M BTSC-Mono + SAP" },
58 	{ 0x0030, MSP_CARRIER(4.5), MSP_CARRIER(4.5), "4.5  M EIA-J Japan Stereo" },
59 	{ 0x0040, MSP_CARRIER(10.7), MSP_CARRIER(10.7), "10.7  FM-Stereo Radio" },
60 	{ 0x0050, MSP_CARRIER(6.5), MSP_CARRIER(6.5), "6.5  SAT-Mono" },
61 	{ 0x0051, MSP_CARRIER(7.02), MSP_CARRIER(7.20), "7.02/7.20  SAT-Stereo" },
62 	{ 0x0060, MSP_CARRIER(7.2), MSP_CARRIER(7.2), "7.2  SAT ADR" },
63 	{     -1, 0, 0, NULL }, /* EOF */
64 };
65 
66 static struct msp3400c_init_data_dem {
67 	int fir1[6];
68 	int fir2[6];
69 	int cdo1;
70 	int cdo2;
71 	int ad_cv;
72 	int mode_reg;
73 	int dsp_src;
74 	int dsp_matrix;
75 } msp3400c_init_data[] = {
76 	{	/* AM (for carrier detect / msp3400) */
77 		{75, 19, 36, 35, 39, 40},
78 		{75, 19, 36, 35, 39, 40},
79 		MSP_CARRIER(5.5), MSP_CARRIER(5.5),
80 		0x00d0, 0x0500, 0x0020, 0x3000
81 	}, {	/* AM (for carrier detect / msp3410) */
82 		{-1, -1, -8, 2, 59, 126},
83 		{-1, -1, -8, 2, 59, 126},
84 		MSP_CARRIER(5.5), MSP_CARRIER(5.5),
85 		0x00d0, 0x0100, 0x0020, 0x3000
86 	}, {	/* FM Radio */
87 		{-8, -8, 4, 6, 78, 107},
88 		{-8, -8, 4, 6, 78, 107},
89 		MSP_CARRIER(10.7), MSP_CARRIER(10.7),
90 		0x00d0, 0x0480, 0x0020, 0x3000
91 	}, {	/* Terrestial FM-mono + FM-stereo */
92 		{3, 18, 27, 48, 66, 72},
93 		{3, 18, 27, 48, 66, 72},
94 		MSP_CARRIER(5.5), MSP_CARRIER(5.5),
95 		0x00d0, 0x0480, 0x0030, 0x3000
96 	}, {	/* Sat FM-mono */
97 		{ 1, 9, 14, 24, 33, 37},
98 		{ 3, 18, 27, 48, 66, 72},
99 		MSP_CARRIER(6.5), MSP_CARRIER(6.5),
100 		0x00c6, 0x0480, 0x0000, 0x3000
101 	}, {	/* NICAM/FM --  B/G (5.5/5.85), D/K (6.5/5.85) */
102 		{-2, -8, -10, 10, 50, 86},
103 		{3, 18, 27, 48, 66, 72},
104 		MSP_CARRIER(5.5), MSP_CARRIER(5.5),
105 		0x00d0, 0x0040, 0x0120, 0x3000
106 	}, {	/* NICAM/FM -- I (6.0/6.552) */
107 		{2, 4, -6, -4, 40, 94},
108 		{3, 18, 27, 48, 66, 72},
109 		MSP_CARRIER(6.0), MSP_CARRIER(6.0),
110 		0x00d0, 0x0040, 0x0120, 0x3000
111 	}, {	/* NICAM/AM -- L (6.5/5.85) */
112 		{-2, -8, -10, 10, 50, 86},
113 		{-4, -12, -9, 23, 79, 126},
114 		MSP_CARRIER(6.5), MSP_CARRIER(6.5),
115 		0x00c6, 0x0140, 0x0120, 0x7c00
116 	},
117 };
118 
119 struct msp3400c_carrier_detect {
120 	int   cdo;
121 	char *name;
122 };
123 
124 static struct msp3400c_carrier_detect msp3400c_carrier_detect_main[] = {
125 	/* main carrier */
126 	{ MSP_CARRIER(4.5),        "4.5   NTSC"                   },
127 	{ MSP_CARRIER(5.5),        "5.5   PAL B/G"                },
128 	{ MSP_CARRIER(6.0),        "6.0   PAL I"                  },
129 	{ MSP_CARRIER(6.5),        "6.5   PAL D/K + SAT + SECAM"  }
130 };
131 
132 static struct msp3400c_carrier_detect msp3400c_carrier_detect_55[] = {
133 	/* PAL B/G */
134 	{ MSP_CARRIER(5.7421875),  "5.742 PAL B/G FM-stereo"     },
135 	{ MSP_CARRIER(5.85),       "5.85  PAL B/G NICAM"         }
136 };
137 
138 static struct msp3400c_carrier_detect msp3400c_carrier_detect_65[] = {
139 	/* PAL SAT / SECAM */
140 	{ MSP_CARRIER(5.85),       "5.85  PAL D/K + SECAM NICAM" },
141 	{ MSP_CARRIER(6.2578125),  "6.25  PAL D/K1 FM-stereo" },
142 	{ MSP_CARRIER(6.7421875),  "6.74  PAL D/K2 FM-stereo" },
143 	{ MSP_CARRIER(7.02),       "7.02  PAL SAT FM-stereo s/b" },
144 	{ MSP_CARRIER(7.20),       "7.20  PAL SAT FM-stereo s"   },
145 	{ MSP_CARRIER(7.38),       "7.38  PAL SAT FM-stereo b"   },
146 };
147 
148 /* ------------------------------------------------------------------------ */
149 
msp_standard_std_name(int std)150 const char *msp_standard_std_name(int std)
151 {
152 	int i;
153 
154 	for (i = 0; msp_stdlist[i].name != NULL; i++)
155 		if (msp_stdlist[i].retval == std)
156 			return msp_stdlist[i].name;
157 	return "unknown";
158 }
159 
msp_set_source(struct i2c_client * client,u16 src)160 static void msp_set_source(struct i2c_client *client, u16 src)
161 {
162 	struct msp_state *state = to_state(i2c_get_clientdata(client));
163 
164 	if (msp_dolby) {
165 		msp_write_dsp(client, 0x0008, 0x0520); /* I2S1 */
166 		msp_write_dsp(client, 0x0009, 0x0620); /* I2S2 */
167 	} else {
168 		msp_write_dsp(client, 0x0008, src);
169 		msp_write_dsp(client, 0x0009, src);
170 	}
171 	msp_write_dsp(client, 0x000a, src);
172 	msp_write_dsp(client, 0x000b, src);
173 	msp_write_dsp(client, 0x000c, src);
174 	if (state->has_scart2_out)
175 		msp_write_dsp(client, 0x0041, src);
176 }
177 
msp3400c_set_carrier(struct i2c_client * client,int cdo1,int cdo2)178 void msp3400c_set_carrier(struct i2c_client *client, int cdo1, int cdo2)
179 {
180 	msp_write_dem(client, 0x0093, cdo1 & 0xfff);
181 	msp_write_dem(client, 0x009b, cdo1 >> 12);
182 	msp_write_dem(client, 0x00a3, cdo2 & 0xfff);
183 	msp_write_dem(client, 0x00ab, cdo2 >> 12);
184 	msp_write_dem(client, 0x0056, 0); /* LOAD_REG_1/2 */
185 }
186 
msp3400c_set_mode(struct i2c_client * client,int mode)187 void msp3400c_set_mode(struct i2c_client *client, int mode)
188 {
189 	struct msp_state *state = to_state(i2c_get_clientdata(client));
190 	struct msp3400c_init_data_dem *data = &msp3400c_init_data[mode];
191 	int tuner = (state->routing.input >> 3) & 1;
192 	int i;
193 
194 	v4l_dbg(1, msp_debug, client, "set_mode: %d\n", mode);
195 	state->mode = mode;
196 	state->rxsubchans = V4L2_TUNER_SUB_MONO;
197 
198 	msp_write_dem(client, 0x00bb, data->ad_cv | (tuner ? 0x100 : 0));
199 
200 	for (i = 5; i >= 0; i--)               /* fir 1 */
201 		msp_write_dem(client, 0x0001, data->fir1[i]);
202 
203 	msp_write_dem(client, 0x0005, 0x0004); /* fir 2 */
204 	msp_write_dem(client, 0x0005, 0x0040);
205 	msp_write_dem(client, 0x0005, 0x0000);
206 	for (i = 5; i >= 0; i--)
207 		msp_write_dem(client, 0x0005, data->fir2[i]);
208 
209 	msp_write_dem(client, 0x0083, data->mode_reg);
210 
211 	msp3400c_set_carrier(client, data->cdo1, data->cdo2);
212 
213 	msp_set_source(client, data->dsp_src);
214 	/* set prescales */
215 
216 	/* volume prescale for SCART (AM mono input) */
217 	msp_write_dsp(client, 0x000d, 0x1900);
218 	msp_write_dsp(client, 0x000e, data->dsp_matrix);
219 	if (state->has_nicam) /* nicam prescale */
220 		msp_write_dsp(client, 0x0010, 0x5a00);
221 }
222 
223 /* Set audio mode. Note that the pre-'G' models do not support BTSC+SAP,
224    nor do they support stereo BTSC. */
msp3400c_set_audmode(struct i2c_client * client)225 static void msp3400c_set_audmode(struct i2c_client *client)
226 {
227 	static char *strmode[] = {
228 		"mono", "stereo", "lang2", "lang1", "lang1+lang2"
229 	};
230 	struct msp_state *state = to_state(i2c_get_clientdata(client));
231 	char *modestr = (state->audmode >= 0 && state->audmode < 5) ?
232 		strmode[state->audmode] : "unknown";
233 	int src = 0;	/* channel source: FM/AM, nicam or SCART */
234 	int audmode = state->audmode;
235 
236 	if (state->opmode == OPMODE_AUTOSELECT) {
237 		/* this method would break everything, let's make sure
238 		 * it's never called
239 		 */
240 		v4l_dbg(1, msp_debug, client,
241 			"set_audmode called with mode=%d instead of set_source (ignored)\n",
242 			state->audmode);
243 		return;
244 	}
245 
246 	/* Note: for the C and D revs no NTSC stereo + SAP is possible as
247 	   the hardware does not support SAP. So the rxsubchans combination
248 	   of STEREO | LANG2 does not occur. */
249 
250 	if (state->mode != MSP_MODE_EXTERN) {
251 		/* switch to mono if only mono is available */
252 		if (state->rxsubchans == V4L2_TUNER_SUB_MONO)
253 			audmode = V4L2_TUNER_MODE_MONO;
254 		/* if bilingual */
255 		else if (state->rxsubchans & V4L2_TUNER_SUB_LANG2) {
256 			/* and mono or stereo, then fallback to lang1 */
257 			if (audmode == V4L2_TUNER_MODE_MONO ||
258 			    audmode == V4L2_TUNER_MODE_STEREO)
259 				audmode = V4L2_TUNER_MODE_LANG1;
260 		}
261 		/* if stereo, and audmode is not mono, then switch to stereo */
262 		else if (audmode != V4L2_TUNER_MODE_MONO)
263 			audmode = V4L2_TUNER_MODE_STEREO;
264 	}
265 
266 	/* switch demodulator */
267 	switch (state->mode) {
268 	case MSP_MODE_FM_TERRA:
269 		v4l_dbg(1, msp_debug, client, "FM set_audmode: %s\n", modestr);
270 		switch (audmode) {
271 		case V4L2_TUNER_MODE_STEREO:
272 			msp_write_dsp(client, 0x000e, 0x3001);
273 			break;
274 		case V4L2_TUNER_MODE_MONO:
275 		case V4L2_TUNER_MODE_LANG1:
276 		case V4L2_TUNER_MODE_LANG2:
277 		case V4L2_TUNER_MODE_LANG1_LANG2:
278 			msp_write_dsp(client, 0x000e, 0x3000);
279 			break;
280 		}
281 		break;
282 	case MSP_MODE_FM_SAT:
283 		v4l_dbg(1, msp_debug, client, "SAT set_audmode: %s\n", modestr);
284 		switch (audmode) {
285 		case V4L2_TUNER_MODE_MONO:
286 			msp3400c_set_carrier(client, MSP_CARRIER(6.5), MSP_CARRIER(6.5));
287 			break;
288 		case V4L2_TUNER_MODE_STEREO:
289 		case V4L2_TUNER_MODE_LANG1_LANG2:
290 			msp3400c_set_carrier(client, MSP_CARRIER(7.2), MSP_CARRIER(7.02));
291 			break;
292 		case V4L2_TUNER_MODE_LANG1:
293 			msp3400c_set_carrier(client, MSP_CARRIER(7.38), MSP_CARRIER(7.02));
294 			break;
295 		case V4L2_TUNER_MODE_LANG2:
296 			msp3400c_set_carrier(client, MSP_CARRIER(7.38), MSP_CARRIER(7.02));
297 			break;
298 		}
299 		break;
300 	case MSP_MODE_FM_NICAM1:
301 	case MSP_MODE_FM_NICAM2:
302 	case MSP_MODE_AM_NICAM:
303 		v4l_dbg(1, msp_debug, client,
304 			"NICAM set_audmode: %s\n", modestr);
305 		if (state->nicam_on)
306 			src = 0x0100;  /* NICAM */
307 		break;
308 	case MSP_MODE_BTSC:
309 		v4l_dbg(1, msp_debug, client,
310 			"BTSC set_audmode: %s\n", modestr);
311 		break;
312 	case MSP_MODE_EXTERN:
313 		v4l_dbg(1, msp_debug, client,
314 			"extern set_audmode: %s\n", modestr);
315 		src = 0x0200;  /* SCART */
316 		break;
317 	case MSP_MODE_FM_RADIO:
318 		v4l_dbg(1, msp_debug, client,
319 			"FM-Radio set_audmode: %s\n", modestr);
320 		break;
321 	default:
322 		v4l_dbg(1, msp_debug, client, "mono set_audmode\n");
323 		return;
324 	}
325 
326 	/* switch audio */
327 	v4l_dbg(1, msp_debug, client, "set audmode %d\n", audmode);
328 	switch (audmode) {
329 	case V4L2_TUNER_MODE_STEREO:
330 	case V4L2_TUNER_MODE_LANG1_LANG2:
331 		src |= 0x0020;
332 		break;
333 	case V4L2_TUNER_MODE_MONO:
334 		if (state->mode == MSP_MODE_AM_NICAM) {
335 			v4l_dbg(1, msp_debug, client, "switching to AM mono\n");
336 			/* AM mono decoding is handled by tuner, not MSP chip */
337 			/* SCART switching control register */
338 			msp_set_scart(client, SCART_MONO, 0);
339 			src = 0x0200;
340 			break;
341 		}
342 		if (state->rxsubchans & V4L2_TUNER_SUB_STEREO)
343 			src = 0x0030;
344 		break;
345 	case V4L2_TUNER_MODE_LANG1:
346 		break;
347 	case V4L2_TUNER_MODE_LANG2:
348 		src |= 0x0010;
349 		break;
350 	}
351 	v4l_dbg(1, msp_debug, client,
352 		"set_audmode final source/matrix = 0x%x\n", src);
353 
354 	msp_set_source(client, src);
355 }
356 
msp3400c_print_mode(struct i2c_client * client)357 static void msp3400c_print_mode(struct i2c_client *client)
358 {
359 	struct msp_state *state = to_state(i2c_get_clientdata(client));
360 
361 	if (state->main == state->second)
362 		v4l_dbg(1, msp_debug, client,
363 			"mono sound carrier: %d.%03d MHz\n",
364 			state->main / 910000, (state->main / 910) % 1000);
365 	else
366 		v4l_dbg(1, msp_debug, client,
367 			"main sound carrier: %d.%03d MHz\n",
368 			state->main / 910000, (state->main / 910) % 1000);
369 	if (state->mode == MSP_MODE_FM_NICAM1 || state->mode == MSP_MODE_FM_NICAM2)
370 		v4l_dbg(1, msp_debug, client,
371 			"NICAM/FM carrier  : %d.%03d MHz\n",
372 			state->second / 910000, (state->second/910) % 1000);
373 	if (state->mode == MSP_MODE_AM_NICAM)
374 		v4l_dbg(1, msp_debug, client,
375 			"NICAM/AM carrier  : %d.%03d MHz\n",
376 			state->second / 910000, (state->second / 910) % 1000);
377 	if (state->mode == MSP_MODE_FM_TERRA && state->main != state->second) {
378 		v4l_dbg(1, msp_debug, client,
379 			"FM-stereo carrier : %d.%03d MHz\n",
380 			state->second / 910000, (state->second / 910) % 1000);
381 	}
382 }
383 
384 /* ----------------------------------------------------------------------- */
385 
msp3400c_detect_stereo(struct i2c_client * client)386 static int msp3400c_detect_stereo(struct i2c_client *client)
387 {
388 	struct msp_state *state = to_state(i2c_get_clientdata(client));
389 	int val;
390 	int rxsubchans = state->rxsubchans;
391 	int newnicam = state->nicam_on;
392 	int update = 0;
393 
394 	switch (state->mode) {
395 	case MSP_MODE_FM_TERRA:
396 		val = msp_read_dsp(client, 0x18);
397 		if (val > 32767)
398 			val -= 65536;
399 		v4l_dbg(2, msp_debug, client,
400 			"stereo detect register: %d\n", val);
401 		if (val > 8192) {
402 			rxsubchans = V4L2_TUNER_SUB_STEREO;
403 		} else if (val < -4096) {
404 			rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
405 		} else {
406 			rxsubchans = V4L2_TUNER_SUB_MONO;
407 		}
408 		newnicam = 0;
409 		break;
410 	case MSP_MODE_FM_NICAM1:
411 	case MSP_MODE_FM_NICAM2:
412 	case MSP_MODE_AM_NICAM:
413 		val = msp_read_dem(client, 0x23);
414 		v4l_dbg(2, msp_debug, client, "nicam sync=%d, mode=%d\n",
415 			val & 1, (val & 0x1e) >> 1);
416 
417 		if (val & 1) {
418 			/* nicam synced */
419 			switch ((val & 0x1e) >> 1)  {
420 			case 0:
421 			case 8:
422 				rxsubchans = V4L2_TUNER_SUB_STEREO;
423 				break;
424 			case 1:
425 			case 9:
426 				rxsubchans = V4L2_TUNER_SUB_MONO;
427 				break;
428 			case 2:
429 			case 10:
430 				rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
431 				break;
432 			default:
433 				rxsubchans = V4L2_TUNER_SUB_MONO;
434 				break;
435 			}
436 			newnicam = 1;
437 		} else {
438 			newnicam = 0;
439 			rxsubchans = V4L2_TUNER_SUB_MONO;
440 		}
441 		break;
442 	}
443 	if (rxsubchans != state->rxsubchans) {
444 		update = 1;
445 		v4l_dbg(1, msp_debug, client,
446 			"watch: rxsubchans %02x => %02x\n",
447 			state->rxsubchans, rxsubchans);
448 		state->rxsubchans = rxsubchans;
449 	}
450 	if (newnicam != state->nicam_on) {
451 		update = 1;
452 		v4l_dbg(1, msp_debug, client, "watch: nicam %d => %d\n",
453 			state->nicam_on, newnicam);
454 		state->nicam_on = newnicam;
455 	}
456 	return update;
457 }
458 
459 /*
460  * A kernel thread for msp3400 control -- we don't want to block the
461  * in the ioctl while doing the sound carrier & stereo detect
462  */
463 /* stereo/multilang monitoring */
watch_stereo(struct i2c_client * client)464 static void watch_stereo(struct i2c_client *client)
465 {
466 	struct msp_state *state = to_state(i2c_get_clientdata(client));
467 
468 	if (msp_detect_stereo(client))
469 		msp_set_audmode(client);
470 
471 	if (msp_once)
472 		state->watch_stereo = 0;
473 }
474 
msp3400c_thread(void * data)475 int msp3400c_thread(void *data)
476 {
477 	struct i2c_client *client = data;
478 	struct msp_state *state = to_state(i2c_get_clientdata(client));
479 	struct msp3400c_carrier_detect *cd;
480 	int count, max1, max2, val1, val2, val, i;
481 
482 	v4l_dbg(1, msp_debug, client, "msp3400 daemon started\n");
483 	set_freezable();
484 	for (;;) {
485 		v4l_dbg(2, msp_debug, client, "msp3400 thread: sleep\n");
486 		msp_sleep(state, -1);
487 		v4l_dbg(2, msp_debug, client, "msp3400 thread: wakeup\n");
488 
489 restart:
490 		v4l_dbg(2, msp_debug, client, "thread: restart scan\n");
491 		state->restart = 0;
492 		if (kthread_should_stop())
493 			break;
494 
495 		if (state->radio || MSP_MODE_EXTERN == state->mode) {
496 			/* no carrier scan, just unmute */
497 			v4l_dbg(1, msp_debug, client,
498 				"thread: no carrier scan\n");
499 			state->scan_in_progress = 0;
500 			msp_set_audio(client);
501 			continue;
502 		}
503 
504 		/* mute audio */
505 		state->scan_in_progress = 1;
506 		msp_set_audio(client);
507 
508 		msp3400c_set_mode(client, MSP_MODE_AM_DETECT);
509 		val1 = val2 = 0;
510 		max1 = max2 = -1;
511 		state->watch_stereo = 0;
512 		state->nicam_on = 0;
513 
514 		/* wait for tuner to settle down after a channel change */
515 		if (msp_sleep(state, 200))
516 			goto restart;
517 
518 		/* carrier detect pass #1 -- main carrier */
519 		cd = msp3400c_carrier_detect_main;
520 		count = ARRAY_SIZE(msp3400c_carrier_detect_main);
521 
522 		if (msp_amsound && (state->v4l2_std & V4L2_STD_SECAM)) {
523 			/* autodetect doesn't work well with AM ... */
524 			max1 = 3;
525 			count = 0;
526 			v4l_dbg(1, msp_debug, client, "AM sound override\n");
527 		}
528 
529 		for (i = 0; i < count; i++) {
530 			msp3400c_set_carrier(client, cd[i].cdo, cd[i].cdo);
531 			if (msp_sleep(state, 100))
532 				goto restart;
533 			val = msp_read_dsp(client, 0x1b);
534 			if (val > 32767)
535 				val -= 65536;
536 			if (val1 < val)
537 				val1 = val, max1 = i;
538 			v4l_dbg(1, msp_debug, client,
539 				"carrier1 val: %5d / %s\n", val, cd[i].name);
540 		}
541 
542 		/* carrier detect pass #2 -- second (stereo) carrier */
543 		switch (max1) {
544 		case 1: /* 5.5 */
545 			cd = msp3400c_carrier_detect_55;
546 			count = ARRAY_SIZE(msp3400c_carrier_detect_55);
547 			break;
548 		case 3: /* 6.5 */
549 			cd = msp3400c_carrier_detect_65;
550 			count = ARRAY_SIZE(msp3400c_carrier_detect_65);
551 			break;
552 		case 0: /* 4.5 */
553 		case 2: /* 6.0 */
554 		default:
555 			cd = NULL;
556 			count = 0;
557 			break;
558 		}
559 
560 		if (msp_amsound && (state->v4l2_std & V4L2_STD_SECAM)) {
561 			/* autodetect doesn't work well with AM ... */
562 			cd = NULL;
563 			count = 0;
564 			max2 = 0;
565 		}
566 		for (i = 0; i < count; i++) {
567 			msp3400c_set_carrier(client, cd[i].cdo, cd[i].cdo);
568 			if (msp_sleep(state, 100))
569 				goto restart;
570 			val = msp_read_dsp(client, 0x1b);
571 			if (val > 32767)
572 				val -= 65536;
573 			if (val2 < val)
574 				val2 = val, max2 = i;
575 			v4l_dbg(1, msp_debug, client,
576 				"carrier2 val: %5d / %s\n", val, cd[i].name);
577 		}
578 
579 		/* program the msp3400 according to the results */
580 		state->main = msp3400c_carrier_detect_main[max1].cdo;
581 		switch (max1) {
582 		case 1: /* 5.5 */
583 			if (max2 == 0) {
584 				/* B/G FM-stereo */
585 				state->second = msp3400c_carrier_detect_55[max2].cdo;
586 				msp3400c_set_mode(client, MSP_MODE_FM_TERRA);
587 				state->watch_stereo = 1;
588 			} else if (max2 == 1 && state->has_nicam) {
589 				/* B/G NICAM */
590 				state->second = msp3400c_carrier_detect_55[max2].cdo;
591 				msp3400c_set_mode(client, MSP_MODE_FM_NICAM1);
592 				state->nicam_on = 1;
593 				state->watch_stereo = 1;
594 			} else {
595 				goto no_second;
596 			}
597 			break;
598 		case 2: /* 6.0 */
599 			/* PAL I NICAM */
600 			state->second = MSP_CARRIER(6.552);
601 			msp3400c_set_mode(client, MSP_MODE_FM_NICAM2);
602 			state->nicam_on = 1;
603 			state->watch_stereo = 1;
604 			break;
605 		case 3: /* 6.5 */
606 			if (max2 == 1 || max2 == 2) {
607 				/* D/K FM-stereo */
608 				state->second = msp3400c_carrier_detect_65[max2].cdo;
609 				msp3400c_set_mode(client, MSP_MODE_FM_TERRA);
610 				state->watch_stereo = 1;
611 			} else if (max2 == 0 && (state->v4l2_std & V4L2_STD_SECAM)) {
612 				/* L NICAM or AM-mono */
613 				state->second = msp3400c_carrier_detect_65[max2].cdo;
614 				msp3400c_set_mode(client, MSP_MODE_AM_NICAM);
615 				state->watch_stereo = 1;
616 			} else if (max2 == 0 && state->has_nicam) {
617 				/* D/K NICAM */
618 				state->second = msp3400c_carrier_detect_65[max2].cdo;
619 				msp3400c_set_mode(client, MSP_MODE_FM_NICAM1);
620 				state->nicam_on = 1;
621 				state->watch_stereo = 1;
622 			} else {
623 				goto no_second;
624 			}
625 			break;
626 		case 0: /* 4.5 */
627 		default:
628 no_second:
629 			state->second = msp3400c_carrier_detect_main[max1].cdo;
630 			msp3400c_set_mode(client, MSP_MODE_FM_TERRA);
631 			break;
632 		}
633 		msp3400c_set_carrier(client, state->second, state->main);
634 
635 		/* unmute */
636 		state->scan_in_progress = 0;
637 		msp3400c_set_audmode(client);
638 		msp_set_audio(client);
639 
640 		if (msp_debug)
641 			msp3400c_print_mode(client);
642 
643 		/* monitor tv audio mode, the first time don't wait
644 		   so long to get a quick stereo/bilingual result */
645 		count = 3;
646 		while (state->watch_stereo) {
647 			if (msp_sleep(state, count ? 1000 : 5000))
648 				goto restart;
649 			if (count)
650 				count--;
651 			watch_stereo(client);
652 		}
653 	}
654 	v4l_dbg(1, msp_debug, client, "thread: exit\n");
655 	return 0;
656 }
657 
658 
msp3410d_thread(void * data)659 int msp3410d_thread(void *data)
660 {
661 	struct i2c_client *client = data;
662 	struct msp_state *state = to_state(i2c_get_clientdata(client));
663 	int val, i, std, count;
664 
665 	v4l_dbg(1, msp_debug, client, "msp3410 daemon started\n");
666 	set_freezable();
667 	for (;;) {
668 		v4l_dbg(2, msp_debug, client, "msp3410 thread: sleep\n");
669 		msp_sleep(state, -1);
670 		v4l_dbg(2, msp_debug, client, "msp3410 thread: wakeup\n");
671 
672 restart:
673 		v4l_dbg(2, msp_debug, client, "thread: restart scan\n");
674 		state->restart = 0;
675 		if (kthread_should_stop())
676 			break;
677 
678 		if (state->mode == MSP_MODE_EXTERN) {
679 			/* no carrier scan needed, just unmute */
680 			v4l_dbg(1, msp_debug, client,
681 				"thread: no carrier scan\n");
682 			state->scan_in_progress = 0;
683 			msp_set_audio(client);
684 			continue;
685 		}
686 
687 		/* mute audio */
688 		state->scan_in_progress = 1;
689 		msp_set_audio(client);
690 
691 		/* start autodetect. Note: autodetect is not supported for
692 		   NTSC-M and radio, hence we force the standard in those
693 		   cases. */
694 		if (state->radio)
695 			std = 0x40;
696 		else
697 			std = (state->v4l2_std & V4L2_STD_NTSC) ? 0x20 : 1;
698 		state->watch_stereo = 0;
699 		state->nicam_on = 0;
700 
701 		/* wait for tuner to settle down after a channel change */
702 		if (msp_sleep(state, 200))
703 			goto restart;
704 
705 		if (msp_debug)
706 			v4l_dbg(2, msp_debug, client,
707 				"setting standard: %s (0x%04x)\n",
708 				msp_standard_std_name(std), std);
709 
710 		if (std != 1) {
711 			/* programmed some specific mode */
712 			val = std;
713 		} else {
714 			/* triggered autodetect */
715 			msp_write_dem(client, 0x20, std);
716 			for (;;) {
717 				if (msp_sleep(state, 100))
718 					goto restart;
719 
720 				/* check results */
721 				val = msp_read_dem(client, 0x7e);
722 				if (val < 0x07ff)
723 					break;
724 				v4l_dbg(2, msp_debug, client,
725 					"detection still in progress\n");
726 			}
727 		}
728 		for (i = 0; msp_stdlist[i].name != NULL; i++)
729 			if (msp_stdlist[i].retval == val)
730 				break;
731 		v4l_dbg(1, msp_debug, client, "current standard: %s (0x%04x)\n",
732 			msp_standard_std_name(val), val);
733 		state->main   = msp_stdlist[i].main;
734 		state->second = msp_stdlist[i].second;
735 		state->std = val;
736 		state->rxsubchans = V4L2_TUNER_SUB_MONO;
737 
738 		if (msp_amsound && !state->radio &&
739 		    (state->v4l2_std & V4L2_STD_SECAM) && (val != 0x0009)) {
740 			/* autodetection has failed, let backup */
741 			v4l_dbg(1, msp_debug, client, "autodetection failed,"
742 				" switching to backup standard: %s (0x%04x)\n",
743 				msp_stdlist[8].name ?
744 					msp_stdlist[8].name : "unknown", val);
745 			state->std = val = 0x0009;
746 			msp_write_dem(client, 0x20, val);
747 		}
748 
749 		/* set stereo */
750 		switch (val) {
751 		case 0x0008: /* B/G NICAM */
752 		case 0x000a: /* I NICAM */
753 		case 0x000b: /* D/K NICAM */
754 			if (val == 0x000a)
755 				state->mode = MSP_MODE_FM_NICAM2;
756 			else
757 				state->mode = MSP_MODE_FM_NICAM1;
758 			/* just turn on stereo */
759 			state->nicam_on = 1;
760 			state->watch_stereo = 1;
761 			break;
762 		case 0x0009:
763 			state->mode = MSP_MODE_AM_NICAM;
764 			state->nicam_on = 1;
765 			state->watch_stereo = 1;
766 			break;
767 		case 0x0020: /* BTSC */
768 			/* The pre-'G' models only have BTSC-mono */
769 			state->mode = MSP_MODE_BTSC;
770 			break;
771 		case 0x0040: /* FM radio */
772 			state->mode = MSP_MODE_FM_RADIO;
773 			state->rxsubchans = V4L2_TUNER_SUB_STEREO;
774 			/* not needed in theory if we have radio, but
775 			   short programming enables carrier mute */
776 			msp3400c_set_mode(client, MSP_MODE_FM_RADIO);
777 			msp3400c_set_carrier(client, MSP_CARRIER(10.7),
778 					    MSP_CARRIER(10.7));
779 			break;
780 		case 0x0002:
781 		case 0x0003:
782 		case 0x0004:
783 		case 0x0005:
784 			state->mode = MSP_MODE_FM_TERRA;
785 			state->watch_stereo = 1;
786 			break;
787 		}
788 
789 		/* set various prescales */
790 		msp_write_dsp(client, 0x0d, 0x1900); /* scart */
791 		msp_write_dsp(client, 0x0e, 0x3000); /* FM */
792 		if (state->has_nicam)
793 			msp_write_dsp(client, 0x10, 0x5a00); /* nicam */
794 
795 		if (state->has_i2s_conf)
796 			msp_write_dem(client, 0x40, state->i2s_mode);
797 
798 		/* unmute */
799 		msp3400c_set_audmode(client);
800 		state->scan_in_progress = 0;
801 		msp_set_audio(client);
802 
803 		/* monitor tv audio mode, the first time don't wait
804 		   so long to get a quick stereo/bilingual result */
805 		count = 3;
806 		while (state->watch_stereo) {
807 			if (msp_sleep(state, count ? 1000 : 5000))
808 				goto restart;
809 			if (count)
810 				count--;
811 			watch_stereo(client);
812 		}
813 	}
814 	v4l_dbg(1, msp_debug, client, "thread: exit\n");
815 	return 0;
816 }
817 
818 /* ----------------------------------------------------------------------- */
819 
820 /* msp34xxG + (autoselect no-thread)
821  * this one uses both automatic standard detection and automatic sound
822  * select which are available in the newer G versions
823  * struct msp: only norm, acb and source are really used in this mode
824  */
825 
msp34xxg_modus(struct i2c_client * client)826 static int msp34xxg_modus(struct i2c_client *client)
827 {
828 	struct msp_state *state = to_state(i2c_get_clientdata(client));
829 
830 	if (state->radio) {
831 		v4l_dbg(1, msp_debug, client, "selected radio modus\n");
832 		return 0x0001;
833 	}
834 	if (state->v4l2_std == V4L2_STD_NTSC_M_JP) {
835 		v4l_dbg(1, msp_debug, client, "selected M (EIA-J) modus\n");
836 		return 0x4001;
837 	}
838 	if (state->v4l2_std == V4L2_STD_NTSC_M_KR) {
839 		v4l_dbg(1, msp_debug, client, "selected M (A2) modus\n");
840 		return 0x0001;
841 	}
842 	if (state->v4l2_std == V4L2_STD_SECAM_L) {
843 		v4l_dbg(1, msp_debug, client, "selected SECAM-L modus\n");
844 		return 0x6001;
845 	}
846 	if (state->v4l2_std & V4L2_STD_MN) {
847 		v4l_dbg(1, msp_debug, client, "selected M (BTSC) modus\n");
848 		return 0x2001;
849 	}
850 	return 0x7001;
851 }
852 
msp34xxg_set_source(struct i2c_client * client,u16 reg,int in)853 static void msp34xxg_set_source(struct i2c_client *client, u16 reg, int in)
854  {
855 	struct msp_state *state = to_state(i2c_get_clientdata(client));
856 	int source, matrix;
857 
858 	switch (state->audmode) {
859 	case V4L2_TUNER_MODE_MONO:
860 		source = 0; /* mono only */
861 		matrix = 0x30;
862 		break;
863 	case V4L2_TUNER_MODE_LANG2:
864 		source = 4; /* stereo or B */
865 		matrix = 0x10;
866 		break;
867 	case V4L2_TUNER_MODE_LANG1_LANG2:
868 		source = 1; /* stereo or A|B */
869 		matrix = 0x20;
870 		break;
871 	case V4L2_TUNER_MODE_LANG1:
872 		source = 3; /* stereo or A */
873 		matrix = 0x00;
874 		break;
875 	case V4L2_TUNER_MODE_STEREO:
876 	default:
877 		source = 3; /* stereo or A */
878 		matrix = 0x20;
879 		break;
880 	}
881 
882 	if (in == MSP_DSP_IN_TUNER)
883 		source = (source << 8) | 0x20;
884 	/* the msp34x2g puts the MAIN_AVC, MAIN and AUX sources in 12, 13, 14
885 	   instead of 11, 12, 13. So we add one for that msp version. */
886 	else if (in >= MSP_DSP_IN_MAIN_AVC && state->has_dolby_pro_logic)
887 		source = ((in + 1) << 8) | matrix;
888 	else
889 		source = (in << 8) | matrix;
890 
891 	v4l_dbg(1, msp_debug, client,
892 		"set source to %d (0x%x) for output %02x\n", in, source, reg);
893 	msp_write_dsp(client, reg, source);
894 }
895 
msp34xxg_set_sources(struct i2c_client * client)896 static void msp34xxg_set_sources(struct i2c_client *client)
897 {
898 	struct msp_state *state = to_state(i2c_get_clientdata(client));
899 	u32 in = state->routing.input;
900 
901 	msp34xxg_set_source(client, 0x0008, (in >> 4) & 0xf);
902 	/* quasi-peak detector is set to same input as the loudspeaker (MAIN) */
903 	msp34xxg_set_source(client, 0x000c, (in >> 4) & 0xf);
904 	msp34xxg_set_source(client, 0x0009, (in >> 8) & 0xf);
905 	msp34xxg_set_source(client, 0x000a, (in >> 12) & 0xf);
906 	if (state->has_scart2_out)
907 		msp34xxg_set_source(client, 0x0041, (in >> 16) & 0xf);
908 	msp34xxg_set_source(client, 0x000b, (in >> 20) & 0xf);
909 }
910 
911 /* (re-)initialize the msp34xxg */
msp34xxg_reset(struct i2c_client * client)912 static void msp34xxg_reset(struct i2c_client *client)
913 {
914 	struct msp_state *state = to_state(i2c_get_clientdata(client));
915 	int tuner = (state->routing.input >> 3) & 1;
916 	int modus;
917 
918 	/* initialize std to 1 (autodetect) to signal that no standard is
919 	   selected yet. */
920 	state->std = 1;
921 
922 	msp_reset(client);
923 
924 	if (state->has_i2s_conf)
925 		msp_write_dem(client, 0x40, state->i2s_mode);
926 
927 	/* step-by-step initialisation, as described in the manual */
928 	modus = msp34xxg_modus(client);
929 	modus |= tuner ? 0x100 : 0;
930 	msp_write_dem(client, 0x30, modus);
931 
932 	/* write the dsps that may have an influence on
933 	   standard/audio autodetection right now */
934 	msp34xxg_set_sources(client);
935 
936 	msp_write_dsp(client, 0x0d, 0x1900); /* scart */
937 	msp_write_dsp(client, 0x0e, 0x3000); /* FM */
938 	if (state->has_nicam)
939 		msp_write_dsp(client, 0x10, 0x5a00); /* nicam */
940 
941 	/* set identification threshold. Personally, I
942 	 * I set it to a higher value than the default
943 	 * of 0x190 to ignore noisy stereo signals.
944 	 * this needs tuning. (recommended range 0x00a0-0x03c0)
945 	 * 0x7f0 = forced mono mode
946 	 *
947 	 * a2 threshold for stereo/bilingual.
948 	 * Note: this register is part of the Manual/Compatibility mode.
949 	 * It is supported by all 'G'-family chips.
950 	 */
951 	msp_write_dem(client, 0x22, msp_stereo_thresh);
952 }
953 
msp34xxg_thread(void * data)954 int msp34xxg_thread(void *data)
955 {
956 	struct i2c_client *client = data;
957 	struct msp_state *state = to_state(i2c_get_clientdata(client));
958 	int val, i;
959 
960 	v4l_dbg(1, msp_debug, client, "msp34xxg daemon started\n");
961 	set_freezable();
962 	for (;;) {
963 		v4l_dbg(2, msp_debug, client, "msp34xxg thread: sleep\n");
964 		msp_sleep(state, -1);
965 		v4l_dbg(2, msp_debug, client, "msp34xxg thread: wakeup\n");
966 
967 restart:
968 		v4l_dbg(1, msp_debug, client, "thread: restart scan\n");
969 		state->restart = 0;
970 		if (kthread_should_stop())
971 			break;
972 
973 		if (state->mode == MSP_MODE_EXTERN) {
974 			/* no carrier scan needed, just unmute */
975 			v4l_dbg(1, msp_debug, client,
976 				"thread: no carrier scan\n");
977 			state->scan_in_progress = 0;
978 			msp_set_audio(client);
979 			continue;
980 		}
981 
982 		/* setup the chip*/
983 		msp34xxg_reset(client);
984 		state->std = state->radio ? 0x40 :
985 			(state->force_btsc && msp_standard == 1) ? 32 : msp_standard;
986 		msp_write_dem(client, 0x20, state->std);
987 		/* start autodetect */
988 		if (state->std != 1)
989 			goto unmute;
990 
991 		/* watch autodetect */
992 		v4l_dbg(1, msp_debug, client,
993 			"started autodetect, waiting for result\n");
994 		for (i = 0; i < 10; i++) {
995 			if (msp_sleep(state, 100))
996 				goto restart;
997 
998 			/* check results */
999 			val = msp_read_dem(client, 0x7e);
1000 			if (val < 0x07ff) {
1001 				state->std = val;
1002 				break;
1003 			}
1004 			v4l_dbg(2, msp_debug, client,
1005 				"detection still in progress\n");
1006 		}
1007 		if (state->std == 1) {
1008 			v4l_dbg(1, msp_debug, client,
1009 				"detection still in progress after 10 tries. giving up.\n");
1010 			continue;
1011 		}
1012 
1013 unmute:
1014 		v4l_dbg(1, msp_debug, client,
1015 			"detected standard: %s (0x%04x)\n",
1016 			msp_standard_std_name(state->std), state->std);
1017 
1018 		if (state->std == 9) {
1019 			/* AM NICAM mode */
1020 			msp_write_dsp(client, 0x0e, 0x7c00);
1021 		}
1022 
1023 		/* unmute: dispatch sound to scart output, set scart volume */
1024 		msp_set_audio(client);
1025 
1026 		/* restore ACB */
1027 		if (msp_write_dsp(client, 0x13, state->acb))
1028 			return -1;
1029 
1030 		/* the periodic stereo/SAP check is only relevant for
1031 		   the 0x20 standard (BTSC) */
1032 		if (state->std != 0x20)
1033 			continue;
1034 
1035 		state->watch_stereo = 1;
1036 
1037 		/* monitor tv audio mode, the first time don't wait
1038 		   in order to get a quick stereo/SAP update */
1039 		watch_stereo(client);
1040 		while (state->watch_stereo) {
1041 			watch_stereo(client);
1042 			if (msp_sleep(state, 5000))
1043 				goto restart;
1044 		}
1045 	}
1046 	v4l_dbg(1, msp_debug, client, "thread: exit\n");
1047 	return 0;
1048 }
1049 
msp34xxg_detect_stereo(struct i2c_client * client)1050 static int msp34xxg_detect_stereo(struct i2c_client *client)
1051 {
1052 	struct msp_state *state = to_state(i2c_get_clientdata(client));
1053 	int status = msp_read_dem(client, 0x0200);
1054 	int is_bilingual = status & 0x100;
1055 	int is_stereo = status & 0x40;
1056 	int oldrx = state->rxsubchans;
1057 
1058 	if (state->mode == MSP_MODE_EXTERN)
1059 		return 0;
1060 
1061 	state->rxsubchans = 0;
1062 	if (is_stereo)
1063 		state->rxsubchans = V4L2_TUNER_SUB_STEREO;
1064 	else
1065 		state->rxsubchans = V4L2_TUNER_SUB_MONO;
1066 	if (is_bilingual) {
1067 		if (state->std == 0x20)
1068 			state->rxsubchans |= V4L2_TUNER_SUB_SAP;
1069 		else
1070 			state->rxsubchans =
1071 				V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
1072 	}
1073 	v4l_dbg(1, msp_debug, client,
1074 		"status=0x%x, stereo=%d, bilingual=%d -> rxsubchans=%d\n",
1075 		status, is_stereo, is_bilingual, state->rxsubchans);
1076 	return (oldrx != state->rxsubchans);
1077 }
1078 
msp34xxg_set_audmode(struct i2c_client * client)1079 static void msp34xxg_set_audmode(struct i2c_client *client)
1080 {
1081 	struct msp_state *state = to_state(i2c_get_clientdata(client));
1082 
1083 	if (state->std == 0x20) {
1084 	       if ((state->rxsubchans & V4L2_TUNER_SUB_SAP) &&
1085 		   (state->audmode == V4L2_TUNER_MODE_LANG1_LANG2 ||
1086 		    state->audmode == V4L2_TUNER_MODE_LANG2)) {
1087 			msp_write_dem(client, 0x20, 0x21);
1088 	       } else {
1089 			msp_write_dem(client, 0x20, 0x20);
1090 	       }
1091 	}
1092 
1093 	msp34xxg_set_sources(client);
1094 }
1095 
msp_set_audmode(struct i2c_client * client)1096 void msp_set_audmode(struct i2c_client *client)
1097 {
1098 	struct msp_state *state = to_state(i2c_get_clientdata(client));
1099 
1100 	switch (state->opmode) {
1101 	case OPMODE_MANUAL:
1102 	case OPMODE_AUTODETECT:
1103 		msp3400c_set_audmode(client);
1104 		break;
1105 	case OPMODE_AUTOSELECT:
1106 		msp34xxg_set_audmode(client);
1107 		break;
1108 	}
1109 }
1110 
msp_detect_stereo(struct i2c_client * client)1111 int msp_detect_stereo(struct i2c_client *client)
1112 {
1113 	struct msp_state *state  = to_state(i2c_get_clientdata(client));
1114 
1115 	switch (state->opmode) {
1116 	case OPMODE_MANUAL:
1117 	case OPMODE_AUTODETECT:
1118 		return msp3400c_detect_stereo(client);
1119 	case OPMODE_AUTOSELECT:
1120 		return msp34xxg_detect_stereo(client);
1121 	}
1122 	return 0;
1123 }
1124 
1125