mt9v022.c 23.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * Driver for MT9V022 CMOS Image Sensor from Micron
 *
 * Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.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.
 */

#include <linux/videodev2.h>
#include <linux/slab.h>
#include <linux/i2c.h>
#include <linux/delay.h>
#include <linux/log2.h>
16
#include <linux/module.h>
17

18 19
#include <media/soc_camera.h>
#include <media/soc_mediabus.h>
20
#include <media/v4l2-subdev.h>
21
#include <media/v4l2-chip-ident.h>
22
#include <media/v4l2-ctrls.h>
23

24 25
/*
 * mt9v022 i2c address 0x48, 0x4c, 0x58, 0x5c
26
 * The platform has to define struct i2c_board_info objects and link to them
27 28
 * from struct soc_camera_link
 */
29 30 31

static char *sensor_type;
module_param(sensor_type, charp, S_IRUGO);
32
MODULE_PARM_DESC(sensor_type, "Sensor type: \"colour\" or \"monochrome\"");
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

/* mt9v022 selected register addresses */
#define MT9V022_CHIP_VERSION		0x00
#define MT9V022_COLUMN_START		0x01
#define MT9V022_ROW_START		0x02
#define MT9V022_WINDOW_HEIGHT		0x03
#define MT9V022_WINDOW_WIDTH		0x04
#define MT9V022_HORIZONTAL_BLANKING	0x05
#define MT9V022_VERTICAL_BLANKING	0x06
#define MT9V022_CHIP_CONTROL		0x07
#define MT9V022_SHUTTER_WIDTH1		0x08
#define MT9V022_SHUTTER_WIDTH2		0x09
#define MT9V022_SHUTTER_WIDTH_CTRL	0x0a
#define MT9V022_TOTAL_SHUTTER_WIDTH	0x0b
#define MT9V022_RESET			0x0c
#define MT9V022_READ_MODE		0x0d
#define MT9V022_MONITOR_MODE		0x0e
#define MT9V022_PIXEL_OPERATION_MODE	0x0f
#define MT9V022_LED_OUT_CONTROL		0x1b
#define MT9V022_ADC_MODE_CONTROL	0x1c
53
#define MT9V022_ANALOG_GAIN		0x35
54 55 56 57 58 59 60 61 62
#define MT9V022_BLACK_LEVEL_CALIB_CTRL	0x47
#define MT9V022_PIXCLK_FV_LV		0x74
#define MT9V022_DIGITAL_TEST_PATTERN	0x7f
#define MT9V022_AEC_AGC_ENABLE		0xAF
#define MT9V022_MAX_TOTAL_SHUTTER_WIDTH	0xBD

/* Progressive scan, master, defaults */
#define MT9V022_CHIP_CONTROL_DEFAULT	0x188

63 64 65 66 67 68 69
#define MT9V022_MAX_WIDTH		752
#define MT9V022_MAX_HEIGHT		480
#define MT9V022_MIN_WIDTH		48
#define MT9V022_MIN_HEIGHT		32
#define MT9V022_COLUMN_SKIP		1
#define MT9V022_ROW_SKIP		4

70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
/* MT9V022 has only one fixed colorspace per pixelcode */
struct mt9v022_datafmt {
	enum v4l2_mbus_pixelcode	code;
	enum v4l2_colorspace		colorspace;
};

/* Find a data format by a pixel code in an array */
static const struct mt9v022_datafmt *mt9v022_find_datafmt(
	enum v4l2_mbus_pixelcode code, const struct mt9v022_datafmt *fmt,
	int n)
{
	int i;
	for (i = 0; i < n; i++)
		if (fmt[i].code == code)
			return fmt + i;

	return NULL;
}

static const struct mt9v022_datafmt mt9v022_colour_fmts[] = {
90 91 92 93
	/*
	 * Order important: first natively supported,
	 * second supported with a GPIO extender
	 */
94 95
	{V4L2_MBUS_FMT_SBGGR10_1X10, V4L2_COLORSPACE_SRGB},
	{V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
96 97
};

98
static const struct mt9v022_datafmt mt9v022_monochrome_fmts[] = {
99
	/* Order important - see above */
100
	{V4L2_MBUS_FMT_Y10_1X10, V4L2_COLORSPACE_JPEG},
101
	{V4L2_MBUS_FMT_Y8_1X8, V4L2_COLORSPACE_JPEG},
102 103 104
};

struct mt9v022 {
105
	struct v4l2_subdev subdev;
106 107 108 109 110 111 112 113 114 115 116
	struct v4l2_ctrl_handler hdl;
	struct {
		/* exposure/auto-exposure cluster */
		struct v4l2_ctrl *autoexposure;
		struct v4l2_ctrl *exposure;
	};
	struct {
		/* gain/auto-gain cluster */
		struct v4l2_ctrl *autogain;
		struct v4l2_ctrl *gain;
	};
117
	struct v4l2_rect rect;	/* Sensor window */
118 119 120
	const struct mt9v022_datafmt *fmt;
	const struct mt9v022_datafmt *fmts;
	int num_fmts;
121
	int model;	/* V4L2_IDENT_MT9V022* codes from v4l2-chip-ident.h */
122
	u16 chip_control;
123
	unsigned short y_skip_top;	/* Lines to skip at the top */
124 125
};

126 127 128 129 130
static struct mt9v022 *to_mt9v022(const struct i2c_client *client)
{
	return container_of(i2c_get_clientdata(client), struct mt9v022, subdev);
}

131
static int reg_read(struct i2c_client *client, const u8 reg)
132
{
133
	return i2c_smbus_read_word_swapped(client, reg);
134 135
}

136
static int reg_write(struct i2c_client *client, const u8 reg,
137 138
		     const u16 data)
{
139
	return i2c_smbus_write_word_swapped(client, reg, data);
140 141
}

142
static int reg_set(struct i2c_client *client, const u8 reg,
143 144 145 146
		   const u16 data)
{
	int ret;

147
	ret = reg_read(client, reg);
148 149
	if (ret < 0)
		return ret;
150
	return reg_write(client, reg, ret | data);
151 152
}

153
static int reg_clear(struct i2c_client *client, const u8 reg,
154 155 156 157
		     const u16 data)
{
	int ret;

158
	ret = reg_read(client, reg);
159 160
	if (ret < 0)
		return ret;
161
	return reg_write(client, reg, ret & ~data);
162 163
}

164
static int mt9v022_init(struct i2c_client *client)
165
{
166
	struct mt9v022 *mt9v022 = to_mt9v022(client);
167 168
	int ret;

169 170
	/*
	 * Almost the default mode: master, parallel, simultaneous, and an
171
	 * undocumented bit 0x200, which is present in table 7, but not in 8,
172 173
	 * plus snapshot mode to disable scan for now
	 */
174
	mt9v022->chip_control |= 0x10;
175
	ret = reg_write(client, MT9V022_CHIP_CONTROL, mt9v022->chip_control);
176
	if (!ret)
177
		ret = reg_write(client, MT9V022_READ_MODE, 0x300);
178 179

	/* All defaults */
180
	if (!ret)
181
		/* AEC, AGC on */
182
		ret = reg_set(client, MT9V022_AEC_AGC_ENABLE, 0x3);
183 184 185 186
	if (!ret)
		ret = reg_write(client, MT9V022_ANALOG_GAIN, 16);
	if (!ret)
		ret = reg_write(client, MT9V022_TOTAL_SHUTTER_WIDTH, 480);
187
	if (!ret)
188
		ret = reg_write(client, MT9V022_MAX_TOTAL_SHUTTER_WIDTH, 480);
189
	if (!ret)
190
		/* default - auto */
191
		ret = reg_clear(client, MT9V022_BLACK_LEVEL_CALIB_CTRL, 1);
192
	if (!ret)
193
		ret = reg_write(client, MT9V022_DIGITAL_TEST_PATTERN, 0);
194 195
	if (!ret)
		return v4l2_ctrl_handler_setup(&mt9v022->hdl);
196

197
	return ret;
198 199
}

200
static int mt9v022_s_stream(struct v4l2_subdev *sd, int enable)
201
{
202
	struct i2c_client *client = v4l2_get_subdevdata(sd);
203
	struct mt9v022 *mt9v022 = to_mt9v022(client);
204

205 206 207 208 209 210
	if (enable)
		/* Switch to master "normal" mode */
		mt9v022->chip_control &= ~0x10;
	else
		/* Switch to snapshot mode */
		mt9v022->chip_control |= 0x10;
211

212
	if (reg_write(client, MT9V022_CHIP_CONTROL, mt9v022->chip_control) < 0)
213 214 215 216
		return -EIO;
	return 0;
}

217
static int mt9v022_s_crop(struct v4l2_subdev *sd, struct v4l2_crop *a)
218
{
219
	struct i2c_client *client = v4l2_get_subdevdata(sd);
220 221
	struct mt9v022 *mt9v022 = to_mt9v022(client);
	struct v4l2_rect rect = a->c;
222 223
	int ret;

224
	/* Bayer format - even size lengths */
225
	if (mt9v022->fmts == mt9v022_colour_fmts) {
226 227 228 229 230 231 232 233 234 235 236
		rect.width	= ALIGN(rect.width, 2);
		rect.height	= ALIGN(rect.height, 2);
		/* Let the user play with the starting pixel */
	}

	soc_camera_limit_side(&rect.left, &rect.width,
		     MT9V022_COLUMN_SKIP, MT9V022_MIN_WIDTH, MT9V022_MAX_WIDTH);

	soc_camera_limit_side(&rect.top, &rect.height,
		     MT9V022_ROW_SKIP, MT9V022_MIN_HEIGHT, MT9V022_MAX_HEIGHT);

237
	/* Like in example app. Contradicts the datasheet though */
238
	ret = reg_read(client, MT9V022_AEC_AGC_ENABLE);
239 240
	if (ret >= 0) {
		if (ret & 1) /* Autoexposure */
241
			ret = reg_write(client, MT9V022_MAX_TOTAL_SHUTTER_WIDTH,
242
					rect.height + mt9v022->y_skip_top + 43);
243
		else
244
			ret = reg_write(client, MT9V022_TOTAL_SHUTTER_WIDTH,
245
					rect.height + mt9v022->y_skip_top + 43);
246 247
	}
	/* Setup frame format: defaults apart from width and height */
248
	if (!ret)
249
		ret = reg_write(client, MT9V022_COLUMN_START, rect.left);
250
	if (!ret)
251
		ret = reg_write(client, MT9V022_ROW_START, rect.top);
252
	if (!ret)
253 254 255 256
		/*
		 * Default 94, Phytec driver says:
		 * "width + horizontal blank >= 660"
		 */
257
		ret = reg_write(client, MT9V022_HORIZONTAL_BLANKING,
258 259
				rect.width > 660 - 43 ? 43 :
				660 - rect.width);
260
	if (!ret)
261
		ret = reg_write(client, MT9V022_VERTICAL_BLANKING, 45);
262
	if (!ret)
263
		ret = reg_write(client, MT9V022_WINDOW_WIDTH, rect.width);
264
	if (!ret)
265
		ret = reg_write(client, MT9V022_WINDOW_HEIGHT,
266
				rect.height + mt9v022->y_skip_top);
267 268 269 270

	if (ret < 0)
		return ret;

271
	dev_dbg(&client->dev, "Frame %dx%d pixel\n", rect.width, rect.height);
272 273 274 275 276 277 278 279

	mt9v022->rect = rect;

	return 0;
}

static int mt9v022_g_crop(struct v4l2_subdev *sd, struct v4l2_crop *a)
{
280
	struct i2c_client *client = v4l2_get_subdevdata(sd);
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
	struct mt9v022 *mt9v022 = to_mt9v022(client);

	a->c	= mt9v022->rect;
	a->type	= V4L2_BUF_TYPE_VIDEO_CAPTURE;

	return 0;
}

static int mt9v022_cropcap(struct v4l2_subdev *sd, struct v4l2_cropcap *a)
{
	a->bounds.left			= MT9V022_COLUMN_SKIP;
	a->bounds.top			= MT9V022_ROW_SKIP;
	a->bounds.width			= MT9V022_MAX_WIDTH;
	a->bounds.height		= MT9V022_MAX_HEIGHT;
	a->defrect			= a->bounds;
	a->type				= V4L2_BUF_TYPE_VIDEO_CAPTURE;
	a->pixelaspect.numerator	= 1;
	a->pixelaspect.denominator	= 1;

	return 0;
}

303 304
static int mt9v022_g_fmt(struct v4l2_subdev *sd,
			 struct v4l2_mbus_framefmt *mf)
305
{
306
	struct i2c_client *client = v4l2_get_subdevdata(sd);
307 308
	struct mt9v022 *mt9v022 = to_mt9v022(client);

309 310 311 312 313
	mf->width	= mt9v022->rect.width;
	mf->height	= mt9v022->rect.height;
	mf->code	= mt9v022->fmt->code;
	mf->colorspace	= mt9v022->fmt->colorspace;
	mf->field	= V4L2_FIELD_NONE;
314 315 316 317

	return 0;
}

318 319
static int mt9v022_s_fmt(struct v4l2_subdev *sd,
			 struct v4l2_mbus_framefmt *mf)
320
{
321
	struct i2c_client *client = v4l2_get_subdevdata(sd);
322
	struct mt9v022 *mt9v022 = to_mt9v022(client);
323 324
	struct v4l2_crop a = {
		.c = {
325 326
			.left	= mt9v022->rect.left,
			.top	= mt9v022->rect.top,
327 328
			.width	= mf->width,
			.height	= mf->height,
329
		},
330
	};
331
	int ret;
332

333 334
	/*
	 * The caller provides a supported format, as verified per call to
335
	 * .try_mbus_fmt(), datawidth is from our supported format list
336
	 */
337
	switch (mf->code) {
338
	case V4L2_MBUS_FMT_Y8_1X8:
339
	case V4L2_MBUS_FMT_Y10_1X10:
340 341 342
		if (mt9v022->model != V4L2_IDENT_MT9V022IX7ATM)
			return -EINVAL;
		break;
343 344
	case V4L2_MBUS_FMT_SBGGR8_1X8:
	case V4L2_MBUS_FMT_SBGGR10_1X10:
345 346 347 348 349 350 351 352
		if (mt9v022->model != V4L2_IDENT_MT9V022IX7ATC)
			return -EINVAL;
		break;
	default:
		return -EINVAL;
	}

	/* No support for scaling on this camera, just crop. */
353 354
	ret = mt9v022_s_crop(sd, &a);
	if (!ret) {
355 356 357 358 359
		mf->width	= mt9v022->rect.width;
		mf->height	= mt9v022->rect.height;
		mt9v022->fmt	= mt9v022_find_datafmt(mf->code,
					mt9v022->fmts, mt9v022->num_fmts);
		mf->colorspace	= mt9v022->fmt->colorspace;
360 361 362
	}

	return ret;
363 364
}

365 366
static int mt9v022_try_fmt(struct v4l2_subdev *sd,
			   struct v4l2_mbus_framefmt *mf)
367
{
368
	struct i2c_client *client = v4l2_get_subdevdata(sd);
369
	struct mt9v022 *mt9v022 = to_mt9v022(client);
370 371 372
	const struct mt9v022_datafmt *fmt;
	int align = mf->code == V4L2_MBUS_FMT_SBGGR8_1X8 ||
		mf->code == V4L2_MBUS_FMT_SBGGR10_1X10;
373

374
	v4l_bound_align_image(&mf->width, MT9V022_MIN_WIDTH,
375
		MT9V022_MAX_WIDTH, align,
376
		&mf->height, MT9V022_MIN_HEIGHT + mt9v022->y_skip_top,
377
		MT9V022_MAX_HEIGHT + mt9v022->y_skip_top, align, 0);
378

379 380 381 382 383 384 385 386 387
	fmt = mt9v022_find_datafmt(mf->code, mt9v022->fmts,
				   mt9v022->num_fmts);
	if (!fmt) {
		fmt = mt9v022->fmt;
		mf->code = fmt->code;
	}

	mf->colorspace	= fmt->colorspace;

388 389 390
	return 0;
}

391 392
static int mt9v022_g_chip_ident(struct v4l2_subdev *sd,
				struct v4l2_dbg_chip_ident *id)
393
{
394
	struct i2c_client *client = v4l2_get_subdevdata(sd);
395
	struct mt9v022 *mt9v022 = to_mt9v022(client);
396

397
	if (id->match.type != V4L2_CHIP_MATCH_I2C_ADDR)
398 399
		return -EINVAL;

400
	if (id->match.addr != client->addr)
401 402 403 404 405 406 407 408 409
		return -ENODEV;

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

	return 0;
}

#ifdef CONFIG_VIDEO_ADV_DEBUG
410 411
static int mt9v022_g_register(struct v4l2_subdev *sd,
			      struct v4l2_dbg_register *reg)
412
{
413
	struct i2c_client *client = v4l2_get_subdevdata(sd);
414

415
	if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0xff)
416 417
		return -EINVAL;

418
	if (reg->match.addr != client->addr)
419 420
		return -ENODEV;

421
	reg->size = 2;
422
	reg->val = reg_read(client, reg->reg);
423 424 425 426 427 428 429

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

	return 0;
}

430 431
static int mt9v022_s_register(struct v4l2_subdev *sd,
			      struct v4l2_dbg_register *reg)
432
{
433
	struct i2c_client *client = v4l2_get_subdevdata(sd);
434

435
	if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0xff)
436 437
		return -EINVAL;

438
	if (reg->match.addr != client->addr)
439 440
		return -ENODEV;

441
	if (reg_write(client, reg->reg, reg->val) < 0)
442 443 444 445 446 447
		return -EIO;

	return 0;
}
#endif

448 449 450 451 452 453 454 455
static int mt9v022_s_power(struct v4l2_subdev *sd, int on)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
	struct soc_camera_link *icl = soc_camera_i2c_to_link(client);

	return soc_camera_set_power(&client->dev, icl, on);
}

456
static int mt9v022_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
457
{
458 459 460
	struct mt9v022 *mt9v022 = container_of(ctrl->handler,
					       struct mt9v022, hdl);
	struct v4l2_subdev *sd = &mt9v022->subdev;
461
	struct i2c_client *client = v4l2_get_subdevdata(sd);
462 463
	struct v4l2_ctrl *gain = mt9v022->gain;
	struct v4l2_ctrl *exp = mt9v022->exposure;
464
	unsigned long range;
465 466 467 468
	int data;

	switch (ctrl->id) {
	case V4L2_CID_AUTOGAIN:
469 470 471 472
		data = reg_read(client, MT9V022_ANALOG_GAIN);
		if (data < 0)
			return -EIO;

473 474 475 476
		range = gain->maximum - gain->minimum;
		gain->val = ((data - 16) * range + 24) / 48 + gain->minimum;
		return 0;
	case V4L2_CID_EXPOSURE_AUTO:
477 478 479 480
		data = reg_read(client, MT9V022_TOTAL_SHUTTER_WIDTH);
		if (data < 0)
			return -EIO;

481 482 483
		range = exp->maximum - exp->minimum;
		exp->val = ((data - 1) * range + 239) / 479 + exp->minimum;
		return 0;
484
	}
485
	return -EINVAL;
486 487
}

488
static int mt9v022_s_ctrl(struct v4l2_ctrl *ctrl)
489
{
490 491 492
	struct mt9v022 *mt9v022 = container_of(ctrl->handler,
					       struct mt9v022, hdl);
	struct v4l2_subdev *sd = &mt9v022->subdev;
493
	struct i2c_client *client = v4l2_get_subdevdata(sd);
494
	int data;
495 496 497

	switch (ctrl->id) {
	case V4L2_CID_VFLIP:
498
		if (ctrl->val)
499
			data = reg_set(client, MT9V022_READ_MODE, 0x10);
500
		else
501
			data = reg_clear(client, MT9V022_READ_MODE, 0x10);
502 503
		if (data < 0)
			return -EIO;
504
		return 0;
505
	case V4L2_CID_HFLIP:
506
		if (ctrl->val)
507
			data = reg_set(client, MT9V022_READ_MODE, 0x20);
508
		else
509
			data = reg_clear(client, MT9V022_READ_MODE, 0x20);
510 511
		if (data < 0)
			return -EIO;
512 513 514 515 516 517 518 519 520
		return 0;
	case V4L2_CID_AUTOGAIN:
		if (ctrl->val) {
			if (reg_set(client, MT9V022_AEC_AGC_ENABLE, 0x2) < 0)
				return -EIO;
		} else {
			struct v4l2_ctrl *gain = mt9v022->gain;
			/* mt9v022 has minimum == default */
			unsigned long range = gain->maximum - gain->minimum;
521
			/* Valid values 16 to 64, 32 to 64 must be even. */
522
			unsigned long gain_val = ((gain->val - gain->minimum) *
523
					      48 + range / 2) / range + 16;
524 525 526 527

			if (gain_val >= 32)
				gain_val &= ~1;

528 529 530 531
			/*
			 * The user wants to set gain manually, hope, she
			 * knows, what she's doing... Switch AGC off.
			 */
532
			if (reg_clear(client, MT9V022_AEC_AGC_ENABLE, 0x2) < 0)
533 534
				return -EIO;

535
			dev_dbg(&client->dev, "Setting gain from %d to %lu\n",
536 537
				reg_read(client, MT9V022_ANALOG_GAIN), gain_val);
			if (reg_write(client, MT9V022_ANALOG_GAIN, gain_val) < 0)
538 539
				return -EIO;
		}
540 541 542 543 544 545 546 547 548 549
		return 0;
	case V4L2_CID_EXPOSURE_AUTO:
		if (ctrl->val == V4L2_EXPOSURE_AUTO) {
			data = reg_set(client, MT9V022_AEC_AGC_ENABLE, 0x1);
		} else {
			struct v4l2_ctrl *exp = mt9v022->exposure;
			unsigned long range = exp->maximum - exp->minimum;
			unsigned long shutter = ((exp->val - exp->minimum) *
					479 + range / 2) / range + 1;

550 551 552 553
			/*
			 * The user wants to set shutter width manually, hope,
			 * she knows, what she's doing... Switch AEC off.
			 */
554 555
			data = reg_clear(client, MT9V022_AEC_AGC_ENABLE, 0x1);
			if (data < 0)
556
				return -EIO;
557
			dev_dbg(&client->dev, "Shutter width from %d to %lu\n",
558 559
					reg_read(client, MT9V022_TOTAL_SHUTTER_WIDTH),
					shutter);
560
			if (reg_write(client, MT9V022_TOTAL_SHUTTER_WIDTH,
561
						shutter) < 0)
562 563
				return -EIO;
		}
564
		return 0;
565
	}
566
	return -EINVAL;
567 568
}

569 570 571 572
/*
 * 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
 */
573
static int mt9v022_video_probe(struct i2c_client *client)
574
{
575
	struct mt9v022 *mt9v022 = to_mt9v022(client);
576
	struct soc_camera_link *icl = soc_camera_i2c_to_link(client);
577 578
	s32 data;
	int ret;
579
	unsigned long flags;
580 581

	/* Read out the chip version register */
582
	data = reg_read(client, MT9V022_CHIP_VERSION);
583 584 585 586

	/* must be 0x1311 or 0x1313 */
	if (data != 0x1311 && data != 0x1313) {
		ret = -ENODEV;
587
		dev_info(&client->dev, "No MT9V022 found, ID register 0x%x\n",
588 589 590 591 592
			 data);
		goto ei2c;
	}

	/* Soft reset */
593
	ret = reg_write(client, MT9V022_RESET, 1);
594 595 596 597
	if (ret < 0)
		goto ei2c;
	/* 15 clock cycles */
	udelay(200);
598
	if (reg_read(client, MT9V022_RESET)) {
599
		dev_err(&client->dev, "Resetting MT9V022 failed!\n");
600 601
		if (ret > 0)
			ret = -EIO;
602 603 604 605 606 607
		goto ei2c;
	}

	/* Set monochrome or colour sensor type */
	if (sensor_type && (!strcmp("colour", sensor_type) ||
			    !strcmp("color", sensor_type))) {
608
		ret = reg_write(client, MT9V022_PIXEL_OPERATION_MODE, 4 | 0x11);
609
		mt9v022->model = V4L2_IDENT_MT9V022IX7ATC;
610
		mt9v022->fmts = mt9v022_colour_fmts;
611
	} else {
612
		ret = reg_write(client, MT9V022_PIXEL_OPERATION_MODE, 0x11);
613
		mt9v022->model = V4L2_IDENT_MT9V022IX7ATM;
614
		mt9v022->fmts = mt9v022_monochrome_fmts;
615 616
	}

617
	if (ret < 0)
618
		goto ei2c;
619

620
	mt9v022->num_fmts = 0;
621 622 623 624 625 626 627 628 629 630 631 632

	/*
	 * This is a 10bit sensor, so by default we only allow 10bit.
	 * The platform may support different bus widths due to
	 * different routing of the data lines.
	 */
	if (icl->query_bus_param)
		flags = icl->query_bus_param(icl);
	else
		flags = SOCAM_DATAWIDTH_10;

	if (flags & SOCAM_DATAWIDTH_10)
633
		mt9v022->num_fmts++;
634
	else
635
		mt9v022->fmts++;
636 637

	if (flags & SOCAM_DATAWIDTH_8)
638
		mt9v022->num_fmts++;
639

640
	mt9v022->fmt = &mt9v022->fmts[0];
641

642
	dev_info(&client->dev, "Detected a MT9V022 chip ID %x, %s sensor\n",
643 644 645
		 data, mt9v022->model == V4L2_IDENT_MT9V022IX7ATM ?
		 "monochrome" : "colour");

646 647 648 649
	ret = mt9v022_init(client);
	if (ret < 0)
		dev_err(&client->dev, "Failed to initialise the camera\n");

650 651 652 653
ei2c:
	return ret;
}

654 655
static int mt9v022_g_skip_top_lines(struct v4l2_subdev *sd, u32 *lines)
{
656
	struct i2c_client *client = v4l2_get_subdevdata(sd);
657 658 659 660 661 662 663
	struct mt9v022 *mt9v022 = to_mt9v022(client);

	*lines = mt9v022->y_skip_top;

	return 0;
}

664 665 666 667 668
static const struct v4l2_ctrl_ops mt9v022_ctrl_ops = {
	.g_volatile_ctrl = mt9v022_g_volatile_ctrl,
	.s_ctrl = mt9v022_s_ctrl,
};

669 670 671 672 673 674
static struct v4l2_subdev_core_ops mt9v022_subdev_core_ops = {
	.g_chip_ident	= mt9v022_g_chip_ident,
#ifdef CONFIG_VIDEO_ADV_DEBUG
	.g_register	= mt9v022_g_register,
	.s_register	= mt9v022_s_register,
#endif
675
	.s_power	= mt9v022_s_power,
676 677
};

678
static int mt9v022_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
679 680
			    enum v4l2_mbus_pixelcode *code)
{
681
	struct i2c_client *client = v4l2_get_subdevdata(sd);
682 683
	struct mt9v022 *mt9v022 = to_mt9v022(client);

684
	if (index >= mt9v022->num_fmts)
685 686 687 688 689 690
		return -EINVAL;

	*code = mt9v022->fmts[index].code;
	return 0;
}

691 692 693 694
static int mt9v022_g_mbus_config(struct v4l2_subdev *sd,
				struct v4l2_mbus_config *cfg)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
695
	struct soc_camera_link *icl = soc_camera_i2c_to_link(client);
696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711

	cfg->flags = V4L2_MBUS_MASTER | V4L2_MBUS_SLAVE |
		V4L2_MBUS_PCLK_SAMPLE_RISING | V4L2_MBUS_PCLK_SAMPLE_FALLING |
		V4L2_MBUS_HSYNC_ACTIVE_HIGH | V4L2_MBUS_HSYNC_ACTIVE_LOW |
		V4L2_MBUS_VSYNC_ACTIVE_HIGH | V4L2_MBUS_VSYNC_ACTIVE_LOW |
		V4L2_MBUS_DATA_ACTIVE_HIGH;
	cfg->type = V4L2_MBUS_PARALLEL;
	cfg->flags = soc_camera_apply_board_flags(icl, cfg);

	return 0;
}

static int mt9v022_s_mbus_config(struct v4l2_subdev *sd,
				 const struct v4l2_mbus_config *cfg)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
712
	struct soc_camera_link *icl = soc_camera_i2c_to_link(client);
713 714
	struct mt9v022 *mt9v022 = to_mt9v022(client);
	unsigned long flags = soc_camera_apply_board_flags(icl, cfg);
715
	unsigned int bps = soc_mbus_get_fmtdesc(mt9v022->fmt->code)->bits_per_sample;
716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756
	int ret;
	u16 pixclk = 0;

	if (icl->set_bus_param) {
		ret = icl->set_bus_param(icl, 1 << (bps - 1));
		if (ret)
			return ret;
	} else if (bps != 10) {
		/*
		 * Without board specific bus width settings we only support the
		 * sensors native bus width
		 */
		return -EINVAL;
	}

	if (flags & V4L2_MBUS_PCLK_SAMPLE_FALLING)
		pixclk |= 0x10;

	if (!(flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH))
		pixclk |= 0x1;

	if (!(flags & V4L2_MBUS_VSYNC_ACTIVE_HIGH))
		pixclk |= 0x2;

	ret = reg_write(client, MT9V022_PIXCLK_FV_LV, pixclk);
	if (ret < 0)
		return ret;

	if (!(flags & V4L2_MBUS_MASTER))
		mt9v022->chip_control &= ~0x8;

	ret = reg_write(client, MT9V022_CHIP_CONTROL, mt9v022->chip_control);
	if (ret < 0)
		return ret;

	dev_dbg(&client->dev, "Calculated pixclk 0x%x, chip control 0x%x\n",
		pixclk, mt9v022->chip_control);

	return 0;
}

757 758
static struct v4l2_subdev_video_ops mt9v022_subdev_video_ops = {
	.s_stream	= mt9v022_s_stream,
759 760 761
	.s_mbus_fmt	= mt9v022_s_fmt,
	.g_mbus_fmt	= mt9v022_g_fmt,
	.try_mbus_fmt	= mt9v022_try_fmt,
762
	.s_crop		= mt9v022_s_crop,
763 764
	.g_crop		= mt9v022_g_crop,
	.cropcap	= mt9v022_cropcap,
765
	.enum_mbus_fmt	= mt9v022_enum_fmt,
766 767
	.g_mbus_config	= mt9v022_g_mbus_config,
	.s_mbus_config	= mt9v022_s_mbus_config,
768 769
};

770 771 772 773
static struct v4l2_subdev_sensor_ops mt9v022_subdev_sensor_ops = {
	.g_skip_top_lines	= mt9v022_g_skip_top_lines,
};

774 775 776
static struct v4l2_subdev_ops mt9v022_subdev_ops = {
	.core	= &mt9v022_subdev_core_ops,
	.video	= &mt9v022_subdev_video_ops,
777
	.sensor	= &mt9v022_subdev_sensor_ops,
778 779
};

780 781
static int mt9v022_probe(struct i2c_client *client,
			 const struct i2c_device_id *did)
782 783
{
	struct mt9v022 *mt9v022;
784
	struct soc_camera_link *icl = soc_camera_i2c_to_link(client);
785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802
	struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
	int ret;

	if (!icl) {
		dev_err(&client->dev, "MT9V022 driver needs platform data\n");
		return -EINVAL;
	}

	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;
	}

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

803
	v4l2_i2c_subdev_init(&mt9v022->subdev, client, &mt9v022_subdev_ops);
804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833
	v4l2_ctrl_handler_init(&mt9v022->hdl, 6);
	v4l2_ctrl_new_std(&mt9v022->hdl, &mt9v022_ctrl_ops,
			V4L2_CID_VFLIP, 0, 1, 1, 0);
	v4l2_ctrl_new_std(&mt9v022->hdl, &mt9v022_ctrl_ops,
			V4L2_CID_HFLIP, 0, 1, 1, 0);
	mt9v022->autogain = v4l2_ctrl_new_std(&mt9v022->hdl, &mt9v022_ctrl_ops,
			V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
	mt9v022->gain = v4l2_ctrl_new_std(&mt9v022->hdl, &mt9v022_ctrl_ops,
			V4L2_CID_GAIN, 0, 127, 1, 64);

	/*
	 * Simulated autoexposure. If enabled, we calculate shutter width
	 * ourselves in the driver based on vertical blanking and frame width
	 */
	mt9v022->autoexposure = v4l2_ctrl_new_std_menu(&mt9v022->hdl,
			&mt9v022_ctrl_ops, V4L2_CID_EXPOSURE_AUTO, 1, 0,
			V4L2_EXPOSURE_AUTO);
	mt9v022->exposure = v4l2_ctrl_new_std(&mt9v022->hdl, &mt9v022_ctrl_ops,
			V4L2_CID_EXPOSURE, 1, 255, 1, 255);

	mt9v022->subdev.ctrl_handler = &mt9v022->hdl;
	if (mt9v022->hdl.error) {
		int err = mt9v022->hdl.error;

		kfree(mt9v022);
		return err;
	}
	v4l2_ctrl_auto_cluster(2, &mt9v022->autoexposure,
				V4L2_EXPOSURE_MANUAL, true);
	v4l2_ctrl_auto_cluster(2, &mt9v022->autogain, 0, true);
834

835 836
	mt9v022->chip_control = MT9V022_CHIP_CONTROL_DEFAULT;

837 838 839 840
	/*
	 * MT9V022 _really_ corrupts the first read out line.
	 * TODO: verify on i.MX31
	 */
841
	mt9v022->y_skip_top	= 1;
842 843 844 845 846
	mt9v022->rect.left	= MT9V022_COLUMN_SKIP;
	mt9v022->rect.top	= MT9V022_ROW_SKIP;
	mt9v022->rect.width	= MT9V022_MAX_WIDTH;
	mt9v022->rect.height	= MT9V022_MAX_HEIGHT;

847
	ret = mt9v022_video_probe(client);
848
	if (ret) {
849
		v4l2_ctrl_handler_free(&mt9v022->hdl);
850 851
		kfree(mt9v022);
	}
852 853 854 855 856 857

	return ret;
}

static int mt9v022_remove(struct i2c_client *client)
{
858
	struct mt9v022 *mt9v022 = to_mt9v022(client);
859
	struct soc_camera_link *icl = soc_camera_i2c_to_link(client);
860

861
	v4l2_device_unregister_subdev(&mt9v022->subdev);
862 863
	if (icl->free_bus)
		icl->free_bus(icl);
864
	v4l2_ctrl_handler_free(&mt9v022->hdl);
865 866 867 868
	kfree(mt9v022);

	return 0;
}
869 870 871 872 873 874
static const struct i2c_device_id mt9v022_id[] = {
	{ "mt9v022", 0 },
	{ }
};
MODULE_DEVICE_TABLE(i2c, mt9v022_id);

875 876 877 878 879 880
static struct i2c_driver mt9v022_i2c_driver = {
	.driver = {
		.name = "mt9v022",
	},
	.probe		= mt9v022_probe,
	.remove		= mt9v022_remove,
881
	.id_table	= mt9v022_id,
882 883
};

884
module_i2c_driver(mt9v022_i2c_driver);
885 886 887 888

MODULE_DESCRIPTION("Micron MT9V022 Camera driver");
MODULE_AUTHOR("Guennadi Liakhovetski <kernel@pengutronix.de>");
MODULE_LICENSE("GPL");