msp3400-kthreads.c 31.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/*
 * Programming the mspx4xx sound processor family
 *
 * (c) 1997-2001 Gerd Knorr <kraxel@bytesex.org>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */


#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/i2c.h>
#include <linux/videodev.h>
#include <linux/videodev2.h>
#include <media/v4l2-common.h>
29
#include <media/msp3400.h>
30 31
#include <linux/kthread.h>
#include <linux/suspend.h>
32
#include "msp3400-driver.h"
33 34 35 36 37 38 39

/* this one uses the automatic sound standard detection of newer msp34xx
   chip versions */
static struct {
	int retval;
	int main, second;
	char *name;
40
} msp_stdlist[] = {
41 42 43 44 45 46 47
	{ 0x0000, 0, 0, "could not detect sound standard" },
	{ 0x0001, 0, 0, "autodetect start" },
	{ 0x0002, MSP_CARRIER(4.5), MSP_CARRIER(4.72), "4.5/4.72  M Dual FM-Stereo" },
	{ 0x0003, MSP_CARRIER(5.5), MSP_CARRIER(5.7421875), "5.5/5.74  B/G Dual FM-Stereo" },
	{ 0x0004, MSP_CARRIER(6.5), MSP_CARRIER(6.2578125), "6.5/6.25  D/K1 Dual FM-Stereo" },
	{ 0x0005, MSP_CARRIER(6.5), MSP_CARRIER(6.7421875), "6.5/6.74  D/K2 Dual FM-Stereo" },
	{ 0x0006, MSP_CARRIER(6.5), MSP_CARRIER(6.5), "6.5  D/K FM-Mono (HDEV3)" },
48
	{ 0x0007, MSP_CARRIER(6.5), MSP_CARRIER(5.7421875), "6.5/5.74  D/K3 Dual FM-Stereo" },
49 50 51 52 53
	{ 0x0008, MSP_CARRIER(5.5), MSP_CARRIER(5.85), "5.5/5.85  B/G NICAM FM" },
	{ 0x0009, MSP_CARRIER(6.5), MSP_CARRIER(5.85), "6.5/5.85  L NICAM AM" },
	{ 0x000a, MSP_CARRIER(6.0), MSP_CARRIER(6.55), "6.0/6.55  I NICAM FM" },
	{ 0x000b, MSP_CARRIER(6.5), MSP_CARRIER(5.85), "6.5/5.85  D/K NICAM FM" },
	{ 0x000c, MSP_CARRIER(6.5), MSP_CARRIER(5.85), "6.5/5.85  D/K NICAM FM (HDEV2)" },
54
	{ 0x000d, MSP_CARRIER(6.5), MSP_CARRIER(5.85), "6.5/5.85  D/K NICAM FM (HDEV3)" },
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
	{ 0x0020, MSP_CARRIER(4.5), MSP_CARRIER(4.5), "4.5  M BTSC-Stereo" },
	{ 0x0021, MSP_CARRIER(4.5), MSP_CARRIER(4.5), "4.5  M BTSC-Mono + SAP" },
	{ 0x0030, MSP_CARRIER(4.5), MSP_CARRIER(4.5), "4.5  M EIA-J Japan Stereo" },
	{ 0x0040, MSP_CARRIER(10.7), MSP_CARRIER(10.7), "10.7  FM-Stereo Radio" },
	{ 0x0050, MSP_CARRIER(6.5), MSP_CARRIER(6.5), "6.5  SAT-Mono" },
	{ 0x0051, MSP_CARRIER(7.02), MSP_CARRIER(7.20), "7.02/7.20  SAT-Stereo" },
	{ 0x0060, MSP_CARRIER(7.2), MSP_CARRIER(7.2), "7.2  SAT ADR" },
	{     -1, 0, 0, NULL }, /* EOF */
};

static struct msp3400c_init_data_dem {
	int fir1[6];
	int fir2[6];
	int cdo1;
	int cdo2;
	int ad_cv;
	int mode_reg;
	int dsp_src;
	int dsp_matrix;
} msp3400c_init_data[] = {
	{	/* AM (for carrier detect / msp3400) */
		{75, 19, 36, 35, 39, 40},
		{75, 19, 36, 35, 39, 40},
		MSP_CARRIER(5.5), MSP_CARRIER(5.5),
		0x00d0, 0x0500, 0x0020, 0x3000
	},{	/* AM (for carrier detect / msp3410) */
		{-1, -1, -8, 2, 59, 126},
		{-1, -1, -8, 2, 59, 126},
		MSP_CARRIER(5.5), MSP_CARRIER(5.5),
		0x00d0, 0x0100, 0x0020, 0x3000
	},{	/* FM Radio */
		{-8, -8, 4, 6, 78, 107},
		{-8, -8, 4, 6, 78, 107},
		MSP_CARRIER(10.7), MSP_CARRIER(10.7),
		0x00d0, 0x0480, 0x0020, 0x3000
	},{	/* Terrestial FM-mono + FM-stereo */
		{3, 18, 27, 48, 66, 72},
		{3, 18, 27, 48, 66, 72},
		MSP_CARRIER(5.5), MSP_CARRIER(5.5),
		0x00d0, 0x0480, 0x0030, 0x3000
	},{	/* Sat FM-mono */
		{ 1, 9, 14, 24, 33, 37},
		{ 3, 18, 27, 48, 66, 72},
		MSP_CARRIER(6.5), MSP_CARRIER(6.5),
		0x00c6, 0x0480, 0x0000, 0x3000
	},{	/* NICAM/FM --  B/G (5.5/5.85), D/K (6.5/5.85) */
		{-2, -8, -10, 10, 50, 86},
		{3, 18, 27, 48, 66, 72},
		MSP_CARRIER(5.5), MSP_CARRIER(5.5),
		0x00d0, 0x0040, 0x0120, 0x3000
	},{	/* NICAM/FM -- I (6.0/6.552) */
		{2, 4, -6, -4, 40, 94},
		{3, 18, 27, 48, 66, 72},
		MSP_CARRIER(6.0), MSP_CARRIER(6.0),
		0x00d0, 0x0040, 0x0120, 0x3000
	},{	/* NICAM/AM -- L (6.5/5.85) */
		{-2, -8, -10, 10, 50, 86},
		{-4, -12, -9, 23, 79, 126},
		MSP_CARRIER(6.5), MSP_CARRIER(6.5),
114
		0x00c6, 0x0140, 0x0120, 0x7c00
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
	},
};

struct msp3400c_carrier_detect {
	int   cdo;
	char *name;
};

static struct msp3400c_carrier_detect msp3400c_carrier_detect_main[] = {
	/* main carrier */
	{ MSP_CARRIER(4.5),        "4.5   NTSC"                   },
	{ MSP_CARRIER(5.5),        "5.5   PAL B/G"                },
	{ MSP_CARRIER(6.0),        "6.0   PAL I"                  },
	{ MSP_CARRIER(6.5),        "6.5   PAL D/K + SAT + SECAM"  }
};

static struct msp3400c_carrier_detect msp3400c_carrier_detect_55[] = {
	/* PAL B/G */
	{ MSP_CARRIER(5.7421875),  "5.742 PAL B/G FM-stereo"     },
	{ MSP_CARRIER(5.85),       "5.85  PAL B/G NICAM"         }
};

static struct msp3400c_carrier_detect msp3400c_carrier_detect_65[] = {
	/* PAL SAT / SECAM */
	{ MSP_CARRIER(5.85),       "5.85  PAL D/K + SECAM NICAM" },
	{ MSP_CARRIER(6.2578125),  "6.25  PAL D/K1 FM-stereo" },
	{ MSP_CARRIER(6.7421875),  "6.74  PAL D/K2 FM-stereo" },
	{ MSP_CARRIER(7.02),       "7.02  PAL SAT FM-stereo s/b" },
	{ MSP_CARRIER(7.20),       "7.20  PAL SAT FM-stereo s"   },
	{ MSP_CARRIER(7.38),       "7.38  PAL SAT FM-stereo b"   },
};

/* ------------------------------------------------------------------------ */

149
const char *msp_standard_std_name(int std)
150 151 152
{
	int i;

153 154 155
	for (i = 0; msp_stdlist[i].name != NULL; i++)
		if (msp_stdlist[i].retval == std)
			return msp_stdlist[i].name;
156 157 158
	return "unknown";
}

159
static void msp_set_source(struct i2c_client *client, u16 src)
160 161 162 163 164 165 166 167 168 169 170 171 172
{
	struct msp_state *state = i2c_get_clientdata(client);

	if (msp_dolby) {
		msp_write_dsp(client, 0x0008, 0x0520); /* I2S1 */
		msp_write_dsp(client, 0x0009, 0x0620); /* I2S2 */
	} else {
		msp_write_dsp(client, 0x0008, src);
		msp_write_dsp(client, 0x0009, src);
	}
	msp_write_dsp(client, 0x000a, src);
	msp_write_dsp(client, 0x000b, src);
	msp_write_dsp(client, 0x000c, src);
173
	if (state->has_scart2_out)
174 175 176 177
		msp_write_dsp(client, 0x0041, src);
}

void msp3400c_set_carrier(struct i2c_client *client, int cdo1, int cdo2)
178 179 180 181 182
{
	msp_write_dem(client, 0x0093, cdo1 & 0xfff);
	msp_write_dem(client, 0x009b, cdo1 >> 12);
	msp_write_dem(client, 0x00a3, cdo2 & 0xfff);
	msp_write_dem(client, 0x00ab, cdo2 >> 12);
183
	msp_write_dem(client, 0x0056, 0); /* LOAD_REG_1/2 */
184 185
}

186
void msp3400c_set_mode(struct i2c_client *client, int mode)
187 188
{
	struct msp_state *state = i2c_get_clientdata(client);
189
	struct msp3400c_init_data_dem *data = &msp3400c_init_data[mode];
190
	int tuner = (state->routing.input >> 3) & 1;
191 192
	int i;

193 194
	v4l_dbg(1, msp_debug, client, "set_mode: %d\n", mode);
	state->mode = mode;
195 196
	state->rxsubchans = V4L2_TUNER_SUB_MONO;

197
	msp_write_dem(client, 0x00bb, data->ad_cv | (tuner ? 0x100 : 0));
198 199

	for (i = 5; i >= 0; i--)               /* fir 1 */
200
		msp_write_dem(client, 0x0001, data->fir1[i]);
201 202 203 204 205

	msp_write_dem(client, 0x0005, 0x0004); /* fir 2 */
	msp_write_dem(client, 0x0005, 0x0040);
	msp_write_dem(client, 0x0005, 0x0000);
	for (i = 5; i >= 0; i--)
206
		msp_write_dem(client, 0x0005, data->fir2[i]);
207

208
	msp_write_dem(client, 0x0083, data->mode_reg);
209

210
	msp3400c_set_carrier(client, data->cdo1, data->cdo2);
211

212
	msp_set_source(client, data->dsp_src);
213
	/* set prescales */
214

215 216 217 218 219
	/* volume prescale for SCART (AM mono input) */
	msp_write_dsp(client, 0x000d, 0x1900);
	msp_write_dsp(client, 0x000e, data->dsp_matrix);
	if (state->has_nicam) /* nicam prescale */
		msp_write_dsp(client, 0x0010, 0x5a00);
220 221
}

222 223
/* Set audio mode. Note that the pre-'G' models do not support BTSC+SAP,
   nor do they support stereo BTSC. */
224
static void msp3400c_set_audmode(struct i2c_client *client)
225
{
226
	static char *strmode[] = { "mono", "stereo", "lang2", "lang1", "lang1+lang2" };
227
	struct msp_state *state = i2c_get_clientdata(client);
228
	char *modestr = (state->audmode >= 0 && state->audmode < 5) ?
229 230
		strmode[state->audmode] : "unknown";
	int src = 0;	/* channel source: FM/AM, nicam or SCART */
231
	int audmode = state->audmode;
232 233 234 235 236

	if (state->opmode == OPMODE_AUTOSELECT) {
		/* this method would break everything, let's make sure
		 * it's never called
		 */
237 238 239
		v4l_dbg(1, msp_debug, client,
			"set_audmode called with mode=%d instead of set_source (ignored)\n",
			state->audmode);
240 241 242
		return;
	}

243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258
	/* Note: for the C and D revs no NTSC stereo + SAP is possible as
	   the hardware does not support SAP. So the rxsubchans combination
	   of STEREO | LANG2 does not occur. */

	/* switch to mono if only mono is available */
	if (state->rxsubchans == V4L2_TUNER_SUB_MONO)
		audmode = V4L2_TUNER_MODE_MONO;
	/* if bilingual */
	else if (state->rxsubchans & V4L2_TUNER_SUB_LANG2) {
		/* and mono or stereo, then fallback to lang1 */
		if (audmode == V4L2_TUNER_MODE_MONO ||
		    audmode == V4L2_TUNER_MODE_STEREO)
			audmode = V4L2_TUNER_MODE_LANG1;
	}
	/* if stereo, and audmode is not mono, then switch to stereo */
	else if (audmode != V4L2_TUNER_MODE_MONO)
259 260
		audmode = V4L2_TUNER_MODE_STEREO;

261 262 263
	/* switch demodulator */
	switch (state->mode) {
	case MSP_MODE_FM_TERRA:
264
		v4l_dbg(1, msp_debug, client, "FM set_audmode: %s\n", modestr);
265
		switch (audmode) {
266 267 268 269 270 271
		case V4L2_TUNER_MODE_STEREO:
			msp_write_dsp(client, 0x000e, 0x3001);
			break;
		case V4L2_TUNER_MODE_MONO:
		case V4L2_TUNER_MODE_LANG1:
		case V4L2_TUNER_MODE_LANG2:
272
		case V4L2_TUNER_MODE_LANG1_LANG2:
273 274 275 276 277
			msp_write_dsp(client, 0x000e, 0x3000);
			break;
		}
		break;
	case MSP_MODE_FM_SAT:
278
		v4l_dbg(1, msp_debug, client, "SAT set_audmode: %s\n", modestr);
279
		switch (audmode) {
280
		case V4L2_TUNER_MODE_MONO:
281
			msp3400c_set_carrier(client, MSP_CARRIER(6.5), MSP_CARRIER(6.5));
282 283
			break;
		case V4L2_TUNER_MODE_STEREO:
284
		case V4L2_TUNER_MODE_LANG1_LANG2:
285
			msp3400c_set_carrier(client, MSP_CARRIER(7.2), MSP_CARRIER(7.02));
286 287
			break;
		case V4L2_TUNER_MODE_LANG1:
288
			msp3400c_set_carrier(client, MSP_CARRIER(7.38), MSP_CARRIER(7.02));
289 290
			break;
		case V4L2_TUNER_MODE_LANG2:
291
			msp3400c_set_carrier(client, MSP_CARRIER(7.38), MSP_CARRIER(7.02));
292 293 294 295 296 297
			break;
		}
		break;
	case MSP_MODE_FM_NICAM1:
	case MSP_MODE_FM_NICAM2:
	case MSP_MODE_AM_NICAM:
298
		v4l_dbg(1, msp_debug, client, "NICAM set_audmode: %s\n",modestr);
299
		if (state->nicam_on)
300
			src = 0x0100;  /* NICAM */
301 302
		break;
	case MSP_MODE_BTSC:
303
		v4l_dbg(1, msp_debug, client, "BTSC set_audmode: %s\n",modestr);
304 305
		break;
	case MSP_MODE_EXTERN:
306 307
		v4l_dbg(1, msp_debug, client, "extern set_audmode: %s\n",modestr);
		src = 0x0200;  /* SCART */
308 309
		break;
	case MSP_MODE_FM_RADIO:
310
		v4l_dbg(1, msp_debug, client, "FM-Radio set_audmode: %s\n",modestr);
311 312
		break;
	default:
313
		v4l_dbg(1, msp_debug, client, "mono set_audmode\n");
314 315 316 317
		return;
	}

	/* switch audio */
318
	v4l_dbg(1, msp_debug, client, "set audmode %d\n", audmode);
319
	switch (audmode) {
320
	case V4L2_TUNER_MODE_STEREO:
321
	case V4L2_TUNER_MODE_LANG1_LANG2:
322
		src |= 0x0020;
323 324 325
		break;
	case V4L2_TUNER_MODE_MONO:
		if (state->mode == MSP_MODE_AM_NICAM) {
M
 
Mauro Carvalho Chehab 已提交
326
			v4l_dbg(1, msp_debug, client, "switching to AM mono\n");
327 328 329 330 331 332
			/* AM mono decoding is handled by tuner, not MSP chip */
			/* SCART switching control register */
			msp_set_scart(client, SCART_MONO, 0);
			src = 0x0200;
			break;
		}
333 334 335
		if (state->rxsubchans & V4L2_TUNER_SUB_STEREO)
			src = 0x0030;
		break;
336 337 338
	case V4L2_TUNER_MODE_LANG1:
		break;
	case V4L2_TUNER_MODE_LANG2:
339
		src |= 0x0010;
340 341
		break;
	}
342
	v4l_dbg(1, msp_debug, client, "set_audmode final source/matrix = 0x%x\n", src);
343

344
	msp_set_source(client, src);
345 346 347 348 349 350 351
}

static void msp3400c_print_mode(struct i2c_client *client)
{
	struct msp_state *state = i2c_get_clientdata(client);

	if (state->main == state->second) {
M
 
Mauro Carvalho Chehab 已提交
352
		v4l_dbg(1, msp_debug, client, "mono sound carrier: %d.%03d MHz\n",
353 354
		       state->main / 910000, (state->main / 910) % 1000);
	} else {
M
 
Mauro Carvalho Chehab 已提交
355
		v4l_dbg(1, msp_debug, client, "main sound carrier: %d.%03d MHz\n",
356 357 358
		       state->main / 910000, (state->main / 910) % 1000);
	}
	if (state->mode == MSP_MODE_FM_NICAM1 || state->mode == MSP_MODE_FM_NICAM2)
M
 
Mauro Carvalho Chehab 已提交
359
		v4l_dbg(1, msp_debug, client, "NICAM/FM carrier  : %d.%03d MHz\n",
360 361
		       state->second / 910000, (state->second/910) % 1000);
	if (state->mode == MSP_MODE_AM_NICAM)
M
 
Mauro Carvalho Chehab 已提交
362
		v4l_dbg(1, msp_debug, client, "NICAM/AM carrier  : %d.%03d MHz\n",
363 364
		       state->second / 910000, (state->second / 910) % 1000);
	if (state->mode == MSP_MODE_FM_TERRA && state->main != state->second) {
M
 
Mauro Carvalho Chehab 已提交
365
		v4l_dbg(1, msp_debug, client, "FM-stereo carrier : %d.%03d MHz\n",
366 367 368 369 370 371
		       state->second / 910000, (state->second / 910) % 1000);
	}
}

/* ----------------------------------------------------------------------- */

372
static int msp3400c_detect_stereo(struct i2c_client *client)
373 374 375 376
{
	struct msp_state *state = i2c_get_clientdata(client);
	int val;
	int rxsubchans = state->rxsubchans;
377
	int newnicam = state->nicam_on;
378 379 380 381 382 383 384
	int update = 0;

	switch (state->mode) {
	case MSP_MODE_FM_TERRA:
		val = msp_read_dsp(client, 0x18);
		if (val > 32767)
			val -= 65536;
M
 
Mauro Carvalho Chehab 已提交
385
		v4l_dbg(2, msp_debug, client, "stereo detect register: %d\n", val);
386
		if (val > 8192) {
387
			rxsubchans = V4L2_TUNER_SUB_STEREO;
388 389 390 391 392 393 394 395 396 397 398
		} else if (val < -4096) {
			rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
		} else {
			rxsubchans = V4L2_TUNER_SUB_MONO;
		}
		newnicam = 0;
		break;
	case MSP_MODE_FM_NICAM1:
	case MSP_MODE_FM_NICAM2:
	case MSP_MODE_AM_NICAM:
		val = msp_read_dem(client, 0x23);
M
 
Mauro Carvalho Chehab 已提交
399
		v4l_dbg(2, msp_debug, client, "nicam sync=%d, mode=%d\n",
400 401 402 403 404 405 406 407 408 409 410
			val & 1, (val & 0x1e) >> 1);

		if (val & 1) {
			/* nicam synced */
			switch ((val & 0x1e) >> 1)  {
			case 0:
			case 8:
				rxsubchans = V4L2_TUNER_SUB_STEREO;
				break;
			case 1:
			case 9:
411
				rxsubchans = V4L2_TUNER_SUB_MONO;
412 413 414
				break;
			case 2:
			case 10:
415
				rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
416 417 418 419 420 421 422 423 424 425 426 427 428 429
				break;
			default:
				rxsubchans = V4L2_TUNER_SUB_MONO;
				break;
			}
			newnicam = 1;
		} else {
			newnicam = 0;
			rxsubchans = V4L2_TUNER_SUB_MONO;
		}
		break;
	}
	if (rxsubchans != state->rxsubchans) {
		update = 1;
430 431
		v4l_dbg(1, msp_debug, client, "watch: rxsubchans %02x => %02x\n",
			state->rxsubchans, rxsubchans);
432 433 434 435
		state->rxsubchans = rxsubchans;
	}
	if (newnicam != state->nicam_on) {
		update = 1;
M
 
Mauro Carvalho Chehab 已提交
436
		v4l_dbg(1, msp_debug, client, "watch: nicam %d => %d\n",
437
			state->nicam_on, newnicam);
438 439 440 441 442 443 444 445 446 447 448 449 450 451
		state->nicam_on = newnicam;
	}
	return update;
}

/*
 * A kernel thread for msp3400 control -- we don't want to block the
 * in the ioctl while doing the sound carrier & stereo detect
 */
/* stereo/multilang monitoring */
static void watch_stereo(struct i2c_client *client)
{
	struct msp_state *state = i2c_get_clientdata(client);

452 453
	if (msp_detect_stereo(client)) {
		msp_set_audmode(client);
454 455
	}

M
 
Mauro Carvalho Chehab 已提交
456
	if (msp_once)
457 458 459 460 461 462 463 464
		state->watch_stereo = 0;
}

int msp3400c_thread(void *data)
{
	struct i2c_client *client = data;
	struct msp_state *state = i2c_get_clientdata(client);
	struct msp3400c_carrier_detect *cd;
465
	int count, max1, max2, val1, val2, val, this;
466 467


M
 
Mauro Carvalho Chehab 已提交
468
	v4l_dbg(1, msp_debug, client, "msp3400 daemon started\n");
469
	for (;;) {
M
 
Mauro Carvalho Chehab 已提交
470
		v4l_dbg(2, msp_debug, client, "msp3400 thread: sleep\n");
471
		msp_sleep(state, -1);
M
 
Mauro Carvalho Chehab 已提交
472
		v4l_dbg(2, msp_debug, client, "msp3400 thread: wakeup\n");
473 474

	restart:
475
		v4l_dbg(2, msp_debug, client, "thread: restart scan\n");
476 477 478 479
		state->restart = 0;
		if (kthread_should_stop())
			break;

480
		if (state->radio || MSP_MODE_EXTERN == state->mode) {
481
			/* no carrier scan, just unmute */
M
 
Mauro Carvalho Chehab 已提交
482
			v4l_dbg(1, msp_debug, client, "thread: no carrier scan\n");
483
			state->scan_in_progress = 0;
484 485 486 487
			msp_set_audio(client);
			continue;
		}

488 489 490
		/* mute audio */
		state->scan_in_progress = 1;
		msp_set_audio(client);
491

492
		msp3400c_set_mode(client, MSP_MODE_AM_DETECT);
493 494 495
		val1 = val2 = 0;
		max1 = max2 = -1;
		state->watch_stereo = 0;
496
		state->nicam_on = 0;
497

498
		/* wait for tuner to settle down after a channel change */
499
		if (msp_sleep(state, 200))
500 501 502 503 504 505
			goto restart;

		/* carrier detect pass #1 -- main carrier */
		cd = msp3400c_carrier_detect_main;
		count = ARRAY_SIZE(msp3400c_carrier_detect_main);

M
 
Mauro Carvalho Chehab 已提交
506
		if (msp_amsound && (state->v4l2_std & V4L2_STD_SECAM)) {
507 508 509
			/* autodetect doesn't work well with AM ... */
			max1 = 3;
			count = 0;
M
 
Mauro Carvalho Chehab 已提交
510
			v4l_dbg(1, msp_debug, client, "AM sound override\n");
511 512 513
		}

		for (this = 0; this < count; this++) {
514
			msp3400c_set_carrier(client, cd[this].cdo, cd[this].cdo);
515 516 517 518 519 520 521
			if (msp_sleep(state,100))
				goto restart;
			val = msp_read_dsp(client, 0x1b);
			if (val > 32767)
				val -= 65536;
			if (val1 < val)
				val1 = val, max1 = this;
M
 
Mauro Carvalho Chehab 已提交
522
			v4l_dbg(1, msp_debug, client, "carrier1 val: %5d / %s\n", val,cd[this].name);
523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542
		}

		/* carrier detect pass #2 -- second (stereo) carrier */
		switch (max1) {
		case 1: /* 5.5 */
			cd = msp3400c_carrier_detect_55;
			count = ARRAY_SIZE(msp3400c_carrier_detect_55);
			break;
		case 3: /* 6.5 */
			cd = msp3400c_carrier_detect_65;
			count = ARRAY_SIZE(msp3400c_carrier_detect_65);
			break;
		case 0: /* 4.5 */
		case 2: /* 6.0 */
		default:
			cd = NULL;
			count = 0;
			break;
		}

M
 
Mauro Carvalho Chehab 已提交
543
		if (msp_amsound && (state->v4l2_std & V4L2_STD_SECAM)) {
544 545 546 547 548 549
			/* autodetect doesn't work well with AM ... */
			cd = NULL;
			count = 0;
			max2 = 0;
		}
		for (this = 0; this < count; this++) {
550
			msp3400c_set_carrier(client, cd[this].cdo, cd[this].cdo);
551 552 553 554 555 556 557
			if (msp_sleep(state,100))
				goto restart;
			val = msp_read_dsp(client, 0x1b);
			if (val > 32767)
				val -= 65536;
			if (val2 < val)
				val2 = val, max2 = this;
M
 
Mauro Carvalho Chehab 已提交
558
			v4l_dbg(1, msp_debug, client, "carrier2 val: %5d / %s\n", val,cd[this].name);
559 560 561
		}

		/* program the msp3400 according to the results */
562
		state->main = msp3400c_carrier_detect_main[max1].cdo;
563 564 565 566 567
		switch (max1) {
		case 1: /* 5.5 */
			if (max2 == 0) {
				/* B/G FM-stereo */
				state->second = msp3400c_carrier_detect_55[max2].cdo;
568
				msp3400c_set_mode(client, MSP_MODE_FM_TERRA);
569
				state->watch_stereo = 1;
570
			} else if (max2 == 1 && state->has_nicam) {
571 572
				/* B/G NICAM */
				state->second = msp3400c_carrier_detect_55[max2].cdo;
573
				msp3400c_set_mode(client, MSP_MODE_FM_NICAM1);
574 575 576 577 578 579 580 581 582
				state->nicam_on = 1;
				state->watch_stereo = 1;
			} else {
				goto no_second;
			}
			break;
		case 2: /* 6.0 */
			/* PAL I NICAM */
			state->second = MSP_CARRIER(6.552);
583
			msp3400c_set_mode(client, MSP_MODE_FM_NICAM2);
584 585 586 587 588 589 590
			state->nicam_on = 1;
			state->watch_stereo = 1;
			break;
		case 3: /* 6.5 */
			if (max2 == 1 || max2 == 2) {
				/* D/K FM-stereo */
				state->second = msp3400c_carrier_detect_65[max2].cdo;
591
				msp3400c_set_mode(client, MSP_MODE_FM_TERRA);
592
				state->watch_stereo = 1;
593
			} else if (max2 == 0 && (state->v4l2_std & V4L2_STD_SECAM)) {
594 595
				/* L NICAM or AM-mono */
				state->second = msp3400c_carrier_detect_65[max2].cdo;
596
				msp3400c_set_mode(client, MSP_MODE_AM_NICAM);
597
				state->watch_stereo = 1;
598
			} else if (max2 == 0 && state->has_nicam) {
599 600
				/* D/K NICAM */
				state->second = msp3400c_carrier_detect_65[max2].cdo;
601
				msp3400c_set_mode(client, MSP_MODE_FM_NICAM1);
602 603 604 605 606 607 608 609 610 611
				state->nicam_on = 1;
				state->watch_stereo = 1;
			} else {
				goto no_second;
			}
			break;
		case 0: /* 4.5 */
		default:
		no_second:
			state->second = msp3400c_carrier_detect_main[max1].cdo;
612
			msp3400c_set_mode(client, MSP_MODE_FM_TERRA);
613 614
			break;
		}
615
		msp3400c_set_carrier(client, state->second, state->main);
616

617 618
		/* unmute */
		state->scan_in_progress = 0;
619
		msp3400c_set_audmode(client);
620
		msp_set_audio(client);
621

M
 
Mauro Carvalho Chehab 已提交
622
		if (msp_debug)
623 624
			msp3400c_print_mode(client);

625 626
		/* monitor tv audio mode, the first time don't wait
		   so long to get a quick stereo/bilingual result */
627
		count = 3;
628
		while (state->watch_stereo) {
629
			if (msp_sleep(state, count ? 1000 : 5000))
630
				goto restart;
631
			if (count) count--;
632
			watch_stereo(client);
633 634
		}
	}
M
 
Mauro Carvalho Chehab 已提交
635
	v4l_dbg(1, msp_debug, client, "thread: exit\n");
636 637 638 639 640 641 642 643
	return 0;
}


int msp3410d_thread(void *data)
{
	struct i2c_client *client = data;
	struct msp_state *state = i2c_get_clientdata(client);
644
	int val, i, std, count;
645

M
 
Mauro Carvalho Chehab 已提交
646
	v4l_dbg(1, msp_debug, client, "msp3410 daemon started\n");
647 648

	for (;;) {
M
 
Mauro Carvalho Chehab 已提交
649
		v4l_dbg(2, msp_debug, client, "msp3410 thread: sleep\n");
650
		msp_sleep(state,-1);
M
 
Mauro Carvalho Chehab 已提交
651
		v4l_dbg(2, msp_debug, client, "msp3410 thread: wakeup\n");
652 653

	restart:
654
		v4l_dbg(2, msp_debug, client, "thread: restart scan\n");
655 656 657 658 659 660
		state->restart = 0;
		if (kthread_should_stop())
			break;

		if (state->mode == MSP_MODE_EXTERN) {
			/* no carrier scan needed, just unmute */
M
 
Mauro Carvalho Chehab 已提交
661
			v4l_dbg(1, msp_debug, client, "thread: no carrier scan\n");
662
			state->scan_in_progress = 0;
663 664 665 666
			msp_set_audio(client);
			continue;
		}

667 668 669
		/* mute audio */
		state->scan_in_progress = 1;
		msp_set_audio(client);
670

671 672
		/* start autodetect. Note: autodetect is not supported for
		   NTSC-M and radio, hence we force the standard in those cases. */
673 674
		if (state->radio)
			std = 0x40;
675
		else
676
			std = (state->v4l2_std & V4L2_STD_NTSC) ? 0x20 : 1;
677
		state->watch_stereo = 0;
678
		state->nicam_on = 0;
679

680 681 682 683
		/* wait for tuner to settle down after a channel change */
		if (msp_sleep(state, 200))
			goto restart;

M
 
Mauro Carvalho Chehab 已提交
684
		if (msp_debug)
685
			v4l_dbg(2, msp_debug, client, "setting standard: %s (0x%04x)\n",
686
			       msp_standard_std_name(std), std);
687 688 689 690 691 692

		if (std != 1) {
			/* programmed some specific mode */
			val = std;
		} else {
			/* triggered autodetect */
693
			msp_write_dem(client, 0x20, std);
694
			for (;;) {
695
				if (msp_sleep(state, 100))
696 697 698 699 700 701
					goto restart;

				/* check results */
				val = msp_read_dem(client, 0x7e);
				if (val < 0x07ff)
					break;
702
				v4l_dbg(2, msp_debug, client, "detection still in progress\n");
703 704
			}
		}
705 706
		for (i = 0; msp_stdlist[i].name != NULL; i++)
			if (msp_stdlist[i].retval == val)
707
				break;
M
 
Mauro Carvalho Chehab 已提交
708
		v4l_dbg(1, msp_debug, client, "current standard: %s (0x%04x)\n",
709 710 711 712
			msp_standard_std_name(val), val);
		state->main   = msp_stdlist[i].main;
		state->second = msp_stdlist[i].second;
		state->std = val;
713
		state->rxsubchans = V4L2_TUNER_SUB_MONO;
714

M
 
Mauro Carvalho Chehab 已提交
715
		if (msp_amsound && !state->radio && (state->v4l2_std & V4L2_STD_SECAM) &&
716
				(val != 0x0009)) {
717
			/* autodetection has failed, let backup */
M
 
Mauro Carvalho Chehab 已提交
718
			v4l_dbg(1, msp_debug, client, "autodetection failed,"
719 720
				" switching to backup standard: %s (0x%04x)\n",
				msp_stdlist[8].name ? msp_stdlist[8].name : "unknown",val);
721
			state->std = val = 0x0009;
722 723 724 725 726 727 728
			msp_write_dem(client, 0x20, val);
		}

		/* set stereo */
		switch (val) {
		case 0x0008: /* B/G NICAM */
		case 0x000a: /* I NICAM */
729 730
		case 0x000b: /* D/K NICAM */
			if (val == 0x000a)
731
				state->mode = MSP_MODE_FM_NICAM2;
732 733
			else
				state->mode = MSP_MODE_FM_NICAM1;
734 735 736 737 738 739 740 741 742 743
			/* just turn on stereo */
			state->nicam_on = 1;
			state->watch_stereo = 1;
			break;
		case 0x0009:
			state->mode = MSP_MODE_AM_NICAM;
			state->nicam_on = 1;
			state->watch_stereo = 1;
			break;
		case 0x0020: /* BTSC */
744
			/* The pre-'G' models only have BTSC-mono */
745 746 747
			state->mode = MSP_MODE_BTSC;
			break;
		case 0x0040: /* FM radio */
748
			state->mode = MSP_MODE_FM_RADIO;
749
			state->rxsubchans = V4L2_TUNER_SUB_STEREO;
750
			/* not needed in theory if we have radio, but
751
			   short programming enables carrier mute */
752 753
			msp3400c_set_mode(client, MSP_MODE_FM_RADIO);
			msp3400c_set_carrier(client, MSP_CARRIER(10.7),
754 755
					    MSP_CARRIER(10.7));
			break;
756
		case 0x0002:
757 758 759
		case 0x0003:
		case 0x0004:
		case 0x0005:
760
			state->mode = MSP_MODE_FM_TERRA;
761 762 763 764
			state->watch_stereo = 1;
			break;
		}

765 766 767 768 769 770
		/* set various prescales */
		msp_write_dsp(client, 0x0d, 0x1900); /* scart */
		msp_write_dsp(client, 0x0e, 0x3000); /* FM */
		if (state->has_nicam)
			msp_write_dsp(client, 0x10, 0x5a00); /* nicam */

771 772
		if (state->has_i2s_conf)
			msp_write_dem(client, 0x40, state->i2s_mode);
773

774
		/* unmute */
775
		msp3400c_set_audmode(client);
776 777
		state->scan_in_progress = 0;
		msp_set_audio(client);
778 779 780

		/* monitor tv audio mode, the first time don't wait
		   so long to get a quick stereo/bilingual result */
781
		count = 3;
782
		while (state->watch_stereo) {
783
			if (msp_sleep(state, count ? 1000 : 5000))
784
				goto restart;
785
			if (count) count--;
786
			watch_stereo(client);
787 788
		}
	}
M
 
Mauro Carvalho Chehab 已提交
789
	v4l_dbg(1, msp_debug, client, "thread: exit\n");
790 791 792 793 794
	return 0;
}

/* ----------------------------------------------------------------------- */

795 796 797 798 799
/* msp34xxG + (autoselect no-thread)
 * this one uses both automatic standard detection and automatic sound
 * select which are available in the newer G versions
 * struct msp: only norm, acb and source are really used in this mode
 */
800

801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832
static int msp34xxg_modus(struct i2c_client *client)
{
	struct msp_state *state = i2c_get_clientdata(client);

	if (state->radio) {
		v4l_dbg(1, msp_debug, client, "selected radio modus\n");
		return 0x0001;
	}

	if (state->v4l2_std & V4L2_STD_PAL) {
		v4l_dbg(1, msp_debug, client, "selected PAL modus\n");
		return 0x7001;
	}
	if (state->v4l2_std == V4L2_STD_NTSC_M_JP) {
		v4l_dbg(1, msp_debug, client, "selected M (EIA-J) modus\n");
		return 0x4001;
	}
	if (state->v4l2_std == V4L2_STD_NTSC_M_KR) {
		v4l_dbg(1, msp_debug, client, "selected M (A2) modus\n");
		return 0x0001;
	}
	if (state->v4l2_std & V4L2_STD_MN) {
		v4l_dbg(1, msp_debug, client, "selected M (BTSC) modus\n");
		return 0x2001;
	}
	if (state->v4l2_std & V4L2_STD_SECAM) {
		v4l_dbg(1, msp_debug, client, "selected SECAM modus\n");
		return 0x6001;
	}
	return 0x0001;
}

833 834 835 836 837 838 839 840 841 842 843 844 845 846
static void msp34xxg_set_source(struct i2c_client *client, u16 reg, int in)
 {
	struct msp_state *state = i2c_get_clientdata(client);
	int source, matrix;

	switch (state->audmode) {
	case V4L2_TUNER_MODE_MONO:
		source = 0; /* mono only */
		matrix = 0x30;
		break;
	case V4L2_TUNER_MODE_LANG2:
		source = 4; /* stereo or B */
		matrix = 0x10;
		break;
847
	case V4L2_TUNER_MODE_LANG1_LANG2:
848 849 850
		source = 1; /* stereo or A|B */
		matrix = 0x20;
		break;
851 852 853 854 855 856
	case V4L2_TUNER_MODE_STEREO:
	case V4L2_TUNER_MODE_LANG1:
	default:
		source = 3; /* stereo or A */
		matrix = 0x00;
		break;
857 858
	}

859
	if (in == MSP_DSP_IN_TUNER)
860 861 862
		source = (source << 8) | 0x20;
	/* the msp34x2g puts the MAIN_AVC, MAIN and AUX sources in 12, 13, 14
	   instead of 11, 12, 13. So we add one for that msp version. */
863
	else if (in >= MSP_DSP_IN_MAIN_AVC && state->has_dolby_pro_logic)
864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882
		source = ((in + 1) << 8) | matrix;
	else
		source = (in << 8) | matrix;

	v4l_dbg(1, msp_debug, client, "set source to %d (0x%x) for output %02x\n",
			in, source, reg);
	msp_write_dsp(client, reg, source);
}

static void msp34xxg_set_sources(struct i2c_client *client)
{
	struct msp_state *state = i2c_get_clientdata(client);
	u32 in = state->routing.input;

	msp34xxg_set_source(client, 0x0008, (in >> 4) & 0xf);
	/* quasi-peak detector is set to same input as the loudspeaker (MAIN) */
	msp34xxg_set_source(client, 0x000c, (in >> 4) & 0xf);
	msp34xxg_set_source(client, 0x0009, (in >> 8) & 0xf);
	msp34xxg_set_source(client, 0x000a, (in >> 12) & 0xf);
883
	if (state->has_scart2_out)
884 885 886 887
		msp34xxg_set_source(client, 0x0041, (in >> 16) & 0xf);
	msp34xxg_set_source(client, 0x000b, (in >> 20) & 0xf);
}

888 889
/* (re-)initialize the msp34xxg */
static void msp34xxg_reset(struct i2c_client *client)
890 891
{
	struct msp_state *state = i2c_get_clientdata(client);
892
	int tuner = (state->routing.input >> 3) & 1;
893
	int modus;
894

895 896 897 898 899
	/* initialize std to 1 (autodetect) to signal that no standard is
	   selected yet. */
	state->std = 1;

	msp_reset(client);
900

901 902
	if (state->has_i2s_conf)
		msp_write_dem(client, 0x40, state->i2s_mode);
903 904

	/* step-by-step initialisation, as described in the manual */
905
	modus = msp34xxg_modus(client);
906
	modus |= tuner ? 0x100 : 0;
907
	msp_write_dem(client, 0x30, modus);
908 909 910

	/* write the dsps that may have an influence on
	   standard/audio autodetection right now */
911
	msp34xxg_set_sources(client);
912

913 914 915 916
	msp_write_dsp(client, 0x0d, 0x1900); /* scart */
	msp_write_dsp(client, 0x0e, 0x3000); /* FM */
	if (state->has_nicam)
		msp_write_dsp(client, 0x10, 0x5a00); /* nicam */
917

918 919 920 921 922 923 924 925 926 927 928
	/* set identification threshold. Personally, I
	 * I set it to a higher value than the default
	 * of 0x190 to ignore noisy stereo signals.
	 * this needs tuning. (recommended range 0x00a0-0x03c0)
	 * 0x7f0 = forced mono mode
	 *
	 * a2 threshold for stereo/bilingual.
	 * Note: this register is part of the Manual/Compatibility mode.
	 * It is supported by all 'G'-family chips.
	 */
	msp_write_dem(client, 0x22, msp_stereo_thresh);
929 930 931 932 933 934
}

int msp34xxg_thread(void *data)
{
	struct i2c_client *client = data;
	struct msp_state *state = i2c_get_clientdata(client);
935
	int val, i;
936

M
 
Mauro Carvalho Chehab 已提交
937
	v4l_dbg(1, msp_debug, client, "msp34xxg daemon started\n");
938 939

	for (;;) {
M
 
Mauro Carvalho Chehab 已提交
940
		v4l_dbg(2, msp_debug, client, "msp34xxg thread: sleep\n");
941
		msp_sleep(state, -1);
M
 
Mauro Carvalho Chehab 已提交
942
		v4l_dbg(2, msp_debug, client, "msp34xxg thread: wakeup\n");
943 944

	restart:
M
 
Mauro Carvalho Chehab 已提交
945
		v4l_dbg(1, msp_debug, client, "thread: restart scan\n");
946 947 948 949 950 951
		state->restart = 0;
		if (kthread_should_stop())
			break;

		/* setup the chip*/
		msp34xxg_reset(client);
952 953
		state->std = state->radio ? 0x40 : msp_standard;
		if (state->std != 1)
954
			goto unmute;
955 956
		/* start autodetect */
		msp_write_dem(client, 0x20, state->std);
957 958

		/* watch autodetect */
959
		v4l_dbg(1, msp_debug, client, "started autodetect, waiting for result\n");
960 961 962 963 964 965 966
		for (i = 0; i < 10; i++) {
			if (msp_sleep(state, 100))
				goto restart;

			/* check results */
			val = msp_read_dem(client, 0x7e);
			if (val < 0x07ff) {
967
				state->std = val;
968 969
				break;
			}
M
 
Mauro Carvalho Chehab 已提交
970
			v4l_dbg(2, msp_debug, client, "detection still in progress\n");
971
		}
972
		if (state->std == 1) {
M
 
Mauro Carvalho Chehab 已提交
973
			v4l_dbg(1, msp_debug, client, "detection still in progress after 10 tries. giving up.\n");
974 975 976 977
			continue;
		}

	unmute:
978 979
		v4l_dbg(1, msp_debug, client, "detected standard: %s (0x%04x)\n",
			msp_standard_std_name(state->std), state->std);
980 981 982 983 984 985 986 987

		/* unmute: dispatch sound to scart output, set scart volume */
		msp_set_audio(client);

		/* restore ACB */
		if (msp_write_dsp(client, 0x13, state->acb))
			return -1;

988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002
		/* the periodic stereo/SAP check is only relevant for
		   the 0x20 standard (BTSC) */
		if (state->std != 0x20)
			continue;

		state->watch_stereo = 1;

		/* monitor tv audio mode, the first time don't wait
		   in order to get a quick stereo/SAP update */
		watch_stereo(client);
		while (state->watch_stereo) {
			watch_stereo(client);
			if (msp_sleep(state, 5000))
				goto restart;
		}
1003
	}
M
 
Mauro Carvalho Chehab 已提交
1004
	v4l_dbg(1, msp_debug, client, "thread: exit\n");
1005 1006 1007
	return 0;
}

1008
static int msp34xxg_detect_stereo(struct i2c_client *client)
1009 1010 1011 1012 1013
{
	struct msp_state *state = i2c_get_clientdata(client);
	int status = msp_read_dem(client, 0x0200);
	int is_bilingual = status & 0x100;
	int is_stereo = status & 0x40;
1014
	int oldrx = state->rxsubchans;
1015 1016 1017

	state->rxsubchans = 0;
	if (is_stereo)
1018
		state->rxsubchans = V4L2_TUNER_SUB_STEREO;
1019
	else
1020
		state->rxsubchans = V4L2_TUNER_SUB_MONO;
1021
	if (is_bilingual) {
1022 1023 1024 1025
		if (state->std == 0x20)
			state->rxsubchans |= V4L2_TUNER_SUB_SAP;
		else
			state->rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
1026
	}
M
 
Mauro Carvalho Chehab 已提交
1027
	v4l_dbg(1, msp_debug, client, "status=0x%x, stereo=%d, bilingual=%d -> rxsubchans=%d\n",
1028
		status, is_stereo, is_bilingual, state->rxsubchans);
1029
	return (oldrx != state->rxsubchans);
1030 1031
}

1032
static void msp34xxg_set_audmode(struct i2c_client *client)
1033 1034 1035
{
	struct msp_state *state = i2c_get_clientdata(client);

1036 1037
	if (state->std == 0x20) {
	       if ((state->rxsubchans & V4L2_TUNER_SUB_SAP) &&
1038
		   (state->audmode == V4L2_TUNER_MODE_LANG1_LANG2 ||
1039 1040 1041 1042 1043 1044 1045
		    state->audmode == V4L2_TUNER_MODE_LANG2)) {
			msp_write_dem(client, 0x20, 0x21);
	       } else {
			msp_write_dem(client, 0x20, 0x20);
	       }
	}

1046
	msp34xxg_set_sources(client);
1047 1048
}

1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063
void msp_set_audmode(struct i2c_client *client)
{
	struct msp_state *state = i2c_get_clientdata(client);

	switch (state->opmode) {
	case OPMODE_MANUAL:
	case OPMODE_AUTODETECT:
		msp3400c_set_audmode(client);
		break;
	case OPMODE_AUTOSELECT:
		msp34xxg_set_audmode(client);
		break;
	}
}

1064
int msp_detect_stereo(struct i2c_client *client)
1065 1066 1067 1068 1069 1070
{
	struct msp_state *state  = i2c_get_clientdata(client);

	switch (state->opmode) {
	case OPMODE_MANUAL:
	case OPMODE_AUTODETECT:
1071
		return msp3400c_detect_stereo(client);
1072
	case OPMODE_AUTOSELECT:
1073
		return msp34xxg_detect_stereo(client);
1074
	}
1075
	return 0;
1076 1077
}