saa7191.c 15.4 KB
Newer Older
R
Ralf Baechle 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 *  saa7191.c - Philips SAA7191 video decoder driver
 *
 *  Copyright (C) 2003 Ladislav Michl <ladis@linux-mips.org>
 *  Copyright (C) 2004,2005 Mikael Nousiainen <tmnousia@cc.hut.fi>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 as
 *  published by the Free Software Foundation.
 */

#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/fs.h>
15
#include <linux/init.h>
R
Ralf Baechle 已提交
16 17
#include <linux/kernel.h>
#include <linux/major.h>
18
#include <linux/module.h>
R
Ralf Baechle 已提交
19
#include <linux/mm.h>
20
#include <linux/slab.h>
R
Ralf Baechle 已提交
21

22
#include <linux/videodev2.h>
R
Ralf Baechle 已提交
23
#include <linux/i2c.h>
24 25
#include <media/v4l2-device.h>
#include <media/v4l2-chip-ident.h>
R
Ralf Baechle 已提交
26 27 28

#include "saa7191.h"

L
Ladislav Michl 已提交
29
#define SAA7191_MODULE_VERSION	"0.0.5"
R
Ralf Baechle 已提交
30 31 32 33 34 35

MODULE_DESCRIPTION("Philips SAA7191 video decoder driver");
MODULE_VERSION(SAA7191_MODULE_VERSION);
MODULE_AUTHOR("Mikael Nousiainen <tmnousia@cc.hut.fi>");
MODULE_LICENSE("GPL");

36

L
Ladislav Michl 已提交
37 38 39 40 41 42 43 44 45 46 47
// #define SAA7191_DEBUG

#ifdef SAA7191_DEBUG
#define dprintk(x...) printk("SAA7191: " x);
#else
#define dprintk(x...)
#endif

#define SAA7191_SYNC_COUNT	30
#define SAA7191_SYNC_DELAY	100	/* milliseconds */

R
Ralf Baechle 已提交
48
struct saa7191 {
49
	struct v4l2_subdev sd;
R
Ralf Baechle 已提交
50 51 52

	/* the register values are stored here as the actual
	 * I2C-registers are write-only */
L
Ladislav Michl 已提交
53
	u8 reg[25];
R
Ralf Baechle 已提交
54

L
Ladislav Michl 已提交
55
	int input;
56
	v4l2_std_id norm;
R
Ralf Baechle 已提交
57 58
};

59 60 61 62 63
static inline struct saa7191 *to_saa7191(struct v4l2_subdev *sd)
{
	return container_of(sd, struct saa7191, sd);
}

L
Ladislav Michl 已提交
64
static const u8 initseq[] = {
R
Ralf Baechle 已提交
65
	0,	/* Subaddress */
L
Ladislav Michl 已提交
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

	0x50,	/* (0x50) SAA7191_REG_IDEL */

	/* 50 Hz signal timing */
	0x30,	/* (0x30) SAA7191_REG_HSYB */
	0x00,	/* (0x00) SAA7191_REG_HSYS */
	0xe8,	/* (0xe8) SAA7191_REG_HCLB */
	0xb6,	/* (0xb6) SAA7191_REG_HCLS */
	0xf4,	/* (0xf4) SAA7191_REG_HPHI */

	/* control */
	SAA7191_LUMA_APER_1,	/* (0x01) SAA7191_REG_LUMA - CVBS mode */
	0x00,	/* (0x00) SAA7191_REG_HUEC */
	0xf8,	/* (0xf8) SAA7191_REG_CKTQ */
	0xf8,	/* (0xf8) SAA7191_REG_CKTS */
	0x90,	/* (0x90) SAA7191_REG_PLSE */
	0x90,	/* (0x90) SAA7191_REG_SESE */
	0x00,	/* (0x00) SAA7191_REG_GAIN */
	SAA7191_STDC_NFEN | SAA7191_STDC_HRMV,	/* (0x0c) SAA7191_REG_STDC
						 * - not SECAM,
						 * slow time constant */
	SAA7191_IOCK_OEDC | SAA7191_IOCK_OEHS | SAA7191_IOCK_OEVS
	| SAA7191_IOCK_OEDY,	/* (0x78) SAA7191_REG_IOCK
				 * - chroma from CVBS, GPSW1 & 2 off */
	SAA7191_CTL3_AUFD | SAA7191_CTL3_SCEN | SAA7191_CTL3_OFTS
	| SAA7191_CTL3_YDEL0,	/* (0x99) SAA7191_REG_CTL3
				 * - automatic field detection */
	0x00,	/* (0x00) SAA7191_REG_CTL4 */
	0x2c,	/* (0x2c) SAA7191_REG_CHCV - PAL nominal value */
R
Ralf Baechle 已提交
95 96
	0x00,	/* unused */
	0x00,	/* unused */
L
Ladislav Michl 已提交
97 98 99 100 101 102 103

	/* 60 Hz signal timing */
	0x34,	/* (0x34) SAA7191_REG_HS6B */
	0x0a,	/* (0x0a) SAA7191_REG_HS6S */
	0xf4,	/* (0xf4) SAA7191_REG_HC6B */
	0xce,	/* (0xce) SAA7191_REG_HC6S */
	0xf4,	/* (0xf4) SAA7191_REG_HP6I */
R
Ralf Baechle 已提交
104 105 106 107
};

/* SAA7191 register handling */

108
static u8 saa7191_read_reg(struct v4l2_subdev *sd, u8 reg)
R
Ralf Baechle 已提交
109
{
110
	return to_saa7191(sd)->reg[reg];
R
Ralf Baechle 已提交
111 112
}

113
static int saa7191_read_status(struct v4l2_subdev *sd, u8 *value)
R
Ralf Baechle 已提交
114
{
115
	struct i2c_client *client = v4l2_get_subdevdata(sd);
R
Ralf Baechle 已提交
116 117 118 119
	int ret;

	ret = i2c_master_recv(client, value, 1);
	if (ret < 0) {
L
Ladislav Michl 已提交
120
		printk(KERN_ERR "SAA7191: saa7191_read_status(): read failed\n");
R
Ralf Baechle 已提交
121 122 123 124 125 126 127
		return ret;
	}

	return 0;
}


128
static int saa7191_write_reg(struct v4l2_subdev *sd, u8 reg, u8 value)
R
Ralf Baechle 已提交
129
{
130 131 132
	struct i2c_client *client = v4l2_get_subdevdata(sd);

	to_saa7191(sd)->reg[reg] = value;
R
Ralf Baechle 已提交
133 134 135 136
	return i2c_smbus_write_byte_data(client, reg, value);
}

/* the first byte of data must be the first subaddress number (register) */
137
static int saa7191_write_block(struct v4l2_subdev *sd,
138
			       u8 length, const u8 *data)
R
Ralf Baechle 已提交
139
{
140 141
	struct i2c_client *client = v4l2_get_subdevdata(sd);
	struct saa7191 *decoder = to_saa7191(sd);
R
Ralf Baechle 已提交
142 143 144 145 146 147 148 149 150 151
	int i;
	int ret;

	for (i = 0; i < (length - 1); i++) {
		decoder->reg[data[0] + i] = data[i + 1];
	}

	ret = i2c_master_send(client, data, length);
	if (ret < 0) {
		printk(KERN_ERR "SAA7191: saa7191_write_block(): "
L
Ladislav Michl 已提交
152
		       "write failed\n");
R
Ralf Baechle 已提交
153 154 155 156 157 158 159 160
		return ret;
	}

	return 0;
}

/* Helper functions */

161
static int saa7191_s_routing(struct v4l2_subdev *sd,
162
			     u32 input, u32 output, u32 config)
R
Ralf Baechle 已提交
163
{
164 165 166
	struct saa7191 *decoder = to_saa7191(sd);
	u8 luma = saa7191_read_reg(sd, SAA7191_REG_LUMA);
	u8 iock = saa7191_read_reg(sd, SAA7191_REG_IOCK);
R
Ralf Baechle 已提交
167 168
	int err;

169
	switch (input) {
R
Ralf Baechle 已提交
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
	case SAA7191_INPUT_COMPOSITE: /* Set Composite input */
		iock &= ~(SAA7191_IOCK_CHRS | SAA7191_IOCK_GPSW1
			  | SAA7191_IOCK_GPSW2);
		/* Chrominance trap active */
		luma &= ~SAA7191_LUMA_BYPS;
		break;
	case SAA7191_INPUT_SVIDEO: /* Set S-Video input */
		iock |= SAA7191_IOCK_CHRS | SAA7191_IOCK_GPSW2;
		/* Chrominance trap bypassed */
		luma |= SAA7191_LUMA_BYPS;
		break;
	default:
		return -EINVAL;
	}

185
	err = saa7191_write_reg(sd, SAA7191_REG_LUMA, luma);
R
Ralf Baechle 已提交
186 187
	if (err)
		return -EIO;
188
	err = saa7191_write_reg(sd, SAA7191_REG_IOCK, iock);
R
Ralf Baechle 已提交
189 190 191
	if (err)
		return -EIO;

192
	decoder->input = input;
L
Ladislav Michl 已提交
193

R
Ralf Baechle 已提交
194 195 196
	return 0;
}

197
static int saa7191_s_std(struct v4l2_subdev *sd, v4l2_std_id norm)
R
Ralf Baechle 已提交
198
{
199 200 201 202
	struct saa7191 *decoder = to_saa7191(sd);
	u8 stdc = saa7191_read_reg(sd, SAA7191_REG_STDC);
	u8 ctl3 = saa7191_read_reg(sd, SAA7191_REG_CTL3);
	u8 chcv = saa7191_read_reg(sd, SAA7191_REG_CHCV);
R
Ralf Baechle 已提交
203 204
	int err;

205
	if (norm & V4L2_STD_PAL) {
R
Ralf Baechle 已提交
206 207 208
		stdc &= ~SAA7191_STDC_SECS;
		ctl3 &= ~(SAA7191_CTL3_AUFD | SAA7191_CTL3_FSEL);
		chcv = SAA7191_CHCV_PAL;
209
	} else if (norm & V4L2_STD_NTSC) {
R
Ralf Baechle 已提交
210 211 212 213
		stdc &= ~SAA7191_STDC_SECS;
		ctl3 &= ~SAA7191_CTL3_AUFD;
		ctl3 |= SAA7191_CTL3_FSEL;
		chcv = SAA7191_CHCV_NTSC;
214
	} else if (norm & V4L2_STD_SECAM) {
R
Ralf Baechle 已提交
215 216 217
		stdc |= SAA7191_STDC_SECS;
		ctl3 &= ~(SAA7191_CTL3_AUFD | SAA7191_CTL3_FSEL);
		chcv = SAA7191_CHCV_PAL;
218
	} else {
R
Ralf Baechle 已提交
219 220 221
		return -EINVAL;
	}

222
	err = saa7191_write_reg(sd, SAA7191_REG_CTL3, ctl3);
R
Ralf Baechle 已提交
223 224
	if (err)
		return -EIO;
225
	err = saa7191_write_reg(sd, SAA7191_REG_STDC, stdc);
R
Ralf Baechle 已提交
226 227
	if (err)
		return -EIO;
228
	err = saa7191_write_reg(sd, SAA7191_REG_CHCV, chcv);
R
Ralf Baechle 已提交
229 230 231 232 233
	if (err)
		return -EIO;

	decoder->norm = norm;

L
Ladislav Michl 已提交
234 235
	dprintk("ctl3: %02x stdc: %02x chcv: %02x\n", ctl3,
		stdc, chcv);
236
	dprintk("norm: %llx\n", norm);
L
Ladislav Michl 已提交
237

R
Ralf Baechle 已提交
238 239 240
	return 0;
}

241
static int saa7191_wait_for_signal(struct v4l2_subdev *sd, u8 *status)
R
Ralf Baechle 已提交
242
{
L
Ladislav Michl 已提交
243
	int i = 0;
R
Ralf Baechle 已提交
244

L
Ladislav Michl 已提交
245 246 247
	dprintk("Checking for signal...\n");

	for (i = 0; i < SAA7191_SYNC_COUNT; i++) {
248
		if (saa7191_read_status(sd, status))
L
Ladislav Michl 已提交
249 250 251 252 253 254 255 256
			return -EIO;

		if (((*status) & SAA7191_STATUS_HLCK) == 0) {
			dprintk("Signal found\n");
			return 0;
		}

		msleep(SAA7191_SYNC_DELAY);
R
Ralf Baechle 已提交
257 258
	}

L
Ladislav Michl 已提交
259
	dprintk("No signal\n");
R
Ralf Baechle 已提交
260

L
Ladislav Michl 已提交
261
	return -EBUSY;
R
Ralf Baechle 已提交
262 263
}

264
static int saa7191_querystd(struct v4l2_subdev *sd, v4l2_std_id *norm)
R
Ralf Baechle 已提交
265
{
266 267 268
	struct saa7191 *decoder = to_saa7191(sd);
	u8 stdc = saa7191_read_reg(sd, SAA7191_REG_STDC);
	u8 ctl3 = saa7191_read_reg(sd, SAA7191_REG_CTL3);
L
Ladislav Michl 已提交
269
	u8 status;
270
	v4l2_std_id old_norm = decoder->norm;
L
Ladislav Michl 已提交
271
	int err = 0;
R
Ralf Baechle 已提交
272

L
Ladislav Michl 已提交
273 274
	dprintk("SAA7191 extended signal auto-detection...\n");

275
	*norm = V4L2_STD_NTSC | V4L2_STD_PAL | V4L2_STD_SECAM;
L
Ladislav Michl 已提交
276 277 278
	stdc &= ~SAA7191_STDC_SECS;
	ctl3 &= ~(SAA7191_CTL3_FSEL);

279
	err = saa7191_write_reg(sd, SAA7191_REG_STDC, stdc);
L
Ladislav Michl 已提交
280 281 282 283
	if (err) {
		err = -EIO;
		goto out;
	}
284
	err = saa7191_write_reg(sd, SAA7191_REG_CTL3, ctl3);
L
Ladislav Michl 已提交
285 286 287 288 289 290
	if (err) {
		err = -EIO;
		goto out;
	}

	ctl3 |= SAA7191_CTL3_AUFD;
291
	err = saa7191_write_reg(sd, SAA7191_REG_CTL3, ctl3);
L
Ladislav Michl 已提交
292 293 294 295 296 297 298
	if (err) {
		err = -EIO;
		goto out;
	}

	msleep(SAA7191_SYNC_DELAY);

299
	err = saa7191_wait_for_signal(sd, &status);
L
Ladislav Michl 已提交
300 301 302 303 304 305
	if (err)
		goto out;

	if (status & SAA7191_STATUS_FIDT) {
		/* 60Hz signal -> NTSC */
		dprintk("60Hz signal: NTSC\n");
306 307
		*norm = V4L2_STD_NTSC;
		return 0;
L
Ladislav Michl 已提交
308 309 310 311 312 313
	}

	/* 50Hz signal */
	dprintk("50Hz signal: Trying PAL...\n");

	/* try PAL first */
314
	err = saa7191_s_std(sd, V4L2_STD_PAL);
L
Ladislav Michl 已提交
315 316 317 318 319
	if (err)
		goto out;

	msleep(SAA7191_SYNC_DELAY);

320
	err = saa7191_wait_for_signal(sd, &status);
L
Ladislav Michl 已提交
321 322 323 324 325 326
	if (err)
		goto out;

	/* not 50Hz ? */
	if (status & SAA7191_STATUS_FIDT) {
		dprintk("No 50Hz signal\n");
327
		saa7191_s_std(sd, old_norm);
328
		return -EAGAIN;
L
Ladislav Michl 已提交
329 330 331 332
	}

	if (status & SAA7191_STATUS_CODE) {
		dprintk("PAL\n");
333
		*norm = V4L2_STD_PAL;
334
		return saa7191_s_std(sd, old_norm);
L
Ladislav Michl 已提交
335 336 337 338 339
	}

	dprintk("No color detected with PAL - Trying SECAM...\n");

	/* no color detected ? -> try SECAM */
340
	err = saa7191_s_std(sd, V4L2_STD_SECAM);
L
Ladislav Michl 已提交
341 342 343 344 345
	if (err)
		goto out;

	msleep(SAA7191_SYNC_DELAY);

346
	err = saa7191_wait_for_signal(sd, &status);
L
Ladislav Michl 已提交
347 348 349 350 351 352 353 354 355 356 357 358 359
	if (err)
		goto out;

	/* not 50Hz ? */
	if (status & SAA7191_STATUS_FIDT) {
		dprintk("No 50Hz signal\n");
		err = -EAGAIN;
		goto out;
	}

	if (status & SAA7191_STATUS_CODE) {
		/* Color detected -> SECAM */
		dprintk("SECAM\n");
360
		*norm = V4L2_STD_SECAM;
361
		return saa7191_s_std(sd, old_norm);
L
Ladislav Michl 已提交
362 363 364 365 366
	}

	dprintk("No color detected with SECAM - Going back to PAL.\n");

out:
367
	return saa7191_s_std(sd, old_norm);
L
Ladislav Michl 已提交
368 369
}

370
static int saa7191_autodetect_norm(struct v4l2_subdev *sd)
L
Ladislav Michl 已提交
371 372 373 374 375 376 377
{
	u8 status;

	dprintk("SAA7191 signal auto-detection...\n");

	dprintk("Reading status...\n");

378
	if (saa7191_read_status(sd, &status))
L
Ladislav Michl 已提交
379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
		return -EIO;

	dprintk("Checking for signal...\n");

	/* no signal ? */
	if (status & SAA7191_STATUS_HLCK) {
		dprintk("No signal\n");
		return -EBUSY;
	}

	dprintk("Signal found\n");

	if (status & SAA7191_STATUS_FIDT) {
		/* 60hz signal -> NTSC */
		dprintk("NTSC\n");
394
		return saa7191_s_std(sd, V4L2_STD_NTSC);
L
Ladislav Michl 已提交
395 396 397
	} else {
		/* 50hz signal -> PAL */
		dprintk("PAL\n");
398
		return saa7191_s_std(sd, V4L2_STD_PAL);
L
Ladislav Michl 已提交
399 400 401
	}
}

402
static int saa7191_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
L
Ladislav Michl 已提交
403 404 405 406
{
	u8 reg;
	int ret = 0;

407
	switch (ctrl->id) {
L
Ladislav Michl 已提交
408 409 410
	case SAA7191_CONTROL_BANDPASS:
	case SAA7191_CONTROL_BANDPASS_WEIGHT:
	case SAA7191_CONTROL_CORING:
411
		reg = saa7191_read_reg(sd, SAA7191_REG_LUMA);
412
		switch (ctrl->id) {
L
Ladislav Michl 已提交
413 414 415 416 417 418 419 420 421 422 423 424
		case SAA7191_CONTROL_BANDPASS:
			ctrl->value = ((s32)reg & SAA7191_LUMA_BPSS_MASK)
				>> SAA7191_LUMA_BPSS_SHIFT;
			break;
		case SAA7191_CONTROL_BANDPASS_WEIGHT:
			ctrl->value = ((s32)reg & SAA7191_LUMA_APER_MASK)
				>> SAA7191_LUMA_APER_SHIFT;
			break;
		case SAA7191_CONTROL_CORING:
			ctrl->value = ((s32)reg & SAA7191_LUMA_CORI_MASK)
				>> SAA7191_LUMA_CORI_SHIFT;
			break;
R
Ralf Baechle 已提交
425
		}
L
Ladislav Michl 已提交
426 427 428
		break;
	case SAA7191_CONTROL_FORCE_COLOUR:
	case SAA7191_CONTROL_CHROMA_GAIN:
429
		reg = saa7191_read_reg(sd, SAA7191_REG_GAIN);
430
		if (ctrl->id == SAA7191_CONTROL_FORCE_COLOUR)
L
Ladislav Michl 已提交
431 432 433 434 435
			ctrl->value = ((s32)reg & SAA7191_GAIN_COLO) ? 1 : 0;
		else
			ctrl->value = ((s32)reg & SAA7191_GAIN_LFIS_MASK)
				>> SAA7191_GAIN_LFIS_SHIFT;
		break;
436
	case V4L2_CID_HUE:
437
		reg = saa7191_read_reg(sd, SAA7191_REG_HUEC);
L
Ladislav Michl 已提交
438 439 440 441 442 443 444
		if (reg < 0x80)
			reg += 0x80;
		else
			reg -= 0x80;
		ctrl->value = (s32)reg;
		break;
	case SAA7191_CONTROL_VTRC:
445
		reg = saa7191_read_reg(sd, SAA7191_REG_STDC);
L
Ladislav Michl 已提交
446 447 448
		ctrl->value = ((s32)reg & SAA7191_STDC_VTRC) ? 1 : 0;
		break;
	case SAA7191_CONTROL_LUMA_DELAY:
449
		reg = saa7191_read_reg(sd, SAA7191_REG_CTL3);
L
Ladislav Michl 已提交
450 451 452 453 454 455
		ctrl->value = ((s32)reg & SAA7191_CTL3_YDEL_MASK)
			>> SAA7191_CTL3_YDEL_SHIFT;
		if (ctrl->value >= 4)
			ctrl->value -= 8;
		break;
	case SAA7191_CONTROL_VNR:
456
		reg = saa7191_read_reg(sd, SAA7191_REG_CTL4);
L
Ladislav Michl 已提交
457 458 459 460 461 462
		ctrl->value = ((s32)reg & SAA7191_CTL4_VNOI_MASK)
			>> SAA7191_CTL4_VNOI_SHIFT;
		break;
	default:
		ret = -EINVAL;
	}
R
Ralf Baechle 已提交
463

L
Ladislav Michl 已提交
464 465 466
	return ret;
}

467
static int saa7191_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
L
Ladislav Michl 已提交
468 469 470 471
{
	u8 reg;
	int ret = 0;

472
	switch (ctrl->id) {
L
Ladislav Michl 已提交
473 474 475
	case SAA7191_CONTROL_BANDPASS:
	case SAA7191_CONTROL_BANDPASS_WEIGHT:
	case SAA7191_CONTROL_CORING:
476
		reg = saa7191_read_reg(sd, SAA7191_REG_LUMA);
477
		switch (ctrl->id) {
L
Ladislav Michl 已提交
478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493
		case SAA7191_CONTROL_BANDPASS:
			reg &= ~SAA7191_LUMA_BPSS_MASK;
			reg |= (ctrl->value << SAA7191_LUMA_BPSS_SHIFT)
				& SAA7191_LUMA_BPSS_MASK;
			break;
		case SAA7191_CONTROL_BANDPASS_WEIGHT:
			reg &= ~SAA7191_LUMA_APER_MASK;
			reg |= (ctrl->value << SAA7191_LUMA_APER_SHIFT)
				& SAA7191_LUMA_APER_MASK;
			break;
		case SAA7191_CONTROL_CORING:
			reg &= ~SAA7191_LUMA_CORI_MASK;
			reg |= (ctrl->value << SAA7191_LUMA_CORI_SHIFT)
				& SAA7191_LUMA_CORI_MASK;
			break;
		}
494
		ret = saa7191_write_reg(sd, SAA7191_REG_LUMA, reg);
L
Ladislav Michl 已提交
495 496 497
		break;
	case SAA7191_CONTROL_FORCE_COLOUR:
	case SAA7191_CONTROL_CHROMA_GAIN:
498
		reg = saa7191_read_reg(sd, SAA7191_REG_GAIN);
499
		if (ctrl->id == SAA7191_CONTROL_FORCE_COLOUR) {
L
Ladislav Michl 已提交
500 501 502 503 504 505 506 507 508
			if (ctrl->value)
				reg |= SAA7191_GAIN_COLO;
			else
				reg &= ~SAA7191_GAIN_COLO;
		} else {
			reg &= ~SAA7191_GAIN_LFIS_MASK;
			reg |= (ctrl->value << SAA7191_GAIN_LFIS_SHIFT)
				& SAA7191_GAIN_LFIS_MASK;
		}
509
		ret = saa7191_write_reg(sd, SAA7191_REG_GAIN, reg);
L
Ladislav Michl 已提交
510
		break;
511
	case V4L2_CID_HUE:
L
Ladislav Michl 已提交
512 513 514 515 516
		reg = ctrl->value & 0xff;
		if (reg < 0x80)
			reg += 0x80;
		else
			reg -= 0x80;
517
		ret = saa7191_write_reg(sd, SAA7191_REG_HUEC, reg);
L
Ladislav Michl 已提交
518 519
		break;
	case SAA7191_CONTROL_VTRC:
520
		reg = saa7191_read_reg(sd, SAA7191_REG_STDC);
L
Ladislav Michl 已提交
521 522 523 524
		if (ctrl->value)
			reg |= SAA7191_STDC_VTRC;
		else
			reg &= ~SAA7191_STDC_VTRC;
525
		ret = saa7191_write_reg(sd, SAA7191_REG_STDC, reg);
L
Ladislav Michl 已提交
526 527 528 529 530
		break;
	case SAA7191_CONTROL_LUMA_DELAY: {
		s32 value = ctrl->value;
		if (value < 0)
			value += 8;
531
		reg = saa7191_read_reg(sd, SAA7191_REG_CTL3);
L
Ladislav Michl 已提交
532 533 534
		reg &= ~SAA7191_CTL3_YDEL_MASK;
		reg |= (value << SAA7191_CTL3_YDEL_SHIFT)
			& SAA7191_CTL3_YDEL_MASK;
535
		ret = saa7191_write_reg(sd, SAA7191_REG_CTL3, reg);
L
Ladislav Michl 已提交
536 537 538
		break;
	}
	case SAA7191_CONTROL_VNR:
539
		reg = saa7191_read_reg(sd, SAA7191_REG_CTL4);
L
Ladislav Michl 已提交
540 541 542
		reg &= ~SAA7191_CTL4_VNOI_MASK;
		reg |= (ctrl->value << SAA7191_CTL4_VNOI_SHIFT)
			& SAA7191_CTL4_VNOI_MASK;
543
		ret = saa7191_write_reg(sd, SAA7191_REG_CTL4, reg);
L
Ladislav Michl 已提交
544 545 546
		break;
	default:
		ret = -EINVAL;
R
Ralf Baechle 已提交
547 548
	}

L
Ladislav Michl 已提交
549
	return ret;
R
Ralf Baechle 已提交
550 551 552 553
}

/* I2C-interface */

554
static int saa7191_g_input_status(struct v4l2_subdev *sd, u32 *status)
R
Ralf Baechle 已提交
555
{
556 557
	u8 status_reg;
	int res = V4L2_IN_ST_NO_SIGNAL;
R
Ralf Baechle 已提交
558

559 560 561 562 563 564 565 566 567
	if (saa7191_read_status(sd, &status_reg))
		return -EIO;
	if ((status_reg & SAA7191_STATUS_HLCK) == 0)
		res = 0;
	if (!(status_reg & SAA7191_STATUS_CODE))
		res |= V4L2_IN_ST_NO_COLOR;
	*status = res;
	return 0;
}
R
Ralf Baechle 已提交
568

L
Ladislav Michl 已提交
569

570 571 572 573
static int saa7191_g_chip_ident(struct v4l2_subdev *sd,
		struct v4l2_dbg_chip_ident *chip)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
L
Ladislav Michl 已提交
574

575 576
	return v4l2_chip_ident_i2c_client(client, chip, V4L2_IDENT_SAA7191, 0);
}
R
Ralf Baechle 已提交
577

578
/* ----------------------------------------------------------------------- */
579

580 581 582 583 584 585
static const struct v4l2_subdev_core_ops saa7191_core_ops = {
	.g_chip_ident = saa7191_g_chip_ident,
	.g_ctrl = saa7191_g_ctrl,
	.s_ctrl = saa7191_s_ctrl,
	.s_std = saa7191_s_std,
};
R
Ralf Baechle 已提交
586

587 588 589 590 591 592 593 594 595 596
static const struct v4l2_subdev_video_ops saa7191_video_ops = {
	.s_routing = saa7191_s_routing,
	.querystd = saa7191_querystd,
	.g_input_status = saa7191_g_input_status,
};

static const struct v4l2_subdev_ops saa7191_ops = {
	.core = &saa7191_core_ops,
	.video = &saa7191_video_ops,
};
R
Ralf Baechle 已提交
597

598 599 600 601 602
static int saa7191_probe(struct i2c_client *client,
			  const struct i2c_device_id *id)
{
	int err = 0;
	struct saa7191 *decoder;
603
	struct v4l2_subdev *sd;
R
Ralf Baechle 已提交
604

605 606 607 608 609 610 611
	v4l_info(client, "chip found @ 0x%x (%s)\n",
			client->addr << 1, client->adapter->name);

	decoder = kzalloc(sizeof(*decoder), GFP_KERNEL);
	if (!decoder)
		return -ENOMEM;

612 613
	sd = &decoder->sd;
	v4l2_i2c_subdev_init(sd, client, &saa7191_ops);
614

615
	err = saa7191_write_block(sd, sizeof(initseq), initseq);
616 617 618 619 620 621 622 623 624
	if (err) {
		printk(KERN_ERR "SAA7191 initialization failed\n");
		kfree(decoder);
		return err;
	}

	printk(KERN_INFO "SAA7191 initialized\n");

	decoder->input = SAA7191_INPUT_COMPOSITE;
625
	decoder->norm = V4L2_STD_PAL;
626

627
	err = saa7191_autodetect_norm(sd);
628 629 630 631 632 633 634
	if (err && (err != -EBUSY))
		printk(KERN_ERR "SAA7191: Signal auto-detection failed\n");

	return 0;
}

static int saa7191_remove(struct i2c_client *client)
R
Ralf Baechle 已提交
635
{
636
	struct v4l2_subdev *sd = i2c_get_clientdata(client);
637

638 639
	v4l2_device_unregister_subdev(sd);
	kfree(to_saa7191(sd));
640
	return 0;
R
Ralf Baechle 已提交
641 642
}

643 644 645 646 647 648
static const struct i2c_device_id saa7191_id[] = {
	{ "saa7191", 0 },
	{ }
};
MODULE_DEVICE_TABLE(i2c, saa7191_id);

649 650 651 652 653 654 655 656
static struct i2c_driver saa7191_driver = {
	.driver = {
		.owner	= THIS_MODULE,
		.name	= "saa7191",
	},
	.probe		= saa7191_probe,
	.remove		= saa7191_remove,
	.id_table	= saa7191_id,
657
};
658

659
module_i2c_driver(saa7191_driver);