mt9m111.c 27.3 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 126 127 128 129 130

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

#define COL_FMT(_name, _depth, _fourcc, _colorspace) \
	{ .name = _name, .depth = _depth, .fourcc = _fourcc, \
	.colorspace = _colorspace }
#define RGB_FMT(_name, _depth, _fourcc) \
	COL_FMT(_name, _depth, _fourcc, V4L2_COLORSPACE_SRGB)
131 132
#define JPG_FMT(_name, _depth, _fourcc) \
	COL_FMT(_name, _depth, _fourcc, V4L2_COLORSPACE_JPEG)
133 134

static const struct soc_camera_data_format mt9m111_colour_formats[] = {
135 136 137 138
	JPG_FMT("CbYCrY 16 bit", 16, V4L2_PIX_FMT_UYVY),
	JPG_FMT("CrYCbY 16 bit", 16, V4L2_PIX_FMT_VYUY),
	JPG_FMT("YCbYCr 16 bit", 16, V4L2_PIX_FMT_YUYV),
	JPG_FMT("YCrYCb 16 bit", 16, V4L2_PIX_FMT_YVYU),
139 140 141 142 143 144 145 146 147 148 149 150
	RGB_FMT("RGB 565", 16, V4L2_PIX_FMT_RGB565),
	RGB_FMT("RGB 555", 16, V4L2_PIX_FMT_RGB555),
	RGB_FMT("Bayer (sRGB) 10 bit", 10, V4L2_PIX_FMT_SBGGR16),
	RGB_FMT("Bayer (sRGB) 8 bit", 8, V4L2_PIX_FMT_SBGGR8),
};

enum mt9m111_context {
	HIGHPOWER = 0,
	LOWPOWER,
};

struct mt9m111 {
151
	struct v4l2_subdev subdev;
152
	int model;	/* V4L2_IDENT_MT9M11x* codes from v4l2-chip-ident.h */
153
	enum mt9m111_context context;
154
	struct v4l2_rect rect;
155
	u32 pixfmt;
156
	unsigned int gain;
157 158 159 160 161 162 163 164 165
	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;
166
	unsigned int autowhitebalance:1;
167 168
};

169 170 171 172 173
static struct mt9m111 *to_mt9m111(const struct i2c_client *client)
{
	return container_of(i2c_get_clientdata(client), struct mt9m111, subdev);
}

174 175 176 177 178 179 180 181 182 183 184 185 186
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));
187
	if (!ret)
188 189 190 191
		lastpage = page;
	return ret;
}

192
static int mt9m111_reg_read(struct i2c_client *client, const u16 reg)
193 194 195 196 197
{
	int ret;

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

200
	dev_dbg(&client->dev, "read  reg.%03x -> %04x\n", reg, ret);
201 202 203
	return ret;
}

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

	ret = reg_page_map_set(client, reg);
210
	if (!ret)
211
		ret = i2c_smbus_write_word_data(client, reg & 0xff,
212
						swab16(data));
213
	dev_dbg(&client->dev, "write reg.%03x = %04x -> %d\n", reg, data, ret);
214 215 216
	return ret;
}

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

222
	ret = mt9m111_reg_read(client, reg);
223
	if (ret >= 0)
224
		ret = mt9m111_reg_write(client, reg, ret | data);
225 226 227
	return ret;
}

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

233 234
	ret = mt9m111_reg_read(client, reg);
	return mt9m111_reg_write(client, reg, ret & ~data);
235 236
}

237
static int mt9m111_set_context(struct i2c_client *client,
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
			       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);
}

253
static int mt9m111_setup_rect(struct i2c_client *client,
254
			      struct v4l2_rect *rect)
255
{
256
	struct mt9m111 *mt9m111 = to_mt9m111(client);
257
	int ret, is_raw_format;
258 259
	int width = rect->width;
	int height = rect->height;
260

261 262
	if (mt9m111->pixfmt == V4L2_PIX_FMT_SBGGR8 ||
	    mt9m111->pixfmt == V4L2_PIX_FMT_SBGGR16)
263 264 265 266
		is_raw_format = 1;
	else
		is_raw_format = 0;

267
	ret = reg_write(COLUMN_START, rect->left);
268
	if (!ret)
269
		ret = reg_write(ROW_START, rect->top);
270 271

	if (is_raw_format) {
272
		if (!ret)
273
			ret = reg_write(WINDOW_WIDTH, width);
274
		if (!ret)
275 276
			ret = reg_write(WINDOW_HEIGHT, height);
	} else {
277
		if (!ret)
278
			ret = reg_write(REDUCER_XZOOM_B, MT9M111_MAX_WIDTH);
279
		if (!ret)
280
			ret = reg_write(REDUCER_YZOOM_B, MT9M111_MAX_HEIGHT);
281
		if (!ret)
282
			ret = reg_write(REDUCER_XSIZE_B, width);
283
		if (!ret)
284
			ret = reg_write(REDUCER_YSIZE_B, height);
285
		if (!ret)
286
			ret = reg_write(REDUCER_XZOOM_A, MT9M111_MAX_WIDTH);
287
		if (!ret)
288
			ret = reg_write(REDUCER_YZOOM_A, MT9M111_MAX_HEIGHT);
289
		if (!ret)
290
			ret = reg_write(REDUCER_XSIZE_A, width);
291
		if (!ret)
292 293 294 295 296 297
			ret = reg_write(REDUCER_YSIZE_A, height);
	}

	return ret;
}

298
static int mt9m111_setup_pixfmt(struct i2c_client *client, u16 outfmt)
299 300 301 302
{
	int ret;

	ret = reg_write(OUTPUT_FORMAT_CTRL2_A, outfmt);
303
	if (!ret)
304 305 306 307
		ret = reg_write(OUTPUT_FORMAT_CTRL2_B, outfmt);
	return ret;
}

308
static int mt9m111_setfmt_bayer8(struct i2c_client *client)
309
{
310
	return mt9m111_setup_pixfmt(client, MT9M111_OUTFMT_PROCESSED_BAYER);
311 312
}

313
static int mt9m111_setfmt_bayer10(struct i2c_client *client)
314
{
315
	return mt9m111_setup_pixfmt(client, MT9M111_OUTFMT_BYPASS_IFP);
316 317
}

318
static int mt9m111_setfmt_rgb565(struct i2c_client *client)
319
{
320
	struct mt9m111 *mt9m111 = to_mt9m111(client);
321 322 323 324 325 326 327 328
	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;

329
	return mt9m111_setup_pixfmt(client, val);
330 331
}

332
static int mt9m111_setfmt_rgb555(struct i2c_client *client)
333
{
334
	struct mt9m111 *mt9m111 = to_mt9m111(client);
335 336 337 338 339 340 341 342
	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;

343
	return mt9m111_setup_pixfmt(client, val);
344 345
}

346
static int mt9m111_setfmt_yuv(struct i2c_client *client)
347
{
348
	struct mt9m111 *mt9m111 = to_mt9m111(client);
349 350 351 352 353 354 355
	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;

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

359
static int mt9m111_enable(struct i2c_client *client)
360
{
361
	struct mt9m111 *mt9m111 = to_mt9m111(client);
362 363 364
	int ret;

	ret = reg_set(RESET, MT9M111_RESET_CHIP_ENABLE);
365
	if (!ret)
366 367 368 369
		mt9m111->powered = 1;
	return ret;
}

370
static int mt9m111_reset(struct i2c_client *client)
371 372 373 374
{
	int ret;

	ret = reg_set(RESET, MT9M111_RESET_RESET_MODE);
375
	if (!ret)
376
		ret = reg_set(RESET, MT9M111_RESET_RESET_SOC);
377
	if (!ret)
378 379
		ret = reg_clear(RESET, MT9M111_RESET_RESET_MODE
				| MT9M111_RESET_RESET_SOC);
380

381 382 383 384 385
	return ret;
}

static unsigned long mt9m111_query_bus_param(struct soc_camera_device *icd)
{
386
	struct soc_camera_link *icl = to_soc_camera_link(icd);
387
	unsigned long flags = SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING |
388
		SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_HIGH |
389
		SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8;
390 391

	return soc_camera_apply_sensor_flags(icl, flags);
392 393 394 395 396 397 398
}

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

399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421
static int mt9m111_make_rect(struct i2c_client *client,
			     struct v4l2_rect *rect)
{
	struct mt9m111 *mt9m111 = to_mt9m111(client);

	if (mt9m111->pixfmt == V4L2_PIX_FMT_SBGGR8 ||
	    mt9m111->pixfmt == V4L2_PIX_FMT_SBGGR16) {
		/* 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);
}

422
static int mt9m111_s_crop(struct v4l2_subdev *sd, struct v4l2_crop *a)
423
{
424
	struct v4l2_rect rect = a->c;
425
	struct i2c_client *client = sd->priv;
426
	struct mt9m111 *mt9m111 = to_mt9m111(client);
427 428
	int ret;

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

432
	ret = mt9m111_make_rect(client, &rect);
433
	if (!ret)
434
		mt9m111->rect = rect;
435 436 437
	return ret;
}

438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477
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;
}

static int mt9m111_g_fmt(struct v4l2_subdev *sd, struct v4l2_format *f)
{
	struct i2c_client *client = sd->priv;
	struct mt9m111 *mt9m111 = to_mt9m111(client);
	struct v4l2_pix_format *pix = &f->fmt.pix;

	pix->width		= mt9m111->rect.width;
	pix->height		= mt9m111->rect.height;
	pix->pixelformat	= mt9m111->pixfmt;
	pix->field		= V4L2_FIELD_NONE;
	pix->colorspace		= V4L2_COLORSPACE_SRGB;

	return 0;
}

478
static int mt9m111_set_pixfmt(struct i2c_client *client, u32 pixfmt)
479
{
480
	struct mt9m111 *mt9m111 = to_mt9m111(client);
481
	int ret;
482 483 484

	switch (pixfmt) {
	case V4L2_PIX_FMT_SBGGR8:
485
		ret = mt9m111_setfmt_bayer8(client);
486 487
		break;
	case V4L2_PIX_FMT_SBGGR16:
488
		ret = mt9m111_setfmt_bayer10(client);
489 490
		break;
	case V4L2_PIX_FMT_RGB555:
491
		ret = mt9m111_setfmt_rgb555(client);
492 493
		break;
	case V4L2_PIX_FMT_RGB565:
494
		ret = mt9m111_setfmt_rgb565(client);
495
		break;
496 497 498
	case V4L2_PIX_FMT_UYVY:
		mt9m111->swap_yuv_y_chromas = 0;
		mt9m111->swap_yuv_cb_cr = 0;
499
		ret = mt9m111_setfmt_yuv(client);
500 501 502 503
		break;
	case V4L2_PIX_FMT_VYUY:
		mt9m111->swap_yuv_y_chromas = 0;
		mt9m111->swap_yuv_cb_cr = 1;
504
		ret = mt9m111_setfmt_yuv(client);
505
		break;
506
	case V4L2_PIX_FMT_YUYV:
507 508
		mt9m111->swap_yuv_y_chromas = 1;
		mt9m111->swap_yuv_cb_cr = 0;
509
		ret = mt9m111_setfmt_yuv(client);
510 511 512 513
		break;
	case V4L2_PIX_FMT_YVYU:
		mt9m111->swap_yuv_y_chromas = 1;
		mt9m111->swap_yuv_cb_cr = 1;
514
		ret = mt9m111_setfmt_yuv(client);
515 516
		break;
	default:
517 518
		dev_err(&client->dev, "Pixel format not handled : %x\n",
			pixfmt);
519 520 521
		ret = -EINVAL;
	}

522
	if (!ret)
523 524 525 526 527
		mt9m111->pixfmt = pixfmt;

	return ret;
}

528
static int mt9m111_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *f)
529
{
530 531
	struct i2c_client *client = sd->priv;
	struct mt9m111 *mt9m111 = to_mt9m111(client);
532 533 534 535 536 537 538
	struct v4l2_pix_format *pix = &f->fmt.pix;
	struct v4l2_rect rect = {
		.left	= mt9m111->rect.left,
		.top	= mt9m111->rect.top,
		.width	= pix->width,
		.height	= pix->height,
	};
539
	int ret;
540

541 542 543
	dev_dbg(&client->dev,
		"%s fmt=%x left=%d, top=%d, width=%d, height=%d\n", __func__,
		pix->pixelformat, rect.left, rect.top, rect.width, rect.height);
544

545
	ret = mt9m111_make_rect(client, &rect);
546
	if (!ret)
547
		ret = mt9m111_set_pixfmt(client, pix->pixelformat);
548
	if (!ret)
549
		mt9m111->rect = rect;
550
	return ret;
551 552
}

553
static int mt9m111_try_fmt(struct v4l2_subdev *sd, struct v4l2_format *f)
554
{
555
	struct v4l2_pix_format *pix = &f->fmt.pix;
556 557 558 559 560 561 562
	bool bayer = pix->pixelformat == V4L2_PIX_FMT_SBGGR8 ||
		pix->pixelformat == V4L2_PIX_FMT_SBGGR16;

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

	if (pix->height > MT9M111_MAX_HEIGHT)
		pix->height = MT9M111_MAX_HEIGHT;
566 567 568 569 570
	else if (pix->height < 2)
		pix->height = 2;
	else if (bayer)
		pix->height = ALIGN(pix->height, 2);

571 572
	if (pix->width > MT9M111_MAX_WIDTH)
		pix->width = MT9M111_MAX_WIDTH;
573 574 575 576
	else if (pix->width < 2)
		pix->width = 2;
	else if (bayer)
		pix->width = ALIGN(pix->width, 2);
577 578 579 580

	return 0;
}

581 582
static int mt9m111_g_chip_ident(struct v4l2_subdev *sd,
				struct v4l2_dbg_chip_ident *id)
583
{
584 585
	struct i2c_client *client = sd->priv;
	struct mt9m111 *mt9m111 = to_mt9m111(client);
586

587
	if (id->match.type != V4L2_CHIP_MATCH_I2C_ADDR)
588 589
		return -EINVAL;

590
	if (id->match.addr != client->addr)
591 592 593 594 595 596 597 598 599
		return -ENODEV;

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

	return 0;
}

#ifdef CONFIG_VIDEO_ADV_DEBUG
600 601
static int mt9m111_g_register(struct v4l2_subdev *sd,
			      struct v4l2_dbg_register *reg)
602
{
603
	struct i2c_client *client = sd->priv;
604 605
	int val;

606
	if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0x2ff)
607
		return -EINVAL;
608
	if (reg->match.addr != client->addr)
609 610
		return -ENODEV;

611
	val = mt9m111_reg_read(client, reg->reg);
612
	reg->size = 2;
613 614 615 616 617 618 619 620
	reg->val = (u64)val;

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

	return 0;
}

621 622
static int mt9m111_s_register(struct v4l2_subdev *sd,
			      struct v4l2_dbg_register *reg)
623
{
624
	struct i2c_client *client = sd->priv;
625

626
	if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0x2ff)
627 628
		return -EINVAL;

629
	if (reg->match.addr != client->addr)
630 631
		return -ENODEV;

632
	if (mt9m111_reg_write(client, reg->reg, reg->val) < 0)
633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676
		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);
677
static int mt9m111_suspend(struct soc_camera_device *icd, pm_message_t state);
678 679

static struct soc_camera_ops mt9m111_ops = {
680
	.suspend		= mt9m111_suspend,
681 682 683 684 685 686 687
	.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),
};

688
static int mt9m111_set_flip(struct i2c_client *client, int flip, int mask)
689
{
690
	struct mt9m111 *mt9m111 = to_mt9m111(client);
691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707
	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;
}

708
static int mt9m111_get_global_gain(struct i2c_client *client)
709
{
710
	int data;
711 712 713

	data = reg_read(GLOBAL_GAIN);
	if (data >= 0)
714 715 716
		return (data & 0x2f) * (1 << ((data >> 10) & 1)) *
			(1 << ((data >> 9) & 1));
	return data;
717
}
718

719
static int mt9m111_set_global_gain(struct i2c_client *client, int gain)
720
{
721
	struct mt9m111 *mt9m111 = to_mt9m111(client);
722 723 724 725 726
	u16 val;

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

727
	mt9m111->gain = gain;
728 729 730
	if ((gain >= 64 * 2) && (gain < 63 * 2 * 2))
		val = (1 << 10) | (1 << 9) | (gain / 4);
	else if ((gain >= 64) && (gain < 64 * 2))
731
		val = (1 << 9) | (gain / 2);
732 733 734 735 736 737
	else
		val = gain;

	return reg_write(GLOBAL_GAIN, val);
}

738
static int mt9m111_set_autoexposure(struct i2c_client *client, int on)
739
{
740
	struct mt9m111 *mt9m111 = to_mt9m111(client);
741 742 743 744 745 746 747
	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);

748
	if (!ret)
749 750 751 752
		mt9m111->autoexposure = on;

	return ret;
}
753

754
static int mt9m111_set_autowhitebalance(struct i2c_client *client, int on)
755
{
756
	struct mt9m111 *mt9m111 = to_mt9m111(client);
757 758 759 760 761 762 763 764 765 766 767 768 769
	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;
}

770
static int mt9m111_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
771
{
772 773
	struct i2c_client *client = sd->priv;
	struct mt9m111 *mt9m111 = to_mt9m111(client);
774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797
	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:
798
		data = mt9m111_get_global_gain(client);
799 800 801 802 803 804 805
		if (data < 0)
			return data;
		ctrl->value = data;
		break;
	case V4L2_CID_EXPOSURE_AUTO:
		ctrl->value = mt9m111->autoexposure;
		break;
806 807 808
	case V4L2_CID_AUTO_WHITE_BALANCE:
		ctrl->value = mt9m111->autowhitebalance;
		break;
809 810 811 812
	}
	return 0;
}

813
static int mt9m111_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
814
{
815 816
	struct i2c_client *client = sd->priv;
	struct mt9m111 *mt9m111 = to_mt9m111(client);
817
	const struct v4l2_queryctrl *qctrl;
818
	int ret;
819 820 821 822 823 824 825 826

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

	switch (ctrl->id) {
	case V4L2_CID_VFLIP:
		mt9m111->vflip = ctrl->value;
827
		ret = mt9m111_set_flip(client, ctrl->value,
828 829 830 831
					MT9M111_RMB_MIRROR_ROWS);
		break;
	case V4L2_CID_HFLIP:
		mt9m111->hflip = ctrl->value;
832
		ret = mt9m111_set_flip(client, ctrl->value,
833 834 835
					MT9M111_RMB_MIRROR_COLS);
		break;
	case V4L2_CID_GAIN:
836
		ret = mt9m111_set_global_gain(client, ctrl->value);
837 838
		break;
	case V4L2_CID_EXPOSURE_AUTO:
839
		ret =  mt9m111_set_autoexposure(client, ctrl->value);
840
		break;
841
	case V4L2_CID_AUTO_WHITE_BALANCE:
842
		ret =  mt9m111_set_autowhitebalance(client, ctrl->value);
843
		break;
844 845 846 847
	default:
		ret = -EINVAL;
	}

848
	return ret;
849 850
}

851 852 853 854 855 856 857 858 859 860
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;
}

861
static int mt9m111_restore_state(struct i2c_client *client)
862
{
863 864 865 866 867 868 869
	struct mt9m111 *mt9m111 = to_mt9m111(client);

	mt9m111_set_context(client, mt9m111->context);
	mt9m111_set_pixfmt(client, mt9m111->pixfmt);
	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);
870
	mt9m111_set_global_gain(client, mt9m111->gain);
871 872
	mt9m111_set_autoexposure(client, mt9m111->autoexposure);
	mt9m111_set_autowhitebalance(client, mt9m111->autowhitebalance);
873 874 875 876 877
	return 0;
}

static int mt9m111_resume(struct soc_camera_device *icd)
{
878
	struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
879
	struct mt9m111 *mt9m111 = to_mt9m111(client);
880 881 882
	int ret = 0;

	if (mt9m111->powered) {
883
		ret = mt9m111_enable(client);
884
		if (!ret)
885
			ret = mt9m111_reset(client);
886
		if (!ret)
887
			ret = mt9m111_restore_state(client);
888 889 890 891
	}
	return ret;
}

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

	mt9m111->context = HIGHPOWER;
898
	ret = mt9m111_enable(client);
899
	if (!ret)
900
		ret = mt9m111_reset(client);
901
	if (!ret)
902
		ret = mt9m111_set_context(client, mt9m111->context);
903
	if (!ret)
904
		ret = mt9m111_set_autoexposure(client, mt9m111->autoexposure);
905
	if (ret)
906
		dev_err(&client->dev, "mt9m11x init failed: %d\n", ret);
907
	return ret;
908 909 910 911 912 913
}

/*
 * 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
 */
914 915
static int mt9m111_video_probe(struct soc_camera_device *icd,
			       struct i2c_client *client)
916
{
917
	struct mt9m111 *mt9m111 = to_mt9m111(client);
918 919 920 921 922 923 924 925 926 927 928
	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;

929 930 931 932 933 934 935
	mt9m111->autoexposure = 1;
	mt9m111->autowhitebalance = 1;

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

	ret = mt9m111_init(client);
936 937 938 939 940 941
	if (ret)
		goto ei2c;

	data = reg_read(CHIP_VERSION);

	switch (data) {
942
	case 0x143a: /* MT9M111 */
943
		mt9m111->model = V4L2_IDENT_MT9M111;
944 945 946
		break;
	case 0x148c: /* MT9M112 */
		mt9m111->model = V4L2_IDENT_MT9M112;
947 948 949
		break;
	default:
		ret = -ENODEV;
950
		dev_err(&client->dev,
951
			"No MT9M11x chip detected, register read %x\n", data);
952 953 954
		goto ei2c;
	}

955 956 957
	icd->formats = mt9m111_colour_formats;
	icd->num_formats = ARRAY_SIZE(mt9m111_colour_formats);

958
	dev_info(&client->dev, "Detected a MT9M11x chip ID %x\n", data);
959 960 961 962 963

ei2c:
	return ret;
}

964 965 966 967 968 969 970 971 972 973 974 975
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
};

static struct v4l2_subdev_video_ops mt9m111_subdev_video_ops = {
	.s_fmt		= mt9m111_s_fmt,
976
	.g_fmt		= mt9m111_g_fmt,
977
	.try_fmt	= mt9m111_try_fmt,
978
	.s_crop		= mt9m111_s_crop,
979 980
	.g_crop		= mt9m111_g_crop,
	.cropcap	= mt9m111_cropcap,
981 982 983 984 985 986 987
};

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

988 989 990 991
static int mt9m111_probe(struct i2c_client *client,
			 const struct i2c_device_id *did)
{
	struct mt9m111 *mt9m111;
992
	struct soc_camera_device *icd = client->dev.platform_data;
993
	struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
994
	struct soc_camera_link *icl;
995 996
	int ret;

997 998 999 1000 1001 1002
	if (!icd) {
		dev_err(&client->dev, "MT9M11x: missing soc-camera data!\n");
		return -EINVAL;
	}

	icl = to_soc_camera_link(icd);
1003
	if (!icl) {
1004
		dev_err(&client->dev, "MT9M11x driver needs platform data\n");
1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
		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;

1018
	v4l2_i2c_subdev_init(&mt9m111->subdev, client, &mt9m111_subdev_ops);
1019 1020

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

1023 1024 1025 1026 1027
	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;

1028 1029 1030 1031 1032 1033
	ret = mt9m111_video_probe(icd, client);
	if (ret) {
		icd->ops = NULL;
		i2c_set_clientdata(client, NULL);
		kfree(mt9m111);
	}
1034 1035 1036 1037 1038 1039

	return ret;
}

static int mt9m111_remove(struct i2c_client *client)
{
1040
	struct mt9m111 *mt9m111 = to_mt9m111(client);
1041 1042 1043 1044 1045
	struct soc_camera_device *icd = client->dev.platform_data;

	icd->ops = NULL;
	i2c_set_clientdata(client, NULL);
	client->driver = NULL;
1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
	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);

1079
MODULE_DESCRIPTION("Micron MT9M111/MT9M112 Camera driver");
1080 1081
MODULE_AUTHOR("Robert Jarzmik");
MODULE_LICENSE("GPL");