mt9m111.c 28.1 KB
Newer Older
1
/*
2
 * Driver for MT9M111/MT9M112 CMOS Image Sensor from Micron
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 *
 * Copyright (C) 2008, Robert Jarzmik <robert.jarzmik@free.fr>
 *
 * 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/log2.h>
#include <linux/gpio.h>
#include <linux/delay.h>

#include <media/v4l2-common.h>
#include <media/v4l2-chip-ident.h>
#include <media/soc_camera.h>

/*
22
 * mt9m111 and mt9m112 i2c address is 0x5d or 0x48 (depending on SAddr pin)
23 24 25 26 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 54 55 56 57 58 59 60 61 62 63 64 65 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
 * The platform has to define i2c_board_info and call i2c_register_board_info()
 */

/* mt9m111: Sensor register addresses */
#define MT9M111_CHIP_VERSION		0x000
#define MT9M111_ROW_START		0x001
#define MT9M111_COLUMN_START		0x002
#define MT9M111_WINDOW_HEIGHT		0x003
#define MT9M111_WINDOW_WIDTH		0x004
#define MT9M111_HORIZONTAL_BLANKING_B	0x005
#define MT9M111_VERTICAL_BLANKING_B	0x006
#define MT9M111_HORIZONTAL_BLANKING_A	0x007
#define MT9M111_VERTICAL_BLANKING_A	0x008
#define MT9M111_SHUTTER_WIDTH		0x009
#define MT9M111_ROW_SPEED		0x00a
#define MT9M111_EXTRA_DELAY		0x00b
#define MT9M111_SHUTTER_DELAY		0x00c
#define MT9M111_RESET			0x00d
#define MT9M111_READ_MODE_B		0x020
#define MT9M111_READ_MODE_A		0x021
#define MT9M111_FLASH_CONTROL		0x023
#define MT9M111_GREEN1_GAIN		0x02b
#define MT9M111_BLUE_GAIN		0x02c
#define MT9M111_RED_GAIN		0x02d
#define MT9M111_GREEN2_GAIN		0x02e
#define MT9M111_GLOBAL_GAIN		0x02f
#define MT9M111_CONTEXT_CONTROL		0x0c8
#define MT9M111_PAGE_MAP		0x0f0
#define MT9M111_BYTE_WISE_ADDR		0x0f1

#define MT9M111_RESET_SYNC_CHANGES	(1 << 15)
#define MT9M111_RESET_RESTART_BAD_FRAME	(1 << 9)
#define MT9M111_RESET_SHOW_BAD_FRAMES	(1 << 8)
#define MT9M111_RESET_RESET_SOC		(1 << 5)
#define MT9M111_RESET_OUTPUT_DISABLE	(1 << 4)
#define MT9M111_RESET_CHIP_ENABLE	(1 << 3)
#define MT9M111_RESET_ANALOG_STANDBY	(1 << 2)
#define MT9M111_RESET_RESTART_FRAME	(1 << 1)
#define MT9M111_RESET_RESET_MODE	(1 << 0)

#define MT9M111_RMB_MIRROR_COLS		(1 << 1)
#define MT9M111_RMB_MIRROR_ROWS		(1 << 0)
#define MT9M111_CTXT_CTRL_RESTART	(1 << 15)
#define MT9M111_CTXT_CTRL_DEFECTCOR_B	(1 << 12)
#define MT9M111_CTXT_CTRL_RESIZE_B	(1 << 10)
#define MT9M111_CTXT_CTRL_CTRL2_B	(1 << 9)
#define MT9M111_CTXT_CTRL_GAMMA_B	(1 << 8)
#define MT9M111_CTXT_CTRL_XENON_EN	(1 << 7)
#define MT9M111_CTXT_CTRL_READ_MODE_B	(1 << 3)
#define MT9M111_CTXT_CTRL_LED_FLASH_EN	(1 << 2)
#define MT9M111_CTXT_CTRL_VBLANK_SEL_B	(1 << 1)
#define MT9M111_CTXT_CTRL_HBLANK_SEL_B	(1 << 0)
/*
 * mt9m111: Colorpipe register addresses (0x100..0x1ff)
 */
#define MT9M111_OPER_MODE_CTRL		0x106
#define MT9M111_OUTPUT_FORMAT_CTRL	0x108
#define MT9M111_REDUCER_XZOOM_B		0x1a0
#define MT9M111_REDUCER_XSIZE_B		0x1a1
#define MT9M111_REDUCER_YZOOM_B		0x1a3
#define MT9M111_REDUCER_YSIZE_B		0x1a4
#define MT9M111_REDUCER_XZOOM_A		0x1a6
#define MT9M111_REDUCER_XSIZE_A		0x1a7
#define MT9M111_REDUCER_YZOOM_A		0x1a9
#define MT9M111_REDUCER_YSIZE_A		0x1aa

#define MT9M111_OUTPUT_FORMAT_CTRL2_A	0x13a
#define MT9M111_OUTPUT_FORMAT_CTRL2_B	0x19b

#define MT9M111_OPMODE_AUTOEXPO_EN	(1 << 14)
93
#define MT9M111_OPMODE_AUTOWHITEBAL_EN	(1 << 1)
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115

#define MT9M111_OUTFMT_PROCESSED_BAYER	(1 << 14)
#define MT9M111_OUTFMT_BYPASS_IFP	(1 << 10)
#define MT9M111_OUTFMT_INV_PIX_CLOCK	(1 << 9)
#define MT9M111_OUTFMT_RGB		(1 << 8)
#define MT9M111_OUTFMT_RGB565		(0x0 << 6)
#define MT9M111_OUTFMT_RGB555		(0x1 << 6)
#define MT9M111_OUTFMT_RGB444x		(0x2 << 6)
#define MT9M111_OUTFMT_RGBx444		(0x3 << 6)
#define MT9M111_OUTFMT_TST_RAMP_OFF	(0x0 << 4)
#define MT9M111_OUTFMT_TST_RAMP_COL	(0x1 << 4)
#define MT9M111_OUTFMT_TST_RAMP_ROW	(0x2 << 4)
#define MT9M111_OUTFMT_TST_RAMP_FRAME	(0x3 << 4)
#define MT9M111_OUTFMT_SHIFT_3_UP	(1 << 3)
#define MT9M111_OUTFMT_AVG_CHROMA	(1 << 2)
#define MT9M111_OUTFMT_SWAP_YCbCr_C_Y	(1 << 1)
#define MT9M111_OUTFMT_SWAP_RGB_EVEN	(1 << 1)
#define MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr	(1 << 0)
/*
 * mt9m111: Camera control register addresses (0x200..0x2ff not implemented)
 */

116 117 118 119
#define reg_read(reg) mt9m111_reg_read(client, MT9M111_##reg)
#define reg_write(reg, val) mt9m111_reg_write(client, MT9M111_##reg, (val))
#define reg_set(reg, val) mt9m111_reg_set(client, MT9M111_##reg, (val))
#define reg_clear(reg, val) mt9m111_reg_clear(client, MT9M111_##reg, (val))
120 121 122 123 124 125

#define MT9M111_MIN_DARK_ROWS	8
#define MT9M111_MIN_DARK_COLS	24
#define MT9M111_MAX_HEIGHT	1024
#define MT9M111_MAX_WIDTH	1280

126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
/* MT9M111 has only one fixed colorspace per pixelcode */
struct mt9m111_datafmt {
	enum v4l2_mbus_pixelcode	code;
	enum v4l2_colorspace		colorspace;
};

/* Find a data format by a pixel code in an array */
static const struct mt9m111_datafmt *mt9m111_find_datafmt(
	enum v4l2_mbus_pixelcode code, const struct mt9m111_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 mt9m111_datafmt mt9m111_colour_fmts[] = {
146 147 148 149
	{V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG},
	{V4L2_MBUS_FMT_YVYU8_2X8, V4L2_COLORSPACE_JPEG},
	{V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},
	{V4L2_MBUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_JPEG},
150 151 152 153
	{V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
	{V4L2_MBUS_FMT_RGB565_2X8_LE, V4L2_COLORSPACE_SRGB},
	{V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
	{V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
154 155 156 157 158 159 160 161
};

enum mt9m111_context {
	HIGHPOWER = 0,
	LOWPOWER,
};

struct mt9m111 {
162
	struct v4l2_subdev subdev;
163
	int model;	/* V4L2_IDENT_MT9M11x* codes from v4l2-chip-ident.h */
164
	enum mt9m111_context context;
165
	struct v4l2_rect rect;
166
	const struct mt9m111_datafmt *fmt;
167
	unsigned int gain;
168 169 170 171 172 173 174 175 176
	unsigned char autoexposure;
	unsigned char datawidth;
	unsigned int powered:1;
	unsigned int hflip:1;
	unsigned int vflip:1;
	unsigned int swap_rgb_even_odd:1;
	unsigned int swap_rgb_red_blue:1;
	unsigned int swap_yuv_y_chromas:1;
	unsigned int swap_yuv_cb_cr:1;
177
	unsigned int autowhitebalance:1;
178 179
};

180 181 182 183 184
static struct mt9m111 *to_mt9m111(const struct i2c_client *client)
{
	return container_of(i2c_get_clientdata(client), struct mt9m111, subdev);
}

185 186 187 188 189 190 191 192 193 194 195 196 197
static int reg_page_map_set(struct i2c_client *client, const u16 reg)
{
	int ret;
	u16 page;
	static int lastpage = -1;	/* PageMap cache value */

	page = (reg >> 8);
	if (page == lastpage)
		return 0;
	if (page > 2)
		return -EINVAL;

	ret = i2c_smbus_write_word_data(client, MT9M111_PAGE_MAP, swab16(page));
198
	if (!ret)
199 200 201 202
		lastpage = page;
	return ret;
}

203
static int mt9m111_reg_read(struct i2c_client *client, const u16 reg)
204 205 206 207 208
{
	int ret;

	ret = reg_page_map_set(client, reg);
	if (!ret)
209
		ret = swab16(i2c_smbus_read_word_data(client, reg & 0xff));
210

211
	dev_dbg(&client->dev, "read  reg.%03x -> %04x\n", reg, ret);
212 213 214
	return ret;
}

215
static int mt9m111_reg_write(struct i2c_client *client, const u16 reg,
216 217 218 219 220
			     const u16 data)
{
	int ret;

	ret = reg_page_map_set(client, reg);
221
	if (!ret)
222
		ret = i2c_smbus_write_word_data(client, reg & 0xff,
223
						swab16(data));
224
	dev_dbg(&client->dev, "write reg.%03x = %04x -> %d\n", reg, data, ret);
225 226 227
	return ret;
}

228
static int mt9m111_reg_set(struct i2c_client *client, const u16 reg,
229 230 231 232
			   const u16 data)
{
	int ret;

233
	ret = mt9m111_reg_read(client, reg);
234
	if (ret >= 0)
235
		ret = mt9m111_reg_write(client, reg, ret | data);
236 237 238
	return ret;
}

239
static int mt9m111_reg_clear(struct i2c_client *client, const u16 reg,
240 241 242 243
			     const u16 data)
{
	int ret;

244 245
	ret = mt9m111_reg_read(client, reg);
	return mt9m111_reg_write(client, reg, ret & ~data);
246 247
}

248
static int mt9m111_set_context(struct i2c_client *client,
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
			       enum mt9m111_context ctxt)
{
	int valB = MT9M111_CTXT_CTRL_RESTART | MT9M111_CTXT_CTRL_DEFECTCOR_B
		| MT9M111_CTXT_CTRL_RESIZE_B | MT9M111_CTXT_CTRL_CTRL2_B
		| MT9M111_CTXT_CTRL_GAMMA_B | MT9M111_CTXT_CTRL_READ_MODE_B
		| MT9M111_CTXT_CTRL_VBLANK_SEL_B
		| MT9M111_CTXT_CTRL_HBLANK_SEL_B;
	int valA = MT9M111_CTXT_CTRL_RESTART;

	if (ctxt == HIGHPOWER)
		return reg_write(CONTEXT_CONTROL, valB);
	else
		return reg_write(CONTEXT_CONTROL, valA);
}

264
static int mt9m111_setup_rect(struct i2c_client *client,
265
			      struct v4l2_rect *rect)
266
{
267
	struct mt9m111 *mt9m111 = to_mt9m111(client);
268
	int ret, is_raw_format;
269 270
	int width = rect->width;
	int height = rect->height;
271

272 273
	if (mt9m111->fmt->code == V4L2_MBUS_FMT_SBGGR8_1X8 ||
	    mt9m111->fmt->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE)
274 275 276 277
		is_raw_format = 1;
	else
		is_raw_format = 0;

278
	ret = reg_write(COLUMN_START, rect->left);
279
	if (!ret)
280
		ret = reg_write(ROW_START, rect->top);
281 282

	if (is_raw_format) {
283
		if (!ret)
284
			ret = reg_write(WINDOW_WIDTH, width);
285
		if (!ret)
286 287
			ret = reg_write(WINDOW_HEIGHT, height);
	} else {
288
		if (!ret)
289
			ret = reg_write(REDUCER_XZOOM_B, MT9M111_MAX_WIDTH);
290
		if (!ret)
291
			ret = reg_write(REDUCER_YZOOM_B, MT9M111_MAX_HEIGHT);
292
		if (!ret)
293
			ret = reg_write(REDUCER_XSIZE_B, width);
294
		if (!ret)
295
			ret = reg_write(REDUCER_YSIZE_B, height);
296
		if (!ret)
297
			ret = reg_write(REDUCER_XZOOM_A, MT9M111_MAX_WIDTH);
298
		if (!ret)
299
			ret = reg_write(REDUCER_YZOOM_A, MT9M111_MAX_HEIGHT);
300
		if (!ret)
301
			ret = reg_write(REDUCER_XSIZE_A, width);
302
		if (!ret)
303 304 305 306 307 308
			ret = reg_write(REDUCER_YSIZE_A, height);
	}

	return ret;
}

309
static int mt9m111_setup_pixfmt(struct i2c_client *client, u16 outfmt)
310 311 312 313
{
	int ret;

	ret = reg_write(OUTPUT_FORMAT_CTRL2_A, outfmt);
314
	if (!ret)
315 316 317 318
		ret = reg_write(OUTPUT_FORMAT_CTRL2_B, outfmt);
	return ret;
}

319
static int mt9m111_setfmt_bayer8(struct i2c_client *client)
320
{
321 322
	return mt9m111_setup_pixfmt(client, MT9M111_OUTFMT_PROCESSED_BAYER |
				    MT9M111_OUTFMT_RGB);
323 324
}

325
static int mt9m111_setfmt_bayer10(struct i2c_client *client)
326
{
327
	return mt9m111_setup_pixfmt(client, MT9M111_OUTFMT_BYPASS_IFP);
328 329
}

330
static int mt9m111_setfmt_rgb565(struct i2c_client *client)
331
{
332
	struct mt9m111 *mt9m111 = to_mt9m111(client);
333 334 335 336 337 338 339 340
	int val = 0;

	if (mt9m111->swap_rgb_red_blue)
		val |= MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr;
	if (mt9m111->swap_rgb_even_odd)
		val |= MT9M111_OUTFMT_SWAP_RGB_EVEN;
	val |= MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565;

341
	return mt9m111_setup_pixfmt(client, val);
342 343
}

344
static int mt9m111_setfmt_rgb555(struct i2c_client *client)
345
{
346
	struct mt9m111 *mt9m111 = to_mt9m111(client);
347 348 349 350 351 352 353 354
	int val = 0;

	if (mt9m111->swap_rgb_red_blue)
		val |= MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr;
	if (mt9m111->swap_rgb_even_odd)
		val |= MT9M111_OUTFMT_SWAP_RGB_EVEN;
	val |= MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB555;

355
	return mt9m111_setup_pixfmt(client, val);
356 357
}

358
static int mt9m111_setfmt_yuv(struct i2c_client *client)
359
{
360
	struct mt9m111 *mt9m111 = to_mt9m111(client);
361 362 363 364 365 366 367
	int val = 0;

	if (mt9m111->swap_yuv_cb_cr)
		val |= MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr;
	if (mt9m111->swap_yuv_y_chromas)
		val |= MT9M111_OUTFMT_SWAP_YCbCr_C_Y;

368
	return mt9m111_setup_pixfmt(client, val);
369 370
}

371
static int mt9m111_enable(struct i2c_client *client)
372
{
373
	struct mt9m111 *mt9m111 = to_mt9m111(client);
374 375 376
	int ret;

	ret = reg_set(RESET, MT9M111_RESET_CHIP_ENABLE);
377
	if (!ret)
378 379 380 381
		mt9m111->powered = 1;
	return ret;
}

382
static int mt9m111_reset(struct i2c_client *client)
383 384 385 386
{
	int ret;

	ret = reg_set(RESET, MT9M111_RESET_RESET_MODE);
387
	if (!ret)
388
		ret = reg_set(RESET, MT9M111_RESET_RESET_SOC);
389
	if (!ret)
390 391
		ret = reg_clear(RESET, MT9M111_RESET_RESET_MODE
				| MT9M111_RESET_RESET_SOC);
392

393 394 395 396 397
	return ret;
}

static unsigned long mt9m111_query_bus_param(struct soc_camera_device *icd)
{
398
	struct soc_camera_link *icl = to_soc_camera_link(icd);
399
	unsigned long flags = SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING |
400
		SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_HIGH |
401
		SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8;
402 403

	return soc_camera_apply_sensor_flags(icl, flags);
404 405 406 407 408 409 410
}

static int mt9m111_set_bus_param(struct soc_camera_device *icd, unsigned long f)
{
	return 0;
}

411 412 413 414 415
static int mt9m111_make_rect(struct i2c_client *client,
			     struct v4l2_rect *rect)
{
	struct mt9m111 *mt9m111 = to_mt9m111(client);

416 417
	if (mt9m111->fmt->code == V4L2_MBUS_FMT_SBGGR8_1X8 ||
	    mt9m111->fmt->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE) {
418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433
		/* Bayer format - even size lengths */
		rect->width	= ALIGN(rect->width, 2);
		rect->height	= ALIGN(rect->height, 2);
		/* Let the user play with the starting pixel */
	}

	/* FIXME: the datasheet doesn't specify minimum sizes */
	soc_camera_limit_side(&rect->left, &rect->width,
		     MT9M111_MIN_DARK_COLS, 2, MT9M111_MAX_WIDTH);

	soc_camera_limit_side(&rect->top, &rect->height,
		     MT9M111_MIN_DARK_ROWS, 2, MT9M111_MAX_HEIGHT);

	return mt9m111_setup_rect(client, rect);
}

434
static int mt9m111_s_crop(struct v4l2_subdev *sd, struct v4l2_crop *a)
435
{
436
	struct v4l2_rect rect = a->c;
437
	struct i2c_client *client = sd->priv;
438
	struct mt9m111 *mt9m111 = to_mt9m111(client);
439 440
	int ret;

441
	dev_dbg(&client->dev, "%s left=%d, top=%d, width=%d, height=%d\n",
442
		__func__, rect.left, rect.top, rect.width, rect.height);
443

444
	ret = mt9m111_make_rect(client, &rect);
445
	if (!ret)
446
		mt9m111->rect = rect;
447 448 449
	return ret;
}

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
static int mt9m111_g_crop(struct v4l2_subdev *sd, struct v4l2_crop *a)
{
	struct i2c_client *client = sd->priv;
	struct mt9m111 *mt9m111 = to_mt9m111(client);

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

	return 0;
}

static int mt9m111_cropcap(struct v4l2_subdev *sd, struct v4l2_cropcap *a)
{
	a->bounds.left			= MT9M111_MIN_DARK_COLS;
	a->bounds.top			= MT9M111_MIN_DARK_ROWS;
	a->bounds.width			= MT9M111_MAX_WIDTH;
	a->bounds.height		= MT9M111_MAX_HEIGHT;
	a->defrect			= a->bounds;
	a->type				= V4L2_BUF_TYPE_VIDEO_CAPTURE;
	a->pixelaspect.numerator	= 1;
	a->pixelaspect.denominator	= 1;

	return 0;
}

475 476
static int mt9m111_g_fmt(struct v4l2_subdev *sd,
			 struct v4l2_mbus_framefmt *mf)
477 478 479 480
{
	struct i2c_client *client = sd->priv;
	struct mt9m111 *mt9m111 = to_mt9m111(client);

481 482 483 484
	mf->width	= mt9m111->rect.width;
	mf->height	= mt9m111->rect.height;
	mf->code	= mt9m111->fmt->code;
	mf->field	= V4L2_FIELD_NONE;
485 486 487 488

	return 0;
}

489 490
static int mt9m111_set_pixfmt(struct i2c_client *client,
			      enum v4l2_mbus_pixelcode code)
491
{
492
	struct mt9m111 *mt9m111 = to_mt9m111(client);
493
	int ret;
494

495 496
	switch (code) {
	case V4L2_MBUS_FMT_SBGGR8_1X8:
497
		ret = mt9m111_setfmt_bayer8(client);
498
		break;
499
	case V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE:
500
		ret = mt9m111_setfmt_bayer10(client);
501
		break;
502
	case V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE:
503
		ret = mt9m111_setfmt_rgb555(client);
504
		break;
505
	case V4L2_MBUS_FMT_RGB565_2X8_LE:
506
		ret = mt9m111_setfmt_rgb565(client);
507
		break;
508
	case V4L2_MBUS_FMT_UYVY8_2X8:
509 510
		mt9m111->swap_yuv_y_chromas = 0;
		mt9m111->swap_yuv_cb_cr = 0;
511
		ret = mt9m111_setfmt_yuv(client);
512
		break;
513
	case V4L2_MBUS_FMT_VYUY8_2X8:
514 515
		mt9m111->swap_yuv_y_chromas = 0;
		mt9m111->swap_yuv_cb_cr = 1;
516
		ret = mt9m111_setfmt_yuv(client);
517
		break;
518
	case V4L2_MBUS_FMT_YUYV8_2X8:
519 520
		mt9m111->swap_yuv_y_chromas = 1;
		mt9m111->swap_yuv_cb_cr = 0;
521
		ret = mt9m111_setfmt_yuv(client);
522
		break;
523
	case V4L2_MBUS_FMT_YVYU8_2X8:
524 525
		mt9m111->swap_yuv_y_chromas = 1;
		mt9m111->swap_yuv_cb_cr = 1;
526
		ret = mt9m111_setfmt_yuv(client);
527 528
		break;
	default:
529
		dev_err(&client->dev, "Pixel format not handled : %x\n",
530
			code);
531 532 533 534 535 536
		ret = -EINVAL;
	}

	return ret;
}

537 538
static int mt9m111_s_fmt(struct v4l2_subdev *sd,
			 struct v4l2_mbus_framefmt *mf)
539
{
540
	struct i2c_client *client = sd->priv;
541
	const struct mt9m111_datafmt *fmt;
542
	struct mt9m111 *mt9m111 = to_mt9m111(client);
543 544 545
	struct v4l2_rect rect = {
		.left	= mt9m111->rect.left,
		.top	= mt9m111->rect.top,
546 547
		.width	= mf->width,
		.height	= mf->height,
548
	};
549
	int ret;
550

551 552 553 554 555
	fmt = mt9m111_find_datafmt(mf->code, mt9m111_colour_fmts,
				   ARRAY_SIZE(mt9m111_colour_fmts));
	if (!fmt)
		return -EINVAL;

556
	dev_dbg(&client->dev,
557 558
		"%s code=%x left=%d, top=%d, width=%d, height=%d\n", __func__,
		mf->code, rect.left, rect.top, rect.width, rect.height);
559

560
	ret = mt9m111_make_rect(client, &rect);
561
	if (!ret)
562 563 564 565 566 567 568
		ret = mt9m111_set_pixfmt(client, mf->code);
	if (!ret) {
		mt9m111->rect	= rect;
		mt9m111->fmt	= fmt;
		mf->colorspace	= fmt->colorspace;
	}

569
	return ret;
570 571
}

572 573
static int mt9m111_try_fmt(struct v4l2_subdev *sd,
			   struct v4l2_mbus_framefmt *mf)
574
{
575 576 577 578 579 580 581 582 583 584 585 586
	struct i2c_client *client = sd->priv;
	struct mt9m111 *mt9m111 = to_mt9m111(client);
	const struct mt9m111_datafmt *fmt;
	bool bayer = mf->code == V4L2_MBUS_FMT_SBGGR8_1X8 ||
		mf->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE;

	fmt = mt9m111_find_datafmt(mf->code, mt9m111_colour_fmts,
				   ARRAY_SIZE(mt9m111_colour_fmts));
	if (!fmt) {
		fmt = mt9m111->fmt;
		mf->code = fmt->code;
	}
587 588 589 590 591

	/*
	 * With Bayer format enforce even side lengths, but let the user play
	 * with the starting pixel
	 */
592

593 594 595 596
	if (mf->height > MT9M111_MAX_HEIGHT)
		mf->height = MT9M111_MAX_HEIGHT;
	else if (mf->height < 2)
		mf->height = 2;
597
	else if (bayer)
598
		mf->height = ALIGN(mf->height, 2);
599

600 601 602 603
	if (mf->width > MT9M111_MAX_WIDTH)
		mf->width = MT9M111_MAX_WIDTH;
	else if (mf->width < 2)
		mf->width = 2;
604
	else if (bayer)
605 606 607
		mf->width = ALIGN(mf->width, 2);

	mf->colorspace = fmt->colorspace;
608 609 610 611

	return 0;
}

612 613
static int mt9m111_g_chip_ident(struct v4l2_subdev *sd,
				struct v4l2_dbg_chip_ident *id)
614
{
615 616
	struct i2c_client *client = sd->priv;
	struct mt9m111 *mt9m111 = to_mt9m111(client);
617

618
	if (id->match.type != V4L2_CHIP_MATCH_I2C_ADDR)
619 620
		return -EINVAL;

621
	if (id->match.addr != client->addr)
622 623 624 625 626 627 628 629 630
		return -ENODEV;

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

	return 0;
}

#ifdef CONFIG_VIDEO_ADV_DEBUG
631 632
static int mt9m111_g_register(struct v4l2_subdev *sd,
			      struct v4l2_dbg_register *reg)
633
{
634
	struct i2c_client *client = sd->priv;
635 636
	int val;

637
	if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0x2ff)
638
		return -EINVAL;
639
	if (reg->match.addr != client->addr)
640 641
		return -ENODEV;

642
	val = mt9m111_reg_read(client, reg->reg);
643
	reg->size = 2;
644 645 646 647 648 649 650 651
	reg->val = (u64)val;

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

	return 0;
}

652 653
static int mt9m111_s_register(struct v4l2_subdev *sd,
			      struct v4l2_dbg_register *reg)
654
{
655
	struct i2c_client *client = sd->priv;
656

657
	if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0x2ff)
658 659
		return -EINVAL;

660
	if (reg->match.addr != client->addr)
661 662
		return -ENODEV;

663
	if (mt9m111_reg_write(client, reg->reg, reg->val) < 0)
664 665 666 667 668 669 670 671 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 699 700 701 702 703 704 705 706 707
		return -EIO;

	return 0;
}
#endif

static const struct v4l2_queryctrl mt9m111_controls[] = {
	{
		.id		= V4L2_CID_VFLIP,
		.type		= V4L2_CTRL_TYPE_BOOLEAN,
		.name		= "Flip Verticaly",
		.minimum	= 0,
		.maximum	= 1,
		.step		= 1,
		.default_value	= 0,
	}, {
		.id		= V4L2_CID_HFLIP,
		.type		= V4L2_CTRL_TYPE_BOOLEAN,
		.name		= "Flip Horizontaly",
		.minimum	= 0,
		.maximum	= 1,
		.step		= 1,
		.default_value	= 0,
	}, {	/* gain = 1/32*val (=>gain=1 if val==32) */
		.id		= V4L2_CID_GAIN,
		.type		= V4L2_CTRL_TYPE_INTEGER,
		.name		= "Gain",
		.minimum	= 0,
		.maximum	= 63 * 2 * 2,
		.step		= 1,
		.default_value	= 32,
		.flags		= V4L2_CTRL_FLAG_SLIDER,
	}, {
		.id		= V4L2_CID_EXPOSURE_AUTO,
		.type		= V4L2_CTRL_TYPE_BOOLEAN,
		.name		= "Auto Exposure",
		.minimum	= 0,
		.maximum	= 1,
		.step		= 1,
		.default_value	= 1,
	}
};

static int mt9m111_resume(struct soc_camera_device *icd);
708
static int mt9m111_suspend(struct soc_camera_device *icd, pm_message_t state);
709 710

static struct soc_camera_ops mt9m111_ops = {
711
	.suspend		= mt9m111_suspend,
712 713 714 715 716 717 718
	.resume			= mt9m111_resume,
	.query_bus_param	= mt9m111_query_bus_param,
	.set_bus_param		= mt9m111_set_bus_param,
	.controls		= mt9m111_controls,
	.num_controls		= ARRAY_SIZE(mt9m111_controls),
};

719
static int mt9m111_set_flip(struct i2c_client *client, int flip, int mask)
720
{
721
	struct mt9m111 *mt9m111 = to_mt9m111(client);
722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738
	int ret;

	if (mt9m111->context == HIGHPOWER) {
		if (flip)
			ret = reg_set(READ_MODE_B, mask);
		else
			ret = reg_clear(READ_MODE_B, mask);
	} else {
		if (flip)
			ret = reg_set(READ_MODE_A, mask);
		else
			ret = reg_clear(READ_MODE_A, mask);
	}

	return ret;
}

739
static int mt9m111_get_global_gain(struct i2c_client *client)
740
{
741
	int data;
742 743 744

	data = reg_read(GLOBAL_GAIN);
	if (data >= 0)
745 746 747
		return (data & 0x2f) * (1 << ((data >> 10) & 1)) *
			(1 << ((data >> 9) & 1));
	return data;
748
}
749

750
static int mt9m111_set_global_gain(struct i2c_client *client, int gain)
751
{
752
	struct mt9m111 *mt9m111 = to_mt9m111(client);
753 754 755 756 757
	u16 val;

	if (gain > 63 * 2 * 2)
		return -EINVAL;

758
	mt9m111->gain = gain;
759 760 761
	if ((gain >= 64 * 2) && (gain < 63 * 2 * 2))
		val = (1 << 10) | (1 << 9) | (gain / 4);
	else if ((gain >= 64) && (gain < 64 * 2))
762
		val = (1 << 9) | (gain / 2);
763 764 765 766 767 768
	else
		val = gain;

	return reg_write(GLOBAL_GAIN, val);
}

769
static int mt9m111_set_autoexposure(struct i2c_client *client, int on)
770
{
771
	struct mt9m111 *mt9m111 = to_mt9m111(client);
772 773 774 775 776 777 778
	int ret;

	if (on)
		ret = reg_set(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOEXPO_EN);
	else
		ret = reg_clear(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOEXPO_EN);

779
	if (!ret)
780 781 782 783
		mt9m111->autoexposure = on;

	return ret;
}
784

785
static int mt9m111_set_autowhitebalance(struct i2c_client *client, int on)
786
{
787
	struct mt9m111 *mt9m111 = to_mt9m111(client);
788 789 790 791 792 793 794 795 796 797 798 799 800
	int ret;

	if (on)
		ret = reg_set(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOWHITEBAL_EN);
	else
		ret = reg_clear(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOWHITEBAL_EN);

	if (!ret)
		mt9m111->autowhitebalance = on;

	return ret;
}

801
static int mt9m111_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
802
{
803 804
	struct i2c_client *client = sd->priv;
	struct mt9m111 *mt9m111 = to_mt9m111(client);
805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828
	int data;

	switch (ctrl->id) {
	case V4L2_CID_VFLIP:
		if (mt9m111->context == HIGHPOWER)
			data = reg_read(READ_MODE_B);
		else
			data = reg_read(READ_MODE_A);

		if (data < 0)
			return -EIO;
		ctrl->value = !!(data & MT9M111_RMB_MIRROR_ROWS);
		break;
	case V4L2_CID_HFLIP:
		if (mt9m111->context == HIGHPOWER)
			data = reg_read(READ_MODE_B);
		else
			data = reg_read(READ_MODE_A);

		if (data < 0)
			return -EIO;
		ctrl->value = !!(data & MT9M111_RMB_MIRROR_COLS);
		break;
	case V4L2_CID_GAIN:
829
		data = mt9m111_get_global_gain(client);
830 831 832 833 834 835 836
		if (data < 0)
			return data;
		ctrl->value = data;
		break;
	case V4L2_CID_EXPOSURE_AUTO:
		ctrl->value = mt9m111->autoexposure;
		break;
837 838 839
	case V4L2_CID_AUTO_WHITE_BALANCE:
		ctrl->value = mt9m111->autowhitebalance;
		break;
840 841 842 843
	}
	return 0;
}

844
static int mt9m111_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
845
{
846 847
	struct i2c_client *client = sd->priv;
	struct mt9m111 *mt9m111 = to_mt9m111(client);
848
	const struct v4l2_queryctrl *qctrl;
849
	int ret;
850 851 852 853 854 855 856 857

	qctrl = soc_camera_find_qctrl(&mt9m111_ops, ctrl->id);
	if (!qctrl)
		return -EINVAL;

	switch (ctrl->id) {
	case V4L2_CID_VFLIP:
		mt9m111->vflip = ctrl->value;
858
		ret = mt9m111_set_flip(client, ctrl->value,
859 860 861 862
					MT9M111_RMB_MIRROR_ROWS);
		break;
	case V4L2_CID_HFLIP:
		mt9m111->hflip = ctrl->value;
863
		ret = mt9m111_set_flip(client, ctrl->value,
864 865 866
					MT9M111_RMB_MIRROR_COLS);
		break;
	case V4L2_CID_GAIN:
867
		ret = mt9m111_set_global_gain(client, ctrl->value);
868 869
		break;
	case V4L2_CID_EXPOSURE_AUTO:
870
		ret =  mt9m111_set_autoexposure(client, ctrl->value);
871
		break;
872
	case V4L2_CID_AUTO_WHITE_BALANCE:
873
		ret =  mt9m111_set_autowhitebalance(client, ctrl->value);
874
		break;
875 876 877 878
	default:
		ret = -EINVAL;
	}

879
	return ret;
880 881
}

882 883 884 885 886 887 888 889 890 891
static int mt9m111_suspend(struct soc_camera_device *icd, pm_message_t state)
{
	struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
	struct mt9m111 *mt9m111 = to_mt9m111(client);

	mt9m111->gain = mt9m111_get_global_gain(client);

	return 0;
}

892
static int mt9m111_restore_state(struct i2c_client *client)
893
{
894 895 896
	struct mt9m111 *mt9m111 = to_mt9m111(client);

	mt9m111_set_context(client, mt9m111->context);
897
	mt9m111_set_pixfmt(client, mt9m111->fmt->code);
898 899 900
	mt9m111_setup_rect(client, &mt9m111->rect);
	mt9m111_set_flip(client, mt9m111->hflip, MT9M111_RMB_MIRROR_COLS);
	mt9m111_set_flip(client, mt9m111->vflip, MT9M111_RMB_MIRROR_ROWS);
901
	mt9m111_set_global_gain(client, mt9m111->gain);
902 903
	mt9m111_set_autoexposure(client, mt9m111->autoexposure);
	mt9m111_set_autowhitebalance(client, mt9m111->autowhitebalance);
904 905 906 907 908
	return 0;
}

static int mt9m111_resume(struct soc_camera_device *icd)
{
909
	struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
910
	struct mt9m111 *mt9m111 = to_mt9m111(client);
911 912 913
	int ret = 0;

	if (mt9m111->powered) {
914
		ret = mt9m111_enable(client);
915
		if (!ret)
916
			ret = mt9m111_reset(client);
917
		if (!ret)
918
			ret = mt9m111_restore_state(client);
919 920 921 922
	}
	return ret;
}

923
static int mt9m111_init(struct i2c_client *client)
924
{
925
	struct mt9m111 *mt9m111 = to_mt9m111(client);
926 927 928
	int ret;

	mt9m111->context = HIGHPOWER;
929
	ret = mt9m111_enable(client);
930
	if (!ret)
931
		ret = mt9m111_reset(client);
932
	if (!ret)
933
		ret = mt9m111_set_context(client, mt9m111->context);
934
	if (!ret)
935
		ret = mt9m111_set_autoexposure(client, mt9m111->autoexposure);
936
	if (ret)
937
		dev_err(&client->dev, "mt9m11x init failed: %d\n", ret);
938
	return ret;
939 940 941 942 943 944
}

/*
 * 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
 */
945 946
static int mt9m111_video_probe(struct soc_camera_device *icd,
			       struct i2c_client *client)
947
{
948
	struct mt9m111 *mt9m111 = to_mt9m111(client);
949 950 951 952 953 954 955 956 957 958 959
	s32 data;
	int ret;

	/*
	 * We must have a parent by now. And it cannot be a wrong one.
	 * So this entire test is completely redundant.
	 */
	if (!icd->dev.parent ||
	    to_soc_camera_host(icd->dev.parent)->nr != icd->iface)
		return -ENODEV;

960 961 962 963 964 965 966
	mt9m111->autoexposure = 1;
	mt9m111->autowhitebalance = 1;

	mt9m111->swap_rgb_even_odd = 1;
	mt9m111->swap_rgb_red_blue = 1;

	ret = mt9m111_init(client);
967 968 969 970 971 972
	if (ret)
		goto ei2c;

	data = reg_read(CHIP_VERSION);

	switch (data) {
973
	case 0x143a: /* MT9M111 */
974
		mt9m111->model = V4L2_IDENT_MT9M111;
975 976 977
		break;
	case 0x148c: /* MT9M112 */
		mt9m111->model = V4L2_IDENT_MT9M112;
978 979 980
		break;
	default:
		ret = -ENODEV;
981
		dev_err(&client->dev,
982
			"No MT9M11x chip detected, register read %x\n", data);
983 984 985
		goto ei2c;
	}

986
	dev_info(&client->dev, "Detected a MT9M11x chip ID %x\n", data);
987 988 989 990 991

ei2c:
	return ret;
}

992 993 994 995 996 997 998 999 1000 1001
static struct v4l2_subdev_core_ops mt9m111_subdev_core_ops = {
	.g_ctrl		= mt9m111_g_ctrl,
	.s_ctrl		= mt9m111_s_ctrl,
	.g_chip_ident	= mt9m111_g_chip_ident,
#ifdef CONFIG_VIDEO_ADV_DEBUG
	.g_register	= mt9m111_g_register,
	.s_register	= mt9m111_s_register,
#endif
};

1002
static int mt9m111_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
1003 1004
			    enum v4l2_mbus_pixelcode *code)
{
1005
	if (index >= ARRAY_SIZE(mt9m111_colour_fmts))
1006 1007 1008 1009 1010 1011
		return -EINVAL;

	*code = mt9m111_colour_fmts[index].code;
	return 0;
}

1012
static struct v4l2_subdev_video_ops mt9m111_subdev_video_ops = {
1013 1014 1015
	.s_mbus_fmt	= mt9m111_s_fmt,
	.g_mbus_fmt	= mt9m111_g_fmt,
	.try_mbus_fmt	= mt9m111_try_fmt,
1016
	.s_crop		= mt9m111_s_crop,
1017 1018
	.g_crop		= mt9m111_g_crop,
	.cropcap	= mt9m111_cropcap,
1019
	.enum_mbus_fmt	= mt9m111_enum_fmt,
1020 1021 1022 1023 1024 1025 1026
};

static struct v4l2_subdev_ops mt9m111_subdev_ops = {
	.core	= &mt9m111_subdev_core_ops,
	.video	= &mt9m111_subdev_video_ops,
};

1027 1028 1029 1030
static int mt9m111_probe(struct i2c_client *client,
			 const struct i2c_device_id *did)
{
	struct mt9m111 *mt9m111;
1031
	struct soc_camera_device *icd = client->dev.platform_data;
1032
	struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
1033
	struct soc_camera_link *icl;
1034 1035
	int ret;

1036 1037 1038 1039 1040 1041
	if (!icd) {
		dev_err(&client->dev, "MT9M11x: missing soc-camera data!\n");
		return -EINVAL;
	}

	icl = to_soc_camera_link(icd);
1042
	if (!icl) {
1043
		dev_err(&client->dev, "MT9M11x driver needs platform data\n");
1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056
		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;
	}

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

1057
	v4l2_i2c_subdev_init(&mt9m111->subdev, client, &mt9m111_subdev_ops);
1058 1059

	/* Second stage probe - when a capture adapter is there */
1060
	icd->ops		= &mt9m111_ops;
1061

1062 1063 1064 1065
	mt9m111->rect.left	= MT9M111_MIN_DARK_COLS;
	mt9m111->rect.top	= MT9M111_MIN_DARK_ROWS;
	mt9m111->rect.width	= MT9M111_MAX_WIDTH;
	mt9m111->rect.height	= MT9M111_MAX_HEIGHT;
1066
	mt9m111->fmt		= &mt9m111_colour_fmts[0];
1067

1068 1069 1070 1071 1072
	ret = mt9m111_video_probe(icd, client);
	if (ret) {
		icd->ops = NULL;
		kfree(mt9m111);
	}
1073 1074 1075 1076 1077 1078

	return ret;
}

static int mt9m111_remove(struct i2c_client *client)
{
1079
	struct mt9m111 *mt9m111 = to_mt9m111(client);
1080 1081 1082 1083
	struct soc_camera_device *icd = client->dev.platform_data;

	icd->ops = NULL;
	client->driver = NULL;
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116
	kfree(mt9m111);

	return 0;
}

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

static struct i2c_driver mt9m111_i2c_driver = {
	.driver = {
		.name = "mt9m111",
	},
	.probe		= mt9m111_probe,
	.remove		= mt9m111_remove,
	.id_table	= mt9m111_id,
};

static int __init mt9m111_mod_init(void)
{
	return i2c_add_driver(&mt9m111_i2c_driver);
}

static void __exit mt9m111_mod_exit(void)
{
	i2c_del_driver(&mt9m111_i2c_driver);
}

module_init(mt9m111_mod_init);
module_exit(mt9m111_mod_exit);

1117
MODULE_DESCRIPTION("Micron MT9M111/MT9M112 Camera driver");
1118 1119
MODULE_AUTHOR("Robert Jarzmik");
MODULE_LICENSE("GPL");