tuner-simple.c 28.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
/*
 * i2c tv tuner chip device driver
 * controls all those simple 4-control-bytes style tuners.
4 5
 *
 * This "tuner-simple" module was split apart from the original "tuner" module.
L
Linus Torvalds 已提交
6 7 8
 */
#include <linux/delay.h>
#include <linux/i2c.h>
9
#include <linux/videodev2.h>
L
Linus Torvalds 已提交
10
#include <media/tuner.h>
11
#include <media/v4l2-common.h>
12
#include <media/tuner-types.h>
13 14 15
#include "tuner-i2c.h"
#include "tuner-simple.h"

16
static int debug;
17 18 19
module_param(debug, int, 0644);
MODULE_PARM_DESC(debug, "enable verbose debug messages");

20 21 22
#define TUNER_SIMPLE_MAX 64
static unsigned int simple_devcount;

23
static int offset;
24
module_param(offset, int, 0664);
25
MODULE_PARM_DESC(offset, "Allows to specify an offset for tuner");
26

27 28 29 30 31 32 33 34 35
static unsigned int atv_input[TUNER_SIMPLE_MAX] = \
			{ [0 ... (TUNER_SIMPLE_MAX-1)] = 0 };
static unsigned int dtv_input[TUNER_SIMPLE_MAX] = \
			{ [0 ... (TUNER_SIMPLE_MAX-1)] = 0 };
module_param_array(atv_input, int, NULL, 0644);
module_param_array(dtv_input, int, NULL, 0644);
MODULE_PARM_DESC(atv_input, "specify atv rf input, 0 for autoselect");
MODULE_PARM_DESC(dtv_input, "specify dtv rf input, 0 for autoselect");

L
Linus Torvalds 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48
/* ---------------------------------------------------------------------- */

/* tv standard selection for Temic 4046 FM5
   this value takes the low bits of control byte 2
   from datasheet Rev.01, Feb.00
     standard     BG      I       L       L2      D
     picture IF   38.9    38.9    38.9    33.95   38.9
     sound 1      33.4    32.9    32.4    40.45   32.4
     sound 2      33.16
     NICAM        33.05   32.348  33.05           33.05
 */
#define TEMIC_SET_PAL_I         0x05
#define TEMIC_SET_PAL_DK        0x09
49 50
#define TEMIC_SET_PAL_L         0x0a /* SECAM ? */
#define TEMIC_SET_PAL_L2        0x0b /* change IF ! */
L
Linus Torvalds 已提交
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
#define TEMIC_SET_PAL_BG        0x0c

/* tv tuner system standard selection for Philips FQ1216ME
   this value takes the low bits of control byte 2
   from datasheet "1999 Nov 16" (supersedes "1999 Mar 23")
     standard 		BG	DK	I	L	L`
     picture carrier	38.90	38.90	38.90	38.90	33.95
     colour		34.47	34.47	34.47	34.47	38.38
     sound 1		33.40	32.40	32.90	32.40	40.45
     sound 2		33.16	-	-	-	-
     NICAM		33.05	33.05	32.35	33.05	39.80
 */
#define PHILIPS_SET_PAL_I	0x01 /* Bit 2 always zero !*/
#define PHILIPS_SET_PAL_BGDK	0x09
#define PHILIPS_SET_PAL_L2	0x0a
#define PHILIPS_SET_PAL_L	0x0b

/* system switching for Philips FI1216MF MK2
   from datasheet "1996 Jul 09",
    standard         BG     L      L'
    picture carrier  38.90  38.90  33.95
    colour	     34.47  34.37  38.38
    sound 1          33.40  32.40  40.45
    sound 2          33.16  -      -
    NICAM            33.05  33.05  39.80
 */
77 78 79
#define PHILIPS_MF_SET_STD_BG	0x01 /* Bit 2 must be zero, Bit 3 is system output */
#define PHILIPS_MF_SET_STD_L	0x03 /* Used on Secam France */
#define PHILIPS_MF_SET_STD_LC	0x02 /* Used on SECAM L' */
L
Linus Torvalds 已提交
80

M
Mauro Carvalho Chehab 已提交
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
/* Control byte */

#define TUNER_RATIO_MASK        0x06 /* Bit cb1:cb2 */
#define TUNER_RATIO_SELECT_50   0x00
#define TUNER_RATIO_SELECT_32   0x02
#define TUNER_RATIO_SELECT_166  0x04
#define TUNER_RATIO_SELECT_62   0x06

#define TUNER_CHARGE_PUMP       0x40  /* Bit cb6 */

/* Status byte */

#define TUNER_POR	  0x80
#define TUNER_FL          0x40
#define TUNER_MODE        0x38
#define TUNER_AFC         0x07
#define TUNER_SIGNAL      0x07
#define TUNER_STEREO      0x10

#define TUNER_PLL_LOCKED   0x40
#define TUNER_STEREO_MK3   0x04
L
Linus Torvalds 已提交
102

103 104 105
static DEFINE_MUTEX(tuner_simple_list_mutex);
static LIST_HEAD(hybrid_tuner_instance_list);

106
struct tuner_simple_priv {
107
	unsigned int nr;
108
	u16 last_div;
109

110
	struct tuner_i2c_props i2c_props;
111
	struct list_head hybrid_tuner_instance_list;
112 113 114 115 116

	unsigned int type;
	struct tunertype *tun;

	u32 frequency;
117
	u32 bandwidth;
118
	bool radio_mode;
119 120
};

L
Linus Torvalds 已提交
121 122
/* ---------------------------------------------------------------------- */

123
static int tuner_read_status(struct dvb_frontend *fe)
L
Linus Torvalds 已提交
124
{
125
	struct tuner_simple_priv *priv = fe->tuner_priv;
L
Linus Torvalds 已提交
126 127
	unsigned char byte;

128
	if (1 != tuner_i2c_xfer_recv(&priv->i2c_props, &byte, 1))
L
Linus Torvalds 已提交
129
		return 0;
130

L
Linus Torvalds 已提交
131 132 133
	return byte;
}

134
static inline int tuner_signal(const int status)
L
Linus Torvalds 已提交
135
{
136
	return (status & TUNER_SIGNAL) << 13;
L
Linus Torvalds 已提交
137 138
}

139
static inline int tuner_stereo(const int type, const int status)
L
Linus Torvalds 已提交
140
{
141
	switch (type) {
142 143 144 145
	case TUNER_PHILIPS_FM1216ME_MK3:
	case TUNER_PHILIPS_FM1236_MK3:
	case TUNER_PHILIPS_FM1256_IH3:
	case TUNER_LG_NTSC_TAPE:
146
	case TUNER_TCL_MF02GIP_5N:
147
		return ((status & TUNER_SIGNAL) == TUNER_STEREO_MK3);
148 149
	case TUNER_PHILIPS_FM1216MK5:
		return status | TUNER_STEREO;
150 151
	default:
		return status & TUNER_STEREO;
152
	}
153
}
154

155 156 157 158 159 160 161 162
static inline int tuner_islocked(const int status)
{
	return (status & TUNER_FL);
}

static inline int tuner_afcstatus(const int status)
{
	return (status & TUNER_AFC) - 2;
L
Linus Torvalds 已提交
163 164 165
}


166 167 168
static int simple_get_status(struct dvb_frontend *fe, u32 *status)
{
	struct tuner_simple_priv *priv = fe->tuner_priv;
169 170 171 172 173 174
	int tuner_status;

	if (priv->i2c_props.adap == NULL)
		return -EINVAL;

	tuner_status = tuner_read_status(fe);
175 176 177

	*status = 0;

178
	if (tuner_islocked(tuner_status))
179
		*status = TUNER_STATUS_LOCKED;
180
	if (tuner_stereo(priv->type, tuner_status))
181 182
		*status |= TUNER_STATUS_STEREO;

183 184 185 186 187 188 189 190
	tuner_dbg("AFC Status: %d\n", tuner_afcstatus(tuner_status));

	return 0;
}

static int simple_get_rf_strength(struct dvb_frontend *fe, u16 *strength)
{
	struct tuner_simple_priv *priv = fe->tuner_priv;
191 192
	int signal;

193
	if (priv->i2c_props.adap == NULL || !priv->radio_mode)
194 195 196
		return -EINVAL;

	signal = tuner_signal(tuner_read_status(fe));
197 198 199 200

	*strength = signal;

	tuner_dbg("Signal strength: %d\n", signal);
201 202 203 204

	return 0;
}

L
Linus Torvalds 已提交
205 206
/* ---------------------------------------------------------------------- */

207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
static inline char *tuner_param_name(enum param_type type)
{
	char *name;

	switch (type) {
	case TUNER_PARAM_TYPE_RADIO:
		name = "radio";
		break;
	case TUNER_PARAM_TYPE_PAL:
		name = "pal";
		break;
	case TUNER_PARAM_TYPE_SECAM:
		name = "secam";
		break;
	case TUNER_PARAM_TYPE_NTSC:
		name = "ntsc";
		break;
224 225 226
	case TUNER_PARAM_TYPE_DIGITAL:
		name = "digital";
		break;
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
	default:
		name = "unknown";
		break;
	}
	return name;
}

static struct tuner_params *simple_tuner_params(struct dvb_frontend *fe,
						enum param_type desired_type)
{
	struct tuner_simple_priv *priv = fe->tuner_priv;
	struct tunertype *tun = priv->tun;
	int i;

	for (i = 0; i < tun->count; i++)
		if (desired_type == tun->params[i].type)
			break;

	/* use default tuner params if desired_type not available */
	if (i == tun->count) {
		tuner_dbg("desired params (%s) undefined for tuner %d\n",
			  tuner_param_name(desired_type), priv->type);
		i = 0;
	}

	tuner_dbg("using tuner params #%d (%s)\n", i,
		  tuner_param_name(tun->params[i].type));

	return &tun->params[i];
}

static int simple_config_lookup(struct dvb_frontend *fe,
				struct tuner_params *t_params,
260
				unsigned *frequency, u8 *config, u8 *cb)
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
{
	struct tuner_simple_priv *priv = fe->tuner_priv;
	int i;

	for (i = 0; i < t_params->count; i++) {
		if (*frequency > t_params->ranges[i].limit)
			continue;
		break;
	}
	if (i == t_params->count) {
		tuner_dbg("frequency out of range (%d > %d)\n",
			  *frequency, t_params->ranges[i - 1].limit);
		*frequency = t_params->ranges[--i].limit;
	}
	*config = t_params->ranges[i].config;
	*cb     = t_params->ranges[i].cb;

278 279 280 281
	tuner_dbg("freq = %d.%02d (%d), range = %d, "
		  "config = 0x%02x, cb = 0x%02x\n",
		  *frequency / 16, *frequency % 16 * 100 / 16, *frequency,
		  i, *config, *cb);
282 283 284 285 286 287

	return i;
}

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

288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
static void simple_set_rf_input(struct dvb_frontend *fe,
				u8 *config, u8 *cb, unsigned int rf)
{
	struct tuner_simple_priv *priv = fe->tuner_priv;

	switch (priv->type) {
	case TUNER_PHILIPS_TUV1236D:
		switch (rf) {
		case 1:
			*cb |= 0x08;
			break;
		default:
			*cb &= ~0x08;
			break;
		}
		break;
304
	case TUNER_PHILIPS_FCV1236D:
305 306 307 308 309 310 311 312 313 314 315 316 317 318
		switch (rf) {
		case 1:
			*cb |= 0x01;
			break;
		default:
			*cb &= ~0x01;
			break;
		}
		break;
	default:
		break;
	}
}

319 320
static int simple_std_setup(struct dvb_frontend *fe,
			    struct analog_parameters *params,
321
			    u8 *config, u8 *cb)
L
Linus Torvalds 已提交
322
{
323
	struct tuner_simple_priv *priv = fe->tuner_priv;
324
	int rc;
325

L
Linus Torvalds 已提交
326
	/* tv norm specific stuff for multi-norm tuners */
327
	switch (priv->type) {
328
	case TUNER_PHILIPS_SECAM: /* FI1216MF */
L
Linus Torvalds 已提交
329 330 331
		/* 0x01 -> ??? no change ??? */
		/* 0x02 -> PAL BDGHI / SECAM L */
		/* 0x04 -> ??? PAL others / SECAM others ??? */
332
		*cb &= ~0x03;
333 334
		if (params->std & V4L2_STD_SECAM_L)
			/* also valid for V4L2_STD_SECAM */
335
			*cb |= PHILIPS_MF_SET_STD_L;
336
		else if (params->std & V4L2_STD_SECAM_LC)
337
			*cb |= PHILIPS_MF_SET_STD_LC;
338
		else /* V4L2_STD_B|V4L2_STD_GH */
339
			*cb |= PHILIPS_MF_SET_STD_BG;
L
Linus Torvalds 已提交
340 341 342
		break;

	case TUNER_TEMIC_4046FM5:
343
		*cb &= ~0x0f;
L
Linus Torvalds 已提交
344

345
		if (params->std & V4L2_STD_PAL_BG) {
346
			*cb |= TEMIC_SET_PAL_BG;
L
Linus Torvalds 已提交
347

348
		} else if (params->std & V4L2_STD_PAL_I) {
349
			*cb |= TEMIC_SET_PAL_I;
L
Linus Torvalds 已提交
350

351
		} else if (params->std & V4L2_STD_PAL_DK) {
352
			*cb |= TEMIC_SET_PAL_DK;
L
Linus Torvalds 已提交
353

354
		} else if (params->std & V4L2_STD_SECAM_L) {
355
			*cb |= TEMIC_SET_PAL_L;
L
Linus Torvalds 已提交
356 357 358 359 360

		}
		break;

	case TUNER_PHILIPS_FQ1216ME:
361
		*cb &= ~0x0f;
L
Linus Torvalds 已提交
362

363
		if (params->std & (V4L2_STD_PAL_BG|V4L2_STD_PAL_DK)) {
364
			*cb |= PHILIPS_SET_PAL_BGDK;
L
Linus Torvalds 已提交
365

366
		} else if (params->std & V4L2_STD_PAL_I) {
367
			*cb |= PHILIPS_SET_PAL_I;
L
Linus Torvalds 已提交
368

369
		} else if (params->std & V4L2_STD_SECAM_L) {
370
			*cb |= PHILIPS_SET_PAL_L;
L
Linus Torvalds 已提交
371 372 373 374

		}
		break;

375
	case TUNER_PHILIPS_FCV1236D:
L
Linus Torvalds 已提交
376 377 378 379
		/* 0x00 -> ATSC antenna input 1 */
		/* 0x01 -> ATSC antenna input 2 */
		/* 0x02 -> NTSC antenna input 1 */
		/* 0x03 -> NTSC antenna input 2 */
380
		*cb &= ~0x03;
381
		if (!(params->std & V4L2_STD_ATSC))
382
			*cb |= 2;
L
Linus Torvalds 已提交
383 384 385 386
		break;

	case TUNER_MICROTUNE_4042FI5:
		/* Set the charge pump for fast tuning */
387
		*config |= TUNER_CHARGE_PUMP;
L
Linus Torvalds 已提交
388
		break;
389 390

	case TUNER_PHILIPS_TUV1236D:
391
	{
392
		struct tuner_i2c_props i2c = priv->i2c_props;
393 394 395 396
		/* 0x40 -> ATSC antenna input 1 */
		/* 0x48 -> ATSC antenna input 2 */
		/* 0x00 -> NTSC antenna input 1 */
		/* 0x08 -> NTSC antenna input 2 */
397
		u8 buffer[4] = { 0x14, 0x00, 0x17, 0x00};
398
		*cb &= ~0x40;
399
		if (params->std & V4L2_STD_ATSC) {
400
			*cb |= 0x40;
401 402 403
			buffer[1] = 0x04;
		}
		/* set to the correct mode (analog or digital) */
404 405
		i2c.addr = 0x0a;
		rc = tuner_i2c_xfer_send(&i2c, &buffer[0], 2);
406 407 408
		if (2 != rc)
			tuner_warn("i2c i/o error: rc == %d "
				   "(should be 2)\n", rc);
409
		rc = tuner_i2c_xfer_send(&i2c, &buffer[2], 2);
410 411 412
		if (2 != rc)
			tuner_warn("i2c i/o error: rc == %d "
				   "(should be 2)\n", rc);
413
		break;
L
Linus Torvalds 已提交
414
	}
415
	}
416 417
	if (atv_input[priv->nr])
		simple_set_rf_input(fe, config, cb, atv_input[priv->nr]);
L
Linus Torvalds 已提交
418

419 420 421
	return 0;
}

422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439
static int simple_set_aux_byte(struct dvb_frontend *fe, u8 config, u8 aux)
{
	struct tuner_simple_priv *priv = fe->tuner_priv;
	int rc;
	u8 buffer[2];

	buffer[0] = (config & ~0x38) | 0x18;
	buffer[1] = aux;

	tuner_dbg("setting aux byte: 0x%02x 0x%02x\n", buffer[0], buffer[1]);

	rc = tuner_i2c_xfer_send(&priv->i2c_props, buffer, 2);
	if (2 != rc)
		tuner_warn("i2c i/o error: rc == %d (should be 2)\n", rc);

	return rc == 2 ? 0 : rc;
}

440 441 442 443 444 445 446 447
static int simple_post_tune(struct dvb_frontend *fe, u8 *buffer,
			    u16 div, u8 config, u8 cb)
{
	struct tuner_simple_priv *priv = fe->tuner_priv;
	int rc;

	switch (priv->type) {
	case TUNER_LG_TDVS_H06XF:
448 449 450 451
		simple_set_aux_byte(fe, config, 0x20);
		break;
	case TUNER_PHILIPS_FQ1216LME_MK3:
		simple_set_aux_byte(fe, config, 0x60); /* External AGC */
452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507
		break;
	case TUNER_MICROTUNE_4042FI5:
	{
		/* FIXME - this may also work for other tuners */
		unsigned long timeout = jiffies + msecs_to_jiffies(1);
		u8 status_byte = 0;

		/* Wait until the PLL locks */
		for (;;) {
			if (time_after(jiffies, timeout))
				return 0;
			rc = tuner_i2c_xfer_recv(&priv->i2c_props,
						 &status_byte, 1);
			if (1 != rc) {
				tuner_warn("i2c i/o read error: rc == %d "
					   "(should be 1)\n", rc);
				break;
			}
			if (status_byte & TUNER_PLL_LOCKED)
				break;
			udelay(10);
		}

		/* Set the charge pump for optimized phase noise figure */
		config &= ~TUNER_CHARGE_PUMP;
		buffer[0] = (div>>8) & 0x7f;
		buffer[1] = div      & 0xff;
		buffer[2] = config;
		buffer[3] = cb;
		tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n",
			  buffer[0], buffer[1], buffer[2], buffer[3]);

		rc = tuner_i2c_xfer_send(&priv->i2c_props, buffer, 4);
		if (4 != rc)
			tuner_warn("i2c i/o error: rc == %d "
				   "(should be 4)\n", rc);
		break;
	}
	}

	return 0;
}

static int simple_radio_bandswitch(struct dvb_frontend *fe, u8 *buffer)
{
	struct tuner_simple_priv *priv = fe->tuner_priv;

	switch (priv->type) {
	case TUNER_TENA_9533_DI:
	case TUNER_YMEC_TVF_5533MF:
		tuner_dbg("This tuner doesn't have FM. "
			  "Most cards have a TEA5767 for FM\n");
		return 0;
	case TUNER_PHILIPS_FM1216ME_MK3:
	case TUNER_PHILIPS_FM1236_MK3:
	case TUNER_PHILIPS_FMD1216ME_MK3:
508
	case TUNER_PHILIPS_FMD1216MEX_MK3:
509 510
	case TUNER_LG_NTSC_TAPE:
	case TUNER_PHILIPS_FM1256_IH3:
511
	case TUNER_TCL_MF02GIP_5N:
512 513
		buffer[3] = 0x19;
		break;
514 515 516 517
	case TUNER_PHILIPS_FM1216MK5:
		buffer[2] = 0x88;
		buffer[3] = 0x09;
		break;
518 519 520 521 522 523 524 525 526
	case TUNER_TNF_5335MF:
		buffer[3] = 0x11;
		break;
	case TUNER_LG_PAL_FM:
		buffer[3] = 0xa5;
		break;
	case TUNER_THOMSON_DTT761X:
		buffer[3] = 0x39;
		break;
527
	case TUNER_PHILIPS_FQ1216LME_MK3:
528
	case TUNER_PHILIPS_FQ1236_MK5:
529 530 531 532
		tuner_err("This tuner doesn't have FM\n");
		/* Set the low band for sanity, since it covers 88-108 MHz */
		buffer[3] = 0x01;
		break;
533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
	case TUNER_MICROTUNE_4049FM5:
	default:
		buffer[3] = 0xa4;
		break;
	}

	return 0;
}

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

static int simple_set_tv_freq(struct dvb_frontend *fe,
			      struct analog_parameters *params)
{
	struct tuner_simple_priv *priv = fe->tuner_priv;
	u8 config, cb;
	u16 div;
	u8 buffer[4];
	int rc, IFPCoff, i;
	enum param_type desired_type;
	struct tuner_params *t_params;

	/* IFPCoff = Video Intermediate Frequency - Vif:
		940  =16*58.75  NTSC/J (Japan)
		732  =16*45.75  M/N STD
		704  =16*44     ATSC (at DVB code)
		632  =16*39.50  I U.K.
		622.4=16*38.90  B/G D/K I, L STD
		592  =16*37.00  D China
		590  =16.36.875 B Australia
		543.2=16*33.95  L' STD
		171.2=16*10.70  FM Radio (at set_radio_freq)
	*/

	if (params->std == V4L2_STD_NTSC_M_JP) {
		IFPCoff      = 940;
		desired_type = TUNER_PARAM_TYPE_NTSC;
	} else if ((params->std & V4L2_STD_MN) &&
		  !(params->std & ~V4L2_STD_MN)) {
		IFPCoff      = 732;
		desired_type = TUNER_PARAM_TYPE_NTSC;
	} else if (params->std == V4L2_STD_SECAM_LC) {
		IFPCoff      = 543;
		desired_type = TUNER_PARAM_TYPE_SECAM;
	} else {
		IFPCoff      = 623;
		desired_type = TUNER_PARAM_TYPE_PAL;
	}

	t_params = simple_tuner_params(fe, desired_type);

	i = simple_config_lookup(fe, t_params, &params->frequency,
				 &config, &cb);

	div = params->frequency + IFPCoff + offset;

	tuner_dbg("Freq= %d.%02d MHz, V_IF=%d.%02d MHz, "
		  "Offset=%d.%02d MHz, div=%0d\n",
		  params->frequency / 16, params->frequency % 16 * 100 / 16,
		  IFPCoff / 16, IFPCoff % 16 * 100 / 16,
		  offset / 16, offset % 16 * 100 / 16, div);

	/* tv norm specific stuff for multi-norm tuners */
596
	simple_std_setup(fe, params, &config, &cb);
597

598
	if (t_params->cb_first_if_lower_freq && div < priv->last_div) {
599
		buffer[0] = config;
600
		buffer[1] = cb;
L
Linus Torvalds 已提交
601 602 603 604 605
		buffer[2] = (div>>8) & 0x7f;
		buffer[3] = div      & 0xff;
	} else {
		buffer[0] = (div>>8) & 0x7f;
		buffer[1] = div      & 0xff;
606
		buffer[2] = config;
607
		buffer[3] = cb;
L
Linus Torvalds 已提交
608
	}
609
	priv->last_div = div;
610
	if (t_params->has_tda9887) {
611
		struct v4l2_priv_tun_config tda9887_cfg;
612
		int tda_config = 0;
613 614 615 616
		int is_secam_l = (params->std & (V4L2_STD_SECAM_L |
						 V4L2_STD_SECAM_LC)) &&
			!(params->std & ~(V4L2_STD_SECAM_L |
					  V4L2_STD_SECAM_LC));
617

618
		tda9887_cfg.tuner = TUNER_TDA9887;
619
		tda9887_cfg.priv  = &tda_config;
620

621 622
		if (params->std == V4L2_STD_SECAM_LC) {
			if (t_params->port1_active ^ t_params->port1_invert_for_secam_lc)
623
				tda_config |= TDA9887_PORT1_ACTIVE;
624
			if (t_params->port2_active ^ t_params->port2_invert_for_secam_lc)
625
				tda_config |= TDA9887_PORT2_ACTIVE;
626
		} else {
627
			if (t_params->port1_active)
628
				tda_config |= TDA9887_PORT1_ACTIVE;
629
			if (t_params->port2_active)
630
				tda_config |= TDA9887_PORT2_ACTIVE;
631
		}
632
		if (t_params->intercarrier_mode)
633
			tda_config |= TDA9887_INTERCARRIER;
634
		if (is_secam_l) {
635
			if (i == 0 && t_params->default_top_secam_low)
636
				tda_config |= TDA9887_TOP(t_params->default_top_secam_low);
637
			else if (i == 1 && t_params->default_top_secam_mid)
638
				tda_config |= TDA9887_TOP(t_params->default_top_secam_mid);
639
			else if (t_params->default_top_secam_high)
640
				tda_config |= TDA9887_TOP(t_params->default_top_secam_high);
641
		} else {
642
			if (i == 0 && t_params->default_top_low)
643
				tda_config |= TDA9887_TOP(t_params->default_top_low);
644
			else if (i == 1 && t_params->default_top_mid)
645
				tda_config |= TDA9887_TOP(t_params->default_top_mid);
646
			else if (t_params->default_top_high)
647
				tda_config |= TDA9887_TOP(t_params->default_top_high);
648
		}
649
		if (t_params->default_pll_gating_18)
650
			tda_config |= TDA9887_GATING_18;
651 652
		i2c_clients_command(priv->i2c_props.adap, TUNER_SET_CONFIG,
				    &tda9887_cfg);
653
	}
L
Linus Torvalds 已提交
654
	tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n",
655
		  buffer[0], buffer[1], buffer[2], buffer[3]);
L
Linus Torvalds 已提交
656

657 658 659
	rc = tuner_i2c_xfer_send(&priv->i2c_props, buffer, 4);
	if (4 != rc)
		tuner_warn("i2c i/o error: rc == %d (should be 4)\n", rc);
L
Linus Torvalds 已提交
660

661
	simple_post_tune(fe, &buffer[0], div, config, cb);
L
Linus Torvalds 已提交
662

663
	return 0;
L
Linus Torvalds 已提交
664 665
}

666 667
static int simple_set_radio_freq(struct dvb_frontend *fe,
				 struct analog_parameters *params)
L
Linus Torvalds 已提交
668 669
{
	struct tunertype *tun;
670
	struct tuner_simple_priv *priv = fe->tuner_priv;
671 672
	u8 buffer[4];
	u16 div;
673
	int rc, j;
674 675
	struct tuner_params *t_params;
	unsigned int freq = params->frequency;
L
Linus Torvalds 已提交
676

677
	tun = priv->tun;
678

679 680 681
	for (j = tun->count-1; j > 0; j--)
		if (tun->params[j].type == TUNER_PARAM_TYPE_RADIO)
			break;
682 683
	/* default t_params (j=0) will be used if desired type wasn't found */
	t_params = &tun->params[j];
684 685

	/* Select Radio 1st IF used */
686
	switch (t_params->radio_if) {
687 688
	case 0: /* 10.7 MHz */
		freq += (unsigned int)(10.7*16000);
689
		break;
690 691 692 693 694 695 696
	case 1: /* 33.3 MHz */
		freq += (unsigned int)(33.3*16000);
		break;
	case 2: /* 41.3 MHz */
		freq += (unsigned int)(41.3*16000);
		break;
	default:
697 698
		tuner_warn("Unsupported radio_if value %d\n",
			   t_params->radio_if);
699
		return 0;
700
	}
L
Linus Torvalds 已提交
701

702
	buffer[2] = (t_params->ranges[0].config & ~TUNER_RATIO_MASK) |
703 704
		    TUNER_RATIO_SELECT_50; /* 50 kHz step */

705 706 707
	/* Bandswitch byte */
	simple_radio_bandswitch(fe, &buffer[0]);

708 709 710 711 712
	/* Convert from 1/16 kHz V4L steps to 1/20 MHz (=50 kHz) PLL steps
	   freq * (1 Mhz / 16000 V4L steps) * (20 PLL steps / 1 MHz) =
	   freq * (1/800) */
	div = (freq + 400) / 800;

713
	if (t_params->cb_first_if_lower_freq && div < priv->last_div) {
714 715 716 717 718 719 720 721
		buffer[0] = buffer[2];
		buffer[1] = buffer[3];
		buffer[2] = (div>>8) & 0x7f;
		buffer[3] = div      & 0xff;
	} else {
		buffer[0] = (div>>8) & 0x7f;
		buffer[1] = div      & 0xff;
	}
L
Linus Torvalds 已提交
722 723

	tuner_dbg("radio 0x%02x 0x%02x 0x%02x 0x%02x\n",
724
	       buffer[0], buffer[1], buffer[2], buffer[3]);
725
	priv->last_div = div;
L
Linus Torvalds 已提交
726

727
	if (t_params->has_tda9887) {
728
		int config = 0;
729 730 731 732 733
		struct v4l2_priv_tun_config tda9887_cfg;

		tda9887_cfg.tuner = TUNER_TDA9887;
		tda9887_cfg.priv = &config;

734 735
		if (t_params->port1_active &&
		    !t_params->port1_fm_high_sensitivity)
736
			config |= TDA9887_PORT1_ACTIVE;
737 738
		if (t_params->port2_active &&
		    !t_params->port2_fm_high_sensitivity)
739
			config |= TDA9887_PORT2_ACTIVE;
740
		if (t_params->intercarrier_mode)
741
			config |= TDA9887_INTERCARRIER;
742
/*		if (t_params->port1_set_for_fm_mono)
743
			config &= ~TDA9887_PORT1_ACTIVE;*/
744
		if (t_params->fm_gain_normal)
745
			config |= TDA9887_GAIN_NORMAL;
746
		if (t_params->radio_if == 2)
747
			config |= TDA9887_RIF_41_3;
748
		i2c_clients_command(priv->i2c_props.adap, TUNER_SET_CONFIG,
749
				    &tda9887_cfg);
750
	}
751 752 753
	rc = tuner_i2c_xfer_send(&priv->i2c_props, buffer, 4);
	if (4 != rc)
		tuner_warn("i2c i/o error: rc == %d (should be 4)\n", rc);
754

755 756 757 758 759 760 761 762 763 764 765
	/* Write AUX byte */
	switch (priv->type) {
	case TUNER_PHILIPS_FM1216ME_MK3:
		buffer[2] = 0x98;
		buffer[3] = 0x20; /* set TOP AGC */
		rc = tuner_i2c_xfer_send(&priv->i2c_props, buffer, 4);
		if (4 != rc)
			tuner_warn("i2c i/o error: rc == %d (should be 4)\n", rc);
		break;
	}

766
	return 0;
L
Linus Torvalds 已提交
767 768
}

769 770
static int simple_set_params(struct dvb_frontend *fe,
			     struct analog_parameters *params)
771
{
772 773 774
	struct tuner_simple_priv *priv = fe->tuner_priv;
	int ret = -EINVAL;

775 776 777
	if (priv->i2c_props.adap == NULL)
		return -EINVAL;

778 779
	switch (params->mode) {
	case V4L2_TUNER_RADIO:
780
		priv->radio_mode = true;
781 782 783 784 785
		ret = simple_set_radio_freq(fe, params);
		priv->frequency = params->frequency * 125 / 2;
		break;
	case V4L2_TUNER_ANALOG_TV:
	case V4L2_TUNER_DIGITAL_TV:
786
		priv->radio_mode = false;
787 788 789 790
		ret = simple_set_tv_freq(fe, params);
		priv->frequency = params->frequency * 62500;
		break;
	}
791
	priv->bandwidth = 0;
792 793 794 795

	return ret;
}

796
static void simple_set_dvb(struct dvb_frontend *fe, u8 *buf,
797 798 799
			   const u32 delsys,
			   const u32 frequency,
			   const u32 bandwidth)
800 801 802 803 804
{
	struct tuner_simple_priv *priv = fe->tuner_priv;

	switch (priv->type) {
	case TUNER_PHILIPS_FMD1216ME_MK3:
805
	case TUNER_PHILIPS_FMD1216MEX_MK3:
806 807
		if (bandwidth == 8000000 &&
		    frequency >= 158870000)
808 809
			buf[3] |= 0x08;
		break;
810 811
	case TUNER_PHILIPS_TD1316:
		/* determine band */
812 813
		buf[3] |= (frequency < 161000000) ? 1 :
			  (frequency < 444000000) ? 2 : 4;
814 815

		/* setup PLL filter */
816
		if (bandwidth == 8000000)
817 818
			buf[3] |= 1 << 3;
		break;
819
	case TUNER_PHILIPS_TUV1236D:
820
	case TUNER_PHILIPS_FCV1236D:
821 822 823
	{
		unsigned int new_rf;

824 825 826
		if (dtv_input[priv->nr])
			new_rf = dtv_input[priv->nr];
		else
827 828
			switch (delsys) {
			case SYS_DVBC_ANNEX_B:
829 830
				new_rf = 1;
				break;
831
			case SYS_ATSC:
832 833 834 835
			default:
				new_rf = 0;
				break;
			}
836 837 838
		simple_set_rf_input(fe, &buf[2], &buf[3], new_rf);
		break;
	}
839 840 841 842 843
	default:
		break;
	}
}

844
static u32 simple_dvb_configure(struct dvb_frontend *fe, u8 *buf,
845 846 847
				const u32 delsys,
				const u32 freq,
				const u32 bw)
848
{
849
	/* This function returns the tuned frequency on success, 0 on error */
850 851 852 853 854
	struct tuner_simple_priv *priv = fe->tuner_priv;
	struct tunertype *tun = priv->tun;
	static struct tuner_params *t_params;
	u8 config, cb;
	u32 div;
855
	int ret;
856
	u32 frequency = freq / 62500;
857

858 859 860 861 862 863 864 865 866
	if (!tun->stepsize) {
		/* tuner-core was loaded before the digital tuner was
		 * configured and somehow picked the wrong tuner type */
		tuner_err("attempt to treat tuner %d (%s) as digital tuner "
			  "without stepsize defined.\n",
			  priv->type, priv->tun->name);
		return 0; /* failure */
	}

867 868 869
	t_params = simple_tuner_params(fe, TUNER_PARAM_TYPE_DIGITAL);
	ret = simple_config_lookup(fe, t_params, &frequency, &config, &cb);
	if (ret < 0)
870
		return 0; /* failure */
871 872 873 874 875 876 877 878 879

	div = ((frequency + t_params->iffreq) * 62500 + offset +
	       tun->stepsize/2) / tun->stepsize;

	buf[0] = div >> 8;
	buf[1] = div & 0xff;
	buf[2] = config;
	buf[3] = cb;

880
	simple_set_dvb(fe, buf, delsys, freq, bw);
881

882 883 884 885 886 887 888 889 890 891
	tuner_dbg("%s: div=%d | buf=0x%02x,0x%02x,0x%02x,0x%02x\n",
		  tun->name, div, buf[0], buf[1], buf[2], buf[3]);

	/* calculate the frequency we set it to */
	return (div * tun->stepsize) - t_params->iffreq;
}

static int simple_dvb_calc_regs(struct dvb_frontend *fe,
				u8 *buf, int buf_len)
{
892 893 894
	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
	u32 delsys = c->delivery_system;
	u32 bw = c->bandwidth_hz;
895 896 897 898 899 900
	struct tuner_simple_priv *priv = fe->tuner_priv;
	u32 frequency;

	if (buf_len < 5)
		return -EINVAL;

901
	frequency = simple_dvb_configure(fe, buf+1, delsys, c->frequency, bw);
902 903
	if (frequency == 0)
		return -EINVAL;
904 905 906 907

	buf[0] = priv->i2c_props.addr;

	priv->frequency = frequency;
908
	priv->bandwidth = c->bandwidth_hz;
909 910 911 912

	return 5;
}

913
static int simple_dvb_set_params(struct dvb_frontend *fe)
914
{
915 916 917 918
	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
	u32 delsys = c->delivery_system;
	u32 bw = c->bandwidth_hz;
	u32 freq = c->frequency;
919
	struct tuner_simple_priv *priv = fe->tuner_priv;
920
	u32 frequency;
921 922 923 924 925 926 927 928 929 930
	u32 prev_freq, prev_bw;
	int ret;
	u8 buf[5];

	if (priv->i2c_props.adap == NULL)
		return -EINVAL;

	prev_freq = priv->frequency;
	prev_bw   = priv->bandwidth;

931 932 933 934 935 936 937 938
	frequency = simple_dvb_configure(fe, buf+1, delsys, freq, bw);
	if (frequency == 0)
		return -EINVAL;

	buf[0] = priv->i2c_props.addr;

	priv->frequency = frequency;
	priv->bandwidth = bw;
939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960

	/* put analog demod in standby when tuning digital */
	if (fe->ops.analog_ops.standby)
		fe->ops.analog_ops.standby(fe);

	if (fe->ops.i2c_gate_ctrl)
		fe->ops.i2c_gate_ctrl(fe, 1);

	/* buf[0] contains the i2c address, but *
	 * we already have it in i2c_props.addr */
	ret = tuner_i2c_xfer_send(&priv->i2c_props, buf+1, 4);
	if (ret != 4)
		goto fail;

	return 0;
fail:
	/* calc_regs sets frequency and bandwidth. if we failed, unset them */
	priv->frequency = prev_freq;
	priv->bandwidth = prev_bw;

	return ret;
}
961

962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007
static int simple_init(struct dvb_frontend *fe)
{
	struct tuner_simple_priv *priv = fe->tuner_priv;

	if (priv->i2c_props.adap == NULL)
		return -EINVAL;

	if (priv->tun->initdata) {
		int ret;

		if (fe->ops.i2c_gate_ctrl)
			fe->ops.i2c_gate_ctrl(fe, 1);

		ret = tuner_i2c_xfer_send(&priv->i2c_props,
					  priv->tun->initdata + 1,
					  priv->tun->initdata[0]);
		if (ret != priv->tun->initdata[0])
			return ret;
	}

	return 0;
}

static int simple_sleep(struct dvb_frontend *fe)
{
	struct tuner_simple_priv *priv = fe->tuner_priv;

	if (priv->i2c_props.adap == NULL)
		return -EINVAL;

	if (priv->tun->sleepdata) {
		int ret;

		if (fe->ops.i2c_gate_ctrl)
			fe->ops.i2c_gate_ctrl(fe, 1);

		ret = tuner_i2c_xfer_send(&priv->i2c_props,
					  priv->tun->sleepdata + 1,
					  priv->tun->sleepdata[0]);
		if (ret != priv->tun->sleepdata[0])
			return ret;
	}

	return 0;
}

1008 1009
static int simple_release(struct dvb_frontend *fe)
{
1010 1011 1012 1013 1014 1015 1016 1017 1018
	struct tuner_simple_priv *priv = fe->tuner_priv;

	mutex_lock(&tuner_simple_list_mutex);

	if (priv)
		hybrid_tuner_release_state(priv);

	mutex_unlock(&tuner_simple_list_mutex);

1019 1020 1021 1022 1023 1024 1025 1026 1027 1028
	fe->tuner_priv = NULL;

	return 0;
}

static int simple_get_frequency(struct dvb_frontend *fe, u32 *frequency)
{
	struct tuner_simple_priv *priv = fe->tuner_priv;
	*frequency = priv->frequency;
	return 0;
1029 1030
}

1031 1032 1033
static int simple_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
{
	struct tuner_simple_priv *priv = fe->tuner_priv;
1034
	*bandwidth = priv->bandwidth;
1035 1036 1037
	return 0;
}

1038
static struct dvb_tuner_ops simple_tuner_ops = {
1039 1040
	.init              = simple_init,
	.sleep             = simple_sleep,
1041
	.set_analog_params = simple_set_params,
1042 1043
	.set_params        = simple_dvb_set_params,
	.calc_regs         = simple_dvb_calc_regs,
1044 1045
	.release           = simple_release,
	.get_frequency     = simple_get_frequency,
1046
	.get_bandwidth     = simple_get_bandwidth,
1047 1048
	.get_status        = simple_get_status,
	.get_rf_strength   = simple_get_rf_strength,
1049 1050
};

1051 1052 1053
struct dvb_frontend *simple_tuner_attach(struct dvb_frontend *fe,
					 struct i2c_adapter *i2c_adap,
					 u8 i2c_addr,
1054
					 unsigned int type)
L
Linus Torvalds 已提交
1055
{
1056
	struct tuner_simple_priv *priv = NULL;
1057
	int instance;
1058

1059 1060
	if (type >= tuner_count) {
		printk(KERN_WARNING "%s: invalid tuner type: %d (max: %d)\n",
1061
		       __func__, type, tuner_count-1);
1062 1063 1064
		return NULL;
	}

1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079
	/* If i2c_adap is set, check that the tuner is at the correct address.
	 * Otherwise, if i2c_adap is NULL, the tuner will be programmed directly
	 * by the digital demod via calc_regs.
	 */
	if (i2c_adap != NULL) {
		u8 b[1];
		struct i2c_msg msg = {
			.addr = i2c_addr, .flags = I2C_M_RD,
			.buf = b, .len = 1,
		};

		if (fe->ops.i2c_gate_ctrl)
			fe->ops.i2c_gate_ctrl(fe, 1);

		if (1 != i2c_transfer(i2c_adap, &msg, 1))
1080 1081 1082 1083
			printk(KERN_WARNING "tuner-simple %d-%04x: "
			       "unable to probe %s, proceeding anyway.",
			       i2c_adapter_id(i2c_adap), i2c_addr,
			       tuners[type].name);
1084 1085 1086 1087 1088

		if (fe->ops.i2c_gate_ctrl)
			fe->ops.i2c_gate_ctrl(fe, 0);
	}

1089 1090 1091 1092 1093 1094 1095 1096 1097
	mutex_lock(&tuner_simple_list_mutex);

	instance = hybrid_tuner_request_state(struct tuner_simple_priv, priv,
					      hybrid_tuner_instance_list,
					      i2c_adap, i2c_addr,
					      "tuner-simple");
	switch (instance) {
	case 0:
		mutex_unlock(&tuner_simple_list_mutex);
1098
		return NULL;
1099 1100
	case 1:
		fe->tuner_priv = priv;
L
Linus Torvalds 已提交
1101

1102 1103
		priv->type = type;
		priv->tun  = &tuners[type];
1104
		priv->nr   = simple_devcount++;
1105 1106 1107 1108 1109
		break;
	default:
		fe->tuner_priv = priv;
		break;
	}
1110

1111
	mutex_unlock(&tuner_simple_list_mutex);
1112

1113 1114
	memcpy(&fe->ops.tuner_ops, &simple_tuner_ops,
	       sizeof(struct dvb_tuner_ops));
L
Linus Torvalds 已提交
1115

1116 1117 1118 1119 1120 1121
	if (type != priv->type)
		tuner_warn("couldn't set type to %d. Using %d (%s) instead\n",
			    type, priv->type, priv->tun->name);
	else
		tuner_info("type set to %d (%s)\n",
			   priv->type, priv->tun->name);
1122

1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140
	if ((debug) || ((atv_input[priv->nr] > 0) ||
			(dtv_input[priv->nr] > 0))) {
		if (0 == atv_input[priv->nr])
			tuner_info("tuner %d atv rf input will be "
				   "autoselected\n", priv->nr);
		else
			tuner_info("tuner %d atv rf input will be "
				   "set to input %d (insmod option)\n",
				   priv->nr, atv_input[priv->nr]);
		if (0 == dtv_input[priv->nr])
			tuner_info("tuner %d dtv rf input will be "
				   "autoselected\n", priv->nr);
		else
			tuner_info("tuner %d dtv rf input will be "
				   "set to input %d (insmod option)\n",
				   priv->nr, dtv_input[priv->nr]);
	}

1141
	strlcpy(fe->ops.tuner_ops.info.name, priv->tun->name,
1142
		sizeof(fe->ops.tuner_ops.info.name));
1143 1144

	return fe;
L
Linus Torvalds 已提交
1145
}
1146 1147 1148 1149 1150 1151
EXPORT_SYMBOL_GPL(simple_tuner_attach);

MODULE_DESCRIPTION("Simple 4-control-bytes style tuner driver");
MODULE_AUTHOR("Ralph Metzler, Gerd Knorr, Gunther Mayer");
MODULE_LICENSE("GPL");

L
Linus Torvalds 已提交
1152 1153 1154 1155 1156 1157 1158
/*
 * Overrides for Emacs so that we follow Linus's tabbing style.
 * ---------------------------------------------------------------------------
 * Local variables:
 * c-basic-offset: 8
 * End:
 */