mt9t031.c 23.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
/*
 * Driver for MT9T031 CMOS Image Sensor from Micron
 *
 * Copyright (C) 2008, Guennadi Liakhovetski, DENX Software Engineering <lg@denx.de>
 *
 * 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.
 */

11
#include <linux/device.h>
12 13
#include <linux/i2c.h>
#include <linux/log2.h>
14 15 16
#include <linux/pm.h>
#include <linux/slab.h>
#include <linux/videodev2.h>
17 18

#include <media/soc_camera.h>
19 20
#include <media/v4l2-chip-ident.h>
#include <media/v4l2-subdev.h>
21

22 23
/*
 * mt9t031 i2c address 0x5d
24
 * The platform has to define i2c_board_info and link to it from
25 26
 * struct soc_camera_link
 */
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

/* mt9t031 selected register addresses */
#define MT9T031_CHIP_VERSION		0x00
#define MT9T031_ROW_START		0x01
#define MT9T031_COLUMN_START		0x02
#define MT9T031_WINDOW_HEIGHT		0x03
#define MT9T031_WINDOW_WIDTH		0x04
#define MT9T031_HORIZONTAL_BLANKING	0x05
#define MT9T031_VERTICAL_BLANKING	0x06
#define MT9T031_OUTPUT_CONTROL		0x07
#define MT9T031_SHUTTER_WIDTH_UPPER	0x08
#define MT9T031_SHUTTER_WIDTH		0x09
#define MT9T031_PIXEL_CLOCK_CONTROL	0x0a
#define MT9T031_FRAME_RESTART		0x0b
#define MT9T031_SHUTTER_DELAY		0x0c
#define MT9T031_RESET			0x0d
#define MT9T031_READ_MODE_1		0x1e
#define MT9T031_READ_MODE_2		0x20
#define MT9T031_READ_MODE_3		0x21
#define MT9T031_ROW_ADDRESS_MODE	0x22
#define MT9T031_COLUMN_ADDRESS_MODE	0x23
#define MT9T031_GLOBAL_GAIN		0x35
#define MT9T031_CHIP_ENABLE		0xF8

#define MT9T031_MAX_HEIGHT		1536
#define MT9T031_MAX_WIDTH		2048
#define MT9T031_MIN_HEIGHT		2
54
#define MT9T031_MIN_WIDTH		18
55 56 57 58 59 60 61 62 63 64 65
#define MT9T031_HORIZONTAL_BLANK	142
#define MT9T031_VERTICAL_BLANK		25
#define MT9T031_COLUMN_SKIP		32
#define MT9T031_ROW_SKIP		20

#define MT9T031_BUS_PARAM	(SOCAM_PCLK_SAMPLE_RISING |	\
	SOCAM_PCLK_SAMPLE_FALLING | SOCAM_HSYNC_ACTIVE_HIGH |	\
	SOCAM_VSYNC_ACTIVE_HIGH | SOCAM_DATA_ACTIVE_HIGH |	\
	SOCAM_MASTER | SOCAM_DATAWIDTH_10)

struct mt9t031 {
66
	struct v4l2_subdev subdev;
67
	struct v4l2_rect rect;	/* Sensor window */
68 69 70
	int model;	/* V4L2_IDENT_MT9T031* codes from v4l2-chip-ident.h */
	u16 xskip;
	u16 yskip;
71
	unsigned int gain;
72
	unsigned short y_skip_top;	/* Lines to skip at the top */
73
	unsigned int exposure;
74
	unsigned char autoexposure;
75 76
};

77 78 79 80 81
static struct mt9t031 *to_mt9t031(const struct i2c_client *client)
{
	return container_of(i2c_get_clientdata(client), struct mt9t031, subdev);
}

82
static int reg_read(struct i2c_client *client, const u8 reg)
83 84 85 86 87
{
	s32 data = i2c_smbus_read_word_data(client, reg);
	return data < 0 ? data : swab16(data);
}

88
static int reg_write(struct i2c_client *client, const u8 reg,
89 90
		     const u16 data)
{
91
	return i2c_smbus_write_word_data(client, reg, swab16(data));
92 93
}

94
static int reg_set(struct i2c_client *client, const u8 reg,
95 96 97 98
		   const u16 data)
{
	int ret;

99
	ret = reg_read(client, reg);
100 101
	if (ret < 0)
		return ret;
102
	return reg_write(client, reg, ret | data);
103 104
}

105
static int reg_clear(struct i2c_client *client, const u8 reg,
106 107 108 109
		     const u16 data)
{
	int ret;

110
	ret = reg_read(client, reg);
111 112
	if (ret < 0)
		return ret;
113
	return reg_write(client, reg, ret & ~data);
114 115
}

116
static int set_shutter(struct i2c_client *client, const u32 data)
117 118 119
{
	int ret;

120
	ret = reg_write(client, MT9T031_SHUTTER_WIDTH_UPPER, data >> 16);
121 122

	if (ret >= 0)
123
		ret = reg_write(client, MT9T031_SHUTTER_WIDTH, data & 0xffff);
124 125 126 127

	return ret;
}

128
static int get_shutter(struct i2c_client *client, u32 *data)
129 130 131
{
	int ret;

132
	ret = reg_read(client, MT9T031_SHUTTER_WIDTH_UPPER);
133 134 135
	*data = ret << 16;

	if (ret >= 0)
136
		ret = reg_read(client, MT9T031_SHUTTER_WIDTH);
137 138 139 140 141
	*data |= ret & 0xffff;

	return ret < 0 ? ret : 0;
}

142
static int mt9t031_idle(struct i2c_client *client)
143 144 145 146
{
	int ret;

	/* Disable chip output, synchronous option update */
147
	ret = reg_write(client, MT9T031_RESET, 1);
148
	if (ret >= 0)
149
		ret = reg_write(client, MT9T031_RESET, 0);
150
	if (ret >= 0)
151
		ret = reg_clear(client, MT9T031_OUTPUT_CONTROL, 2);
152 153 154 155

	return ret >= 0 ? 0 : -EIO;
}

156
static int mt9t031_disable(struct i2c_client *client)
157 158
{
	/* Disable the chip */
159
	reg_clear(client, MT9T031_OUTPUT_CONTROL, 2);
160

161 162 163
	return 0;
}

164 165 166 167 168 169 170 171 172 173 174 175 176
static int mt9t031_s_stream(struct v4l2_subdev *sd, int enable)
{
	struct i2c_client *client = sd->priv;
	int ret;

	if (enable)
		/* Switch to master "normal" mode */
		ret = reg_set(client, MT9T031_OUTPUT_CONTROL, 2);
	else
		/* Stop sensor readout */
		ret = reg_clear(client, MT9T031_OUTPUT_CONTROL, 2);

	if (ret < 0)
177
		return -EIO;
178

179 180 181 182 183 184
	return 0;
}

static int mt9t031_set_bus_param(struct soc_camera_device *icd,
				 unsigned long flags)
{
185
	struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
186

187 188 189 190 191
	/* The caller should have queried our parameters, check anyway */
	if (flags & ~MT9T031_BUS_PARAM)
		return -EINVAL;

	if (flags & SOCAM_PCLK_SAMPLE_FALLING)
192
		reg_clear(client, MT9T031_PIXEL_CLOCK_CONTROL, 0x8000);
193
	else
194
		reg_set(client, MT9T031_PIXEL_CLOCK_CONTROL, 0x8000);
195 196 197 198 199 200

	return 0;
}

static unsigned long mt9t031_query_bus_param(struct soc_camera_device *icd)
{
201
	struct soc_camera_link *icl = to_soc_camera_link(icd);
202 203 204 205

	return soc_camera_apply_sensor_flags(icl, MT9T031_BUS_PARAM);
}

206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 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 260 261 262 263 264 265 266 267 268 269 270
enum {
	MT9T031_CTRL_VFLIP,
	MT9T031_CTRL_HFLIP,
	MT9T031_CTRL_GAIN,
	MT9T031_CTRL_EXPOSURE,
	MT9T031_CTRL_EXPOSURE_AUTO,
};

static const struct v4l2_queryctrl mt9t031_controls[] = {
	[MT9T031_CTRL_VFLIP] = {
		.id		= V4L2_CID_VFLIP,
		.type		= V4L2_CTRL_TYPE_BOOLEAN,
		.name		= "Flip Vertically",
		.minimum	= 0,
		.maximum	= 1,
		.step		= 1,
		.default_value	= 0,
	},
	[MT9T031_CTRL_HFLIP] = {
		.id		= V4L2_CID_HFLIP,
		.type		= V4L2_CTRL_TYPE_BOOLEAN,
		.name		= "Flip Horizontally",
		.minimum	= 0,
		.maximum	= 1,
		.step		= 1,
		.default_value	= 0,
	},
	[MT9T031_CTRL_GAIN] = {
		.id		= V4L2_CID_GAIN,
		.type		= V4L2_CTRL_TYPE_INTEGER,
		.name		= "Gain",
		.minimum	= 0,
		.maximum	= 127,
		.step		= 1,
		.default_value	= 64,
		.flags		= V4L2_CTRL_FLAG_SLIDER,
	},
	[MT9T031_CTRL_EXPOSURE] = {
		.id		= V4L2_CID_EXPOSURE,
		.type		= V4L2_CTRL_TYPE_INTEGER,
		.name		= "Exposure",
		.minimum	= 1,
		.maximum	= 255,
		.step		= 1,
		.default_value	= 255,
		.flags		= V4L2_CTRL_FLAG_SLIDER,
	},
	[MT9T031_CTRL_EXPOSURE_AUTO] = {
		.id		= V4L2_CID_EXPOSURE_AUTO,
		.type		= V4L2_CTRL_TYPE_BOOLEAN,
		.name		= "Automatic Exposure",
		.minimum	= 0,
		.maximum	= 1,
		.step		= 1,
		.default_value	= 1,
	}
};

static struct soc_camera_ops mt9t031_ops = {
	.set_bus_param		= mt9t031_set_bus_param,
	.query_bus_param	= mt9t031_query_bus_param,
	.controls		= mt9t031_controls,
	.num_controls		= ARRAY_SIZE(mt9t031_controls),
};

271 272
/* target must be _even_ */
static u16 mt9t031_skip(s32 *source, s32 target, s32 max)
273
{
274 275 276 277 278 279 280 281 282 283 284 285 286
	unsigned int skip;

	if (*source < target + target / 2) {
		*source = target;
		return 1;
	}

	skip = min(max, *source + target / 2) / target;
	if (skip > 8)
		skip = 8;
	*source = target * skip;

	return skip;
287 288
}

289
/* rect is the sensor rectangle, the caller guarantees parameter validity */
290
static int mt9t031_set_params(struct i2c_client *client,
291
			      struct v4l2_rect *rect, u16 xskip, u16 yskip)
292
{
293
	struct mt9t031 *mt9t031 = to_mt9t031(client);
294
	int ret;
295
	u16 xbin, ybin;
296 297 298 299 300 301
	const u16 hblank = MT9T031_HORIZONTAL_BLANK,
		vblank = MT9T031_VERTICAL_BLANK;

	xbin = min(xskip, (u16)3);
	ybin = min(yskip, (u16)3);

302 303 304 305 306 307 308 309 310 311 312 313 314
	/*
	 * Could just do roundup(rect->left, [xy]bin * 2); but this is cheaper.
	 * There is always a valid suitably aligned value. The worst case is
	 * xbin = 3, width = 2048. Then we will start at 36, the last read out
	 * pixel will be 2083, which is < 2085 - first black pixel.
	 *
	 * MT9T031 datasheet imposes window left border alignment, depending on
	 * the selected xskip. Failing to conform to this requirement produces
	 * dark horizontal stripes in the image. However, even obeying to this
	 * requirement doesn't eliminate the stripes in all configurations. They
	 * appear "locally reproducibly," but can differ between tests under
	 * different lighting conditions.
	 */
315
	switch (xbin) {
316 317
	case 1:
		rect->left &= ~1;
318 319
		break;
	case 2:
320
		rect->left &= ~3;
321 322
		break;
	case 3:
323 324
		rect->left = rect->left > roundup(MT9T031_COLUMN_SKIP, 6) ?
			(rect->left / 6) * 6 : roundup(MT9T031_COLUMN_SKIP, 6);
325 326
	}

327 328 329 330 331
	rect->top &= ~1;

	dev_dbg(&client->dev, "skip %u:%u, rect %ux%u@%u:%u\n",
		xskip, yskip, rect->width, rect->height, rect->left, rect->top);

332
	/* Disable register update, reconfigure atomically */
333
	ret = reg_set(client, MT9T031_OUTPUT_CONTROL, 1);
334 335 336
	if (ret < 0)
		return ret;

337
	/* Blanking and start values - default... */
338
	ret = reg_write(client, MT9T031_HORIZONTAL_BLANKING, hblank);
339
	if (ret >= 0)
340
		ret = reg_write(client, MT9T031_VERTICAL_BLANKING, vblank);
341

342
	if (yskip != mt9t031->yskip || xskip != mt9t031->xskip) {
343 344
		/* Binning, skipping */
		if (ret >= 0)
345
			ret = reg_write(client, MT9T031_COLUMN_ADDRESS_MODE,
346 347
					((xbin - 1) << 4) | (xskip - 1));
		if (ret >= 0)
348
			ret = reg_write(client, MT9T031_ROW_ADDRESS_MODE,
349 350
					((ybin - 1) << 4) | (yskip - 1));
	}
351 352
	dev_dbg(&client->dev, "new physical left %u, top %u\n",
		rect->left, rect->top);
353

354 355 356 357
	/*
	 * The caller provides a supported format, as guaranteed by
	 * icd->try_fmt_cap(), soc_camera_s_crop() and soc_camera_cropcap()
	 */
358
	if (ret >= 0)
359
		ret = reg_write(client, MT9T031_COLUMN_START, rect->left);
360
	if (ret >= 0)
361
		ret = reg_write(client, MT9T031_ROW_START, rect->top);
362
	if (ret >= 0)
363
		ret = reg_write(client, MT9T031_WINDOW_WIDTH, rect->width - 1);
364
	if (ret >= 0)
365
		ret = reg_write(client, MT9T031_WINDOW_HEIGHT,
366
				rect->height + mt9t031->y_skip_top - 1);
367
	if (ret >= 0 && mt9t031->autoexposure) {
368
		unsigned int total_h = rect->height + mt9t031->y_skip_top + vblank;
369
		ret = set_shutter(client, total_h);
370 371 372
		if (ret >= 0) {
			const u32 shutter_max = MT9T031_MAX_HEIGHT + vblank;
			const struct v4l2_queryctrl *qctrl =
373
				&mt9t031_controls[MT9T031_CTRL_EXPOSURE];
374 375
			mt9t031->exposure = (shutter_max / 2 + (total_h - 1) *
				 (qctrl->maximum - qctrl->minimum)) /
376 377 378 379
				shutter_max + qctrl->minimum;
		}
	}

380 381
	/* Re-enable register update, commit all changes */
	if (ret >= 0)
382
		ret = reg_clear(client, MT9T031_OUTPUT_CONTROL, 1);
383

384 385 386 387 388 389
	if (ret >= 0) {
		mt9t031->rect = *rect;
		mt9t031->xskip = xskip;
		mt9t031->yskip = yskip;
	}

390 391 392
	return ret < 0 ? ret : 0;
}

393
static int mt9t031_s_crop(struct v4l2_subdev *sd, struct v4l2_crop *a)
394
{
395
	struct v4l2_rect rect = a->c;
396
	struct i2c_client *client = sd->priv;
397
	struct mt9t031 *mt9t031 = to_mt9t031(client);
398

399 400 401 402 403 404 405 406 407
	rect.width = ALIGN(rect.width, 2);
	rect.height = ALIGN(rect.height, 2);

	soc_camera_limit_side(&rect.left, &rect.width,
		     MT9T031_COLUMN_SKIP, MT9T031_MIN_WIDTH, MT9T031_MAX_WIDTH);

	soc_camera_limit_side(&rect.top, &rect.height,
		     MT9T031_ROW_SKIP, MT9T031_MIN_HEIGHT, MT9T031_MAX_HEIGHT);

408
	return mt9t031_set_params(client, &rect, mt9t031->xskip, mt9t031->yskip);
409 410 411 412 413 414 415 416 417
}

static int mt9t031_g_crop(struct v4l2_subdev *sd, struct v4l2_crop *a)
{
	struct i2c_client *client = sd->priv;
	struct mt9t031 *mt9t031 = to_mt9t031(client);

	a->c	= mt9t031->rect;
	a->type	= V4L2_BUF_TYPE_VIDEO_CAPTURE;
418

419 420 421 422 423 424 425 426 427 428 429 430 431
	return 0;
}

static int mt9t031_cropcap(struct v4l2_subdev *sd, struct v4l2_cropcap *a)
{
	a->bounds.left			= MT9T031_COLUMN_SKIP;
	a->bounds.top			= MT9T031_ROW_SKIP;
	a->bounds.width			= MT9T031_MAX_WIDTH;
	a->bounds.height		= MT9T031_MAX_HEIGHT;
	a->defrect			= a->bounds;
	a->type				= V4L2_BUF_TYPE_VIDEO_CAPTURE;
	a->pixelaspect.numerator	= 1;
	a->pixelaspect.denominator	= 1;
432

433 434 435
	return 0;
}

436 437
static int mt9t031_g_fmt(struct v4l2_subdev *sd,
			 struct v4l2_mbus_framefmt *mf)
438 439 440 441
{
	struct i2c_client *client = sd->priv;
	struct mt9t031 *mt9t031 = to_mt9t031(client);

442 443 444 445 446
	mf->width	= mt9t031->rect.width / mt9t031->xskip;
	mf->height	= mt9t031->rect.height / mt9t031->yskip;
	mf->code	= V4L2_MBUS_FMT_SBGGR10_1X10;
	mf->colorspace	= V4L2_COLORSPACE_SRGB;
	mf->field	= V4L2_FIELD_NONE;
447 448

	return 0;
449 450
}

451 452
static int mt9t031_s_fmt(struct v4l2_subdev *sd,
			 struct v4l2_mbus_framefmt *mf)
453
{
454 455
	struct i2c_client *client = sd->priv;
	struct mt9t031 *mt9t031 = to_mt9t031(client);
456
	u16 xskip, yskip;
457
	struct v4l2_rect rect = mt9t031->rect;
458 459

	/*
460 461
	 * try_fmt has put width and height within limits.
	 * S_FMT: use binning and skipping for scaling
462
	 */
463 464 465 466 467
	xskip = mt9t031_skip(&rect.width, mf->width, MT9T031_MAX_WIDTH);
	yskip = mt9t031_skip(&rect.height, mf->height, MT9T031_MAX_HEIGHT);

	mf->code	= V4L2_MBUS_FMT_SBGGR10_1X10;
	mf->colorspace	= V4L2_COLORSPACE_SRGB;
468

469
	/* mt9t031_set_params() doesn't change width and height */
470
	return mt9t031_set_params(client, &rect, xskip, yskip);
471 472
}

473 474 475 476
/*
 * If a user window larger than sensor window is requested, we'll increase the
 * sensor window.
 */
477 478
static int mt9t031_try_fmt(struct v4l2_subdev *sd,
			   struct v4l2_mbus_framefmt *mf)
479
{
480
	v4l_bound_align_image(
481 482 483 484 485
		&mf->width, MT9T031_MIN_WIDTH, MT9T031_MAX_WIDTH, 1,
		&mf->height, MT9T031_MIN_HEIGHT, MT9T031_MAX_HEIGHT, 1, 0);

	mf->code	= V4L2_MBUS_FMT_SBGGR10_1X10;
	mf->colorspace	= V4L2_COLORSPACE_SRGB;
486 487 488 489

	return 0;
}

490 491
static int mt9t031_g_chip_ident(struct v4l2_subdev *sd,
				struct v4l2_dbg_chip_ident *id)
492
{
493 494
	struct i2c_client *client = sd->priv;
	struct mt9t031 *mt9t031 = to_mt9t031(client);
495

496
	if (id->match.type != V4L2_CHIP_MATCH_I2C_ADDR)
497 498
		return -EINVAL;

499
	if (id->match.addr != client->addr)
500 501 502 503 504 505 506 507 508
		return -ENODEV;

	id->ident	= mt9t031->model;
	id->revision	= 0;

	return 0;
}

#ifdef CONFIG_VIDEO_ADV_DEBUG
509 510
static int mt9t031_g_register(struct v4l2_subdev *sd,
			      struct v4l2_dbg_register *reg)
511
{
512
	struct i2c_client *client = sd->priv;
513

514
	if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0xff)
515 516
		return -EINVAL;

517
	if (reg->match.addr != client->addr)
518 519
		return -ENODEV;

520
	reg->val = reg_read(client, reg->reg);
521 522 523 524 525 526 527

	if (reg->val > 0xffff)
		return -EIO;

	return 0;
}

528 529
static int mt9t031_s_register(struct v4l2_subdev *sd,
			      struct v4l2_dbg_register *reg)
530
{
531
	struct i2c_client *client = sd->priv;
532

533
	if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0xff)
534 535
		return -EINVAL;

536
	if (reg->match.addr != client->addr)
537 538
		return -ENODEV;

539
	if (reg_write(client, reg->reg, reg->val) < 0)
540 541 542 543 544 545
		return -EIO;

	return 0;
}
#endif

546
static int mt9t031_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
547
{
548 549
	struct i2c_client *client = sd->priv;
	struct mt9t031 *mt9t031 = to_mt9t031(client);
550 551 552 553
	int data;

	switch (ctrl->id) {
	case V4L2_CID_VFLIP:
554
		data = reg_read(client, MT9T031_READ_MODE_2);
555 556 557 558 559
		if (data < 0)
			return -EIO;
		ctrl->value = !!(data & 0x8000);
		break;
	case V4L2_CID_HFLIP:
560
		data = reg_read(client, MT9T031_READ_MODE_2);
561 562 563 564 565 566 567
		if (data < 0)
			return -EIO;
		ctrl->value = !!(data & 0x4000);
		break;
	case V4L2_CID_EXPOSURE_AUTO:
		ctrl->value = mt9t031->autoexposure;
		break;
568 569 570 571 572 573
	case V4L2_CID_GAIN:
		ctrl->value = mt9t031->gain;
		break;
	case V4L2_CID_EXPOSURE:
		ctrl->value = mt9t031->exposure;
		break;
574 575 576 577
	}
	return 0;
}

578
static int mt9t031_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
579
{
580 581
	struct i2c_client *client = sd->priv;
	struct mt9t031 *mt9t031 = to_mt9t031(client);
582 583 584 585 586 587
	const struct v4l2_queryctrl *qctrl;
	int data;

	switch (ctrl->id) {
	case V4L2_CID_VFLIP:
		if (ctrl->value)
588
			data = reg_set(client, MT9T031_READ_MODE_2, 0x8000);
589
		else
590
			data = reg_clear(client, MT9T031_READ_MODE_2, 0x8000);
591 592 593 594 595
		if (data < 0)
			return -EIO;
		break;
	case V4L2_CID_HFLIP:
		if (ctrl->value)
596
			data = reg_set(client, MT9T031_READ_MODE_2, 0x4000);
597
		else
598
			data = reg_clear(client, MT9T031_READ_MODE_2, 0x4000);
599 600 601 602
		if (data < 0)
			return -EIO;
		break;
	case V4L2_CID_GAIN:
603
		qctrl = &mt9t031_controls[MT9T031_CTRL_GAIN];
604 605 606 607 608 609 610 611
		if (ctrl->value > qctrl->maximum || ctrl->value < qctrl->minimum)
			return -EINVAL;
		/* See Datasheet Table 7, Gain settings. */
		if (ctrl->value <= qctrl->default_value) {
			/* Pack it into 0..1 step 0.125, register values 0..8 */
			unsigned long range = qctrl->default_value - qctrl->minimum;
			data = ((ctrl->value - qctrl->minimum) * 8 + range / 2) / range;

612
			dev_dbg(&client->dev, "Setting gain %d\n", data);
613
			data = reg_write(client, MT9T031_GLOBAL_GAIN, data);
614 615 616
			if (data < 0)
				return -EIO;
		} else {
617
			/* Pack it into 1.125..128 variable step, register values 9..0x7860 */
618 619
			/* We assume qctrl->maximum - qctrl->default_value - 1 > 0 */
			unsigned long range = qctrl->maximum - qctrl->default_value - 1;
620
			/* calculated gain: map 65..127 to 9..1024 step 0.125 */
621
			unsigned long gain = ((ctrl->value - qctrl->default_value - 1) *
622
					       1015 + range / 2) / range + 9;
623

624
			if (gain <= 32)		/* calculated gain 9..32 -> 9..32 */
625
				data = gain;
626
			else if (gain <= 64)	/* calculated gain 33..64 -> 0x51..0x60 */
627 628
				data = ((gain - 32) * 16 + 16) / 32 + 80;
			else
629 630
				/* calculated gain 65..1024 -> (1..120) << 8 + 0x60 */
				data = (((gain - 64 + 7) * 32) & 0xff00) | 0x60;
631

632
			dev_dbg(&client->dev, "Set gain from 0x%x to 0x%x\n",
633 634
				reg_read(client, MT9T031_GLOBAL_GAIN), data);
			data = reg_write(client, MT9T031_GLOBAL_GAIN, data);
635 636 637 638 639
			if (data < 0)
				return -EIO;
		}

		/* Success */
640
		mt9t031->gain = ctrl->value;
641 642
		break;
	case V4L2_CID_EXPOSURE:
643
		qctrl = &mt9t031_controls[MT9T031_CTRL_EXPOSURE];
644 645 646 647 648 649 650 651 652
		/* mt9t031 has maximum == default */
		if (ctrl->value > qctrl->maximum || ctrl->value < qctrl->minimum)
			return -EINVAL;
		else {
			const unsigned long range = qctrl->maximum - qctrl->minimum;
			const u32 shutter = ((ctrl->value - qctrl->minimum) * 1048 +
					     range / 2) / range + 1;
			u32 old;

653
			get_shutter(client, &old);
654
			dev_dbg(&client->dev, "Set shutter from %u to %u\n",
655
				old, shutter);
656
			if (set_shutter(client, shutter) < 0)
657
				return -EIO;
658
			mt9t031->exposure = ctrl->value;
659 660 661 662 663 664 665
			mt9t031->autoexposure = 0;
		}
		break;
	case V4L2_CID_EXPOSURE_AUTO:
		if (ctrl->value) {
			const u16 vblank = MT9T031_VERTICAL_BLANK;
			const u32 shutter_max = MT9T031_MAX_HEIGHT + vblank;
666
			unsigned int total_h = mt9t031->rect.height +
667
				mt9t031->y_skip_top + vblank;
668 669

			if (set_shutter(client, total_h) < 0)
670
				return -EIO;
671
			qctrl = &mt9t031_controls[MT9T031_CTRL_EXPOSURE];
672 673
			mt9t031->exposure = (shutter_max / 2 + (total_h - 1) *
				 (qctrl->maximum - qctrl->minimum)) /
674 675 676 677 678
				shutter_max + qctrl->minimum;
			mt9t031->autoexposure = 1;
		} else
			mt9t031->autoexposure = 0;
		break;
679 680
	default:
		return -EINVAL;
681 682 683 684
	}
	return 0;
}

685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737
/*
 * Power Management:
 * This function does nothing for now but must be present for pm to work
 */
static int mt9t031_runtime_suspend(struct device *dev)
{
	return 0;
}

/*
 * Power Management:
 * COLUMN_ADDRESS_MODE and ROW_ADDRESS_MODE are not rewritten if unchanged
 * they are however changed at reset if the platform hook is present
 * thus we rewrite them with the values stored by the driver
 */
static int mt9t031_runtime_resume(struct device *dev)
{
	struct video_device *vdev = to_video_device(dev);
	struct soc_camera_device *icd = container_of(vdev->parent,
		struct soc_camera_device, dev);
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
	struct i2c_client *client = sd->priv;
	struct mt9t031 *mt9t031 = to_mt9t031(client);

	int ret;
	u16 xbin, ybin;

	xbin = min(mt9t031->xskip, (u16)3);
	ybin = min(mt9t031->yskip, (u16)3);

	ret = reg_write(client, MT9T031_COLUMN_ADDRESS_MODE,
		((xbin - 1) << 4) | (mt9t031->xskip - 1));
	if (ret < 0)
		return ret;

	ret = reg_write(client, MT9T031_ROW_ADDRESS_MODE,
		((ybin - 1) << 4) | (mt9t031->yskip - 1));
	if (ret < 0)
		return ret;

	return 0;
}

static struct dev_pm_ops mt9t031_dev_pm_ops = {
	.runtime_suspend	= mt9t031_runtime_suspend,
	.runtime_resume		= mt9t031_runtime_resume,
};

static struct device_type mt9t031_dev_type = {
	.name	= "MT9T031",
	.pm	= &mt9t031_dev_pm_ops,
};

738 739 740 741
/*
 * Interface active, can use i2c. If it fails, it can indeed mean, that
 * this wasn't our capture interface, so, we wait for the right one
 */
742
static int mt9t031_video_probe(struct i2c_client *client)
743
{
744
	struct mt9t031 *mt9t031 = to_mt9t031(client);
745
	struct video_device *vdev = soc_camera_i2c_to_vdev(client);
746
	s32 data;
747
	int ret;
748 749

	/* Enable the chip */
750
	data = reg_write(client, MT9T031_CHIP_ENABLE, 1);
751
	dev_dbg(&client->dev, "write: %d\n", data);
752 753

	/* Read out the chip version register */
754
	data = reg_read(client, MT9T031_CHIP_VERSION);
755 756 757 758 759 760

	switch (data) {
	case 0x1621:
		mt9t031->model = V4L2_IDENT_MT9T031;
		break;
	default:
761
		dev_err(&client->dev,
762
			"No MT9T031 chip detected, register read %x\n", data);
763
		return -ENODEV;
764 765
	}

766
	dev_info(&client->dev, "Detected a MT9T031 chip ID %x\n", data);
767

768 769 770
	ret = mt9t031_idle(client);
	if (ret < 0)
		dev_err(&client->dev, "Failed to initialise the camera\n");
771 772
	else
		vdev->dev.type = &mt9t031_dev_type;
773

774 775 776 777
	/* mt9t031_idle() has reset the chip to default. */
	mt9t031->exposure = 255;
	mt9t031->gain = 64;

778
	return ret;
779 780
}

781 782 783 784 785 786 787 788 789 790
static int mt9t031_g_skip_top_lines(struct v4l2_subdev *sd, u32 *lines)
{
	struct i2c_client *client = sd->priv;
	struct mt9t031 *mt9t031 = to_mt9t031(client);

	*lines = mt9t031->y_skip_top;

	return 0;
}

791 792 793 794 795 796 797 798 799 800
static struct v4l2_subdev_core_ops mt9t031_subdev_core_ops = {
	.g_ctrl		= mt9t031_g_ctrl,
	.s_ctrl		= mt9t031_s_ctrl,
	.g_chip_ident	= mt9t031_g_chip_ident,
#ifdef CONFIG_VIDEO_ADV_DEBUG
	.g_register	= mt9t031_g_register,
	.s_register	= mt9t031_s_register,
#endif
};

801 802 803 804 805 806 807 808 809 810
static int mt9t031_enum_fmt(struct v4l2_subdev *sd, int index,
			    enum v4l2_mbus_pixelcode *code)
{
	if (index)
		return -EINVAL;

	*code = V4L2_MBUS_FMT_SBGGR10_1X10;
	return 0;
}

811 812
static struct v4l2_subdev_video_ops mt9t031_subdev_video_ops = {
	.s_stream	= mt9t031_s_stream,
813 814 815
	.s_mbus_fmt	= mt9t031_s_fmt,
	.g_mbus_fmt	= mt9t031_g_fmt,
	.try_mbus_fmt	= mt9t031_try_fmt,
816
	.s_crop		= mt9t031_s_crop,
817 818
	.g_crop		= mt9t031_g_crop,
	.cropcap	= mt9t031_cropcap,
819
	.enum_mbus_fmt	= mt9t031_enum_fmt,
820 821
};

822 823 824 825
static struct v4l2_subdev_sensor_ops mt9t031_subdev_sensor_ops = {
	.g_skip_top_lines	= mt9t031_g_skip_top_lines,
};

826 827 828
static struct v4l2_subdev_ops mt9t031_subdev_ops = {
	.core	= &mt9t031_subdev_core_ops,
	.video	= &mt9t031_subdev_video_ops,
829
	.sensor	= &mt9t031_subdev_sensor_ops,
830 831
};

832 833 834 835
static int mt9t031_probe(struct i2c_client *client,
			 const struct i2c_device_id *did)
{
	struct mt9t031 *mt9t031;
836
	struct soc_camera_device *icd = client->dev.platform_data;
837 838 839
	struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
	int ret;

840 841 842 843 844 845
	if (icd) {
		struct soc_camera_link *icl = to_soc_camera_link(icd);
		if (!icl) {
			dev_err(&client->dev, "MT9T031 driver needs platform data\n");
			return -EINVAL;
		}
846

847
		icd->ops = &mt9t031_ops;
848 849 850 851 852 853 854 855 856 857 858 859
	}

	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) {
		dev_warn(&adapter->dev,
			 "I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD\n");
		return -EIO;
	}

	mt9t031 = kzalloc(sizeof(struct mt9t031), GFP_KERNEL);
	if (!mt9t031)
		return -ENOMEM;

860
	v4l2_i2c_subdev_init(&mt9t031->subdev, client, &mt9t031_subdev_ops);
861

862
	mt9t031->y_skip_top	= 0;
863 864 865 866 867
	mt9t031->rect.left	= MT9T031_COLUMN_SKIP;
	mt9t031->rect.top	= MT9T031_ROW_SKIP;
	mt9t031->rect.width	= MT9T031_MAX_WIDTH;
	mt9t031->rect.height	= MT9T031_MAX_HEIGHT;

868 869 870 871
	/*
	 * Simulated autoexposure. If enabled, we calculate shutter width
	 * ourselves in the driver based on vertical blanking and frame width
	 */
872 873 874 875 876
	mt9t031->autoexposure = 1;

	mt9t031->xskip = 1;
	mt9t031->yskip = 1;

877 878 879 880 881 882
	mt9t031_idle(client);

	ret = mt9t031_video_probe(client);

	mt9t031_disable(client);

883
	if (ret) {
884 885
		if (icd)
			icd->ops = NULL;
886 887 888
		i2c_set_clientdata(client, NULL);
		kfree(mt9t031);
	}
889 890 891 892 893 894

	return ret;
}

static int mt9t031_remove(struct i2c_client *client)
{
895
	struct mt9t031 *mt9t031 = to_mt9t031(client);
896
	struct soc_camera_device *icd = client->dev.platform_data;
897

898 899
	if (icd)
		icd->ops = NULL;
900
	i2c_set_clientdata(client, NULL);
901
	client->driver = NULL;
902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937
	kfree(mt9t031);

	return 0;
}

static const struct i2c_device_id mt9t031_id[] = {
	{ "mt9t031", 0 },
	{ }
};
MODULE_DEVICE_TABLE(i2c, mt9t031_id);

static struct i2c_driver mt9t031_i2c_driver = {
	.driver = {
		.name = "mt9t031",
	},
	.probe		= mt9t031_probe,
	.remove		= mt9t031_remove,
	.id_table	= mt9t031_id,
};

static int __init mt9t031_mod_init(void)
{
	return i2c_add_driver(&mt9t031_i2c_driver);
}

static void __exit mt9t031_mod_exit(void)
{
	i2c_del_driver(&mt9t031_i2c_driver);
}

module_init(mt9t031_mod_init);
module_exit(mt9t031_mod_exit);

MODULE_DESCRIPTION("Micron MT9T031 Camera driver");
MODULE_AUTHOR("Guennadi Liakhovetski <lg@denx.de>");
MODULE_LICENSE("GPL v2");