tvp5150.c 28.3 KB
Newer Older
1
/*
2
 * tvp5150 - Texas Instruments TVP5150A/AM1 video decoder driver
3
 *
4 5
 * Copyright (c) 2005,2006 Mauro Carvalho Chehab (mchehab@infradead.org)
 * This code is placed under the terms of the GNU General Public License v2
6 7 8 9 10
 */

#include <linux/i2c.h>
#include <linux/videodev.h>
#include <linux/delay.h>
11
#include <linux/video_decoder.h>
12
#include <media/v4l2-common.h>
13 14 15

#include "tvp5150_reg.h"

16
MODULE_DESCRIPTION("Texas Instruments TVP5150A video decoder driver");
17 18 19
MODULE_AUTHOR("Mauro Carvalho Chehab");
MODULE_LICENSE("GPL");

20
/* standard i2c insmod options */
21
static unsigned short normal_i2c[] = {
22 23
	0xb8 >> 1,
	0xba >> 1,
24 25 26 27 28 29 30 31 32
	I2C_CLIENT_END
};

I2C_CLIENT_INSMOD;

static int debug = 0;
module_param(debug, int, 0);
MODULE_PARM_DESC(debug, "Debug level (0-1)");

33 34 35
#define tvp5150_err(fmt, arg...) do { \
	printk(KERN_ERR "%s %d-%04x: " fmt, c->driver->driver.name, \
	       i2c_adapter_id(c->adapter), c->addr , ## arg); } while (0)
36
#define tvp5150_info(fmt, arg...) do { \
37
	printk(KERN_INFO "%s %d-%04x: " fmt, c->driver->driver.name, \
38 39
	       i2c_adapter_id(c->adapter), c->addr , ## arg); } while (0)
#define tvp5150_dbg(num, fmt, arg...) \
40 41
	do { \
		if (debug >= num) \
42 43 44 45
			printk(KERN_DEBUG "%s debug %d-%04x: " fmt,\
				c->driver->driver.name, \
				i2c_adapter_id(c->adapter), \
				c->addr , ## arg); } while (0)
46

47 48 49
/* supported controls */
static struct v4l2_queryctrl tvp5150_qctrl[] = {
	{
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
		.id = V4L2_CID_BRIGHTNESS,
		.type = V4L2_CTRL_TYPE_INTEGER,
		.name = "Brightness",
		.minimum = 0,
		.maximum = 255,
		.step = 1,
		.default_value = 0,
		.flags = 0,
	}, {
		.id = V4L2_CID_CONTRAST,
		.type = V4L2_CTRL_TYPE_INTEGER,
		.name = "Contrast",
		.minimum = 0,
		.maximum = 255,
		.step = 0x1,
		.default_value = 0x10,
		.flags = 0,
	}, {
68 69 70 71 72 73 74 75
		 .id = V4L2_CID_SATURATION,
		 .type = V4L2_CTRL_TYPE_INTEGER,
		 .name = "Saturation",
		 .minimum = 0,
		 .maximum = 255,
		 .step = 0x1,
		 .default_value = 0x10,
		 .flags = 0,
76 77 78 79 80 81 82 83 84 85
	}, {
		.id = V4L2_CID_HUE,
		.type = V4L2_CTRL_TYPE_INTEGER,
		.name = "Hue",
		.minimum = -128,
		.maximum = 127,
		.step = 0x1,
		.default_value = 0x10,
		.flags = 0,
	}
86 87
};

88 89
struct tvp5150 {
	struct i2c_client *client;
90

91
	v4l2_std_id norm;	/* Current set standard */
92 93 94 95 96 97
	int input;
	int enable;
	int bright;
	int contrast;
	int hue;
	int sat;
98 99
};

100
static int tvp5150_read(struct i2c_client *c, unsigned char addr)
101 102 103 104 105 106
{
	unsigned char buffer[1];
	int rc;

	buffer[0] = addr;
	if (1 != (rc = i2c_master_send(c, buffer, 1)))
107
		tvp5150_dbg(0, "i2c i/o error: rc == %d (should be 1)\n", rc);
108 109 110 111

	msleep(10);

	if (1 != (rc = i2c_master_recv(c, buffer, 1)))
112 113 114
		tvp5150_dbg(0, "i2c i/o error: rc == %d (should be 1)\n", rc);

	tvp5150_dbg(2, "tvp5150: read 0x%02x = 0x%02x\n", addr, buffer[0]);
115 116 117 118

	return (buffer[0]);
}

119 120
static inline void tvp5150_write(struct i2c_client *c, unsigned char addr,
				 unsigned char value)
121 122 123 124 125
{
	unsigned char buffer[2];
	int rc;

	buffer[0] = addr;
126
	buffer[1] = value;
127
	tvp5150_dbg(2, "tvp5150: writing 0x%02x 0x%02x\n", buffer[0], buffer[1]);
128
	if (2 != (rc = i2c_master_send(c, buffer, 2)))
129
		tvp5150_dbg(0, "i2c i/o error: rc == %d (should be 2)\n", rc);
130 131
}

132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
static void dump_reg_range(struct i2c_client *c, char *s, u8 init, const u8 end,int max_line)
{
	int i=0;

	while (init!=(u8)(end+1)) {
		if ((i%max_line) == 0) {
			if (i>0)
				printk("\n");
			printk("tvp5150: %s reg 0x%02x = ",s,init);
		}
		printk("%02x ",tvp5150_read(c, init));

		init++;
		i++;
	}
	printk("\n");
}

150
static void dump_reg(struct i2c_client *c)
151
{
152
	printk("tvp5150: Video input source selection #1 = 0x%02x\n",
153
					tvp5150_read(c, TVP5150_VD_IN_SRC_SEL_1));
154
	printk("tvp5150: Analog channel controls = 0x%02x\n",
155
					tvp5150_read(c, TVP5150_ANAL_CHL_CTL));
156
	printk("tvp5150: Operation mode controls = 0x%02x\n",
157
					tvp5150_read(c, TVP5150_OP_MODE_CTL));
158
	printk("tvp5150: Miscellaneous controls = 0x%02x\n",
159 160 161
					tvp5150_read(c, TVP5150_MISC_CTL));
	printk("tvp5150: Autoswitch mask= 0x%02x\n",
					tvp5150_read(c, TVP5150_AUTOSW_MSK));
162
	printk("tvp5150: Color killer threshold control = 0x%02x\n",
163 164 165 166 167
					tvp5150_read(c, TVP5150_COLOR_KIL_THSH_CTL));
	printk("tvp5150: Luminance processing controls #1 #2 and #3 = %02x %02x %02x\n",
					tvp5150_read(c, TVP5150_LUMA_PROC_CTL_1),
					tvp5150_read(c, TVP5150_LUMA_PROC_CTL_2),
					tvp5150_read(c, TVP5150_LUMA_PROC_CTL_3));
168
	printk("tvp5150: Brightness control = 0x%02x\n",
169
					tvp5150_read(c, TVP5150_BRIGHT_CTL));
170
	printk("tvp5150: Color saturation control = 0x%02x\n",
171
					tvp5150_read(c, TVP5150_SATURATION_CTL));
172
	printk("tvp5150: Hue control = 0x%02x\n",
173
					tvp5150_read(c, TVP5150_HUE_CTL));
174
	printk("tvp5150: Contrast control = 0x%02x\n",
175
					tvp5150_read(c, TVP5150_CONTRAST_CTL));
176
	printk("tvp5150: Outputs and data rates select = 0x%02x\n",
177
					tvp5150_read(c, TVP5150_DATA_RATE_SEL));
178
	printk("tvp5150: Configuration shared pins = 0x%02x\n",
179 180 181 182 183 184 185
					tvp5150_read(c, TVP5150_CONF_SHARED_PIN));
	printk("tvp5150: Active video cropping start = 0x%02x%02x\n",
					tvp5150_read(c, TVP5150_ACT_VD_CROP_ST_MSB),
					tvp5150_read(c, TVP5150_ACT_VD_CROP_ST_LSB));
	printk("tvp5150: Active video cropping stop  = 0x%02x%02x\n",
					tvp5150_read(c, TVP5150_ACT_VD_CROP_STP_MSB),
					tvp5150_read(c, TVP5150_ACT_VD_CROP_STP_LSB));
186
	printk("tvp5150: Genlock/RTC = 0x%02x\n",
187
					tvp5150_read(c, TVP5150_GENLOCK));
188
	printk("tvp5150: Horizontal sync start = 0x%02x\n",
189
					tvp5150_read(c, TVP5150_HORIZ_SYNC_START));
190
	printk("tvp5150: Vertical blanking start = 0x%02x\n",
191
					tvp5150_read(c, TVP5150_VERT_BLANKING_START));
192
	printk("tvp5150: Vertical blanking stop = 0x%02x\n",
193 194 195 196
					tvp5150_read(c, TVP5150_VERT_BLANKING_STOP));
	printk("tvp5150: Chrominance processing control #1 and #2 = %02x %02x\n",
					tvp5150_read(c, TVP5150_CHROMA_PROC_CTL_1),
					tvp5150_read(c, TVP5150_CHROMA_PROC_CTL_2));
197
	printk("tvp5150: Interrupt reset register B = 0x%02x\n",
198
					tvp5150_read(c, TVP5150_INT_RESET_REG_B));
199
	printk("tvp5150: Interrupt enable register B = 0x%02x\n",
200
					tvp5150_read(c, TVP5150_INT_ENABLE_REG_B));
201
	printk("tvp5150: Interrupt configuration register B = 0x%02x\n",
202
					tvp5150_read(c, TVP5150_INTT_CONFIG_REG_B));
203
	printk("tvp5150: Video standard = 0x%02x\n",
204 205 206 207
					tvp5150_read(c, TVP5150_VIDEO_STD));
	printk("tvp5150: Chroma gain factor: Cb=0x%02x Cr=0x%02x\n",
					tvp5150_read(c, TVP5150_CB_GAIN_FACT),
					tvp5150_read(c, TVP5150_CR_GAIN_FACTOR));
208
	printk("tvp5150: Macrovision on counter = 0x%02x\n",
209
					tvp5150_read(c, TVP5150_MACROVISION_ON_CTR));
210
	printk("tvp5150: Macrovision off counter = 0x%02x\n",
211 212 213 214 215 216 217 218 219 220 221 222
					tvp5150_read(c, TVP5150_MACROVISION_OFF_CTR));
	printk("tvp5150: ITU-R BT.656.%d timing(TVP5150AM1 only)\n",
					(tvp5150_read(c, TVP5150_REV_SELECT)&1)?3:4);
	printk("tvp5150: Device ID = %02x%02x\n",
					tvp5150_read(c, TVP5150_MSB_DEV_ID),
					tvp5150_read(c, TVP5150_LSB_DEV_ID));
	printk("tvp5150: ROM version = (hex) %02x.%02x\n",
					tvp5150_read(c, TVP5150_ROM_MAJOR_VER),
					tvp5150_read(c, TVP5150_ROM_MINOR_VER));
	printk("tvp5150: Vertical line count = 0x%02x%02x\n",
					tvp5150_read(c, TVP5150_VERT_LN_COUNT_MSB),
					tvp5150_read(c, TVP5150_VERT_LN_COUNT_LSB));
223
	printk("tvp5150: Interrupt status register B = 0x%02x\n",
224
					tvp5150_read(c, TVP5150_INT_STATUS_REG_B));
225
	printk("tvp5150: Interrupt active register B = 0x%02x\n",
226 227 228 229 230 231 232 233 234 235 236 237 238
					tvp5150_read(c, TVP5150_INT_ACTIVE_REG_B));
	printk("tvp5150: Status regs #1 to #5 = %02x %02x %02x %02x %02x\n",
					tvp5150_read(c, TVP5150_STATUS_REG_1),
					tvp5150_read(c, TVP5150_STATUS_REG_2),
					tvp5150_read(c, TVP5150_STATUS_REG_3),
					tvp5150_read(c, TVP5150_STATUS_REG_4),
					tvp5150_read(c, TVP5150_STATUS_REG_5));

	dump_reg_range(c,"Teletext filter 1",   TVP5150_TELETEXT_FIL1_INI,
						TVP5150_TELETEXT_FIL1_END,8);
	dump_reg_range(c,"Teletext filter 2",   TVP5150_TELETEXT_FIL2_INI,
						TVP5150_TELETEXT_FIL2_END,8);

239
	printk("tvp5150: Teletext filter enable = 0x%02x\n",
240
					tvp5150_read(c, TVP5150_TELETEXT_FIL_ENA));
241
	printk("tvp5150: Interrupt status register A = 0x%02x\n",
242
					tvp5150_read(c, TVP5150_INT_STATUS_REG_A));
243
	printk("tvp5150: Interrupt enable register A = 0x%02x\n",
244
					tvp5150_read(c, TVP5150_INT_ENABLE_REG_A));
245
	printk("tvp5150: Interrupt configuration = 0x%02x\n",
246
					tvp5150_read(c, TVP5150_INT_CONF));
247
	printk("tvp5150: VDP status register = 0x%02x\n",
248
					tvp5150_read(c, TVP5150_VDP_STATUS_REG));
249
	printk("tvp5150: FIFO word count = 0x%02x\n",
250
					tvp5150_read(c, TVP5150_FIFO_WORD_COUNT));
251
	printk("tvp5150: FIFO interrupt threshold = 0x%02x\n",
252
					tvp5150_read(c, TVP5150_FIFO_INT_THRESHOLD));
253
	printk("tvp5150: FIFO reset = 0x%02x\n",
254
					tvp5150_read(c, TVP5150_FIFO_RESET));
255
	printk("tvp5150: Line number interrupt = 0x%02x\n",
256 257 258 259
					tvp5150_read(c, TVP5150_LINE_NUMBER_INT));
	printk("tvp5150: Pixel alignment register = 0x%02x%02x\n",
					tvp5150_read(c, TVP5150_PIX_ALIGN_REG_HIGH),
					tvp5150_read(c, TVP5150_PIX_ALIGN_REG_LOW));
260
	printk("tvp5150: FIFO output control = 0x%02x\n",
261 262 263
					tvp5150_read(c, TVP5150_FIFO_OUT_CTRL));
	printk("tvp5150: Full field enable = 0x%02x\n",
					tvp5150_read(c, TVP5150_FULL_FIELD_ENA));
264
	printk("tvp5150: Full field mode register = 0x%02x\n",
265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
					tvp5150_read(c, TVP5150_FULL_FIELD_MODE_REG));

	dump_reg_range(c,"CC   data",   TVP5150_CC_DATA_INI,
					TVP5150_CC_DATA_END,8);

	dump_reg_range(c,"WSS  data",   TVP5150_WSS_DATA_INI,
					TVP5150_WSS_DATA_END,8);

	dump_reg_range(c,"VPS  data",   TVP5150_VPS_DATA_INI,
					TVP5150_VPS_DATA_END,8);

	dump_reg_range(c,"VITC data",   TVP5150_VITC_DATA_INI,
					TVP5150_VITC_DATA_END,10);

	dump_reg_range(c,"Line mode",   TVP5150_LINE_MODE_INI,
					TVP5150_LINE_MODE_END,8);
281 282 283 284 285 286
}

/****************************************************************************
			Basic functions
 ****************************************************************************/
enum tvp5150_input {
287 288 289 290
	TVP5150_ANALOG_CH0 = 0,
	TVP5150_SVIDEO = 1,
	TVP5150_ANALOG_CH1 = 2,
	TVP5150_BLACK_SCREEN = 8
291 292
};

293 294
static inline void tvp5150_selmux(struct i2c_client *c,
				  enum tvp5150_input input)
295
{
296 297
	int opmode=0;

298
	struct tvp5150 *decoder = i2c_get_clientdata(c);
299

300
	if (!decoder->enable)
301
		input |= TVP5150_BLACK_SCREEN;
302

303 304 305 306 307 308 309 310 311 312 313
	switch (input) {
	case TVP5150_ANALOG_CH0:
	case TVP5150_ANALOG_CH1:
		opmode=0x30;		/* TV Mode */
		break;
	default:
		opmode=0;		/* Auto Mode */
		break;
	}

	tvp5150_write(c, TVP5150_OP_MODE_CTL, opmode);
314
	tvp5150_write(c, TVP5150_VD_IN_SRC_SEL_1, input);
315 316
};

317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444
struct i2c_reg_value {
	unsigned char reg;
	unsigned char value;
};

/* Default values as sugested at TVP5150AM1 datasheet */
static const struct i2c_reg_value tvp5150_init_default[] = {
	{ /* 0x00 */
		TVP5150_VD_IN_SRC_SEL_1,0x00
	},
	{ /* 0x01 */
		TVP5150_ANAL_CHL_CTL,0x15
	},
	{ /* 0x02 */
		TVP5150_OP_MODE_CTL,0x00
	},
	{ /* 0x03 */
		TVP5150_MISC_CTL,0x01
	},
	{ /* 0x06 */
		TVP5150_COLOR_KIL_THSH_CTL,0x10
	},
	{ /* 0x07 */
		TVP5150_LUMA_PROC_CTL_1,0x60
	},
	{ /* 0x08 */
		TVP5150_LUMA_PROC_CTL_2,0x00
	},
	{ /* 0x09 */
		TVP5150_BRIGHT_CTL,0x80
	},
	{ /* 0x0a */
		TVP5150_SATURATION_CTL,0x80
	},
	{ /* 0x0b */
		TVP5150_HUE_CTL,0x00
	},
	{ /* 0x0c */
		TVP5150_CONTRAST_CTL,0x80
	},
	{ /* 0x0d */
		TVP5150_DATA_RATE_SEL,0x47
	},
	{ /* 0x0e */
		TVP5150_LUMA_PROC_CTL_3,0x00
	},
	{ /* 0x0f */
		TVP5150_CONF_SHARED_PIN,0x08
	},
	{ /* 0x11 */
		TVP5150_ACT_VD_CROP_ST_MSB,0x00
	},
	{ /* 0x12 */
		TVP5150_ACT_VD_CROP_ST_LSB,0x00
	},
	{ /* 0x13 */
		TVP5150_ACT_VD_CROP_STP_MSB,0x00
	},
	{ /* 0x14 */
		TVP5150_ACT_VD_CROP_STP_LSB,0x00
	},
	{ /* 0x15 */
		TVP5150_GENLOCK,0x01
	},
	{ /* 0x16 */
		TVP5150_HORIZ_SYNC_START,0x80
	},
	{ /* 0x18 */
		TVP5150_VERT_BLANKING_START,0x00
	},
	{ /* 0x19 */
		TVP5150_VERT_BLANKING_STOP,0x00
	},
	{ /* 0x1a */
		TVP5150_CHROMA_PROC_CTL_1,0x0c
	},
	{ /* 0x1b */
		TVP5150_CHROMA_PROC_CTL_2,0x14
	},
	{ /* 0x1c */
		TVP5150_INT_RESET_REG_B,0x00
	},
	{ /* 0x1d */
		TVP5150_INT_ENABLE_REG_B,0x00
	},
	{ /* 0x1e */
		TVP5150_INTT_CONFIG_REG_B,0x00
	},
	{ /* 0x28 */
		TVP5150_VIDEO_STD,0x00
	},
	{ /* 0x2e */
		TVP5150_MACROVISION_ON_CTR,0x0f
	},
	{ /* 0x2f */
		TVP5150_MACROVISION_OFF_CTR,0x01
	},
	{ /* 0xbb */
		TVP5150_TELETEXT_FIL_ENA,0x00
	},
	{ /* 0xc0 */
		TVP5150_INT_STATUS_REG_A,0x00
	},
	{ /* 0xc1 */
		TVP5150_INT_ENABLE_REG_A,0x00
	},
	{ /* 0xc2 */
		TVP5150_INT_CONF,0x04
	},
	{ /* 0xc8 */
		TVP5150_FIFO_INT_THRESHOLD,0x80
	},
	{ /* 0xc9 */
		TVP5150_FIFO_RESET,0x00
	},
	{ /* 0xca */
		TVP5150_LINE_NUMBER_INT,0x00
	},
	{ /* 0xcb */
		TVP5150_PIX_ALIGN_REG_LOW,0x4e
	},
	{ /* 0xcc */
		TVP5150_PIX_ALIGN_REG_HIGH,0x00
	},
	{ /* 0xcd */
		TVP5150_FIFO_OUT_CTRL,0x01
	},
	{ /* 0xcf */
445
		TVP5150_FULL_FIELD_ENA,0x00
446 447
	},
	{ /* 0xd0 */
448
		TVP5150_LINE_MODE_INI,0x00
449 450 451 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
	},
	{ /* 0xfc */
		TVP5150_FULL_FIELD_MODE_REG,0x7f
	},
	{ /* end of data */
		0xff,0xff
	}
};

/* Default values as sugested at TVP5150AM1 datasheet */
static const struct i2c_reg_value tvp5150_init_enable[] = {
	{
		TVP5150_CONF_SHARED_PIN, 2
	},{	/* Automatic offset and AGC enabled */
		TVP5150_ANAL_CHL_CTL, 0x15
	},{	/* Activate YCrCb output 0x9 or 0xd ? */
		TVP5150_MISC_CTL, 0x6f
	},{	/* Activates video std autodetection for all standards */
		TVP5150_AUTOSW_MSK, 0x0
	},{	/* Default format: 0x47. For 4:2:2: 0x40 */
		TVP5150_DATA_RATE_SEL, 0x47
	},{
		TVP5150_CHROMA_PROC_CTL_1, 0x0c
	},{
		TVP5150_CHROMA_PROC_CTL_2, 0x54
	},{	/* Non documented, but initialized on WinTV USB2 */
		0x27, 0x20
	},{
		0xff,0xff
	}
};

481 482 483 484 485 486 487
struct tvp5150_vbi_type {
	unsigned int vbi_type;
	unsigned int ini_line;
	unsigned int end_line;
	unsigned int by_field :1;
};

488 489
struct i2c_vbi_ram_value {
	u16 reg;
490 491
	struct tvp5150_vbi_type type;
	unsigned char values[16];
492 493
};

494 495 496
/* This struct have the values for each supported VBI Standard
 * by
 tvp5150_vbi_types should follow the same order as vbi_ram_default
497 498 499 500
 * value 0 means rom position 0x10, value 1 means rom position 0x30
 * and so on. There are 16 possible locations from 0 to 15.
 */

501
static struct i2c_vbi_ram_value vbi_ram_default[] =
502
{
503 504 505 506
	{0x010, /* Teletext, SECAM, WST System A */
		{V4L2_SLICED_TELETEXT_SECAM,6,23,1},
		{ 0xaa, 0xaa, 0xff, 0xff, 0xe7, 0x2e, 0x20, 0x26,
		  0xe6, 0xb4, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00 }
507
	},
508 509 510 511
	{0x030, /* Teletext, PAL, WST System B */
		{V4L2_SLICED_TELETEXT_PAL_B,6,22,1},
		{ 0xaa, 0xaa, 0xff, 0xff, 0x27, 0x2e, 0x20, 0x2b,
		  0xa6, 0x72, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00 }
512
	},
513 514 515 516
	{0x050, /* Teletext, PAL, WST System C */
		{V4L2_SLICED_TELETEXT_PAL_C,6,22,1},
		{ 0xaa, 0xaa, 0xff, 0xff, 0xe7, 0x2e, 0x20, 0x22,
		  0xa6, 0x98, 0x0d, 0x00, 0x00, 0x00, 0x10, 0x00 }
517
	},
518 519 520 521
	{0x070, /* Teletext, NTSC, WST System B */
		{V4L2_SLICED_TELETEXT_NTSC_B,10,21,1},
		{ 0xaa, 0xaa, 0xff, 0xff, 0x27, 0x2e, 0x20, 0x23,
		  0x69, 0x93, 0x0d, 0x00, 0x00, 0x00, 0x10, 0x00 }
522
	},
523 524 525 526
	{0x090, /* Tetetext, NTSC NABTS System C */
		{V4L2_SLICED_TELETEXT_NTSC_C,10,21,1},
		{ 0xaa, 0xaa, 0xff, 0xff, 0xe7, 0x2e, 0x20, 0x22,
		  0x69, 0x93, 0x0d, 0x00, 0x00, 0x00, 0x15, 0x00 }
527
	},
528 529 530 531
	{0x0b0, /* Teletext, NTSC-J, NABTS System D */
		{V4L2_SLICED_TELETEXT_NTSC_D,10,21,1},
		{ 0xaa, 0xaa, 0xff, 0xff, 0xa7, 0x2e, 0x20, 0x23,
		  0x69, 0x93, 0x0d, 0x00, 0x00, 0x00, 0x10, 0x00 }
532
	},
533 534 535 536
	{0x0d0, /* Closed Caption, PAL/SECAM */
		{V4L2_SLICED_CAPTION_625,22,22,1},
		{ 0xaa, 0x2a, 0xff, 0x3f, 0x04, 0x51, 0x6e, 0x02,
		  0xa6, 0x7b, 0x09, 0x00, 0x00, 0x00, 0x27, 0x00 }
537
	},
538 539 540 541
	{0x0f0, /* Closed Caption, NTSC */
		{V4L2_SLICED_CAPTION_525,21,21,1},
		{ 0xaa, 0x2a, 0xff, 0x3f, 0x04, 0x51, 0x6e, 0x02,
		  0x69, 0x8c, 0x09, 0x00, 0x00, 0x00, 0x27, 0x00 }
542
	},
543 544 545 546
	{0x110, /* Wide Screen Signal, PAL/SECAM */
		{V4L2_SLICED_WSS_625,20,21,1},
		{ 0x5b, 0x55, 0xc5, 0xff, 0x00, 0x71, 0x6e, 0x42,
		  0xa6, 0xcd, 0x0f, 0x00, 0x00, 0x00, 0x3a, 0x00 }
547
	},
548 549 550 551
	{0x130, /* Wide Screen Signal, NTSC C */
		{V4L2_SLICED_WSS_525,20,20,1},
		{ 0x38, 0x00, 0x3f, 0x00, 0x00, 0x71, 0x6e, 0x43,
		  0x69, 0x7c, 0x08, 0x00, 0x00, 0x00, 0x39, 0x00 }
552
	},
553 554 555 556
	{0x150, /* Vertical Interval Timecode (VITC), PAL/SECAM */
		{V4l2_SLICED_VITC_625,6,22,0},
		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x6d, 0x49,
		  0xa6, 0x85, 0x08, 0x00, 0x00, 0x00, 0x4c, 0x00 }
557
	},
558 559 560 561
	{0x170, /* Vertical Interval Timecode (VITC), NTSC */
		{V4l2_SLICED_VITC_525,10,20,0},
		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x6d, 0x49,
		  0x69, 0x94, 0x08, 0x00, 0x00, 0x00, 0x4c, 0x00 }
562
	},
563 564 565 566
	{0x190, /* Video Program System (VPS), PAL */
		{V4L2_SLICED_VPS,16,16,0},
		{ 0xaa, 0xaa, 0xff, 0xff, 0xba, 0xce, 0x2b, 0x0d,
		  0xa6, 0xda, 0x0b, 0x00, 0x00, 0x00, 0x60, 0x00 }
567
	},
568 569 570 571
	/* 0x1d0 User programmable */

	/* End of struct */
	{ (u16)-1 }
572
};
573

574
static int tvp5150_write_inittab(struct i2c_client *c,
575
				const struct i2c_reg_value *regs)
576 577 578 579 580 581 582
{
	while (regs->reg != 0xff) {
		tvp5150_write(c, regs->reg, regs->value);
		regs++;
	}
	return 0;
}
583

584
static int tvp5150_vdp_init(struct i2c_client *c,
585
				const struct i2c_vbi_ram_value *regs)
586 587
{
	unsigned int i;
588

589
	/* Disable Full Field */
590
	tvp5150_write(c, TVP5150_FULL_FIELD_ENA, 0);
591

592
	/* Before programming, Line mode should be at 0xff */
593
	for (i=TVP5150_LINE_MODE_INI; i<=TVP5150_LINE_MODE_END; i++)
594
		tvp5150_write(c, i, 0xff);
595

596 597 598 599
	/* Load Ram Table */
	while (regs->reg != (u16)-1 ) {
		tvp5150_write(c, TVP5150_CONF_RAM_ADDR_HIGH,regs->reg>>8);
		tvp5150_write(c, TVP5150_CONF_RAM_ADDR_LOW,regs->reg);
600

601 602
		for (i=0;i<16;i++)
			tvp5150_write(c, TVP5150_VDP_CONF_RAM_DATA,regs->values[i]);
603

604 605 606 607
		regs++;
	}
	return 0;
}
608

609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626
/* Fills VBI capabilities based on i2c_vbi_ram_value struct */
static void tvp5150_vbi_get_cap(const struct i2c_vbi_ram_value *regs,
				struct v4l2_sliced_vbi_cap *cap)
{
	int line;

	memset(cap, 0, sizeof *cap);

	while (regs->reg != (u16)-1 ) {
		for (line=regs->type.ini_line;line<=regs->type.end_line;line++) {
			cap->service_lines[0][line] |= regs->type.vbi_type;
		}
		cap->service_set |= regs->type.vbi_type;

		regs++;
	}
}

627 628 629 630 631 632 633 634 635 636 637 638 639
/* Set vbi processing
 * type - one of tvp5150_vbi_types
 * line - line to gather data
 * fields: bit 0 field1, bit 1, field2
 * flags (default=0xf0) is a bitmask, were set means:
 *	bit 7: enable filtering null bytes on CC
 *	bit 6: send data also to FIFO
 *	bit 5: don't allow data with errors on FIFO
 *	bit 4: enable ECC when possible
 * pix_align = pix alignment:
 *	LSB = field1
 *	MSB = field2
 */
640
static int tvp5150_set_vbi(struct i2c_client *c, unsigned int type,
641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671
					u8 flags, int line, const int fields)
{
	struct tvp5150 *decoder = i2c_get_clientdata(c);
	v4l2_std_id std=decoder->norm;
	u8 reg;

	if (std == V4L2_STD_ALL) {
		tvp5150_err("VBI can't be configured without knowing number of lines\n");
		return -EINVAL;
	} else if (std && V4L2_STD_625_50) {
		/* Don't follow NTSC Line number convension */
		line += 3;
	}

	if (line<6||line>27)
		return -EINVAL;

	type=type | (flags & 0xf0);
	reg=((line-6)<<1)+TVP5150_LINE_MODE_INI;

	if (fields&1) {
		tvp5150_write(c, reg, type);
	}

	if (fields&2) {
		tvp5150_write(c, reg+1, type);
	}

	return 0;
}

672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698
static int tvp5150_set_std(struct i2c_client *c, v4l2_std_id std)
{
	struct tvp5150 *decoder = i2c_get_clientdata(c);
	int fmt=0;

	decoder->norm=std;

	/* First tests should be against specific std */

	if (std == V4L2_STD_ALL) {
		fmt=0;	/* Autodetect mode */
	} else if (std & V4L2_STD_NTSC_443) {
		fmt=0xa;
	} else if (std & V4L2_STD_PAL_M) {
		fmt=0x6;
	} else if (std & (V4L2_STD_PAL_N| V4L2_STD_PAL_Nc)) {
		fmt=0x8;
	} else {
		/* Then, test against generic ones */
		if (std & V4L2_STD_NTSC) {
			fmt=0x2;
		} else if (std & V4L2_STD_PAL) {
			fmt=0x4;
		} else if (std & V4L2_STD_SECAM) {
			fmt=0xc;
		}
	}
699

700 701
	tvp5150_dbg(1,"Set video std register to %d.\n",fmt);
	tvp5150_write(c, TVP5150_VIDEO_STD, fmt);
702

703 704 705 706 707
	return 0;
}

static inline void tvp5150_reset(struct i2c_client *c)
{
708
	u8 msb_id, lsb_id, msb_rom, lsb_rom;
709 710 711 712 713 714 715
	struct tvp5150 *decoder = i2c_get_clientdata(c);

	msb_id=tvp5150_read(c,TVP5150_MSB_DEV_ID);
	lsb_id=tvp5150_read(c,TVP5150_LSB_DEV_ID);
	msb_rom=tvp5150_read(c,TVP5150_ROM_MAJOR_VER);
	lsb_rom=tvp5150_read(c,TVP5150_ROM_MINOR_VER);

716 717 718 719 720
	if ((msb_rom==4)&&(lsb_rom==0)) { /* Is TVP5150AM1 */
		tvp5150_info("tvp%02x%02xam1 detected.\n",msb_id, lsb_id);

		/* ITU-T BT.656.4 timing */
		tvp5150_write(c,TVP5150_REV_SELECT,0);
721
	} else {
722 723 724 725 726 727
		if ((msb_rom==3)||(lsb_rom==0x21)) { /* Is TVP5150A */
			tvp5150_info("tvp%02x%02xa detected.\n",msb_id, lsb_id);
		} else {
			tvp5150_info("*** unknown tvp%02x%02x chip detected.\n",msb_id,lsb_id);
			tvp5150_info("*** Rom ver is %d.%d\n",msb_rom,lsb_rom);
		}
728
	}
729

730 731 732 733 734 735 736 737 738 739 740 741 742
	/* Initializes TVP5150 to its default values */
	tvp5150_write_inittab(c, tvp5150_init_default);

	/* Initializes VDP registers */
	tvp5150_vdp_init(c, vbi_ram_default);

	/* Selects decoder input */
	tvp5150_selmux(c, decoder->input);

	/* Initializes TVP5150 to stream enabled values */
	tvp5150_write_inittab(c, tvp5150_init_enable);

	/* Initialize image preferences */
743 744 745 746
	tvp5150_write(c, TVP5150_BRIGHT_CTL, decoder->bright >> 8);
	tvp5150_write(c, TVP5150_CONTRAST_CTL, decoder->contrast >> 8);
	tvp5150_write(c, TVP5150_SATURATION_CTL, decoder->contrast >> 8);
	tvp5150_write(c, TVP5150_HUE_CTL, (decoder->hue - 32768) >> 8);
747 748

	tvp5150_set_std(c, decoder->norm);
749 750
};

751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768
static int tvp5150_get_ctrl(struct i2c_client *c, struct v4l2_control *ctrl)
{
/*	struct tvp5150 *decoder = i2c_get_clientdata(c); */

	switch (ctrl->id) {
	case V4L2_CID_BRIGHTNESS:
		ctrl->value = tvp5150_read(c, TVP5150_BRIGHT_CTL);
		return 0;
	case V4L2_CID_CONTRAST:
		ctrl->value = tvp5150_read(c, TVP5150_CONTRAST_CTL);
		return 0;
	case V4L2_CID_SATURATION:
		ctrl->value = tvp5150_read(c, TVP5150_SATURATION_CTL);
		return 0;
	case V4L2_CID_HUE:
		ctrl->value = tvp5150_read(c, TVP5150_HUE_CTL);
		return 0;
	}
769
	return -EINVAL;
770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789
}

static int tvp5150_set_ctrl(struct i2c_client *c, struct v4l2_control *ctrl)
{
/*	struct tvp5150 *decoder = i2c_get_clientdata(c); */

	switch (ctrl->id) {
	case V4L2_CID_BRIGHTNESS:
		tvp5150_write(c, TVP5150_BRIGHT_CTL, ctrl->value);
		return 0;
	case V4L2_CID_CONTRAST:
		tvp5150_write(c, TVP5150_CONTRAST_CTL, ctrl->value);
		return 0;
	case V4L2_CID_SATURATION:
		tvp5150_write(c, TVP5150_SATURATION_CTL, ctrl->value);
		return 0;
	case V4L2_CID_HUE:
		tvp5150_write(c, TVP5150_HUE_CTL, ctrl->value);
		return 0;
	}
790
	return -EINVAL;
791 792
}

793 794 795
/****************************************************************************
			I2C Command
 ****************************************************************************/
796
static int tvp5150_command(struct i2c_client *c,
797 798
			   unsigned int cmd, void *arg)
{
799
	struct tvp5150 *decoder = i2c_get_clientdata(c);
800 801 802 803

	switch (cmd) {

	case 0:
804
	case VIDIOC_INT_RESET:
805
	case DECODER_INIT:
806 807 808 809 810 811 812 813
		tvp5150_reset(c);
		break;
	case VIDIOC_S_STD:
		if (decoder->norm == *(v4l2_std_id *)arg)
			break;
		return tvp5150_set_std(c, *(v4l2_std_id *)arg);
	case VIDIOC_G_STD:
		*(v4l2_std_id *)arg = decoder->norm;
814 815
		break;

816 817 818 819 820 821 822 823 824
	case VIDIOC_G_SLICED_VBI_CAP:
	{
		struct v4l2_sliced_vbi_cap *cap = arg;
		tvp5150_dbg(1, "VIDIOC_G_SLICED_VBI_CAP\n");

		tvp5150_vbi_get_cap(vbi_ram_default, cap);
		break;
	}

825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848
#ifdef CONFIG_VIDEO_ADV_DEBUG
	case VIDIOC_INT_G_REGISTER:
	{
		struct v4l2_register *reg = arg;

		if (reg->i2c_id != I2C_DRIVERID_TVP5150)
			return -EINVAL;
		reg->val = tvp5150_read(c, reg->reg & 0xff);
		break;
	}

	case VIDIOC_INT_S_REGISTER:
	{
		struct v4l2_register *reg = arg;

		if (reg->i2c_id != I2C_DRIVERID_TVP5150)
			return -EINVAL;
		if (!capable(CAP_SYS_ADMIN))
			return -EPERM;
		tvp5150_write(c, reg->reg & 0xff, reg->val & 0xff);
		break;
	}
#endif

849
	case DECODER_DUMP:
850
		dump_reg(c);
851 852 853
		break;

	case DECODER_GET_CAPABILITIES:
854 855 856 857 858 859 860 861 862 863 864
		{
			struct video_decoder_capability *cap = arg;

			cap->flags = VIDEO_DECODER_PAL |
			    VIDEO_DECODER_NTSC |
			    VIDEO_DECODER_SECAM |
			    VIDEO_DECODER_AUTO | VIDEO_DECODER_CCIR;
			cap->inputs = 3;
			cap->outputs = 1;
			break;
		}
865
	case DECODER_GET_STATUS:
866 867 868
		{
			break;
		}
869 870 871 872 873 874 875 876

	case DECODER_SET_GPIO:
		break;

	case DECODER_SET_VBI_BYPASS:
		break;

	case DECODER_SET_NORM:
877 878
		{
			int *iarg = arg;
879

880
			switch (*iarg) {
881

882 883
			case VIDEO_MODE_NTSC:
				break;
884

885 886
			case VIDEO_MODE_PAL:
				break;
887

888 889
			case VIDEO_MODE_SECAM:
				break;
890

891 892
			case VIDEO_MODE_AUTO:
				break;
893

894 895
			default:
				return -EINVAL;
896

897 898 899
			}
			decoder->norm = *iarg;
			break;
900 901
		}
	case DECODER_SET_INPUT:
902 903 904 905 906
		{
			int *iarg = arg;
			if (*iarg < 0 || *iarg > 3) {
				return -EINVAL;
			}
907

908
			decoder->input = *iarg;
909
			tvp5150_selmux(c, decoder->input);
910

911 912
			break;
		}
913
	case DECODER_SET_OUTPUT:
914 915
		{
			int *iarg = arg;
916

917 918 919 920 921
			/* not much choice of outputs */
			if (*iarg != 0) {
				return -EINVAL;
			}
			break;
922 923
		}
	case DECODER_ENABLE_OUTPUT:
924 925
		{
			int *iarg = arg;
926

927
			decoder->enable = (*iarg != 0);
928

929
			tvp5150_selmux(c, decoder->input);
930

931
			break;
932
		}
933 934 935
	case VIDIOC_QUERYCTRL:
		{
			struct v4l2_queryctrl *qc = arg;
936
			int i;
937

938
			tvp5150_dbg(1, "VIDIOC_QUERYCTRL called\n");
939

940
			for (i = 0; i < ARRAY_SIZE(tvp5150_qctrl); i++)
941 942 943 944 945 946 947
				if (qc->id && qc->id == tvp5150_qctrl[i].id) {
					memcpy(qc, &(tvp5150_qctrl[i]),
					       sizeof(*qc));
					return 0;
				}

			return -EINVAL;
948
		}
949 950 951
	case VIDIOC_G_CTRL:
		{
			struct v4l2_control *ctrl = arg;
952
			tvp5150_dbg(1, "VIDIOC_G_CTRL called\n");
953

954
			return tvp5150_get_ctrl(c, ctrl);
955
		}
956 957 958 959 960 961 962 963 964 965 966 967
	case VIDIOC_S_CTRL:
		{
			struct v4l2_control *ctrl = arg;
			u8 i, n;
			n = sizeof(tvp5150_qctrl) / sizeof(tvp5150_qctrl[0]);
			for (i = 0; i < n; i++)
				if (ctrl->id == tvp5150_qctrl[i].id) {
					if (ctrl->value <
					    tvp5150_qctrl[i].minimum
					    || ctrl->value >
					    tvp5150_qctrl[i].maximum)
						return -ERANGE;
968 969
					tvp5150_dbg(1,
						"VIDIOC_S_CTRL: id=%d, value=%d\n",
970
						ctrl->id, ctrl->value);
971
					return tvp5150_set_ctrl(c, ctrl);
972 973 974 975 976 977 978 979 980 981
				}
			return -EINVAL;
		}

	case DECODER_SET_PICTURE:
		{
			struct video_picture *pic = arg;
			if (decoder->bright != pic->brightness) {
				/* We want 0 to 255 we get 0-65535 */
				decoder->bright = pic->brightness;
982
				tvp5150_write(c, TVP5150_BRIGHT_CTL,
983 984 985 986 987
					      decoder->bright >> 8);
			}
			if (decoder->contrast != pic->contrast) {
				/* We want 0 to 255 we get 0-65535 */
				decoder->contrast = pic->contrast;
988
				tvp5150_write(c, TVP5150_CONTRAST_CTL,
989 990 991 992 993
					      decoder->contrast >> 8);
			}
			if (decoder->sat != pic->colour) {
				/* We want 0 to 255 we get 0-65535 */
				decoder->sat = pic->colour;
994
				tvp5150_write(c, TVP5150_SATURATION_CTL,
995 996 997 998 999
					      decoder->contrast >> 8);
			}
			if (decoder->hue != pic->hue) {
				/* We want -128 to 127 we get 0-65535 */
				decoder->hue = pic->hue;
1000
				tvp5150_write(c, TVP5150_HUE_CTL,
1001 1002 1003
					      (decoder->hue - 32768) >> 8);
			}
			break;
1004
		}
1005 1006 1007 1008 1009 1010
	default:
		return -EINVAL;
	}

	return 0;
}
1011 1012 1013 1014 1015 1016

/****************************************************************************
			I2C Client & Driver
 ****************************************************************************/
static struct i2c_driver driver;

1017 1018 1019
static struct i2c_client client_template = {
	.name = "(unset)",
	.driver = &driver,
1020 1021
};

1022 1023
static int tvp5150_detect_client(struct i2c_adapter *adapter,
				 int address, int kind)
1024
{
1025
	struct i2c_client *c;
1026 1027 1028
	struct tvp5150 *core;
	int rv;

1029 1030
	if (debug)
		printk( KERN_INFO
1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042
		"tvp5150.c: detecting tvp5150 client on address 0x%x\n",
		address << 1);

	client_template.adapter = adapter;
	client_template.addr = address;

	/* Check if the adapter supports the needed features */
	if (!i2c_check_functionality
	    (adapter,
	     I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
		return 0;

1043 1044
	c = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
	if (c == 0)
1045
		return -ENOMEM;
1046
	memcpy(c, &client_template, sizeof(struct i2c_client));
1047

P
 
Panagiotis Issaris 已提交
1048
	core = kzalloc(sizeof(struct tvp5150), GFP_KERNEL);
1049
	if (core == 0) {
1050
		kfree(c);
1051 1052
		return -ENOMEM;
	}
1053
	i2c_set_clientdata(c, core);
1054

1055
	rv = i2c_attach_client(c);
1056

1057
	core->norm = V4L2_STD_ALL;	/* Default is autodetect */
1058 1059 1060 1061 1062 1063 1064
	core->input = 2;
	core->enable = 1;
	core->bright = 32768;
	core->contrast = 32768;
	core->hue = 32768;
	core->sat = 32768;

1065
	if (rv) {
1066
		kfree(c);
1067 1068 1069 1070
		kfree(core);
		return rv;
	}

1071
//	if (debug > 1)
1072
		dump_reg(c);
1073 1074 1075
	return 0;
}

1076
static int tvp5150_attach_adapter(struct i2c_adapter *adapter)
1077
{
1078 1079
	if (debug)
		printk( KERN_INFO
1080 1081 1082 1083 1084
		"tvp5150.c: starting probe for adapter %s (0x%x)\n",
		adapter->name, adapter->id);
	return i2c_probe(adapter, &addr_data, &tvp5150_detect_client);
}

1085
static int tvp5150_detach_client(struct i2c_client *c)
1086
{
1087
	struct tvp5150 *decoder = i2c_get_clientdata(c);
1088 1089
	int err;

1090 1091 1092 1093 1094
	tvp5150_dbg(1,
		"tvp5150.c: removing tvp5150 adapter on address 0x%x\n",
		c->addr << 1);

	err = i2c_detach_client(c);
1095 1096 1097 1098 1099
	if (err) {
		return err;
	}

	kfree(decoder);
1100
	kfree(c);
1101 1102 1103 1104 1105 1106 1107

	return 0;
}

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

static struct i2c_driver driver = {
1108 1109 1110
	.driver = {
		.name = "tvp5150",
	},
1111
	.id = I2C_DRIVERID_TVP5150,
1112 1113 1114

	.attach_adapter = tvp5150_attach_adapter,
	.detach_client = tvp5150_detach_client,
1115 1116

	.command = tvp5150_command,
1117 1118
};

1119
static int __init tvp5150_init(void)
1120 1121 1122 1123
{
	return i2c_add_driver(&driver);
}

1124
static void __exit tvp5150_exit(void)
1125 1126 1127 1128 1129 1130
{
	i2c_del_driver(&driver);
}

module_init(tvp5150_init);
module_exit(tvp5150_exit);