1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Driver for MT9P031 CMOS Image Sensor from Aptina
4 *
5 * Copyright (C) 2011, Laurent Pinchart <laurent.pinchart@ideasonboard.com>
6 * Copyright (C) 2011, Javier Martin <javier.martin@vista-silicon.com>
7 * Copyright (C) 2011, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
8 *
9 * Based on the MT9V032 driver and Bastian Hecht's code.
10 */
11
12#include <linux/clk.h>
13#include <linux/delay.h>
14#include <linux/device.h>
15#include <linux/gpio/consumer.h>
16#include <linux/i2c.h>
17#include <linux/log2.h>
18#include <linux/module.h>
19#include <linux/of.h>
20#include <linux/of_graph.h>
21#include <linux/pm.h>
22#include <linux/regulator/consumer.h>
23#include <linux/slab.h>
24#include <linux/videodev2.h>
25
26#include <media/i2c/mt9p031.h>
27#include <media/v4l2-async.h>
28#include <media/v4l2-ctrls.h>
29#include <media/v4l2-device.h>
30#include <media/v4l2-subdev.h>
31
32#include "aptina-pll.h"
33
34#define MT9P031_PIXEL_ARRAY_WIDTH			2752
35#define MT9P031_PIXEL_ARRAY_HEIGHT			2004
36
37#define MT9P031_CHIP_VERSION				0x00
38#define		MT9P031_CHIP_VERSION_VALUE		0x1801
39#define MT9P031_ROW_START				0x01
40#define		MT9P031_ROW_START_MIN			0
41#define		MT9P031_ROW_START_MAX			2004
42#define		MT9P031_ROW_START_DEF			54
43#define MT9P031_COLUMN_START				0x02
44#define		MT9P031_COLUMN_START_MIN		0
45#define		MT9P031_COLUMN_START_MAX		2750
46#define		MT9P031_COLUMN_START_DEF		16
47#define MT9P031_WINDOW_HEIGHT				0x03
48#define		MT9P031_WINDOW_HEIGHT_MIN		2
49#define		MT9P031_WINDOW_HEIGHT_MAX		2006
50#define		MT9P031_WINDOW_HEIGHT_DEF		1944
51#define MT9P031_WINDOW_WIDTH				0x04
52#define		MT9P031_WINDOW_WIDTH_MIN		2
53#define		MT9P031_WINDOW_WIDTH_MAX		2752
54#define		MT9P031_WINDOW_WIDTH_DEF		2592
55#define MT9P031_HORIZONTAL_BLANK			0x05
56#define		MT9P031_HORIZONTAL_BLANK_MIN		0
57#define		MT9P031_HORIZONTAL_BLANK_MAX		4095
58#define MT9P031_VERTICAL_BLANK				0x06
59#define		MT9P031_VERTICAL_BLANK_MIN		1
60#define		MT9P031_VERTICAL_BLANK_MAX		4096
61#define		MT9P031_VERTICAL_BLANK_DEF		26
62#define MT9P031_OUTPUT_CONTROL				0x07
63#define		MT9P031_OUTPUT_CONTROL_CEN		2
64#define		MT9P031_OUTPUT_CONTROL_SYN		1
65#define		MT9P031_OUTPUT_CONTROL_DEF		0x1f82
66#define MT9P031_SHUTTER_WIDTH_UPPER			0x08
67#define MT9P031_SHUTTER_WIDTH_LOWER			0x09
68#define		MT9P031_SHUTTER_WIDTH_MIN		1
69#define		MT9P031_SHUTTER_WIDTH_MAX		1048575
70#define		MT9P031_SHUTTER_WIDTH_DEF		1943
71#define	MT9P031_PLL_CONTROL				0x10
72#define		MT9P031_PLL_CONTROL_PWROFF		0x0050
73#define		MT9P031_PLL_CONTROL_PWRON		0x0051
74#define		MT9P031_PLL_CONTROL_USEPLL		0x0052
75#define	MT9P031_PLL_CONFIG_1				0x11
76#define	MT9P031_PLL_CONFIG_2				0x12
77#define MT9P031_PIXEL_CLOCK_CONTROL			0x0a
78#define		MT9P031_PIXEL_CLOCK_INVERT		(1 << 15)
79#define		MT9P031_PIXEL_CLOCK_SHIFT(n)		((n) << 8)
80#define		MT9P031_PIXEL_CLOCK_DIVIDE(n)		((n) << 0)
81#define MT9P031_RESTART					0x0b
82#define		MT9P031_FRAME_PAUSE_RESTART		(1 << 1)
83#define		MT9P031_FRAME_RESTART			(1 << 0)
84#define MT9P031_SHUTTER_DELAY				0x0c
85#define MT9P031_RST					0x0d
86#define		MT9P031_RST_ENABLE			1
87#define		MT9P031_RST_DISABLE			0
88#define MT9P031_READ_MODE_1				0x1e
89#define MT9P031_READ_MODE_2				0x20
90#define		MT9P031_READ_MODE_2_ROW_MIR		(1 << 15)
91#define		MT9P031_READ_MODE_2_COL_MIR		(1 << 14)
92#define		MT9P031_READ_MODE_2_ROW_BLC		(1 << 6)
93#define MT9P031_ROW_ADDRESS_MODE			0x22
94#define MT9P031_COLUMN_ADDRESS_MODE			0x23
95#define MT9P031_GLOBAL_GAIN				0x35
96#define		MT9P031_GLOBAL_GAIN_MIN			8
97#define		MT9P031_GLOBAL_GAIN_MAX			1024
98#define		MT9P031_GLOBAL_GAIN_DEF			8
99#define		MT9P031_GLOBAL_GAIN_MULT		(1 << 6)
100#define MT9P031_ROW_BLACK_TARGET			0x49
101#define MT9P031_ROW_BLACK_DEF_OFFSET			0x4b
102#define MT9P031_GREEN1_OFFSET				0x60
103#define MT9P031_GREEN2_OFFSET				0x61
104#define MT9P031_BLACK_LEVEL_CALIBRATION			0x62
105#define		MT9P031_BLC_MANUAL_BLC			(1 << 0)
106#define MT9P031_RED_OFFSET				0x63
107#define MT9P031_BLUE_OFFSET				0x64
108#define MT9P031_TEST_PATTERN				0xa0
109#define		MT9P031_TEST_PATTERN_SHIFT		3
110#define		MT9P031_TEST_PATTERN_ENABLE		(1 << 0)
111#define		MT9P031_TEST_PATTERN_DISABLE		(0 << 0)
112#define MT9P031_TEST_PATTERN_GREEN			0xa1
113#define MT9P031_TEST_PATTERN_RED			0xa2
114#define MT9P031_TEST_PATTERN_BLUE			0xa3
115
116enum mt9p031_model {
117	MT9P031_MODEL_COLOR,
118	MT9P031_MODEL_MONOCHROME,
119};
120
121struct mt9p031 {
122	struct v4l2_subdev subdev;
123	struct media_pad pad;
124	struct v4l2_rect crop;  /* Sensor window */
125	struct v4l2_mbus_framefmt format;
126	struct mt9p031_platform_data *pdata;
127	struct mutex power_lock; /* lock to protect power_count */
128	int power_count;
129
130	struct clk *clk;
131	struct regulator_bulk_data regulators[3];
132
133	enum mt9p031_model model;
134	struct aptina_pll pll;
135	unsigned int clk_div;
136	bool use_pll;
137	struct gpio_desc *reset;
138
139	struct v4l2_ctrl_handler ctrls;
140	struct v4l2_ctrl *blc_auto;
141	struct v4l2_ctrl *blc_offset;
142
143	/* Registers cache */
144	u16 output_control;
145	u16 mode2;
146};
147
148static struct mt9p031 *to_mt9p031(struct v4l2_subdev *sd)
149{
150	return container_of(sd, struct mt9p031, subdev);
151}
152
153static int mt9p031_read(struct i2c_client *client, u8 reg)
154{
155	return i2c_smbus_read_word_swapped(client, reg);
156}
157
158static int mt9p031_write(struct i2c_client *client, u8 reg, u16 data)
159{
160	return i2c_smbus_write_word_swapped(client, reg, data);
161}
162
163static int mt9p031_set_output_control(struct mt9p031 *mt9p031, u16 clear,
164				      u16 set)
165{
166	struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
167	u16 value = (mt9p031->output_control & ~clear) | set;
168	int ret;
169
170	ret = mt9p031_write(client, MT9P031_OUTPUT_CONTROL, value);
171	if (ret < 0)
172		return ret;
173
174	mt9p031->output_control = value;
175	return 0;
176}
177
178static int mt9p031_set_mode2(struct mt9p031 *mt9p031, u16 clear, u16 set)
179{
180	struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
181	u16 value = (mt9p031->mode2 & ~clear) | set;
182	int ret;
183
184	ret = mt9p031_write(client, MT9P031_READ_MODE_2, value);
185	if (ret < 0)
186		return ret;
187
188	mt9p031->mode2 = value;
189	return 0;
190}
191
192static int mt9p031_reset(struct mt9p031 *mt9p031)
193{
194	struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
195	int ret;
196
197	/* Disable chip output, synchronous option update */
198	ret = mt9p031_write(client, MT9P031_RST, MT9P031_RST_ENABLE);
199	if (ret < 0)
200		return ret;
201	ret = mt9p031_write(client, MT9P031_RST, MT9P031_RST_DISABLE);
202	if (ret < 0)
203		return ret;
204
205	ret = mt9p031_write(client, MT9P031_PIXEL_CLOCK_CONTROL,
206			    MT9P031_PIXEL_CLOCK_DIVIDE(mt9p031->clk_div));
207	if (ret < 0)
208		return ret;
209
210	return mt9p031_set_output_control(mt9p031, MT9P031_OUTPUT_CONTROL_CEN,
211					  0);
212}
213
214static int mt9p031_clk_setup(struct mt9p031 *mt9p031)
215{
216	static const struct aptina_pll_limits limits = {
217		.ext_clock_min = 6000000,
218		.ext_clock_max = 27000000,
219		.int_clock_min = 2000000,
220		.int_clock_max = 13500000,
221		.out_clock_min = 180000000,
222		.out_clock_max = 360000000,
223		.pix_clock_max = 96000000,
224		.n_min = 1,
225		.n_max = 64,
226		.m_min = 16,
227		.m_max = 255,
228		.p1_min = 1,
229		.p1_max = 128,
230	};
231
232	struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
233	struct mt9p031_platform_data *pdata = mt9p031->pdata;
234	int ret;
235
236	mt9p031->clk = devm_clk_get(&client->dev, NULL);
237	if (IS_ERR(mt9p031->clk))
238		return PTR_ERR(mt9p031->clk);
239
240	ret = clk_set_rate(mt9p031->clk, pdata->ext_freq);
241	if (ret < 0)
242		return ret;
243
244	/* If the external clock frequency is out of bounds for the PLL use the
245	 * pixel clock divider only and disable the PLL.
246	 */
247	if (pdata->ext_freq > limits.ext_clock_max) {
248		unsigned int div;
249
250		div = DIV_ROUND_UP(pdata->ext_freq, pdata->target_freq);
251		div = roundup_pow_of_two(div) / 2;
252
253		mt9p031->clk_div = min_t(unsigned int, div, 64);
254		mt9p031->use_pll = false;
255
256		return 0;
257	}
258
259	mt9p031->pll.ext_clock = pdata->ext_freq;
260	mt9p031->pll.pix_clock = pdata->target_freq;
261	mt9p031->use_pll = true;
262
263	return aptina_pll_calculate(&client->dev, &limits, &mt9p031->pll);
264}
265
266static int mt9p031_pll_enable(struct mt9p031 *mt9p031)
267{
268	struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
269	int ret;
270
271	if (!mt9p031->use_pll)
272		return 0;
273
274	ret = mt9p031_write(client, MT9P031_PLL_CONTROL,
275			    MT9P031_PLL_CONTROL_PWRON);
276	if (ret < 0)
277		return ret;
278
279	ret = mt9p031_write(client, MT9P031_PLL_CONFIG_1,
280			    (mt9p031->pll.m << 8) | (mt9p031->pll.n - 1));
281	if (ret < 0)
282		return ret;
283
284	ret = mt9p031_write(client, MT9P031_PLL_CONFIG_2, mt9p031->pll.p1 - 1);
285	if (ret < 0)
286		return ret;
287
288	usleep_range(1000, 2000);
289	ret = mt9p031_write(client, MT9P031_PLL_CONTROL,
290			    MT9P031_PLL_CONTROL_PWRON |
291			    MT9P031_PLL_CONTROL_USEPLL);
292	return ret;
293}
294
295static inline int mt9p031_pll_disable(struct mt9p031 *mt9p031)
296{
297	struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
298
299	if (!mt9p031->use_pll)
300		return 0;
301
302	return mt9p031_write(client, MT9P031_PLL_CONTROL,
303			     MT9P031_PLL_CONTROL_PWROFF);
304}
305
306static int mt9p031_power_on(struct mt9p031 *mt9p031)
307{
308	int ret;
309
310	/* Ensure RESET_BAR is active */
311	if (mt9p031->reset) {
312		gpiod_set_value(mt9p031->reset, 1);
313		usleep_range(1000, 2000);
314	}
315
316	/* Bring up the supplies */
317	ret = regulator_bulk_enable(ARRAY_SIZE(mt9p031->regulators),
318				   mt9p031->regulators);
319	if (ret < 0)
320		return ret;
321
322	/* Enable clock */
323	if (mt9p031->clk) {
324		ret = clk_prepare_enable(mt9p031->clk);
325		if (ret) {
326			regulator_bulk_disable(ARRAY_SIZE(mt9p031->regulators),
327					       mt9p031->regulators);
328			return ret;
329		}
330	}
331
332	/* Now RESET_BAR must be high */
333	if (mt9p031->reset) {
334		gpiod_set_value(mt9p031->reset, 0);
335		usleep_range(1000, 2000);
336	}
337
338	return 0;
339}
340
341static void mt9p031_power_off(struct mt9p031 *mt9p031)
342{
343	if (mt9p031->reset) {
344		gpiod_set_value(mt9p031->reset, 1);
345		usleep_range(1000, 2000);
346	}
347
348	regulator_bulk_disable(ARRAY_SIZE(mt9p031->regulators),
349			       mt9p031->regulators);
350
351	if (mt9p031->clk)
352		clk_disable_unprepare(mt9p031->clk);
353}
354
355static int __mt9p031_set_power(struct mt9p031 *mt9p031, bool on)
356{
357	struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
358	int ret;
359
360	if (!on) {
361		mt9p031_power_off(mt9p031);
362		return 0;
363	}
364
365	ret = mt9p031_power_on(mt9p031);
366	if (ret < 0)
367		return ret;
368
369	ret = mt9p031_reset(mt9p031);
370	if (ret < 0) {
371		dev_err(&client->dev, "Failed to reset the camera\n");
372		return ret;
373	}
374
375	return v4l2_ctrl_handler_setup(&mt9p031->ctrls);
376}
377
378/* -----------------------------------------------------------------------------
379 * V4L2 subdev video operations
380 */
381
382static int mt9p031_set_params(struct mt9p031 *mt9p031)
383{
384	struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
385	struct v4l2_mbus_framefmt *format = &mt9p031->format;
386	const struct v4l2_rect *crop = &mt9p031->crop;
387	unsigned int hblank;
388	unsigned int vblank;
389	unsigned int xskip;
390	unsigned int yskip;
391	unsigned int xbin;
392	unsigned int ybin;
393	int ret;
394
395	/* Windows position and size.
396	 *
397	 * TODO: Make sure the start coordinates and window size match the
398	 * skipping, binning and mirroring (see description of registers 2 and 4
399	 * in table 13, and Binning section on page 41).
400	 */
401	ret = mt9p031_write(client, MT9P031_COLUMN_START, crop->left);
402	if (ret < 0)
403		return ret;
404	ret = mt9p031_write(client, MT9P031_ROW_START, crop->top);
405	if (ret < 0)
406		return ret;
407	ret = mt9p031_write(client, MT9P031_WINDOW_WIDTH, crop->width - 1);
408	if (ret < 0)
409		return ret;
410	ret = mt9p031_write(client, MT9P031_WINDOW_HEIGHT, crop->height - 1);
411	if (ret < 0)
412		return ret;
413
414	/* Row and column binning and skipping. Use the maximum binning value
415	 * compatible with the skipping settings.
416	 */
417	xskip = DIV_ROUND_CLOSEST(crop->width, format->width);
418	yskip = DIV_ROUND_CLOSEST(crop->height, format->height);
419	xbin = 1 << (ffs(xskip) - 1);
420	ybin = 1 << (ffs(yskip) - 1);
421
422	ret = mt9p031_write(client, MT9P031_COLUMN_ADDRESS_MODE,
423			    ((xbin - 1) << 4) | (xskip - 1));
424	if (ret < 0)
425		return ret;
426	ret = mt9p031_write(client, MT9P031_ROW_ADDRESS_MODE,
427			    ((ybin - 1) << 4) | (yskip - 1));
428	if (ret < 0)
429		return ret;
430
431	/* Blanking - use minimum value for horizontal blanking and default
432	 * value for vertical blanking.
433	 */
434	hblank = 346 * ybin + 64 + (80 >> min_t(unsigned int, xbin, 3));
435	vblank = MT9P031_VERTICAL_BLANK_DEF;
436
437	ret = mt9p031_write(client, MT9P031_HORIZONTAL_BLANK, hblank - 1);
438	if (ret < 0)
439		return ret;
440	ret = mt9p031_write(client, MT9P031_VERTICAL_BLANK, vblank - 1);
441	if (ret < 0)
442		return ret;
443
444	return ret;
445}
446
447static int mt9p031_s_stream(struct v4l2_subdev *subdev, int enable)
448{
449	struct mt9p031 *mt9p031 = to_mt9p031(subdev);
450	struct i2c_client *client = v4l2_get_subdevdata(subdev);
451	int val;
452	int ret;
453
454	if (!enable) {
455		/* enable pause restart */
456		val = MT9P031_FRAME_PAUSE_RESTART;
457		ret = mt9p031_write(client, MT9P031_RESTART, val);
458		if (ret < 0)
459			return ret;
460
461		/* enable restart + keep pause restart set */
462		val |= MT9P031_FRAME_RESTART;
463		ret = mt9p031_write(client, MT9P031_RESTART, val);
464		if (ret < 0)
465			return ret;
466
467		/* Stop sensor readout */
468		ret = mt9p031_set_output_control(mt9p031,
469						 MT9P031_OUTPUT_CONTROL_CEN, 0);
470		if (ret < 0)
471			return ret;
472
473		return mt9p031_pll_disable(mt9p031);
474	}
475
476	ret = mt9p031_set_params(mt9p031);
477	if (ret < 0)
478		return ret;
479
480	/* Switch to master "normal" mode */
481	ret = mt9p031_set_output_control(mt9p031, 0,
482					 MT9P031_OUTPUT_CONTROL_CEN);
483	if (ret < 0)
484		return ret;
485
486	/*
487	 * - clear pause restart
488	 * - don't clear restart as clearing restart manually can cause
489	 *   undefined behavior
490	 */
491	val = MT9P031_FRAME_RESTART;
492	ret = mt9p031_write(client, MT9P031_RESTART, val);
493	if (ret < 0)
494		return ret;
495
496	return mt9p031_pll_enable(mt9p031);
497}
498
499static int mt9p031_enum_mbus_code(struct v4l2_subdev *subdev,
500				  struct v4l2_subdev_pad_config *cfg,
501				  struct v4l2_subdev_mbus_code_enum *code)
502{
503	struct mt9p031 *mt9p031 = to_mt9p031(subdev);
504
505	if (code->pad || code->index)
506		return -EINVAL;
507
508	code->code = mt9p031->format.code;
509	return 0;
510}
511
512static int mt9p031_enum_frame_size(struct v4l2_subdev *subdev,
513				   struct v4l2_subdev_pad_config *cfg,
514				   struct v4l2_subdev_frame_size_enum *fse)
515{
516	struct mt9p031 *mt9p031 = to_mt9p031(subdev);
517
518	if (fse->index >= 8 || fse->code != mt9p031->format.code)
519		return -EINVAL;
520
521	fse->min_width = MT9P031_WINDOW_WIDTH_DEF
522		       / min_t(unsigned int, 7, fse->index + 1);
523	fse->max_width = fse->min_width;
524	fse->min_height = MT9P031_WINDOW_HEIGHT_DEF / (fse->index + 1);
525	fse->max_height = fse->min_height;
526
527	return 0;
528}
529
530static struct v4l2_mbus_framefmt *
531__mt9p031_get_pad_format(struct mt9p031 *mt9p031, struct v4l2_subdev_pad_config *cfg,
532			 unsigned int pad, u32 which)
533{
534	switch (which) {
535	case V4L2_SUBDEV_FORMAT_TRY:
536		return v4l2_subdev_get_try_format(&mt9p031->subdev, cfg, pad);
537	case V4L2_SUBDEV_FORMAT_ACTIVE:
538		return &mt9p031->format;
539	default:
540		return NULL;
541	}
542}
543
544static struct v4l2_rect *
545__mt9p031_get_pad_crop(struct mt9p031 *mt9p031, struct v4l2_subdev_pad_config *cfg,
546		     unsigned int pad, u32 which)
547{
548	switch (which) {
549	case V4L2_SUBDEV_FORMAT_TRY:
550		return v4l2_subdev_get_try_crop(&mt9p031->subdev, cfg, pad);
551	case V4L2_SUBDEV_FORMAT_ACTIVE:
552		return &mt9p031->crop;
553	default:
554		return NULL;
555	}
556}
557
558static int mt9p031_get_format(struct v4l2_subdev *subdev,
559			      struct v4l2_subdev_pad_config *cfg,
560			      struct v4l2_subdev_format *fmt)
561{
562	struct mt9p031 *mt9p031 = to_mt9p031(subdev);
563
564	fmt->format = *__mt9p031_get_pad_format(mt9p031, cfg, fmt->pad,
565						fmt->which);
566	return 0;
567}
568
569static int mt9p031_set_format(struct v4l2_subdev *subdev,
570			      struct v4l2_subdev_pad_config *cfg,
571			      struct v4l2_subdev_format *format)
572{
573	struct mt9p031 *mt9p031 = to_mt9p031(subdev);
574	struct v4l2_mbus_framefmt *__format;
575	struct v4l2_rect *__crop;
576	unsigned int width;
577	unsigned int height;
578	unsigned int hratio;
579	unsigned int vratio;
580
581	__crop = __mt9p031_get_pad_crop(mt9p031, cfg, format->pad,
582					format->which);
583
584	/* Clamp the width and height to avoid dividing by zero. */
585	width = clamp_t(unsigned int, ALIGN(format->format.width, 2),
586			max_t(unsigned int, __crop->width / 7,
587			      MT9P031_WINDOW_WIDTH_MIN),
588			__crop->width);
589	height = clamp_t(unsigned int, ALIGN(format->format.height, 2),
590			 max_t(unsigned int, __crop->height / 8,
591			       MT9P031_WINDOW_HEIGHT_MIN),
592			 __crop->height);
593
594	hratio = DIV_ROUND_CLOSEST(__crop->width, width);
595	vratio = DIV_ROUND_CLOSEST(__crop->height, height);
596
597	__format = __mt9p031_get_pad_format(mt9p031, cfg, format->pad,
598					    format->which);
599	__format->width = __crop->width / hratio;
600	__format->height = __crop->height / vratio;
601
602	format->format = *__format;
603
604	return 0;
605}
606
607static int mt9p031_get_selection(struct v4l2_subdev *subdev,
608				 struct v4l2_subdev_pad_config *cfg,
609				 struct v4l2_subdev_selection *sel)
610{
611	struct mt9p031 *mt9p031 = to_mt9p031(subdev);
612
613	if (sel->target != V4L2_SEL_TGT_CROP)
614		return -EINVAL;
615
616	sel->r = *__mt9p031_get_pad_crop(mt9p031, cfg, sel->pad, sel->which);
617	return 0;
618}
619
620static int mt9p031_set_selection(struct v4l2_subdev *subdev,
621				 struct v4l2_subdev_pad_config *cfg,
622				 struct v4l2_subdev_selection *sel)
623{
624	struct mt9p031 *mt9p031 = to_mt9p031(subdev);
625	struct v4l2_mbus_framefmt *__format;
626	struct v4l2_rect *__crop;
627	struct v4l2_rect rect;
628
629	if (sel->target != V4L2_SEL_TGT_CROP)
630		return -EINVAL;
631
632	/* Clamp the crop rectangle boundaries and align them to a multiple of 2
633	 * pixels to ensure a GRBG Bayer pattern.
634	 */
635	rect.left = clamp(ALIGN(sel->r.left, 2), MT9P031_COLUMN_START_MIN,
636			  MT9P031_COLUMN_START_MAX);
637	rect.top = clamp(ALIGN(sel->r.top, 2), MT9P031_ROW_START_MIN,
638			 MT9P031_ROW_START_MAX);
639	rect.width = clamp_t(unsigned int, ALIGN(sel->r.width, 2),
640			     MT9P031_WINDOW_WIDTH_MIN,
641			     MT9P031_WINDOW_WIDTH_MAX);
642	rect.height = clamp_t(unsigned int, ALIGN(sel->r.height, 2),
643			      MT9P031_WINDOW_HEIGHT_MIN,
644			      MT9P031_WINDOW_HEIGHT_MAX);
645
646	rect.width = min_t(unsigned int, rect.width,
647			   MT9P031_PIXEL_ARRAY_WIDTH - rect.left);
648	rect.height = min_t(unsigned int, rect.height,
649			    MT9P031_PIXEL_ARRAY_HEIGHT - rect.top);
650
651	__crop = __mt9p031_get_pad_crop(mt9p031, cfg, sel->pad, sel->which);
652
653	if (rect.width != __crop->width || rect.height != __crop->height) {
654		/* Reset the output image size if the crop rectangle size has
655		 * been modified.
656		 */
657		__format = __mt9p031_get_pad_format(mt9p031, cfg, sel->pad,
658						    sel->which);
659		__format->width = rect.width;
660		__format->height = rect.height;
661	}
662
663	*__crop = rect;
664	sel->r = rect;
665
666	return 0;
667}
668
669/* -----------------------------------------------------------------------------
670 * V4L2 subdev control operations
671 */
672
673#define V4L2_CID_BLC_AUTO		(V4L2_CID_USER_BASE | 0x1002)
674#define V4L2_CID_BLC_TARGET_LEVEL	(V4L2_CID_USER_BASE | 0x1003)
675#define V4L2_CID_BLC_ANALOG_OFFSET	(V4L2_CID_USER_BASE | 0x1004)
676#define V4L2_CID_BLC_DIGITAL_OFFSET	(V4L2_CID_USER_BASE | 0x1005)
677
678static int mt9p031_restore_blc(struct mt9p031 *mt9p031)
679{
680	struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
681	int ret;
682
683	if (mt9p031->blc_auto->cur.val != 0) {
684		ret = mt9p031_set_mode2(mt9p031, 0,
685					MT9P031_READ_MODE_2_ROW_BLC);
686		if (ret < 0)
687			return ret;
688	}
689
690	if (mt9p031->blc_offset->cur.val != 0) {
691		ret = mt9p031_write(client, MT9P031_ROW_BLACK_TARGET,
692				    mt9p031->blc_offset->cur.val);
693		if (ret < 0)
694			return ret;
695	}
696
697	return 0;
698}
699
700static int mt9p031_s_ctrl(struct v4l2_ctrl *ctrl)
701{
702	struct mt9p031 *mt9p031 =
703			container_of(ctrl->handler, struct mt9p031, ctrls);
704	struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
705	u16 data;
706	int ret;
707
708	if (ctrl->flags & V4L2_CTRL_FLAG_INACTIVE)
709		return 0;
710
711	switch (ctrl->id) {
712	case V4L2_CID_EXPOSURE:
713		ret = mt9p031_write(client, MT9P031_SHUTTER_WIDTH_UPPER,
714				    (ctrl->val >> 16) & 0xffff);
715		if (ret < 0)
716			return ret;
717
718		return mt9p031_write(client, MT9P031_SHUTTER_WIDTH_LOWER,
719				     ctrl->val & 0xffff);
720
721	case V4L2_CID_GAIN:
722		/* Gain is controlled by 2 analog stages and a digital stage.
723		 * Valid values for the 3 stages are
724		 *
725		 * Stage                Min     Max     Step
726		 * ------------------------------------------
727		 * First analog stage   x1      x2      1
728		 * Second analog stage  x1      x4      0.125
729		 * Digital stage        x1      x16     0.125
730		 *
731		 * To minimize noise, the gain stages should be used in the
732		 * second analog stage, first analog stage, digital stage order.
733		 * Gain from a previous stage should be pushed to its maximum
734		 * value before the next stage is used.
735		 */
736		if (ctrl->val <= 32) {
737			data = ctrl->val;
738		} else if (ctrl->val <= 64) {
739			ctrl->val &= ~1;
740			data = (1 << 6) | (ctrl->val >> 1);
741		} else {
742			ctrl->val &= ~7;
743			data = ((ctrl->val - 64) << 5) | (1 << 6) | 32;
744		}
745
746		return mt9p031_write(client, MT9P031_GLOBAL_GAIN, data);
747
748	case V4L2_CID_HFLIP:
749		if (ctrl->val)
750			return mt9p031_set_mode2(mt9p031,
751					0, MT9P031_READ_MODE_2_COL_MIR);
752		else
753			return mt9p031_set_mode2(mt9p031,
754					MT9P031_READ_MODE_2_COL_MIR, 0);
755
756	case V4L2_CID_VFLIP:
757		if (ctrl->val)
758			return mt9p031_set_mode2(mt9p031,
759					0, MT9P031_READ_MODE_2_ROW_MIR);
760		else
761			return mt9p031_set_mode2(mt9p031,
762					MT9P031_READ_MODE_2_ROW_MIR, 0);
763
764	case V4L2_CID_TEST_PATTERN:
765		/* The digital side of the Black Level Calibration function must
766		 * be disabled when generating a test pattern to avoid artifacts
767		 * in the image. Activate (deactivate) the BLC-related controls
768		 * when the test pattern is enabled (disabled).
769		 */
770		v4l2_ctrl_activate(mt9p031->blc_auto, ctrl->val == 0);
771		v4l2_ctrl_activate(mt9p031->blc_offset, ctrl->val == 0);
772
773		if (!ctrl->val) {
774			/* Restore the BLC settings. */
775			ret = mt9p031_restore_blc(mt9p031);
776			if (ret < 0)
777				return ret;
778
779			return mt9p031_write(client, MT9P031_TEST_PATTERN,
780					     MT9P031_TEST_PATTERN_DISABLE);
781		}
782
783		ret = mt9p031_write(client, MT9P031_TEST_PATTERN_GREEN, 0x05a0);
784		if (ret < 0)
785			return ret;
786		ret = mt9p031_write(client, MT9P031_TEST_PATTERN_RED, 0x0a50);
787		if (ret < 0)
788			return ret;
789		ret = mt9p031_write(client, MT9P031_TEST_PATTERN_BLUE, 0x0aa0);
790		if (ret < 0)
791			return ret;
792
793		/* Disable digital BLC when generating a test pattern. */
794		ret = mt9p031_set_mode2(mt9p031, MT9P031_READ_MODE_2_ROW_BLC,
795					0);
796		if (ret < 0)
797			return ret;
798
799		ret = mt9p031_write(client, MT9P031_ROW_BLACK_DEF_OFFSET, 0);
800		if (ret < 0)
801			return ret;
802
803		return mt9p031_write(client, MT9P031_TEST_PATTERN,
804				((ctrl->val - 1) << MT9P031_TEST_PATTERN_SHIFT)
805				| MT9P031_TEST_PATTERN_ENABLE);
806
807	case V4L2_CID_BLC_AUTO:
808		ret = mt9p031_set_mode2(mt9p031,
809				ctrl->val ? 0 : MT9P031_READ_MODE_2_ROW_BLC,
810				ctrl->val ? MT9P031_READ_MODE_2_ROW_BLC : 0);
811		if (ret < 0)
812			return ret;
813
814		return mt9p031_write(client, MT9P031_BLACK_LEVEL_CALIBRATION,
815				     ctrl->val ? 0 : MT9P031_BLC_MANUAL_BLC);
816
817	case V4L2_CID_BLC_TARGET_LEVEL:
818		return mt9p031_write(client, MT9P031_ROW_BLACK_TARGET,
819				     ctrl->val);
820
821	case V4L2_CID_BLC_ANALOG_OFFSET:
822		data = ctrl->val & ((1 << 9) - 1);
823
824		ret = mt9p031_write(client, MT9P031_GREEN1_OFFSET, data);
825		if (ret < 0)
826			return ret;
827		ret = mt9p031_write(client, MT9P031_GREEN2_OFFSET, data);
828		if (ret < 0)
829			return ret;
830		ret = mt9p031_write(client, MT9P031_RED_OFFSET, data);
831		if (ret < 0)
832			return ret;
833		return mt9p031_write(client, MT9P031_BLUE_OFFSET, data);
834
835	case V4L2_CID_BLC_DIGITAL_OFFSET:
836		return mt9p031_write(client, MT9P031_ROW_BLACK_DEF_OFFSET,
837				     ctrl->val & ((1 << 12) - 1));
838	}
839
840	return 0;
841}
842
843static const struct v4l2_ctrl_ops mt9p031_ctrl_ops = {
844	.s_ctrl = mt9p031_s_ctrl,
845};
846
847static const char * const mt9p031_test_pattern_menu[] = {
848	"Disabled",
849	"Color Field",
850	"Horizontal Gradient",
851	"Vertical Gradient",
852	"Diagonal Gradient",
853	"Classic Test Pattern",
854	"Walking 1s",
855	"Monochrome Horizontal Bars",
856	"Monochrome Vertical Bars",
857	"Vertical Color Bars",
858};
859
860static const struct v4l2_ctrl_config mt9p031_ctrls[] = {
861	{
862		.ops		= &mt9p031_ctrl_ops,
863		.id		= V4L2_CID_BLC_AUTO,
864		.type		= V4L2_CTRL_TYPE_BOOLEAN,
865		.name		= "BLC, Auto",
866		.min		= 0,
867		.max		= 1,
868		.step		= 1,
869		.def		= 1,
870		.flags		= 0,
871	}, {
872		.ops		= &mt9p031_ctrl_ops,
873		.id		= V4L2_CID_BLC_TARGET_LEVEL,
874		.type		= V4L2_CTRL_TYPE_INTEGER,
875		.name		= "BLC Target Level",
876		.min		= 0,
877		.max		= 4095,
878		.step		= 1,
879		.def		= 168,
880		.flags		= 0,
881	}, {
882		.ops		= &mt9p031_ctrl_ops,
883		.id		= V4L2_CID_BLC_ANALOG_OFFSET,
884		.type		= V4L2_CTRL_TYPE_INTEGER,
885		.name		= "BLC Analog Offset",
886		.min		= -255,
887		.max		= 255,
888		.step		= 1,
889		.def		= 32,
890		.flags		= 0,
891	}, {
892		.ops		= &mt9p031_ctrl_ops,
893		.id		= V4L2_CID_BLC_DIGITAL_OFFSET,
894		.type		= V4L2_CTRL_TYPE_INTEGER,
895		.name		= "BLC Digital Offset",
896		.min		= -2048,
897		.max		= 2047,
898		.step		= 1,
899		.def		= 40,
900		.flags		= 0,
901	}
902};
903
904/* -----------------------------------------------------------------------------
905 * V4L2 subdev core operations
906 */
907
908static int mt9p031_set_power(struct v4l2_subdev *subdev, int on)
909{
910	struct mt9p031 *mt9p031 = to_mt9p031(subdev);
911	int ret = 0;
912
913	mutex_lock(&mt9p031->power_lock);
914
915	/* If the power count is modified from 0 to != 0 or from != 0 to 0,
916	 * update the power state.
917	 */
918	if (mt9p031->power_count == !on) {
919		ret = __mt9p031_set_power(mt9p031, !!on);
920		if (ret < 0)
921			goto out;
922	}
923
924	/* Update the power count. */
925	mt9p031->power_count += on ? 1 : -1;
926	WARN_ON(mt9p031->power_count < 0);
927
928out:
929	mutex_unlock(&mt9p031->power_lock);
930	return ret;
931}
932
933/* -----------------------------------------------------------------------------
934 * V4L2 subdev internal operations
935 */
936
937static int mt9p031_registered(struct v4l2_subdev *subdev)
938{
939	struct i2c_client *client = v4l2_get_subdevdata(subdev);
940	struct mt9p031 *mt9p031 = to_mt9p031(subdev);
941	s32 data;
942	int ret;
943
944	ret = mt9p031_power_on(mt9p031);
945	if (ret < 0) {
946		dev_err(&client->dev, "MT9P031 power up failed\n");
947		return ret;
948	}
949
950	/* Read out the chip version register */
951	data = mt9p031_read(client, MT9P031_CHIP_VERSION);
952	mt9p031_power_off(mt9p031);
953
954	if (data != MT9P031_CHIP_VERSION_VALUE) {
955		dev_err(&client->dev, "MT9P031 not detected, wrong version "
956			"0x%04x\n", data);
957		return -ENODEV;
958	}
959
960	dev_info(&client->dev, "MT9P031 detected at address 0x%02x\n",
961		 client->addr);
962
963	return 0;
964}
965
966static int mt9p031_open(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
967{
968	struct mt9p031 *mt9p031 = to_mt9p031(subdev);
969	struct v4l2_mbus_framefmt *format;
970	struct v4l2_rect *crop;
971
972	crop = v4l2_subdev_get_try_crop(subdev, fh->pad, 0);
973	crop->left = MT9P031_COLUMN_START_DEF;
974	crop->top = MT9P031_ROW_START_DEF;
975	crop->width = MT9P031_WINDOW_WIDTH_DEF;
976	crop->height = MT9P031_WINDOW_HEIGHT_DEF;
977
978	format = v4l2_subdev_get_try_format(subdev, fh->pad, 0);
979
980	if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
981		format->code = MEDIA_BUS_FMT_Y12_1X12;
982	else
983		format->code = MEDIA_BUS_FMT_SGRBG12_1X12;
984
985	format->width = MT9P031_WINDOW_WIDTH_DEF;
986	format->height = MT9P031_WINDOW_HEIGHT_DEF;
987	format->field = V4L2_FIELD_NONE;
988	format->colorspace = V4L2_COLORSPACE_SRGB;
989
990	return mt9p031_set_power(subdev, 1);
991}
992
993static int mt9p031_close(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
994{
995	return mt9p031_set_power(subdev, 0);
996}
997
998static const struct v4l2_subdev_core_ops mt9p031_subdev_core_ops = {
999	.s_power        = mt9p031_set_power,
1000};
1001
1002static const struct v4l2_subdev_video_ops mt9p031_subdev_video_ops = {
1003	.s_stream       = mt9p031_s_stream,
1004};
1005
1006static const struct v4l2_subdev_pad_ops mt9p031_subdev_pad_ops = {
1007	.enum_mbus_code = mt9p031_enum_mbus_code,
1008	.enum_frame_size = mt9p031_enum_frame_size,
1009	.get_fmt = mt9p031_get_format,
1010	.set_fmt = mt9p031_set_format,
1011	.get_selection = mt9p031_get_selection,
1012	.set_selection = mt9p031_set_selection,
1013};
1014
1015static const struct v4l2_subdev_ops mt9p031_subdev_ops = {
1016	.core   = &mt9p031_subdev_core_ops,
1017	.video  = &mt9p031_subdev_video_ops,
1018	.pad    = &mt9p031_subdev_pad_ops,
1019};
1020
1021static const struct v4l2_subdev_internal_ops mt9p031_subdev_internal_ops = {
1022	.registered = mt9p031_registered,
1023	.open = mt9p031_open,
1024	.close = mt9p031_close,
1025};
1026
1027/* -----------------------------------------------------------------------------
1028 * Driver initialization and probing
1029 */
1030
1031static struct mt9p031_platform_data *
1032mt9p031_get_pdata(struct i2c_client *client)
1033{
1034	struct mt9p031_platform_data *pdata;
1035	struct device_node *np;
1036
1037	if (!IS_ENABLED(CONFIG_OF) || !client->dev.of_node)
1038		return client->dev.platform_data;
1039
1040	np = of_graph_get_next_endpoint(client->dev.of_node, NULL);
1041	if (!np)
1042		return NULL;
1043
1044	pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
1045	if (!pdata)
1046		goto done;
1047
1048	of_property_read_u32(np, "input-clock-frequency", &pdata->ext_freq);
1049	of_property_read_u32(np, "pixel-clock-frequency", &pdata->target_freq);
1050
1051done:
1052	of_node_put(np);
1053	return pdata;
1054}
1055
1056static int mt9p031_probe(struct i2c_client *client,
1057			 const struct i2c_device_id *did)
1058{
1059	struct mt9p031_platform_data *pdata = mt9p031_get_pdata(client);
1060	struct i2c_adapter *adapter = client->adapter;
1061	struct mt9p031 *mt9p031;
1062	unsigned int i;
1063	int ret;
1064
1065	if (pdata == NULL) {
1066		dev_err(&client->dev, "No platform data\n");
1067		return -EINVAL;
1068	}
1069
1070	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) {
1071		dev_warn(&client->dev,
1072			"I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD\n");
1073		return -EIO;
1074	}
1075
1076	mt9p031 = devm_kzalloc(&client->dev, sizeof(*mt9p031), GFP_KERNEL);
1077	if (mt9p031 == NULL)
1078		return -ENOMEM;
1079
1080	mt9p031->pdata = pdata;
1081	mt9p031->output_control	= MT9P031_OUTPUT_CONTROL_DEF;
1082	mt9p031->mode2 = MT9P031_READ_MODE_2_ROW_BLC;
1083	mt9p031->model = did->driver_data;
1084
1085	mt9p031->regulators[0].supply = "vdd";
1086	mt9p031->regulators[1].supply = "vdd_io";
1087	mt9p031->regulators[2].supply = "vaa";
1088
1089	ret = devm_regulator_bulk_get(&client->dev, 3, mt9p031->regulators);
1090	if (ret < 0) {
1091		dev_err(&client->dev, "Unable to get regulators\n");
1092		return ret;
1093	}
1094
1095	mutex_init(&mt9p031->power_lock);
1096
1097	v4l2_ctrl_handler_init(&mt9p031->ctrls, ARRAY_SIZE(mt9p031_ctrls) + 6);
1098
1099	v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1100			  V4L2_CID_EXPOSURE, MT9P031_SHUTTER_WIDTH_MIN,
1101			  MT9P031_SHUTTER_WIDTH_MAX, 1,
1102			  MT9P031_SHUTTER_WIDTH_DEF);
1103	v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1104			  V4L2_CID_GAIN, MT9P031_GLOBAL_GAIN_MIN,
1105			  MT9P031_GLOBAL_GAIN_MAX, 1, MT9P031_GLOBAL_GAIN_DEF);
1106	v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1107			  V4L2_CID_HFLIP, 0, 1, 1, 0);
1108	v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1109			  V4L2_CID_VFLIP, 0, 1, 1, 0);
1110	v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1111			  V4L2_CID_PIXEL_RATE, pdata->target_freq,
1112			  pdata->target_freq, 1, pdata->target_freq);
1113	v4l2_ctrl_new_std_menu_items(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1114			  V4L2_CID_TEST_PATTERN,
1115			  ARRAY_SIZE(mt9p031_test_pattern_menu) - 1, 0,
1116			  0, mt9p031_test_pattern_menu);
1117
1118	for (i = 0; i < ARRAY_SIZE(mt9p031_ctrls); ++i)
1119		v4l2_ctrl_new_custom(&mt9p031->ctrls, &mt9p031_ctrls[i], NULL);
1120
1121	mt9p031->subdev.ctrl_handler = &mt9p031->ctrls;
1122
1123	if (mt9p031->ctrls.error) {
1124		printk(KERN_INFO "%s: control initialization error %d\n",
1125		       __func__, mt9p031->ctrls.error);
1126		ret = mt9p031->ctrls.error;
1127		goto done;
1128	}
1129
1130	mt9p031->blc_auto = v4l2_ctrl_find(&mt9p031->ctrls, V4L2_CID_BLC_AUTO);
1131	mt9p031->blc_offset = v4l2_ctrl_find(&mt9p031->ctrls,
1132					     V4L2_CID_BLC_DIGITAL_OFFSET);
1133
1134	v4l2_i2c_subdev_init(&mt9p031->subdev, client, &mt9p031_subdev_ops);
1135	mt9p031->subdev.internal_ops = &mt9p031_subdev_internal_ops;
1136
1137	mt9p031->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1138	mt9p031->pad.flags = MEDIA_PAD_FL_SOURCE;
1139	ret = media_entity_pads_init(&mt9p031->subdev.entity, 1, &mt9p031->pad);
1140	if (ret < 0)
1141		goto done;
1142
1143	mt9p031->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1144
1145	mt9p031->crop.width = MT9P031_WINDOW_WIDTH_DEF;
1146	mt9p031->crop.height = MT9P031_WINDOW_HEIGHT_DEF;
1147	mt9p031->crop.left = MT9P031_COLUMN_START_DEF;
1148	mt9p031->crop.top = MT9P031_ROW_START_DEF;
1149
1150	if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
1151		mt9p031->format.code = MEDIA_BUS_FMT_Y12_1X12;
1152	else
1153		mt9p031->format.code = MEDIA_BUS_FMT_SGRBG12_1X12;
1154
1155	mt9p031->format.width = MT9P031_WINDOW_WIDTH_DEF;
1156	mt9p031->format.height = MT9P031_WINDOW_HEIGHT_DEF;
1157	mt9p031->format.field = V4L2_FIELD_NONE;
1158	mt9p031->format.colorspace = V4L2_COLORSPACE_SRGB;
1159
1160	mt9p031->reset = devm_gpiod_get_optional(&client->dev, "reset",
1161						 GPIOD_OUT_HIGH);
1162
1163	ret = mt9p031_clk_setup(mt9p031);
1164	if (ret)
1165		goto done;
1166
1167	ret = v4l2_async_register_subdev(&mt9p031->subdev);
1168
1169done:
1170	if (ret < 0) {
1171		v4l2_ctrl_handler_free(&mt9p031->ctrls);
1172		media_entity_cleanup(&mt9p031->subdev.entity);
1173		mutex_destroy(&mt9p031->power_lock);
1174	}
1175
1176	return ret;
1177}
1178
1179static int mt9p031_remove(struct i2c_client *client)
1180{
1181	struct v4l2_subdev *subdev = i2c_get_clientdata(client);
1182	struct mt9p031 *mt9p031 = to_mt9p031(subdev);
1183
1184	v4l2_ctrl_handler_free(&mt9p031->ctrls);
1185	v4l2_async_unregister_subdev(subdev);
1186	media_entity_cleanup(&subdev->entity);
1187	mutex_destroy(&mt9p031->power_lock);
1188
1189	return 0;
1190}
1191
1192static const struct i2c_device_id mt9p031_id[] = {
1193	{ "mt9p031", MT9P031_MODEL_COLOR },
1194	{ "mt9p031m", MT9P031_MODEL_MONOCHROME },
1195	{ }
1196};
1197MODULE_DEVICE_TABLE(i2c, mt9p031_id);
1198
1199#if IS_ENABLED(CONFIG_OF)
1200static const struct of_device_id mt9p031_of_match[] = {
1201	{ .compatible = "aptina,mt9p031", },
1202	{ .compatible = "aptina,mt9p031m", },
1203	{ /* sentinel */ },
1204};
1205MODULE_DEVICE_TABLE(of, mt9p031_of_match);
1206#endif
1207
1208static struct i2c_driver mt9p031_i2c_driver = {
1209	.driver = {
1210		.of_match_table = of_match_ptr(mt9p031_of_match),
1211		.name = "mt9p031",
1212	},
1213	.probe          = mt9p031_probe,
1214	.remove         = mt9p031_remove,
1215	.id_table       = mt9p031_id,
1216};
1217
1218module_i2c_driver(mt9p031_i2c_driver);
1219
1220MODULE_DESCRIPTION("Aptina MT9P031 Camera driver");
1221MODULE_AUTHOR("Bastian Hecht <hechtb@gmail.com>");
1222MODULE_LICENSE("GPL v2");
1223