mt9m111.c 28.5 KB
Newer Older
1
/*
2
 * Driver for MT9M111/MT9M112/MT9M131 CMOS Image Sensor from Micron/Aptina
3 4 5 6 7 8 9 10 11 12 13 14 15
 *
 * 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>
16
#include <linux/v4l2-mediabus.h>
17
#include <linux/module.h>
18

19
#include <media/soc_camera.h>
20
#include <media/v4l2-common.h>
21
#include <media/v4l2-ctrls.h>
22 23 24
#include <media/v4l2-chip-ident.h>

/*
25 26
 * MT9M111, MT9M112 and MT9M131:
 * i2c address is 0x48 or 0x5d (depending on SADDR pin)
27 28 29
 * The platform has to define i2c_board_info and call i2c_register_board_info()
 */

30 31 32
/*
 * Sensor core register addresses (0x000..0x0ff)
 */
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
#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)

69 70 71 72 73 74
#define MT9M111_RM_FULL_POWER_RD	(0 << 10)
#define MT9M111_RM_LOW_POWER_RD		(1 << 10)
#define MT9M111_RM_COL_SKIP_4X		(1 << 5)
#define MT9M111_RM_ROW_SKIP_4X		(1 << 4)
#define MT9M111_RM_COL_SKIP_2X		(1 << 3)
#define MT9M111_RM_ROW_SKIP_2X		(1 << 2)
75 76 77 78 79 80 81 82 83 84 85 86
#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)
87

88
/*
89
 * Colorpipe register addresses (0x100..0x1ff)
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
 */
#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)
106
#define MT9M111_OPMODE_AUTOWHITEBAL_EN	(1 << 1)
107 108
#define MT9M111_OUTFMT_FLIP_BAYER_COL	(1 << 9)
#define MT9M111_OUTFMT_FLIP_BAYER_ROW	(1 << 8)
109 110 111 112
#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)
113 114 115 116 117 118 119 120
#define MT9M111_OUTFMT_RGB565		(0 << 6)
#define MT9M111_OUTFMT_RGB555		(1 << 6)
#define MT9M111_OUTFMT_RGB444x		(2 << 6)
#define MT9M111_OUTFMT_RGBx444		(3 << 6)
#define MT9M111_OUTFMT_TST_RAMP_OFF	(0 << 4)
#define MT9M111_OUTFMT_TST_RAMP_COL	(1 << 4)
#define MT9M111_OUTFMT_TST_RAMP_ROW	(2 << 4)
#define MT9M111_OUTFMT_TST_RAMP_FRAME	(3 << 4)
121 122
#define MT9M111_OUTFMT_SHIFT_3_UP	(1 << 3)
#define MT9M111_OUTFMT_AVG_CHROMA	(1 << 2)
123 124
#define MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN	(1 << 1)
#define MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B	(1 << 0)
125

126
/*
127
 * Camera control register addresses (0x200..0x2ff not implemented)
128 129
 */

130 131 132 133
#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))
134 135
#define reg_mask(reg, val, mask) mt9m111_reg_mask(client, MT9M111_##reg, \
		(val), (mask))
136 137

#define MT9M111_MIN_DARK_ROWS	8
138
#define MT9M111_MIN_DARK_COLS	26
139 140 141
#define MT9M111_MAX_HEIGHT	1024
#define MT9M111_MAX_WIDTH	1280

142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
struct mt9m111_context {
	u16 read_mode;
	u16 blanking_h;
	u16 blanking_v;
	u16 reducer_xzoom;
	u16 reducer_yzoom;
	u16 reducer_xsize;
	u16 reducer_ysize;
	u16 output_fmt_ctrl2;
	u16 control;
};

static struct mt9m111_context context_a = {
	.read_mode		= MT9M111_READ_MODE_A,
	.blanking_h		= MT9M111_HORIZONTAL_BLANKING_A,
	.blanking_v		= MT9M111_VERTICAL_BLANKING_A,
	.reducer_xzoom		= MT9M111_REDUCER_XZOOM_A,
	.reducer_yzoom		= MT9M111_REDUCER_YZOOM_A,
	.reducer_xsize		= MT9M111_REDUCER_XSIZE_A,
	.reducer_ysize		= MT9M111_REDUCER_YSIZE_A,
	.output_fmt_ctrl2	= MT9M111_OUTPUT_FORMAT_CTRL2_A,
	.control		= MT9M111_CTXT_CTRL_RESTART,
};

static struct mt9m111_context context_b = {
	.read_mode		= MT9M111_READ_MODE_B,
	.blanking_h		= MT9M111_HORIZONTAL_BLANKING_B,
	.blanking_v		= MT9M111_VERTICAL_BLANKING_B,
	.reducer_xzoom		= MT9M111_REDUCER_XZOOM_B,
	.reducer_yzoom		= MT9M111_REDUCER_YZOOM_B,
	.reducer_xsize		= MT9M111_REDUCER_XSIZE_B,
	.reducer_ysize		= MT9M111_REDUCER_YSIZE_B,
	.output_fmt_ctrl2	= MT9M111_OUTPUT_FORMAT_CTRL2_B,
	.control		= 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,
};

182 183 184 185 186 187 188
/* MT9M111 has only one fixed colorspace per pixelcode */
struct mt9m111_datafmt {
	enum v4l2_mbus_pixelcode	code;
	enum v4l2_colorspace		colorspace;
};

static const struct mt9m111_datafmt mt9m111_colour_fmts[] = {
189 190 191 192
	{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},
193
	{V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
194
	{V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE, V4L2_COLORSPACE_SRGB},
195
	{V4L2_MBUS_FMT_RGB565_2X8_LE, V4L2_COLORSPACE_SRGB},
196 197 198
	{V4L2_MBUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_SRGB},
	{V4L2_MBUS_FMT_BGR565_2X8_LE, V4L2_COLORSPACE_SRGB},
	{V4L2_MBUS_FMT_BGR565_2X8_BE, V4L2_COLORSPACE_SRGB},
199 200
	{V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
	{V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
201 202 203
};

struct mt9m111 {
204
	struct v4l2_subdev subdev;
205 206
	struct v4l2_ctrl_handler hdl;
	struct v4l2_ctrl *gain;
207 208
	int model;	/* V4L2_IDENT_MT9M111 or V4L2_IDENT_MT9M112 code
			 * from v4l2-chip-ident.h */
209
	struct mt9m111_context *ctx;
210 211 212
	struct v4l2_rect rect;	/* cropping rectangle */
	int width;		/* output */
	int height;		/* sizes */
213 214
	struct mutex power_lock; /* lock to protect power_count */
	int power_count;
215
	const struct mt9m111_datafmt *fmt;
216
	int lastpage;	/* PageMap cache value */
217 218
};

219 220 221 222 223 224 225 226 227 228 229 230
/* Find a data format by a pixel code */
static const struct mt9m111_datafmt *mt9m111_find_datafmt(struct mt9m111 *mt9m111,
						enum v4l2_mbus_pixelcode code)
{
	int i;
	for (i = 0; i < ARRAY_SIZE(mt9m111_colour_fmts); i++)
		if (mt9m111_colour_fmts[i].code == code)
			return mt9m111_colour_fmts + i;

	return mt9m111->fmt;
}

231 232 233 234 235
static struct mt9m111 *to_mt9m111(const struct i2c_client *client)
{
	return container_of(i2c_get_clientdata(client), struct mt9m111, subdev);
}

236 237 238 239
static int reg_page_map_set(struct i2c_client *client, const u16 reg)
{
	int ret;
	u16 page;
240
	struct mt9m111 *mt9m111 = to_mt9m111(client);
241 242

	page = (reg >> 8);
243
	if (page == mt9m111->lastpage)
244 245 246 247
		return 0;
	if (page > 2)
		return -EINVAL;

248
	ret = i2c_smbus_write_word_swapped(client, MT9M111_PAGE_MAP, page);
249
	if (!ret)
250
		mt9m111->lastpage = page;
251 252 253
	return ret;
}

254
static int mt9m111_reg_read(struct i2c_client *client, const u16 reg)
255 256 257 258 259
{
	int ret;

	ret = reg_page_map_set(client, reg);
	if (!ret)
260
		ret = i2c_smbus_read_word_swapped(client, reg & 0xff);
261

262
	dev_dbg(&client->dev, "read  reg.%03x -> %04x\n", reg, ret);
263 264 265
	return ret;
}

266
static int mt9m111_reg_write(struct i2c_client *client, const u16 reg,
267 268 269 270 271
			     const u16 data)
{
	int ret;

	ret = reg_page_map_set(client, reg);
272
	if (!ret)
273
		ret = i2c_smbus_write_word_swapped(client, reg & 0xff, data);
274
	dev_dbg(&client->dev, "write reg.%03x = %04x -> %d\n", reg, data, ret);
275 276 277
	return ret;
}

278
static int mt9m111_reg_set(struct i2c_client *client, const u16 reg,
279 280 281 282
			   const u16 data)
{
	int ret;

283
	ret = mt9m111_reg_read(client, reg);
284
	if (ret >= 0)
285
		ret = mt9m111_reg_write(client, reg, ret | data);
286 287 288
	return ret;
}

289
static int mt9m111_reg_clear(struct i2c_client *client, const u16 reg,
290 291 292 293
			     const u16 data)
{
	int ret;

294
	ret = mt9m111_reg_read(client, reg);
295 296 297
	if (ret >= 0)
		ret = mt9m111_reg_write(client, reg, ret & ~data);
	return ret;
298 299
}

300 301 302 303 304 305 306 307 308 309 310
static int mt9m111_reg_mask(struct i2c_client *client, const u16 reg,
			    const u16 data, const u16 mask)
{
	int ret;

	ret = mt9m111_reg_read(client, reg);
	if (ret >= 0)
		ret = mt9m111_reg_write(client, reg, (ret & ~mask) | data);
	return ret;
}

311
static int mt9m111_set_context(struct mt9m111 *mt9m111,
312
			       struct mt9m111_context *ctx)
313
{
314
	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
315 316 317 318
	return reg_write(CONTEXT_CONTROL, ctx->control);
}

static int mt9m111_setup_rect_ctx(struct mt9m111 *mt9m111,
319 320
			struct mt9m111_context *ctx, struct v4l2_rect *rect,
			unsigned int width, unsigned int height)
321 322
{
	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
323
	int ret = mt9m111_reg_write(client, ctx->reducer_xzoom, rect->width);
324
	if (!ret)
325
		ret = mt9m111_reg_write(client, ctx->reducer_yzoom, rect->height);
326
	if (!ret)
327
		ret = mt9m111_reg_write(client, ctx->reducer_xsize, width);
328
	if (!ret)
329
		ret = mt9m111_reg_write(client, ctx->reducer_ysize, height);
330
	return ret;
331 332
}

333 334
static int mt9m111_setup_geometry(struct mt9m111 *mt9m111, struct v4l2_rect *rect,
			int width, int height, enum v4l2_mbus_pixelcode code)
335
{
336
	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
337
	int ret;
338

339
	ret = reg_write(COLUMN_START, rect->left);
340
	if (!ret)
341
		ret = reg_write(ROW_START, rect->top);
342

343 344 345 346 347 348 349
	if (!ret)
		ret = reg_write(WINDOW_WIDTH, rect->width);
	if (!ret)
		ret = reg_write(WINDOW_HEIGHT, rect->height);

	if (code != V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE) {
		/* IFP in use, down-scaling possible */
350
		if (!ret)
351 352
			ret = mt9m111_setup_rect_ctx(mt9m111, &context_b,
						     rect, width, height);
353
		if (!ret)
354 355
			ret = mt9m111_setup_rect_ctx(mt9m111, &context_a,
						     rect, width, height);
356 357
	}

358 359 360 361
	dev_dbg(&client->dev, "%s(%x): %ux%u@%u:%u -> %ux%u = %d\n",
		__func__, code, rect->width, rect->height, rect->left, rect->top,
		width, height, ret);

362 363 364
	return ret;
}

365
static int mt9m111_enable(struct mt9m111 *mt9m111)
366
{
367
	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
368
	return reg_write(RESET, MT9M111_RESET_CHIP_ENABLE);
369 370
}

371
static int mt9m111_reset(struct mt9m111 *mt9m111)
372
{
373
	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
374 375 376
	int ret;

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

383 384 385
	return ret;
}

386
static int mt9m111_s_crop(struct v4l2_subdev *sd, struct v4l2_crop *a)
387
{
388 389 390 391 392 393 394 395
	struct v4l2_rect rect = a->c;
	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
	int width, height;
	int ret;

	if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

396 397
	if (mt9m111->fmt->code == V4L2_MBUS_FMT_SBGGR8_1X8 ||
	    mt9m111->fmt->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE) {
398
		/* Bayer format - even size lengths */
399 400
		rect.width	= ALIGN(rect.width, 2);
		rect.height	= ALIGN(rect.height, 2);
401 402 403 404
		/* Let the user play with the starting pixel */
	}

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

408
	soc_camera_limit_side(&rect.top, &rect.height,
409 410
		     MT9M111_MIN_DARK_ROWS, 2, MT9M111_MAX_HEIGHT);

411 412
	width = min(mt9m111->width, rect.width);
	height = min(mt9m111->height, rect.height);
413

414 415
	ret = mt9m111_setup_geometry(mt9m111, &rect, width, height, mt9m111->fmt->code);
	if (!ret) {
416
		mt9m111->rect = rect;
417 418 419 420
		mt9m111->width = width;
		mt9m111->height = height;
	}

421 422 423
	return ret;
}

424 425
static int mt9m111_g_crop(struct v4l2_subdev *sd, struct v4l2_crop *a)
{
426
	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
427 428 429 430 431 432 433 434 435

	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)
{
436 437 438
	if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

439 440 441 442 443 444 445 446 447 448 449
	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->pixelaspect.numerator	= 1;
	a->pixelaspect.denominator	= 1;

	return 0;
}

450 451
static int mt9m111_g_fmt(struct v4l2_subdev *sd,
			 struct v4l2_mbus_framefmt *mf)
452
{
453
	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
454

455 456
	mf->width	= mt9m111->width;
	mf->height	= mt9m111->height;
457
	mf->code	= mt9m111->fmt->code;
458
	mf->colorspace	= mt9m111->fmt->colorspace;
459
	mf->field	= V4L2_FIELD_NONE;
460 461 462 463

	return 0;
}

464
static int mt9m111_set_pixfmt(struct mt9m111 *mt9m111,
465
			      enum v4l2_mbus_pixelcode code)
466
{
467 468 469 470 471 472 473
	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
	u16 data_outfmt2, mask_outfmt2 = MT9M111_OUTFMT_PROCESSED_BAYER |
		MT9M111_OUTFMT_BYPASS_IFP | MT9M111_OUTFMT_RGB |
		MT9M111_OUTFMT_RGB565 | MT9M111_OUTFMT_RGB555 |
		MT9M111_OUTFMT_RGB444x | MT9M111_OUTFMT_RGBx444 |
		MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN |
		MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
474
	int ret;
475

476 477
	switch (code) {
	case V4L2_MBUS_FMT_SBGGR8_1X8:
478 479
		data_outfmt2 = MT9M111_OUTFMT_PROCESSED_BAYER |
			MT9M111_OUTFMT_RGB;
480
		break;
481
	case V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE:
482
		data_outfmt2 = MT9M111_OUTFMT_BYPASS_IFP | MT9M111_OUTFMT_RGB;
483
		break;
484
	case V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE:
485 486 487 488 489
		data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB555 |
			MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN;
		break;
	case V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE:
		data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB555;
490
		break;
491
	case V4L2_MBUS_FMT_RGB565_2X8_LE:
492 493 494 495 496 497 498 499 500 501 502 503 504 505
		data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565 |
			MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN;
		break;
	case V4L2_MBUS_FMT_RGB565_2X8_BE:
		data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565;
		break;
	case V4L2_MBUS_FMT_BGR565_2X8_BE:
		data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565 |
			MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
		break;
	case V4L2_MBUS_FMT_BGR565_2X8_LE:
		data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565 |
			MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN |
			MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
506
		break;
507
	case V4L2_MBUS_FMT_UYVY8_2X8:
508
		data_outfmt2 = 0;
509
		break;
510
	case V4L2_MBUS_FMT_VYUY8_2X8:
511
		data_outfmt2 = MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
512
		break;
513
	case V4L2_MBUS_FMT_YUYV8_2X8:
514
		data_outfmt2 = MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN;
515
		break;
516
	case V4L2_MBUS_FMT_YVYU8_2X8:
517 518
		data_outfmt2 = MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN |
			MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
519 520
		break;
	default:
521 522
		dev_err(&client->dev, "Pixel format not handled: %x\n", code);
		return -EINVAL;
523 524
	}

525 526
	ret = mt9m111_reg_mask(client, context_a.output_fmt_ctrl2,
			       data_outfmt2, mask_outfmt2);
527
	if (!ret)
528 529
		ret = mt9m111_reg_mask(client, context_b.output_fmt_ctrl2,
				       data_outfmt2, mask_outfmt2);
530

531 532 533
	return ret;
}

534 535
static int mt9m111_try_fmt(struct v4l2_subdev *sd,
			   struct v4l2_mbus_framefmt *mf)
536
{
537
	struct i2c_client *client = v4l2_get_subdevdata(sd);
538
	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
539
	const struct mt9m111_datafmt *fmt;
540 541 542 543 544 545 546
	struct v4l2_rect *rect = &mt9m111->rect;
	bool bayer;

	fmt = mt9m111_find_datafmt(mt9m111, mf->code);

	bayer = fmt->code == V4L2_MBUS_FMT_SBGGR8_1X8 ||
		fmt->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE;
547 548 549 550 551

	/*
	 * With Bayer format enforce even side lengths, but let the user play
	 * with the starting pixel
	 */
552 553 554 555
	if (bayer) {
		rect->width = ALIGN(rect->width, 2);
		rect->height = ALIGN(rect->height, 2);
	}
556

557 558 559 560 561 562 563 564 565 566 567
	if (fmt->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE) {
		/* IFP bypass mode, no scaling */
		mf->width = rect->width;
		mf->height = rect->height;
	} else {
		/* No upscaling */
		if (mf->width > rect->width)
			mf->width = rect->width;
		if (mf->height > rect->height)
			mf->height = rect->height;
	}
568

569 570
	dev_dbg(&client->dev, "%s(): %ux%u, code=%x\n", __func__,
		mf->width, mf->height, fmt->code);
571

572
	mf->code = fmt->code;
573
	mf->colorspace = fmt->colorspace;
574 575 576 577

	return 0;
}

578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601
static int mt9m111_s_fmt(struct v4l2_subdev *sd,
			 struct v4l2_mbus_framefmt *mf)
{
	const struct mt9m111_datafmt *fmt;
	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
	struct v4l2_rect *rect = &mt9m111->rect;
	int ret;

	mt9m111_try_fmt(sd, mf);
	fmt = mt9m111_find_datafmt(mt9m111, mf->code);
	/* try_fmt() guarantees fmt != NULL && fmt->code == mf->code */

	ret = mt9m111_setup_geometry(mt9m111, rect, mf->width, mf->height, mf->code);
	if (!ret)
		ret = mt9m111_set_pixfmt(mt9m111, mf->code);
	if (!ret) {
		mt9m111->width	= mf->width;
		mt9m111->height	= mf->height;
		mt9m111->fmt	= fmt;
	}

	return ret;
}

602 603
static int mt9m111_g_chip_ident(struct v4l2_subdev *sd,
				struct v4l2_dbg_chip_ident *id)
604
{
605
	struct i2c_client *client = v4l2_get_subdevdata(sd);
606
	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
607

608
	if (id->match.type != V4L2_CHIP_MATCH_I2C_ADDR)
609 610
		return -EINVAL;

611
	if (id->match.addr != client->addr)
612 613 614 615 616 617 618 619 620
		return -ENODEV;

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

	return 0;
}

#ifdef CONFIG_VIDEO_ADV_DEBUG
621 622
static int mt9m111_g_register(struct v4l2_subdev *sd,
			      struct v4l2_dbg_register *reg)
623
{
624
	struct i2c_client *client = v4l2_get_subdevdata(sd);
625 626
	int val;

627
	if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0x2ff)
628
		return -EINVAL;
629
	if (reg->match.addr != client->addr)
630 631
		return -ENODEV;

632
	val = mt9m111_reg_read(client, reg->reg);
633
	reg->size = 2;
634 635 636 637 638 639 640 641
	reg->val = (u64)val;

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

	return 0;
}

642 643
static int mt9m111_s_register(struct v4l2_subdev *sd,
			      struct v4l2_dbg_register *reg)
644
{
645
	struct i2c_client *client = v4l2_get_subdevdata(sd);
646

647
	if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0x2ff)
648 649
		return -EINVAL;

650
	if (reg->match.addr != client->addr)
651 652
		return -ENODEV;

653
	if (mt9m111_reg_write(client, reg->reg, reg->val) < 0)
654 655 656 657 658 659
		return -EIO;

	return 0;
}
#endif

660
static int mt9m111_set_flip(struct mt9m111 *mt9m111, int flip, int mask)
661
{
662
	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
663 664
	int ret;

665 666 667 668
	if (flip)
		ret = mt9m111_reg_set(client, mt9m111->ctx->read_mode, mask);
	else
		ret = mt9m111_reg_clear(client, mt9m111->ctx->read_mode, mask);
669 670 671 672

	return ret;
}

673
static int mt9m111_get_global_gain(struct mt9m111 *mt9m111)
674
{
675
	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
676
	int data;
677 678 679

	data = reg_read(GLOBAL_GAIN);
	if (data >= 0)
680 681 682
		return (data & 0x2f) * (1 << ((data >> 10) & 1)) *
			(1 << ((data >> 9) & 1));
	return data;
683
}
684

685
static int mt9m111_set_global_gain(struct mt9m111 *mt9m111, int gain)
686
{
687
	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
688 689 690 691 692 693 694 695
	u16 val;

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

	if ((gain >= 64 * 2) && (gain < 63 * 2 * 2))
		val = (1 << 10) | (1 << 9) | (gain / 4);
	else if ((gain >= 64) && (gain < 64 * 2))
696
		val = (1 << 9) | (gain / 2);
697 698 699 700 701 702
	else
		val = gain;

	return reg_write(GLOBAL_GAIN, val);
}

703
static int mt9m111_set_autoexposure(struct mt9m111 *mt9m111, int on)
704
{
705
	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
706 707

	if (on)
708 709
		return reg_set(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOEXPO_EN);
	return reg_clear(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOEXPO_EN);
710
}
711

712
static int mt9m111_set_autowhitebalance(struct mt9m111 *mt9m111, int on)
713
{
714
	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
715 716

	if (on)
717 718
		return reg_set(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOWHITEBAL_EN);
	return reg_clear(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOWHITEBAL_EN);
719 720
}

721
static int mt9m111_s_ctrl(struct v4l2_ctrl *ctrl)
722
{
723 724
	struct mt9m111 *mt9m111 = container_of(ctrl->handler,
					       struct mt9m111, hdl);
725 726 727

	switch (ctrl->id) {
	case V4L2_CID_VFLIP:
728
		return mt9m111_set_flip(mt9m111, ctrl->val,
729 730
					MT9M111_RMB_MIRROR_ROWS);
	case V4L2_CID_HFLIP:
731
		return mt9m111_set_flip(mt9m111, ctrl->val,
732 733
					MT9M111_RMB_MIRROR_COLS);
	case V4L2_CID_GAIN:
734
		return mt9m111_set_global_gain(mt9m111, ctrl->val);
735
	case V4L2_CID_EXPOSURE_AUTO:
736
		return mt9m111_set_autoexposure(mt9m111, ctrl->val);
737
	case V4L2_CID_AUTO_WHITE_BALANCE:
738
		return mt9m111_set_autowhitebalance(mt9m111, ctrl->val);
739 740
	}

741
	return -EINVAL;
742 743
}

744
static int mt9m111_suspend(struct mt9m111 *mt9m111)
745
{
746 747 748
	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
	int ret;

749
	v4l2_ctrl_s_ctrl(mt9m111->gain, mt9m111_get_global_gain(mt9m111));
750

751 752 753 754 755 756 757 758 759
	ret = reg_set(RESET, MT9M111_RESET_RESET_MODE);
	if (!ret)
		ret = reg_set(RESET, MT9M111_RESET_RESET_SOC |
			      MT9M111_RESET_OUTPUT_DISABLE |
			      MT9M111_RESET_ANALOG_STANDBY);
	if (!ret)
		ret = reg_clear(RESET, MT9M111_RESET_CHIP_ENABLE);

	return ret;
760 761
}

762
static void mt9m111_restore_state(struct mt9m111 *mt9m111)
763
{
764
	mt9m111_set_context(mt9m111, mt9m111->ctx);
765
	mt9m111_set_pixfmt(mt9m111, mt9m111->fmt->code);
766 767
	mt9m111_setup_geometry(mt9m111, &mt9m111->rect,
			mt9m111->width, mt9m111->height, mt9m111->fmt->code);
768
	v4l2_ctrl_handler_setup(&mt9m111->hdl);
769 770
}

771
static int mt9m111_resume(struct mt9m111 *mt9m111)
772
{
773 774 775 776 777
	int ret = mt9m111_enable(mt9m111);
	if (!ret)
		ret = mt9m111_reset(mt9m111);
	if (!ret)
		mt9m111_restore_state(mt9m111);
778 779 780 781

	return ret;
}

782
static int mt9m111_init(struct mt9m111 *mt9m111)
783
{
784
	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
785 786
	int ret;

787 788
	/* Default HIGHPOWER context */
	mt9m111->ctx = &context_b;
789
	ret = mt9m111_enable(mt9m111);
790
	if (!ret)
791
		ret = mt9m111_reset(mt9m111);
792
	if (!ret)
793
		ret = mt9m111_set_context(mt9m111, mt9m111->ctx);
794
	if (ret)
795
		dev_err(&client->dev, "mt9m111 init failed: %d\n", ret);
796
	return ret;
797 798 799 800 801 802
}

/*
 * 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
 */
803
static int mt9m111_video_probe(struct i2c_client *client)
804
{
805
	struct mt9m111 *mt9m111 = to_mt9m111(client);
806 807 808 809 810 811
	s32 data;
	int ret;

	data = reg_read(CHIP_VERSION);

	switch (data) {
812
	case 0x143a: /* MT9M111 or MT9M131 */
813
		mt9m111->model = V4L2_IDENT_MT9M111;
814 815
		dev_info(&client->dev,
			"Detected a MT9M111/MT9M131 chip ID %x\n", data);
816 817 818
		break;
	case 0x148c: /* MT9M112 */
		mt9m111->model = V4L2_IDENT_MT9M112;
819
		dev_info(&client->dev, "Detected a MT9M112 chip ID %x\n", data);
820 821
		break;
	default:
822
		dev_err(&client->dev,
823 824
			"No MT9M111/MT9M112/MT9M131 chip detected register read %x\n",
			data);
825
		return -ENODEV;
826 827
	}

828
	ret = mt9m111_init(mt9m111);
829 830 831
	if (ret)
		return ret;
	return v4l2_ctrl_handler_setup(&mt9m111->hdl);
832 833
}

834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861
static int mt9m111_power_on(struct mt9m111 *mt9m111)
{
	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
	struct soc_camera_link *icl = soc_camera_i2c_to_link(client);
	int ret;

	ret = soc_camera_power_on(&client->dev, icl);
	if (ret < 0)
		return ret;

	ret = mt9m111_resume(mt9m111);
	if (ret < 0) {
		dev_err(&client->dev, "Failed to resume the sensor: %d\n", ret);
		soc_camera_power_off(&client->dev, icl);
	}

	return ret;
}

static void mt9m111_power_off(struct mt9m111 *mt9m111)
{
	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
	struct soc_camera_link *icl = soc_camera_i2c_to_link(client);

	mt9m111_suspend(mt9m111);
	soc_camera_power_off(&client->dev, icl);
}

862 863 864 865 866 867 868 869 870 871 872 873
static int mt9m111_s_power(struct v4l2_subdev *sd, int on)
{
	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
	int ret = 0;

	mutex_lock(&mt9m111->power_lock);

	/*
	 * If the power count is modified from 0 to != 0 or from != 0 to 0,
	 * update the power state.
	 */
	if (mt9m111->power_count == !on) {
874 875 876 877
		if (on)
			ret = mt9m111_power_on(mt9m111);
		else
			mt9m111_power_off(mt9m111);
878 879
	}

880 881 882 883 884
	if (!ret) {
		/* Update the power count. */
		mt9m111->power_count += on ? 1 : -1;
		WARN_ON(mt9m111->power_count < 0);
	}
885 886 887 888 889

	mutex_unlock(&mt9m111->power_lock);
	return ret;
}

890 891 892 893
static const struct v4l2_ctrl_ops mt9m111_ctrl_ops = {
	.s_ctrl = mt9m111_s_ctrl,
};

894 895
static struct v4l2_subdev_core_ops mt9m111_subdev_core_ops = {
	.g_chip_ident	= mt9m111_g_chip_ident,
896
	.s_power	= mt9m111_s_power,
897 898 899 900 901 902
#ifdef CONFIG_VIDEO_ADV_DEBUG
	.g_register	= mt9m111_g_register,
	.s_register	= mt9m111_s_register,
#endif
};

903
static int mt9m111_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
904 905
			    enum v4l2_mbus_pixelcode *code)
{
906
	if (index >= ARRAY_SIZE(mt9m111_colour_fmts))
907 908 909 910 911 912
		return -EINVAL;

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

913 914 915 916
static int mt9m111_g_mbus_config(struct v4l2_subdev *sd,
				struct v4l2_mbus_config *cfg)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
917
	struct soc_camera_link *icl = soc_camera_i2c_to_link(client);
918 919 920 921 922 923 924 925 926 927

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

	return 0;
}

928
static struct v4l2_subdev_video_ops mt9m111_subdev_video_ops = {
929 930 931
	.s_mbus_fmt	= mt9m111_s_fmt,
	.g_mbus_fmt	= mt9m111_g_fmt,
	.try_mbus_fmt	= mt9m111_try_fmt,
932
	.s_crop		= mt9m111_s_crop,
933 934
	.g_crop		= mt9m111_g_crop,
	.cropcap	= mt9m111_cropcap,
935
	.enum_mbus_fmt	= mt9m111_enum_fmt,
936
	.g_mbus_config	= mt9m111_g_mbus_config,
937 938 939 940 941 942 943
};

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

944 945 946 947 948
static int mt9m111_probe(struct i2c_client *client,
			 const struct i2c_device_id *did)
{
	struct mt9m111 *mt9m111;
	struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
949
	struct soc_camera_link *icl = soc_camera_i2c_to_link(client);
950 951 952
	int ret;

	if (!icl) {
953
		dev_err(&client->dev, "mt9m111: driver needs platform data\n");
954 955 956 957 958 959 960 961 962 963 964 965 966
		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;

967
	v4l2_i2c_subdev_init(&mt9m111->subdev, client, &mt9m111_subdev_ops);
968 969 970 971 972 973 974 975 976 977 978 979 980 981 982
	v4l2_ctrl_handler_init(&mt9m111->hdl, 5);
	v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops,
			V4L2_CID_VFLIP, 0, 1, 1, 0);
	v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops,
			V4L2_CID_HFLIP, 0, 1, 1, 0);
	v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops,
			V4L2_CID_AUTO_WHITE_BALANCE, 0, 1, 1, 1);
	mt9m111->gain = v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops,
			V4L2_CID_GAIN, 0, 63 * 2 * 2, 1, 32);
	v4l2_ctrl_new_std_menu(&mt9m111->hdl,
			&mt9m111_ctrl_ops, V4L2_CID_EXPOSURE_AUTO, 1, 0,
			V4L2_EXPOSURE_AUTO);
	mt9m111->subdev.ctrl_handler = &mt9m111->hdl;
	if (mt9m111->hdl.error) {
		int err = mt9m111->hdl.error;
983

984 985 986
		kfree(mt9m111);
		return err;
	}
987

988
	/* Second stage probe - when a capture adapter is there */
989 990 991 992
	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;
993
	mt9m111->fmt		= &mt9m111_colour_fmts[0];
994
	mt9m111->lastpage	= -1;
995
	mutex_init(&mt9m111->power_lock);
996

997
	ret = mt9m111_video_probe(client);
998
	if (ret) {
999
		v4l2_ctrl_handler_free(&mt9m111->hdl);
1000 1001
		kfree(mt9m111);
	}
1002 1003 1004 1005 1006 1007

	return ret;
}

static int mt9m111_remove(struct i2c_client *client)
{
1008
	struct mt9m111 *mt9m111 = to_mt9m111(client);
1009

1010 1011
	v4l2_device_unregister_subdev(&mt9m111->subdev);
	v4l2_ctrl_handler_free(&mt9m111->hdl);
1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031
	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,
};

1032
module_i2c_driver(mt9m111_i2c_driver);
1033

1034
MODULE_DESCRIPTION("Micron/Aptina MT9M111/MT9M112/MT9M131 Camera driver");
1035 1036
MODULE_AUTHOR("Robert Jarzmik");
MODULE_LICENSE("GPL");