cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mt9m111.c (38817B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Driver for MT9M111/MT9M112/MT9M131 CMOS Image Sensor from Micron/Aptina
      4 *
      5 * Copyright (C) 2008, Robert Jarzmik <robert.jarzmik@free.fr>
      6 */
      7#include <linux/clk.h>
      8#include <linux/videodev2.h>
      9#include <linux/slab.h>
     10#include <linux/i2c.h>
     11#include <linux/log2.h>
     12#include <linux/delay.h>
     13#include <linux/regulator/consumer.h>
     14#include <linux/v4l2-mediabus.h>
     15#include <linux/module.h>
     16#include <linux/property.h>
     17
     18#include <media/v4l2-async.h>
     19#include <media/v4l2-common.h>
     20#include <media/v4l2-ctrls.h>
     21#include <media/v4l2-device.h>
     22#include <media/v4l2-event.h>
     23#include <media/v4l2-fwnode.h>
     24
     25/*
     26 * MT9M111, MT9M112 and MT9M131:
     27 * i2c address is 0x48 or 0x5d (depending on SADDR pin)
     28 * The platform has to define struct i2c_board_info objects and link to them
     29 * from struct soc_camera_host_desc
     30 */
     31
     32/*
     33 * Sensor core register addresses (0x000..0x0ff)
     34 */
     35#define MT9M111_CHIP_VERSION		0x000
     36#define MT9M111_ROW_START		0x001
     37#define MT9M111_COLUMN_START		0x002
     38#define MT9M111_WINDOW_HEIGHT		0x003
     39#define MT9M111_WINDOW_WIDTH		0x004
     40#define MT9M111_HORIZONTAL_BLANKING_B	0x005
     41#define MT9M111_VERTICAL_BLANKING_B	0x006
     42#define MT9M111_HORIZONTAL_BLANKING_A	0x007
     43#define MT9M111_VERTICAL_BLANKING_A	0x008
     44#define MT9M111_SHUTTER_WIDTH		0x009
     45#define MT9M111_ROW_SPEED		0x00a
     46#define MT9M111_EXTRA_DELAY		0x00b
     47#define MT9M111_SHUTTER_DELAY		0x00c
     48#define MT9M111_RESET			0x00d
     49#define MT9M111_READ_MODE_B		0x020
     50#define MT9M111_READ_MODE_A		0x021
     51#define MT9M111_FLASH_CONTROL		0x023
     52#define MT9M111_GREEN1_GAIN		0x02b
     53#define MT9M111_BLUE_GAIN		0x02c
     54#define MT9M111_RED_GAIN		0x02d
     55#define MT9M111_GREEN2_GAIN		0x02e
     56#define MT9M111_GLOBAL_GAIN		0x02f
     57#define MT9M111_CONTEXT_CONTROL		0x0c8
     58#define MT9M111_PAGE_MAP		0x0f0
     59#define MT9M111_BYTE_WISE_ADDR		0x0f1
     60
     61#define MT9M111_RESET_SYNC_CHANGES	(1 << 15)
     62#define MT9M111_RESET_RESTART_BAD_FRAME	(1 << 9)
     63#define MT9M111_RESET_SHOW_BAD_FRAMES	(1 << 8)
     64#define MT9M111_RESET_RESET_SOC		(1 << 5)
     65#define MT9M111_RESET_OUTPUT_DISABLE	(1 << 4)
     66#define MT9M111_RESET_CHIP_ENABLE	(1 << 3)
     67#define MT9M111_RESET_ANALOG_STANDBY	(1 << 2)
     68#define MT9M111_RESET_RESTART_FRAME	(1 << 1)
     69#define MT9M111_RESET_RESET_MODE	(1 << 0)
     70
     71#define MT9M111_RM_FULL_POWER_RD	(0 << 10)
     72#define MT9M111_RM_LOW_POWER_RD		(1 << 10)
     73#define MT9M111_RM_COL_SKIP_4X		(1 << 5)
     74#define MT9M111_RM_ROW_SKIP_4X		(1 << 4)
     75#define MT9M111_RM_COL_SKIP_2X		(1 << 3)
     76#define MT9M111_RM_ROW_SKIP_2X		(1 << 2)
     77#define MT9M111_RMB_MIRROR_COLS		(1 << 1)
     78#define MT9M111_RMB_MIRROR_ROWS		(1 << 0)
     79#define MT9M111_CTXT_CTRL_RESTART	(1 << 15)
     80#define MT9M111_CTXT_CTRL_DEFECTCOR_B	(1 << 12)
     81#define MT9M111_CTXT_CTRL_RESIZE_B	(1 << 10)
     82#define MT9M111_CTXT_CTRL_CTRL2_B	(1 << 9)
     83#define MT9M111_CTXT_CTRL_GAMMA_B	(1 << 8)
     84#define MT9M111_CTXT_CTRL_XENON_EN	(1 << 7)
     85#define MT9M111_CTXT_CTRL_READ_MODE_B	(1 << 3)
     86#define MT9M111_CTXT_CTRL_LED_FLASH_EN	(1 << 2)
     87#define MT9M111_CTXT_CTRL_VBLANK_SEL_B	(1 << 1)
     88#define MT9M111_CTXT_CTRL_HBLANK_SEL_B	(1 << 0)
     89
     90/*
     91 * Colorpipe register addresses (0x100..0x1ff)
     92 */
     93#define MT9M111_OPER_MODE_CTRL		0x106
     94#define MT9M111_OUTPUT_FORMAT_CTRL	0x108
     95#define MT9M111_TPG_CTRL		0x148
     96#define MT9M111_REDUCER_XZOOM_B		0x1a0
     97#define MT9M111_REDUCER_XSIZE_B		0x1a1
     98#define MT9M111_REDUCER_YZOOM_B		0x1a3
     99#define MT9M111_REDUCER_YSIZE_B		0x1a4
    100#define MT9M111_REDUCER_XZOOM_A		0x1a6
    101#define MT9M111_REDUCER_XSIZE_A		0x1a7
    102#define MT9M111_REDUCER_YZOOM_A		0x1a9
    103#define MT9M111_REDUCER_YSIZE_A		0x1aa
    104#define MT9M111_EFFECTS_MODE		0x1e2
    105
    106#define MT9M111_OUTPUT_FORMAT_CTRL2_A	0x13a
    107#define MT9M111_OUTPUT_FORMAT_CTRL2_B	0x19b
    108
    109#define MT9M111_OPMODE_AUTOEXPO_EN	(1 << 14)
    110#define MT9M111_OPMODE_AUTOWHITEBAL_EN	(1 << 1)
    111#define MT9M111_OUTFMT_FLIP_BAYER_COL	(1 << 9)
    112#define MT9M111_OUTFMT_FLIP_BAYER_ROW	(1 << 8)
    113#define MT9M111_OUTFMT_PROCESSED_BAYER	(1 << 14)
    114#define MT9M111_OUTFMT_BYPASS_IFP	(1 << 10)
    115#define MT9M111_OUTFMT_INV_PIX_CLOCK	(1 << 9)
    116#define MT9M111_OUTFMT_RGB		(1 << 8)
    117#define MT9M111_OUTFMT_RGB565		(0 << 6)
    118#define MT9M111_OUTFMT_RGB555		(1 << 6)
    119#define MT9M111_OUTFMT_RGB444x		(2 << 6)
    120#define MT9M111_OUTFMT_RGBx444		(3 << 6)
    121#define MT9M111_OUTFMT_TST_RAMP_OFF	(0 << 4)
    122#define MT9M111_OUTFMT_TST_RAMP_COL	(1 << 4)
    123#define MT9M111_OUTFMT_TST_RAMP_ROW	(2 << 4)
    124#define MT9M111_OUTFMT_TST_RAMP_FRAME	(3 << 4)
    125#define MT9M111_OUTFMT_SHIFT_3_UP	(1 << 3)
    126#define MT9M111_OUTFMT_AVG_CHROMA	(1 << 2)
    127#define MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN	(1 << 1)
    128#define MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B	(1 << 0)
    129#define MT9M111_TPG_SEL_MASK		GENMASK(2, 0)
    130#define MT9M111_EFFECTS_MODE_MASK	GENMASK(2, 0)
    131#define MT9M111_RM_PWR_MASK		BIT(10)
    132#define MT9M111_RM_SKIP2_MASK		GENMASK(3, 2)
    133
    134/*
    135 * Camera control register addresses (0x200..0x2ff not implemented)
    136 */
    137
    138#define reg_read(reg) mt9m111_reg_read(client, MT9M111_##reg)
    139#define reg_write(reg, val) mt9m111_reg_write(client, MT9M111_##reg, (val))
    140#define reg_set(reg, val) mt9m111_reg_set(client, MT9M111_##reg, (val))
    141#define reg_clear(reg, val) mt9m111_reg_clear(client, MT9M111_##reg, (val))
    142#define reg_mask(reg, val, mask) mt9m111_reg_mask(client, MT9M111_##reg, \
    143		(val), (mask))
    144
    145#define MT9M111_MIN_DARK_ROWS	8
    146#define MT9M111_MIN_DARK_COLS	26
    147#define MT9M111_MAX_HEIGHT	1024
    148#define MT9M111_MAX_WIDTH	1280
    149
    150struct mt9m111_context {
    151	u16 read_mode;
    152	u16 blanking_h;
    153	u16 blanking_v;
    154	u16 reducer_xzoom;
    155	u16 reducer_yzoom;
    156	u16 reducer_xsize;
    157	u16 reducer_ysize;
    158	u16 output_fmt_ctrl2;
    159	u16 control;
    160};
    161
    162static struct mt9m111_context context_a = {
    163	.read_mode		= MT9M111_READ_MODE_A,
    164	.blanking_h		= MT9M111_HORIZONTAL_BLANKING_A,
    165	.blanking_v		= MT9M111_VERTICAL_BLANKING_A,
    166	.reducer_xzoom		= MT9M111_REDUCER_XZOOM_A,
    167	.reducer_yzoom		= MT9M111_REDUCER_YZOOM_A,
    168	.reducer_xsize		= MT9M111_REDUCER_XSIZE_A,
    169	.reducer_ysize		= MT9M111_REDUCER_YSIZE_A,
    170	.output_fmt_ctrl2	= MT9M111_OUTPUT_FORMAT_CTRL2_A,
    171	.control		= MT9M111_CTXT_CTRL_RESTART,
    172};
    173
    174static struct mt9m111_context context_b = {
    175	.read_mode		= MT9M111_READ_MODE_B,
    176	.blanking_h		= MT9M111_HORIZONTAL_BLANKING_B,
    177	.blanking_v		= MT9M111_VERTICAL_BLANKING_B,
    178	.reducer_xzoom		= MT9M111_REDUCER_XZOOM_B,
    179	.reducer_yzoom		= MT9M111_REDUCER_YZOOM_B,
    180	.reducer_xsize		= MT9M111_REDUCER_XSIZE_B,
    181	.reducer_ysize		= MT9M111_REDUCER_YSIZE_B,
    182	.output_fmt_ctrl2	= MT9M111_OUTPUT_FORMAT_CTRL2_B,
    183	.control		= MT9M111_CTXT_CTRL_RESTART |
    184		MT9M111_CTXT_CTRL_DEFECTCOR_B | MT9M111_CTXT_CTRL_RESIZE_B |
    185		MT9M111_CTXT_CTRL_CTRL2_B | MT9M111_CTXT_CTRL_GAMMA_B |
    186		MT9M111_CTXT_CTRL_READ_MODE_B | MT9M111_CTXT_CTRL_VBLANK_SEL_B |
    187		MT9M111_CTXT_CTRL_HBLANK_SEL_B,
    188};
    189
    190/* MT9M111 has only one fixed colorspace per pixelcode */
    191struct mt9m111_datafmt {
    192	u32	code;
    193	enum v4l2_colorspace		colorspace;
    194};
    195
    196static const struct mt9m111_datafmt mt9m111_colour_fmts[] = {
    197	{MEDIA_BUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_SRGB},
    198	{MEDIA_BUS_FMT_YVYU8_2X8, V4L2_COLORSPACE_SRGB},
    199	{MEDIA_BUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_SRGB},
    200	{MEDIA_BUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_SRGB},
    201	{MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
    202	{MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE, V4L2_COLORSPACE_SRGB},
    203	{MEDIA_BUS_FMT_RGB565_2X8_LE, V4L2_COLORSPACE_SRGB},
    204	{MEDIA_BUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_SRGB},
    205	{MEDIA_BUS_FMT_BGR565_2X8_LE, V4L2_COLORSPACE_SRGB},
    206	{MEDIA_BUS_FMT_BGR565_2X8_BE, V4L2_COLORSPACE_SRGB},
    207	{MEDIA_BUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
    208	{MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
    209};
    210
    211enum mt9m111_mode_id {
    212	MT9M111_MODE_SXGA_8FPS,
    213	MT9M111_MODE_SXGA_15FPS,
    214	MT9M111_MODE_QSXGA_30FPS,
    215	MT9M111_NUM_MODES,
    216};
    217
    218struct mt9m111_mode_info {
    219	unsigned int sensor_w;
    220	unsigned int sensor_h;
    221	unsigned int max_image_w;
    222	unsigned int max_image_h;
    223	unsigned int max_fps;
    224	unsigned int reg_val;
    225	unsigned int reg_mask;
    226};
    227
    228struct mt9m111 {
    229	struct v4l2_subdev subdev;
    230	struct v4l2_ctrl_handler hdl;
    231	struct v4l2_ctrl *gain;
    232	struct mt9m111_context *ctx;
    233	struct v4l2_rect rect;	/* cropping rectangle */
    234	struct clk *clk;
    235	unsigned int width;	/* output */
    236	unsigned int height;	/* sizes */
    237	struct v4l2_fract frame_interval;
    238	const struct mt9m111_mode_info *current_mode;
    239	struct mutex power_lock; /* lock to protect power_count */
    240	int power_count;
    241	const struct mt9m111_datafmt *fmt;
    242	int lastpage;	/* PageMap cache value */
    243	struct regulator *regulator;
    244	bool is_streaming;
    245	/* user point of view - 0: falling 1: rising edge */
    246	unsigned int pclk_sample:1;
    247#ifdef CONFIG_MEDIA_CONTROLLER
    248	struct media_pad pad;
    249#endif
    250};
    251
    252static const struct mt9m111_mode_info mt9m111_mode_data[MT9M111_NUM_MODES] = {
    253	[MT9M111_MODE_SXGA_8FPS] = {
    254		.sensor_w = 1280,
    255		.sensor_h = 1024,
    256		.max_image_w = 1280,
    257		.max_image_h = 1024,
    258		.max_fps = 8,
    259		.reg_val = MT9M111_RM_LOW_POWER_RD,
    260		.reg_mask = MT9M111_RM_PWR_MASK | MT9M111_RM_SKIP2_MASK,
    261	},
    262	[MT9M111_MODE_SXGA_15FPS] = {
    263		.sensor_w = 1280,
    264		.sensor_h = 1024,
    265		.max_image_w = 1280,
    266		.max_image_h = 1024,
    267		.max_fps = 15,
    268		.reg_val = MT9M111_RM_FULL_POWER_RD,
    269		.reg_mask = MT9M111_RM_PWR_MASK | MT9M111_RM_SKIP2_MASK,
    270	},
    271	[MT9M111_MODE_QSXGA_30FPS] = {
    272		.sensor_w = 1280,
    273		.sensor_h = 1024,
    274		.max_image_w = 640,
    275		.max_image_h = 512,
    276		.max_fps = 30,
    277		.reg_val = MT9M111_RM_LOW_POWER_RD | MT9M111_RM_COL_SKIP_2X |
    278			   MT9M111_RM_ROW_SKIP_2X,
    279		.reg_mask = MT9M111_RM_PWR_MASK | MT9M111_RM_SKIP2_MASK,
    280	},
    281};
    282
    283/* Find a data format by a pixel code */
    284static const struct mt9m111_datafmt *mt9m111_find_datafmt(struct mt9m111 *mt9m111,
    285						u32 code)
    286{
    287	int i;
    288	for (i = 0; i < ARRAY_SIZE(mt9m111_colour_fmts); i++)
    289		if (mt9m111_colour_fmts[i].code == code)
    290			return mt9m111_colour_fmts + i;
    291
    292	return mt9m111->fmt;
    293}
    294
    295static struct mt9m111 *to_mt9m111(const struct i2c_client *client)
    296{
    297	return container_of(i2c_get_clientdata(client), struct mt9m111, subdev);
    298}
    299
    300static int reg_page_map_set(struct i2c_client *client, const u16 reg)
    301{
    302	int ret;
    303	u16 page;
    304	struct mt9m111 *mt9m111 = to_mt9m111(client);
    305
    306	page = (reg >> 8);
    307	if (page == mt9m111->lastpage)
    308		return 0;
    309	if (page > 2)
    310		return -EINVAL;
    311
    312	ret = i2c_smbus_write_word_swapped(client, MT9M111_PAGE_MAP, page);
    313	if (!ret)
    314		mt9m111->lastpage = page;
    315	return ret;
    316}
    317
    318static int mt9m111_reg_read(struct i2c_client *client, const u16 reg)
    319{
    320	int ret;
    321
    322	ret = reg_page_map_set(client, reg);
    323	if (!ret)
    324		ret = i2c_smbus_read_word_swapped(client, reg & 0xff);
    325
    326	dev_dbg(&client->dev, "read  reg.%03x -> %04x\n", reg, ret);
    327	return ret;
    328}
    329
    330static int mt9m111_reg_write(struct i2c_client *client, const u16 reg,
    331			     const u16 data)
    332{
    333	int ret;
    334
    335	ret = reg_page_map_set(client, reg);
    336	if (!ret)
    337		ret = i2c_smbus_write_word_swapped(client, reg & 0xff, data);
    338	dev_dbg(&client->dev, "write reg.%03x = %04x -> %d\n", reg, data, ret);
    339	return ret;
    340}
    341
    342static int mt9m111_reg_set(struct i2c_client *client, const u16 reg,
    343			   const u16 data)
    344{
    345	int ret;
    346
    347	ret = mt9m111_reg_read(client, reg);
    348	if (ret >= 0)
    349		ret = mt9m111_reg_write(client, reg, ret | data);
    350	return ret;
    351}
    352
    353static int mt9m111_reg_clear(struct i2c_client *client, const u16 reg,
    354			     const u16 data)
    355{
    356	int ret;
    357
    358	ret = mt9m111_reg_read(client, reg);
    359	if (ret >= 0)
    360		ret = mt9m111_reg_write(client, reg, ret & ~data);
    361	return ret;
    362}
    363
    364static int mt9m111_reg_mask(struct i2c_client *client, const u16 reg,
    365			    const u16 data, const u16 mask)
    366{
    367	int ret;
    368
    369	ret = mt9m111_reg_read(client, reg);
    370	if (ret >= 0)
    371		ret = mt9m111_reg_write(client, reg, (ret & ~mask) | data);
    372	return ret;
    373}
    374
    375static int mt9m111_set_context(struct mt9m111 *mt9m111,
    376			       struct mt9m111_context *ctx)
    377{
    378	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    379	return reg_write(CONTEXT_CONTROL, ctx->control);
    380}
    381
    382static int mt9m111_setup_rect_ctx(struct mt9m111 *mt9m111,
    383			struct mt9m111_context *ctx, struct v4l2_rect *rect,
    384			unsigned int width, unsigned int height)
    385{
    386	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    387	int ret = mt9m111_reg_write(client, ctx->reducer_xzoom, rect->width);
    388	if (!ret)
    389		ret = mt9m111_reg_write(client, ctx->reducer_yzoom, rect->height);
    390	if (!ret)
    391		ret = mt9m111_reg_write(client, ctx->reducer_xsize, width);
    392	if (!ret)
    393		ret = mt9m111_reg_write(client, ctx->reducer_ysize, height);
    394	return ret;
    395}
    396
    397static int mt9m111_setup_geometry(struct mt9m111 *mt9m111, struct v4l2_rect *rect,
    398			int width, int height, u32 code)
    399{
    400	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    401	int ret;
    402
    403	ret = reg_write(COLUMN_START, rect->left);
    404	if (!ret)
    405		ret = reg_write(ROW_START, rect->top);
    406
    407	if (!ret)
    408		ret = reg_write(WINDOW_WIDTH, rect->width);
    409	if (!ret)
    410		ret = reg_write(WINDOW_HEIGHT, rect->height);
    411
    412	if (code != MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE) {
    413		/* IFP in use, down-scaling possible */
    414		if (!ret)
    415			ret = mt9m111_setup_rect_ctx(mt9m111, &context_b,
    416						     rect, width, height);
    417		if (!ret)
    418			ret = mt9m111_setup_rect_ctx(mt9m111, &context_a,
    419						     rect, width, height);
    420	}
    421
    422	dev_dbg(&client->dev, "%s(%x): %ux%u@%u:%u -> %ux%u = %d\n",
    423		__func__, code, rect->width, rect->height, rect->left, rect->top,
    424		width, height, ret);
    425
    426	return ret;
    427}
    428
    429static int mt9m111_enable(struct mt9m111 *mt9m111)
    430{
    431	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    432	return reg_write(RESET, MT9M111_RESET_CHIP_ENABLE);
    433}
    434
    435static int mt9m111_reset(struct mt9m111 *mt9m111)
    436{
    437	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    438	int ret;
    439
    440	ret = reg_set(RESET, MT9M111_RESET_RESET_MODE);
    441	if (!ret)
    442		ret = reg_set(RESET, MT9M111_RESET_RESET_SOC);
    443	if (!ret)
    444		ret = reg_clear(RESET, MT9M111_RESET_RESET_MODE
    445				| MT9M111_RESET_RESET_SOC);
    446
    447	return ret;
    448}
    449
    450static int mt9m111_set_selection(struct v4l2_subdev *sd,
    451				 struct v4l2_subdev_state *sd_state,
    452				 struct v4l2_subdev_selection *sel)
    453{
    454	struct i2c_client *client = v4l2_get_subdevdata(sd);
    455	struct mt9m111 *mt9m111 = to_mt9m111(client);
    456	struct v4l2_rect rect = sel->r;
    457	int width, height;
    458	int ret, align = 0;
    459
    460	if (sel->which != V4L2_SUBDEV_FORMAT_ACTIVE ||
    461	    sel->target != V4L2_SEL_TGT_CROP)
    462		return -EINVAL;
    463
    464	if (mt9m111->fmt->code == MEDIA_BUS_FMT_SBGGR8_1X8 ||
    465	    mt9m111->fmt->code == MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE) {
    466		/* Bayer format - even size lengths */
    467		align = 1;
    468		/* Let the user play with the starting pixel */
    469	}
    470
    471	/* FIXME: the datasheet doesn't specify minimum sizes */
    472	v4l_bound_align_image(&rect.width, 2, MT9M111_MAX_WIDTH, align,
    473			      &rect.height, 2, MT9M111_MAX_HEIGHT, align, 0);
    474	rect.left = clamp(rect.left, MT9M111_MIN_DARK_COLS,
    475			  MT9M111_MIN_DARK_COLS + MT9M111_MAX_WIDTH -
    476			  (__s32)rect.width);
    477	rect.top = clamp(rect.top, MT9M111_MIN_DARK_ROWS,
    478			 MT9M111_MIN_DARK_ROWS + MT9M111_MAX_HEIGHT -
    479			 (__s32)rect.height);
    480
    481	width = min(mt9m111->width, rect.width);
    482	height = min(mt9m111->height, rect.height);
    483
    484	ret = mt9m111_setup_geometry(mt9m111, &rect, width, height, mt9m111->fmt->code);
    485	if (!ret) {
    486		mt9m111->rect = rect;
    487		mt9m111->width = width;
    488		mt9m111->height = height;
    489	}
    490
    491	return ret;
    492}
    493
    494static int mt9m111_get_selection(struct v4l2_subdev *sd,
    495				 struct v4l2_subdev_state *sd_state,
    496				 struct v4l2_subdev_selection *sel)
    497{
    498	struct i2c_client *client = v4l2_get_subdevdata(sd);
    499	struct mt9m111 *mt9m111 = to_mt9m111(client);
    500
    501	if (sel->which != V4L2_SUBDEV_FORMAT_ACTIVE)
    502		return -EINVAL;
    503
    504	switch (sel->target) {
    505	case V4L2_SEL_TGT_CROP_BOUNDS:
    506		sel->r.left = MT9M111_MIN_DARK_COLS;
    507		sel->r.top = MT9M111_MIN_DARK_ROWS;
    508		sel->r.width = MT9M111_MAX_WIDTH;
    509		sel->r.height = MT9M111_MAX_HEIGHT;
    510		return 0;
    511	case V4L2_SEL_TGT_CROP:
    512		sel->r = mt9m111->rect;
    513		return 0;
    514	default:
    515		return -EINVAL;
    516	}
    517}
    518
    519static int mt9m111_get_fmt(struct v4l2_subdev *sd,
    520		struct v4l2_subdev_state *sd_state,
    521		struct v4l2_subdev_format *format)
    522{
    523	struct v4l2_mbus_framefmt *mf = &format->format;
    524	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
    525
    526	if (format->pad)
    527		return -EINVAL;
    528
    529	if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
    530#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
    531		mf = v4l2_subdev_get_try_format(sd, sd_state, format->pad);
    532		format->format = *mf;
    533		return 0;
    534#else
    535		return -EINVAL;
    536#endif
    537	}
    538
    539	mf->width	= mt9m111->width;
    540	mf->height	= mt9m111->height;
    541	mf->code	= mt9m111->fmt->code;
    542	mf->colorspace	= mt9m111->fmt->colorspace;
    543	mf->field	= V4L2_FIELD_NONE;
    544	mf->ycbcr_enc	= V4L2_YCBCR_ENC_DEFAULT;
    545	mf->quantization	= V4L2_QUANTIZATION_DEFAULT;
    546	mf->xfer_func	= V4L2_XFER_FUNC_DEFAULT;
    547
    548	return 0;
    549}
    550
    551static int mt9m111_set_pixfmt(struct mt9m111 *mt9m111,
    552			      u32 code)
    553{
    554	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    555	u16 data_outfmt2, mask_outfmt2 = MT9M111_OUTFMT_PROCESSED_BAYER |
    556		MT9M111_OUTFMT_BYPASS_IFP | MT9M111_OUTFMT_RGB |
    557		MT9M111_OUTFMT_RGB565 | MT9M111_OUTFMT_RGB555 |
    558		MT9M111_OUTFMT_RGB444x | MT9M111_OUTFMT_RGBx444 |
    559		MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN |
    560		MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
    561	int ret;
    562
    563	switch (code) {
    564	case MEDIA_BUS_FMT_SBGGR8_1X8:
    565		data_outfmt2 = MT9M111_OUTFMT_PROCESSED_BAYER |
    566			MT9M111_OUTFMT_RGB;
    567		break;
    568	case MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE:
    569		data_outfmt2 = MT9M111_OUTFMT_BYPASS_IFP | MT9M111_OUTFMT_RGB;
    570		break;
    571	case MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE:
    572		data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB555 |
    573			MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN;
    574		break;
    575	case MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE:
    576		data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB555;
    577		break;
    578	case MEDIA_BUS_FMT_RGB565_2X8_LE:
    579		data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565 |
    580			MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN;
    581		break;
    582	case MEDIA_BUS_FMT_RGB565_2X8_BE:
    583		data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565;
    584		break;
    585	case MEDIA_BUS_FMT_BGR565_2X8_BE:
    586		data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565 |
    587			MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
    588		break;
    589	case MEDIA_BUS_FMT_BGR565_2X8_LE:
    590		data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565 |
    591			MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN |
    592			MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
    593		break;
    594	case MEDIA_BUS_FMT_UYVY8_2X8:
    595		data_outfmt2 = 0;
    596		break;
    597	case MEDIA_BUS_FMT_VYUY8_2X8:
    598		data_outfmt2 = MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
    599		break;
    600	case MEDIA_BUS_FMT_YUYV8_2X8:
    601		data_outfmt2 = MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN;
    602		break;
    603	case MEDIA_BUS_FMT_YVYU8_2X8:
    604		data_outfmt2 = MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN |
    605			MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
    606		break;
    607	default:
    608		dev_err(&client->dev, "Pixel format not handled: %x\n", code);
    609		return -EINVAL;
    610	}
    611
    612	/* receiver samples on falling edge, chip-hw default is rising */
    613	if (mt9m111->pclk_sample == 0)
    614		mask_outfmt2 |= MT9M111_OUTFMT_INV_PIX_CLOCK;
    615
    616	ret = mt9m111_reg_mask(client, context_a.output_fmt_ctrl2,
    617			       data_outfmt2, mask_outfmt2);
    618	if (!ret)
    619		ret = mt9m111_reg_mask(client, context_b.output_fmt_ctrl2,
    620				       data_outfmt2, mask_outfmt2);
    621
    622	return ret;
    623}
    624
    625static int mt9m111_set_fmt(struct v4l2_subdev *sd,
    626		struct v4l2_subdev_state *sd_state,
    627		struct v4l2_subdev_format *format)
    628{
    629	struct v4l2_mbus_framefmt *mf = &format->format;
    630	struct i2c_client *client = v4l2_get_subdevdata(sd);
    631	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
    632	const struct mt9m111_datafmt *fmt;
    633	struct v4l2_rect *rect = &mt9m111->rect;
    634	bool bayer;
    635	int ret;
    636
    637	if (mt9m111->is_streaming)
    638		return -EBUSY;
    639
    640	if (format->pad)
    641		return -EINVAL;
    642
    643	fmt = mt9m111_find_datafmt(mt9m111, mf->code);
    644
    645	bayer = fmt->code == MEDIA_BUS_FMT_SBGGR8_1X8 ||
    646		fmt->code == MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE;
    647
    648	/*
    649	 * With Bayer format enforce even side lengths, but let the user play
    650	 * with the starting pixel
    651	 */
    652	if (bayer) {
    653		rect->width = ALIGN(rect->width, 2);
    654		rect->height = ALIGN(rect->height, 2);
    655	}
    656
    657	if (fmt->code == MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE) {
    658		/* IFP bypass mode, no scaling */
    659		mf->width = rect->width;
    660		mf->height = rect->height;
    661	} else {
    662		/* No upscaling */
    663		if (mf->width > rect->width)
    664			mf->width = rect->width;
    665		if (mf->height > rect->height)
    666			mf->height = rect->height;
    667	}
    668
    669	dev_dbg(&client->dev, "%s(): %ux%u, code=%x\n", __func__,
    670		mf->width, mf->height, fmt->code);
    671
    672	mf->code = fmt->code;
    673	mf->colorspace = fmt->colorspace;
    674	mf->field	= V4L2_FIELD_NONE;
    675	mf->ycbcr_enc	= V4L2_YCBCR_ENC_DEFAULT;
    676	mf->quantization	= V4L2_QUANTIZATION_DEFAULT;
    677	mf->xfer_func	= V4L2_XFER_FUNC_DEFAULT;
    678
    679	if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
    680		sd_state->pads->try_fmt = *mf;
    681		return 0;
    682	}
    683
    684	ret = mt9m111_setup_geometry(mt9m111, rect, mf->width, mf->height, mf->code);
    685	if (!ret)
    686		ret = mt9m111_set_pixfmt(mt9m111, mf->code);
    687	if (!ret) {
    688		mt9m111->width	= mf->width;
    689		mt9m111->height	= mf->height;
    690		mt9m111->fmt	= fmt;
    691	}
    692
    693	return ret;
    694}
    695
    696static const struct mt9m111_mode_info *
    697mt9m111_find_mode(struct mt9m111 *mt9m111, unsigned int req_fps,
    698		  unsigned int width, unsigned int height)
    699{
    700	const struct mt9m111_mode_info *mode;
    701	struct v4l2_rect *sensor_rect = &mt9m111->rect;
    702	unsigned int gap, gap_best = (unsigned int) -1;
    703	int i, best_gap_idx = MT9M111_MODE_SXGA_15FPS;
    704	bool skip_30fps = false;
    705
    706	/*
    707	 * The fps selection is based on the row, column skipping mechanism.
    708	 * So ensure that the sensor window is set to default else the fps
    709	 * aren't calculated correctly within the sensor hw.
    710	 */
    711	if (sensor_rect->width != MT9M111_MAX_WIDTH ||
    712	    sensor_rect->height != MT9M111_MAX_HEIGHT) {
    713		dev_info(mt9m111->subdev.dev,
    714			 "Framerate selection is not supported for cropped "
    715			 "images\n");
    716		return NULL;
    717	}
    718
    719	/* 30fps only supported for images not exceeding 640x512 */
    720	if (width > MT9M111_MAX_WIDTH / 2 || height > MT9M111_MAX_HEIGHT / 2) {
    721		dev_dbg(mt9m111->subdev.dev,
    722			"Framerates > 15fps are supported only for images "
    723			"not exceeding 640x512\n");
    724		skip_30fps = true;
    725	}
    726
    727	/* find best matched fps */
    728	for (i = 0; i < MT9M111_NUM_MODES; i++) {
    729		unsigned int fps = mt9m111_mode_data[i].max_fps;
    730
    731		if (fps == 30 && skip_30fps)
    732			continue;
    733
    734		gap = abs(fps - req_fps);
    735		if (gap < gap_best) {
    736			best_gap_idx = i;
    737			gap_best = gap;
    738		}
    739	}
    740
    741	/*
    742	 * Use context a/b default timing values instead of calculate blanking
    743	 * timing values.
    744	 */
    745	mode = &mt9m111_mode_data[best_gap_idx];
    746	mt9m111->ctx = (best_gap_idx == MT9M111_MODE_QSXGA_30FPS) ? &context_a :
    747								    &context_b;
    748	return mode;
    749}
    750
    751#ifdef CONFIG_VIDEO_ADV_DEBUG
    752static int mt9m111_g_register(struct v4l2_subdev *sd,
    753			      struct v4l2_dbg_register *reg)
    754{
    755	struct i2c_client *client = v4l2_get_subdevdata(sd);
    756	int val;
    757
    758	if (reg->reg > 0x2ff)
    759		return -EINVAL;
    760
    761	val = mt9m111_reg_read(client, reg->reg);
    762	reg->size = 2;
    763	reg->val = (u64)val;
    764
    765	if (reg->val > 0xffff)
    766		return -EIO;
    767
    768	return 0;
    769}
    770
    771static int mt9m111_s_register(struct v4l2_subdev *sd,
    772			      const struct v4l2_dbg_register *reg)
    773{
    774	struct i2c_client *client = v4l2_get_subdevdata(sd);
    775
    776	if (reg->reg > 0x2ff)
    777		return -EINVAL;
    778
    779	if (mt9m111_reg_write(client, reg->reg, reg->val) < 0)
    780		return -EIO;
    781
    782	return 0;
    783}
    784#endif
    785
    786static int mt9m111_set_flip(struct mt9m111 *mt9m111, int flip, int mask)
    787{
    788	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    789	int ret;
    790
    791	if (flip)
    792		ret = mt9m111_reg_set(client, mt9m111->ctx->read_mode, mask);
    793	else
    794		ret = mt9m111_reg_clear(client, mt9m111->ctx->read_mode, mask);
    795
    796	return ret;
    797}
    798
    799static int mt9m111_get_global_gain(struct mt9m111 *mt9m111)
    800{
    801	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    802	int data;
    803
    804	data = reg_read(GLOBAL_GAIN);
    805	if (data >= 0)
    806		return (data & 0x2f) * (1 << ((data >> 10) & 1)) *
    807			(1 << ((data >> 9) & 1));
    808	return data;
    809}
    810
    811static int mt9m111_set_global_gain(struct mt9m111 *mt9m111, int gain)
    812{
    813	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    814	u16 val;
    815
    816	if (gain > 63 * 2 * 2)
    817		return -EINVAL;
    818
    819	if ((gain >= 64 * 2) && (gain < 63 * 2 * 2))
    820		val = (1 << 10) | (1 << 9) | (gain / 4);
    821	else if ((gain >= 64) && (gain < 64 * 2))
    822		val = (1 << 9) | (gain / 2);
    823	else
    824		val = gain;
    825
    826	return reg_write(GLOBAL_GAIN, val);
    827}
    828
    829static int mt9m111_set_autoexposure(struct mt9m111 *mt9m111, int val)
    830{
    831	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    832
    833	if (val == V4L2_EXPOSURE_AUTO)
    834		return reg_set(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOEXPO_EN);
    835	return reg_clear(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOEXPO_EN);
    836}
    837
    838static int mt9m111_set_autowhitebalance(struct mt9m111 *mt9m111, int on)
    839{
    840	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    841
    842	if (on)
    843		return reg_set(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOWHITEBAL_EN);
    844	return reg_clear(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOWHITEBAL_EN);
    845}
    846
    847static const char * const mt9m111_test_pattern_menu[] = {
    848	"Disabled",
    849	"Vertical monochrome gradient",
    850	"Flat color type 1",
    851	"Flat color type 2",
    852	"Flat color type 3",
    853	"Flat color type 4",
    854	"Flat color type 5",
    855	"Color bar",
    856};
    857
    858static int mt9m111_set_test_pattern(struct mt9m111 *mt9m111, int val)
    859{
    860	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    861
    862	return mt9m111_reg_mask(client, MT9M111_TPG_CTRL, val,
    863				MT9M111_TPG_SEL_MASK);
    864}
    865
    866static int mt9m111_set_colorfx(struct mt9m111 *mt9m111, int val)
    867{
    868	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    869	static const struct v4l2_control colorfx[] = {
    870		{ V4L2_COLORFX_NONE,		0 },
    871		{ V4L2_COLORFX_BW,		1 },
    872		{ V4L2_COLORFX_SEPIA,		2 },
    873		{ V4L2_COLORFX_NEGATIVE,	3 },
    874		{ V4L2_COLORFX_SOLARIZATION,	4 },
    875	};
    876	int i;
    877
    878	for (i = 0; i < ARRAY_SIZE(colorfx); i++) {
    879		if (colorfx[i].id == val) {
    880			return mt9m111_reg_mask(client, MT9M111_EFFECTS_MODE,
    881						colorfx[i].value,
    882						MT9M111_EFFECTS_MODE_MASK);
    883		}
    884	}
    885
    886	return -EINVAL;
    887}
    888
    889static int mt9m111_s_ctrl(struct v4l2_ctrl *ctrl)
    890{
    891	struct mt9m111 *mt9m111 = container_of(ctrl->handler,
    892					       struct mt9m111, hdl);
    893
    894	switch (ctrl->id) {
    895	case V4L2_CID_VFLIP:
    896		return mt9m111_set_flip(mt9m111, ctrl->val,
    897					MT9M111_RMB_MIRROR_ROWS);
    898	case V4L2_CID_HFLIP:
    899		return mt9m111_set_flip(mt9m111, ctrl->val,
    900					MT9M111_RMB_MIRROR_COLS);
    901	case V4L2_CID_GAIN:
    902		return mt9m111_set_global_gain(mt9m111, ctrl->val);
    903	case V4L2_CID_EXPOSURE_AUTO:
    904		return mt9m111_set_autoexposure(mt9m111, ctrl->val);
    905	case V4L2_CID_AUTO_WHITE_BALANCE:
    906		return mt9m111_set_autowhitebalance(mt9m111, ctrl->val);
    907	case V4L2_CID_TEST_PATTERN:
    908		return mt9m111_set_test_pattern(mt9m111, ctrl->val);
    909	case V4L2_CID_COLORFX:
    910		return mt9m111_set_colorfx(mt9m111, ctrl->val);
    911	}
    912
    913	return -EINVAL;
    914}
    915
    916static int mt9m111_suspend(struct mt9m111 *mt9m111)
    917{
    918	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    919	int ret;
    920
    921	v4l2_ctrl_s_ctrl(mt9m111->gain, mt9m111_get_global_gain(mt9m111));
    922
    923	ret = reg_set(RESET, MT9M111_RESET_RESET_MODE);
    924	if (!ret)
    925		ret = reg_set(RESET, MT9M111_RESET_RESET_SOC |
    926			      MT9M111_RESET_OUTPUT_DISABLE |
    927			      MT9M111_RESET_ANALOG_STANDBY);
    928	if (!ret)
    929		ret = reg_clear(RESET, MT9M111_RESET_CHIP_ENABLE);
    930
    931	return ret;
    932}
    933
    934static void mt9m111_restore_state(struct mt9m111 *mt9m111)
    935{
    936	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    937
    938	mt9m111_set_context(mt9m111, mt9m111->ctx);
    939	mt9m111_set_pixfmt(mt9m111, mt9m111->fmt->code);
    940	mt9m111_setup_geometry(mt9m111, &mt9m111->rect,
    941			mt9m111->width, mt9m111->height, mt9m111->fmt->code);
    942	v4l2_ctrl_handler_setup(&mt9m111->hdl);
    943	mt9m111_reg_mask(client, mt9m111->ctx->read_mode,
    944			 mt9m111->current_mode->reg_val,
    945			 mt9m111->current_mode->reg_mask);
    946}
    947
    948static int mt9m111_resume(struct mt9m111 *mt9m111)
    949{
    950	int ret = mt9m111_enable(mt9m111);
    951	if (!ret)
    952		ret = mt9m111_reset(mt9m111);
    953	if (!ret)
    954		mt9m111_restore_state(mt9m111);
    955
    956	return ret;
    957}
    958
    959static int mt9m111_init(struct mt9m111 *mt9m111)
    960{
    961	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    962	int ret;
    963
    964	ret = mt9m111_enable(mt9m111);
    965	if (!ret)
    966		ret = mt9m111_reset(mt9m111);
    967	if (!ret)
    968		ret = mt9m111_set_context(mt9m111, mt9m111->ctx);
    969	if (ret)
    970		dev_err(&client->dev, "mt9m111 init failed: %d\n", ret);
    971	return ret;
    972}
    973
    974static int mt9m111_power_on(struct mt9m111 *mt9m111)
    975{
    976	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
    977	int ret;
    978
    979	ret = clk_prepare_enable(mt9m111->clk);
    980	if (ret < 0)
    981		return ret;
    982
    983	ret = regulator_enable(mt9m111->regulator);
    984	if (ret < 0)
    985		goto out_clk_disable;
    986
    987	ret = mt9m111_resume(mt9m111);
    988	if (ret < 0)
    989		goto out_regulator_disable;
    990
    991	return 0;
    992
    993out_regulator_disable:
    994	regulator_disable(mt9m111->regulator);
    995
    996out_clk_disable:
    997	clk_disable_unprepare(mt9m111->clk);
    998
    999	dev_err(&client->dev, "Failed to resume the sensor: %d\n", ret);
   1000
   1001	return ret;
   1002}
   1003
   1004static void mt9m111_power_off(struct mt9m111 *mt9m111)
   1005{
   1006	mt9m111_suspend(mt9m111);
   1007	regulator_disable(mt9m111->regulator);
   1008	clk_disable_unprepare(mt9m111->clk);
   1009}
   1010
   1011static int mt9m111_s_power(struct v4l2_subdev *sd, int on)
   1012{
   1013	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
   1014	int ret = 0;
   1015
   1016	mutex_lock(&mt9m111->power_lock);
   1017
   1018	/*
   1019	 * If the power count is modified from 0 to != 0 or from != 0 to 0,
   1020	 * update the power state.
   1021	 */
   1022	if (mt9m111->power_count == !on) {
   1023		if (on)
   1024			ret = mt9m111_power_on(mt9m111);
   1025		else
   1026			mt9m111_power_off(mt9m111);
   1027	}
   1028
   1029	if (!ret) {
   1030		/* Update the power count. */
   1031		mt9m111->power_count += on ? 1 : -1;
   1032		WARN_ON(mt9m111->power_count < 0);
   1033	}
   1034
   1035	mutex_unlock(&mt9m111->power_lock);
   1036	return ret;
   1037}
   1038
   1039static const struct v4l2_ctrl_ops mt9m111_ctrl_ops = {
   1040	.s_ctrl = mt9m111_s_ctrl,
   1041};
   1042
   1043static const struct v4l2_subdev_core_ops mt9m111_subdev_core_ops = {
   1044	.s_power	= mt9m111_s_power,
   1045	.log_status = v4l2_ctrl_subdev_log_status,
   1046	.subscribe_event = v4l2_ctrl_subdev_subscribe_event,
   1047	.unsubscribe_event = v4l2_event_subdev_unsubscribe,
   1048#ifdef CONFIG_VIDEO_ADV_DEBUG
   1049	.g_register	= mt9m111_g_register,
   1050	.s_register	= mt9m111_s_register,
   1051#endif
   1052};
   1053
   1054static int mt9m111_g_frame_interval(struct v4l2_subdev *sd,
   1055				   struct v4l2_subdev_frame_interval *fi)
   1056{
   1057	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
   1058
   1059	fi->interval = mt9m111->frame_interval;
   1060
   1061	return 0;
   1062}
   1063
   1064static int mt9m111_s_frame_interval(struct v4l2_subdev *sd,
   1065				   struct v4l2_subdev_frame_interval *fi)
   1066{
   1067	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
   1068	const struct mt9m111_mode_info *mode;
   1069	struct v4l2_fract *fract = &fi->interval;
   1070	int fps;
   1071
   1072	if (mt9m111->is_streaming)
   1073		return -EBUSY;
   1074
   1075	if (fi->pad != 0)
   1076		return -EINVAL;
   1077
   1078	if (fract->numerator == 0) {
   1079		fract->denominator = 30;
   1080		fract->numerator = 1;
   1081	}
   1082
   1083	fps = DIV_ROUND_CLOSEST(fract->denominator, fract->numerator);
   1084
   1085	/* Find best fitting mode. Do not update the mode if no one was found. */
   1086	mode = mt9m111_find_mode(mt9m111, fps, mt9m111->width, mt9m111->height);
   1087	if (!mode)
   1088		return 0;
   1089
   1090	if (mode->max_fps != fps) {
   1091		fract->denominator = mode->max_fps;
   1092		fract->numerator = 1;
   1093	}
   1094
   1095	mt9m111->current_mode = mode;
   1096	mt9m111->frame_interval = fi->interval;
   1097
   1098	return 0;
   1099}
   1100
   1101static int mt9m111_enum_mbus_code(struct v4l2_subdev *sd,
   1102		struct v4l2_subdev_state *sd_state,
   1103		struct v4l2_subdev_mbus_code_enum *code)
   1104{
   1105	if (code->pad || code->index >= ARRAY_SIZE(mt9m111_colour_fmts))
   1106		return -EINVAL;
   1107
   1108	code->code = mt9m111_colour_fmts[code->index].code;
   1109	return 0;
   1110}
   1111
   1112static int mt9m111_s_stream(struct v4l2_subdev *sd, int enable)
   1113{
   1114	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
   1115
   1116	mt9m111->is_streaming = !!enable;
   1117	return 0;
   1118}
   1119
   1120static int mt9m111_init_cfg(struct v4l2_subdev *sd,
   1121			    struct v4l2_subdev_state *sd_state)
   1122{
   1123#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
   1124	struct v4l2_mbus_framefmt *format =
   1125		v4l2_subdev_get_try_format(sd, sd_state, 0);
   1126
   1127	format->width	= MT9M111_MAX_WIDTH;
   1128	format->height	= MT9M111_MAX_HEIGHT;
   1129	format->code	= mt9m111_colour_fmts[0].code;
   1130	format->colorspace	= mt9m111_colour_fmts[0].colorspace;
   1131	format->field	= V4L2_FIELD_NONE;
   1132	format->ycbcr_enc	= V4L2_YCBCR_ENC_DEFAULT;
   1133	format->quantization	= V4L2_QUANTIZATION_DEFAULT;
   1134	format->xfer_func	= V4L2_XFER_FUNC_DEFAULT;
   1135#endif
   1136	return 0;
   1137}
   1138
   1139static int mt9m111_get_mbus_config(struct v4l2_subdev *sd,
   1140				   unsigned int pad,
   1141				   struct v4l2_mbus_config *cfg)
   1142{
   1143	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
   1144
   1145	cfg->type = V4L2_MBUS_PARALLEL;
   1146
   1147	cfg->bus.parallel.flags = V4L2_MBUS_MASTER |
   1148				  V4L2_MBUS_HSYNC_ACTIVE_HIGH |
   1149				  V4L2_MBUS_VSYNC_ACTIVE_HIGH |
   1150				  V4L2_MBUS_DATA_ACTIVE_HIGH;
   1151
   1152	cfg->bus.parallel.flags |= mt9m111->pclk_sample ?
   1153				   V4L2_MBUS_PCLK_SAMPLE_RISING :
   1154				   V4L2_MBUS_PCLK_SAMPLE_FALLING;
   1155
   1156	return 0;
   1157}
   1158
   1159static const struct v4l2_subdev_video_ops mt9m111_subdev_video_ops = {
   1160	.s_stream	= mt9m111_s_stream,
   1161	.g_frame_interval = mt9m111_g_frame_interval,
   1162	.s_frame_interval = mt9m111_s_frame_interval,
   1163};
   1164
   1165static const struct v4l2_subdev_pad_ops mt9m111_subdev_pad_ops = {
   1166	.init_cfg	= mt9m111_init_cfg,
   1167	.enum_mbus_code = mt9m111_enum_mbus_code,
   1168	.get_selection	= mt9m111_get_selection,
   1169	.set_selection	= mt9m111_set_selection,
   1170	.get_fmt	= mt9m111_get_fmt,
   1171	.set_fmt	= mt9m111_set_fmt,
   1172	.get_mbus_config = mt9m111_get_mbus_config,
   1173};
   1174
   1175static const struct v4l2_subdev_ops mt9m111_subdev_ops = {
   1176	.core	= &mt9m111_subdev_core_ops,
   1177	.video	= &mt9m111_subdev_video_ops,
   1178	.pad	= &mt9m111_subdev_pad_ops,
   1179};
   1180
   1181/*
   1182 * Interface active, can use i2c. If it fails, it can indeed mean, that
   1183 * this wasn't our capture interface, so, we wait for the right one
   1184 */
   1185static int mt9m111_video_probe(struct i2c_client *client)
   1186{
   1187	struct mt9m111 *mt9m111 = to_mt9m111(client);
   1188	s32 data;
   1189	int ret;
   1190
   1191	ret = mt9m111_s_power(&mt9m111->subdev, 1);
   1192	if (ret < 0)
   1193		return ret;
   1194
   1195	data = reg_read(CHIP_VERSION);
   1196
   1197	switch (data) {
   1198	case 0x143a: /* MT9M111 or MT9M131 */
   1199		dev_info(&client->dev,
   1200			"Detected a MT9M111/MT9M131 chip ID %x\n", data);
   1201		break;
   1202	case 0x148c: /* MT9M112 */
   1203		dev_info(&client->dev, "Detected a MT9M112 chip ID %x\n", data);
   1204		break;
   1205	default:
   1206		dev_err(&client->dev,
   1207			"No MT9M111/MT9M112/MT9M131 chip detected register read %x\n",
   1208			data);
   1209		ret = -ENODEV;
   1210		goto done;
   1211	}
   1212
   1213	ret = mt9m111_init(mt9m111);
   1214	if (ret)
   1215		goto done;
   1216
   1217	ret = v4l2_ctrl_handler_setup(&mt9m111->hdl);
   1218
   1219done:
   1220	mt9m111_s_power(&mt9m111->subdev, 0);
   1221	return ret;
   1222}
   1223
   1224static int mt9m111_probe_fw(struct i2c_client *client, struct mt9m111 *mt9m111)
   1225{
   1226	struct v4l2_fwnode_endpoint bus_cfg = {
   1227		.bus_type = V4L2_MBUS_PARALLEL
   1228	};
   1229	struct fwnode_handle *np;
   1230	int ret;
   1231
   1232	np = fwnode_graph_get_next_endpoint(dev_fwnode(&client->dev), NULL);
   1233	if (!np)
   1234		return -EINVAL;
   1235
   1236	ret = v4l2_fwnode_endpoint_parse(np, &bus_cfg);
   1237	if (ret)
   1238		goto out_put_fw;
   1239
   1240	mt9m111->pclk_sample = !!(bus_cfg.bus.parallel.flags &
   1241				  V4L2_MBUS_PCLK_SAMPLE_RISING);
   1242
   1243out_put_fw:
   1244	fwnode_handle_put(np);
   1245	return ret;
   1246}
   1247
   1248static int mt9m111_probe(struct i2c_client *client)
   1249{
   1250	struct mt9m111 *mt9m111;
   1251	struct i2c_adapter *adapter = client->adapter;
   1252	int ret;
   1253
   1254	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) {
   1255		dev_warn(&adapter->dev,
   1256			 "I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD\n");
   1257		return -EIO;
   1258	}
   1259
   1260	mt9m111 = devm_kzalloc(&client->dev, sizeof(struct mt9m111), GFP_KERNEL);
   1261	if (!mt9m111)
   1262		return -ENOMEM;
   1263
   1264	if (dev_fwnode(&client->dev)) {
   1265		ret = mt9m111_probe_fw(client, mt9m111);
   1266		if (ret)
   1267			return ret;
   1268	}
   1269
   1270	mt9m111->clk = devm_clk_get(&client->dev, "mclk");
   1271	if (IS_ERR(mt9m111->clk))
   1272		return PTR_ERR(mt9m111->clk);
   1273
   1274	mt9m111->regulator = devm_regulator_get(&client->dev, "vdd");
   1275	if (IS_ERR(mt9m111->regulator)) {
   1276		dev_err(&client->dev, "regulator not found: %ld\n",
   1277			PTR_ERR(mt9m111->regulator));
   1278		return PTR_ERR(mt9m111->regulator);
   1279	}
   1280
   1281	/* Default HIGHPOWER context */
   1282	mt9m111->ctx = &context_b;
   1283
   1284	v4l2_i2c_subdev_init(&mt9m111->subdev, client, &mt9m111_subdev_ops);
   1285	mt9m111->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
   1286				 V4L2_SUBDEV_FL_HAS_EVENTS;
   1287
   1288	v4l2_ctrl_handler_init(&mt9m111->hdl, 7);
   1289	v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops,
   1290			V4L2_CID_VFLIP, 0, 1, 1, 0);
   1291	v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops,
   1292			V4L2_CID_HFLIP, 0, 1, 1, 0);
   1293	v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops,
   1294			V4L2_CID_AUTO_WHITE_BALANCE, 0, 1, 1, 1);
   1295	mt9m111->gain = v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops,
   1296			V4L2_CID_GAIN, 0, 63 * 2 * 2, 1, 32);
   1297	v4l2_ctrl_new_std_menu(&mt9m111->hdl,
   1298			&mt9m111_ctrl_ops, V4L2_CID_EXPOSURE_AUTO, 1, 0,
   1299			V4L2_EXPOSURE_AUTO);
   1300	v4l2_ctrl_new_std_menu_items(&mt9m111->hdl,
   1301			&mt9m111_ctrl_ops, V4L2_CID_TEST_PATTERN,
   1302			ARRAY_SIZE(mt9m111_test_pattern_menu) - 1, 0, 0,
   1303			mt9m111_test_pattern_menu);
   1304	v4l2_ctrl_new_std_menu(&mt9m111->hdl, &mt9m111_ctrl_ops,
   1305			V4L2_CID_COLORFX, V4L2_COLORFX_SOLARIZATION,
   1306			~(BIT(V4L2_COLORFX_NONE) |
   1307				BIT(V4L2_COLORFX_BW) |
   1308				BIT(V4L2_COLORFX_SEPIA) |
   1309				BIT(V4L2_COLORFX_NEGATIVE) |
   1310				BIT(V4L2_COLORFX_SOLARIZATION)),
   1311			V4L2_COLORFX_NONE);
   1312	mt9m111->subdev.ctrl_handler = &mt9m111->hdl;
   1313	if (mt9m111->hdl.error) {
   1314		ret = mt9m111->hdl.error;
   1315		return ret;
   1316	}
   1317
   1318#ifdef CONFIG_MEDIA_CONTROLLER
   1319	mt9m111->pad.flags = MEDIA_PAD_FL_SOURCE;
   1320	mt9m111->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
   1321	ret = media_entity_pads_init(&mt9m111->subdev.entity, 1, &mt9m111->pad);
   1322	if (ret < 0)
   1323		goto out_hdlfree;
   1324#endif
   1325
   1326	mt9m111->current_mode = &mt9m111_mode_data[MT9M111_MODE_SXGA_15FPS];
   1327	mt9m111->frame_interval.numerator = 1;
   1328	mt9m111->frame_interval.denominator = mt9m111->current_mode->max_fps;
   1329
   1330	/* Second stage probe - when a capture adapter is there */
   1331	mt9m111->rect.left	= MT9M111_MIN_DARK_COLS;
   1332	mt9m111->rect.top	= MT9M111_MIN_DARK_ROWS;
   1333	mt9m111->rect.width	= MT9M111_MAX_WIDTH;
   1334	mt9m111->rect.height	= MT9M111_MAX_HEIGHT;
   1335	mt9m111->width		= mt9m111->rect.width;
   1336	mt9m111->height		= mt9m111->rect.height;
   1337	mt9m111->fmt		= &mt9m111_colour_fmts[0];
   1338	mt9m111->lastpage	= -1;
   1339	mutex_init(&mt9m111->power_lock);
   1340
   1341	ret = mt9m111_video_probe(client);
   1342	if (ret < 0)
   1343		goto out_entityclean;
   1344
   1345	mt9m111->subdev.dev = &client->dev;
   1346	ret = v4l2_async_register_subdev(&mt9m111->subdev);
   1347	if (ret < 0)
   1348		goto out_entityclean;
   1349
   1350	return 0;
   1351
   1352out_entityclean:
   1353#ifdef CONFIG_MEDIA_CONTROLLER
   1354	media_entity_cleanup(&mt9m111->subdev.entity);
   1355out_hdlfree:
   1356#endif
   1357	v4l2_ctrl_handler_free(&mt9m111->hdl);
   1358
   1359	return ret;
   1360}
   1361
   1362static int mt9m111_remove(struct i2c_client *client)
   1363{
   1364	struct mt9m111 *mt9m111 = to_mt9m111(client);
   1365
   1366	v4l2_async_unregister_subdev(&mt9m111->subdev);
   1367	media_entity_cleanup(&mt9m111->subdev.entity);
   1368	v4l2_ctrl_handler_free(&mt9m111->hdl);
   1369
   1370	return 0;
   1371}
   1372static const struct of_device_id mt9m111_of_match[] = {
   1373	{ .compatible = "micron,mt9m111", },
   1374	{},
   1375};
   1376MODULE_DEVICE_TABLE(of, mt9m111_of_match);
   1377
   1378static const struct i2c_device_id mt9m111_id[] = {
   1379	{ "mt9m111", 0 },
   1380	{ }
   1381};
   1382MODULE_DEVICE_TABLE(i2c, mt9m111_id);
   1383
   1384static struct i2c_driver mt9m111_i2c_driver = {
   1385	.driver = {
   1386		.name = "mt9m111",
   1387		.of_match_table = of_match_ptr(mt9m111_of_match),
   1388	},
   1389	.probe_new	= mt9m111_probe,
   1390	.remove		= mt9m111_remove,
   1391	.id_table	= mt9m111_id,
   1392};
   1393
   1394module_i2c_driver(mt9m111_i2c_driver);
   1395
   1396MODULE_DESCRIPTION("Micron/Aptina MT9M111/MT9M112/MT9M131 Camera driver");
   1397MODULE_AUTHOR("Robert Jarzmik");
   1398MODULE_LICENSE("GPL");