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