1 /*
2  * Driver for MT9M032 CMOS Image Sensor from Micron
3  *
4  * Copyright (C) 2010-2011 Lund Engineering
5  * Contact: Gil Lund <gwlund@lundeng.com>
6  * Author: Martin Hostettler <martin@neutronstar.dyndns.org>
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * version 2 as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20  * 02110-1301 USA
21  */
22 
23 #include <linux/delay.h>
24 #include <linux/i2c.h>
25 #include <linux/init.h>
26 #include <linux/kernel.h>
27 #include <linux/math64.h>
28 #include <linux/module.h>
29 #include <linux/mutex.h>
30 #include <linux/slab.h>
31 #include <linux/v4l2-mediabus.h>
32 
33 #include <media/media-entity.h>
34 #include <media/mt9m032.h>
35 #include <media/v4l2-ctrls.h>
36 #include <media/v4l2-device.h>
37 #include <media/v4l2-subdev.h>
38 
39 #include "aptina-pll.h"
40 
41 /*
42  * width and height include active boundary and black parts
43  *
44  * column    0-  15 active boundary
45  * column   16-1455 image
46  * column 1456-1471 active boundary
47  * column 1472-1599 black
48  *
49  * row       0-  51 black
50  * row      53-  59 active boundary
51  * row      60-1139 image
52  * row    1140-1147 active boundary
53  * row    1148-1151 black
54  */
55 
56 #define MT9M032_PIXEL_ARRAY_WIDTH			1600
57 #define MT9M032_PIXEL_ARRAY_HEIGHT			1152
58 
59 #define MT9M032_CHIP_VERSION				0x00
60 #define		MT9M032_CHIP_VERSION_VALUE		0x1402
61 #define MT9M032_ROW_START				0x01
62 #define		MT9M032_ROW_START_MIN			0
63 #define		MT9M032_ROW_START_MAX			1152
64 #define		MT9M032_ROW_START_DEF			60
65 #define MT9M032_COLUMN_START				0x02
66 #define		MT9M032_COLUMN_START_MIN		0
67 #define		MT9M032_COLUMN_START_MAX		1600
68 #define		MT9M032_COLUMN_START_DEF		16
69 #define MT9M032_ROW_SIZE				0x03
70 #define		MT9M032_ROW_SIZE_MIN			32
71 #define		MT9M032_ROW_SIZE_MAX			1152
72 #define		MT9M032_ROW_SIZE_DEF			1080
73 #define MT9M032_COLUMN_SIZE				0x04
74 #define		MT9M032_COLUMN_SIZE_MIN			32
75 #define		MT9M032_COLUMN_SIZE_MAX			1600
76 #define		MT9M032_COLUMN_SIZE_DEF			1440
77 #define MT9M032_HBLANK					0x05
78 #define MT9M032_VBLANK					0x06
79 #define		MT9M032_VBLANK_MAX			0x7ff
80 #define MT9M032_SHUTTER_WIDTH_HIGH			0x08
81 #define MT9M032_SHUTTER_WIDTH_LOW			0x09
82 #define		MT9M032_SHUTTER_WIDTH_MIN		1
83 #define		MT9M032_SHUTTER_WIDTH_MAX		1048575
84 #define		MT9M032_SHUTTER_WIDTH_DEF		1943
85 #define MT9M032_PIX_CLK_CTRL				0x0a
86 #define		MT9M032_PIX_CLK_CTRL_INV_PIXCLK		0x8000
87 #define MT9M032_RESTART					0x0b
88 #define MT9M032_RESET					0x0d
89 #define MT9M032_PLL_CONFIG1				0x11
90 #define		MT9M032_PLL_CONFIG1_PREDIV_MASK		0x3f
91 #define		MT9M032_PLL_CONFIG1_MUL_SHIFT		8
92 #define MT9M032_READ_MODE1				0x1e
93 #define		MT9M032_READ_MODE1_OUTPUT_BAD_FRAMES	(1 << 13)
94 #define		MT9M032_READ_MODE1_MAINTAIN_FRAME_RATE	(1 << 12)
95 #define		MT9M032_READ_MODE1_XOR_LINE_VALID	(1 << 11)
96 #define		MT9M032_READ_MODE1_CONT_LINE_VALID	(1 << 10)
97 #define		MT9M032_READ_MODE1_INVERT_TRIGGER	(1 << 9)
98 #define		MT9M032_READ_MODE1_SNAPSHOT		(1 << 8)
99 #define		MT9M032_READ_MODE1_GLOBAL_RESET		(1 << 7)
100 #define		MT9M032_READ_MODE1_BULB_EXPOSURE	(1 << 6)
101 #define		MT9M032_READ_MODE1_INVERT_STROBE	(1 << 5)
102 #define		MT9M032_READ_MODE1_STROBE_ENABLE	(1 << 4)
103 #define		MT9M032_READ_MODE1_STROBE_START_TRIG1	(0 << 2)
104 #define		MT9M032_READ_MODE1_STROBE_START_EXP	(1 << 2)
105 #define		MT9M032_READ_MODE1_STROBE_START_SHUTTER	(2 << 2)
106 #define		MT9M032_READ_MODE1_STROBE_START_TRIG2	(3 << 2)
107 #define		MT9M032_READ_MODE1_STROBE_END_TRIG1	(0 << 0)
108 #define		MT9M032_READ_MODE1_STROBE_END_EXP	(1 << 0)
109 #define		MT9M032_READ_MODE1_STROBE_END_SHUTTER	(2 << 0)
110 #define		MT9M032_READ_MODE1_STROBE_END_TRIG2	(3 << 0)
111 #define MT9M032_READ_MODE2				0x20
112 #define		MT9M032_READ_MODE2_VFLIP_SHIFT		15
113 #define		MT9M032_READ_MODE2_HFLIP_SHIFT		14
114 #define		MT9M032_READ_MODE2_ROW_BLC		0x40
115 #define MT9M032_GAIN_GREEN1				0x2b
116 #define MT9M032_GAIN_BLUE				0x2c
117 #define MT9M032_GAIN_RED				0x2d
118 #define MT9M032_GAIN_GREEN2				0x2e
119 
120 /* write only */
121 #define MT9M032_GAIN_ALL				0x35
122 #define		MT9M032_GAIN_DIGITAL_MASK		0x7f
123 #define		MT9M032_GAIN_DIGITAL_SHIFT		8
124 #define		MT9M032_GAIN_AMUL_SHIFT			6
125 #define		MT9M032_GAIN_ANALOG_MASK		0x3f
126 #define MT9M032_FORMATTER1				0x9e
127 #define		MT9M032_FORMATTER1_PLL_P1_6		(1 << 8)
128 #define		MT9M032_FORMATTER1_PARALLEL		(1 << 12)
129 #define MT9M032_FORMATTER2				0x9f
130 #define		MT9M032_FORMATTER2_DOUT_EN		0x1000
131 #define		MT9M032_FORMATTER2_PIXCLK_EN		0x2000
132 
133 /*
134  * The available MT9M032 datasheet is missing documentation for register 0x10
135  * MT9P031 seems to be close enough, so use constants from that datasheet for
136  * now.
137  * But keep the name MT9P031 to remind us, that this isn't really confirmed
138  * for this sensor.
139  */
140 #define MT9P031_PLL_CONTROL				0x10
141 #define		MT9P031_PLL_CONTROL_PWROFF		0x0050
142 #define		MT9P031_PLL_CONTROL_PWRON		0x0051
143 #define		MT9P031_PLL_CONTROL_USEPLL		0x0052
144 
145 struct mt9m032 {
146 	struct v4l2_subdev subdev;
147 	struct media_pad pad;
148 	struct mt9m032_platform_data *pdata;
149 
150 	unsigned int pix_clock;
151 
152 	struct v4l2_ctrl_handler ctrls;
153 	struct {
154 		struct v4l2_ctrl *hflip;
155 		struct v4l2_ctrl *vflip;
156 	};
157 
158 	struct mutex lock; /* Protects streaming, format, interval and crop */
159 
160 	bool streaming;
161 
162 	struct v4l2_mbus_framefmt format;
163 	struct v4l2_rect crop;
164 	struct v4l2_fract frame_interval;
165 };
166 
167 #define to_mt9m032(sd)	container_of(sd, struct mt9m032, subdev)
168 #define to_dev(sensor) \
169 	(&((struct i2c_client *)v4l2_get_subdevdata(&(sensor)->subdev))->dev)
170 
mt9m032_read(struct i2c_client * client,u8 reg)171 static int mt9m032_read(struct i2c_client *client, u8 reg)
172 {
173 	return i2c_smbus_read_word_swapped(client, reg);
174 }
175 
mt9m032_write(struct i2c_client * client,u8 reg,const u16 data)176 static int mt9m032_write(struct i2c_client *client, u8 reg, const u16 data)
177 {
178 	return i2c_smbus_write_word_swapped(client, reg, data);
179 }
180 
mt9m032_row_time(struct mt9m032 * sensor,unsigned int width)181 static u32 mt9m032_row_time(struct mt9m032 *sensor, unsigned int width)
182 {
183 	unsigned int effective_width;
184 	u32 ns;
185 
186 	effective_width = width + 716; /* empirical value */
187 	ns = div_u64(1000000000ULL * effective_width, sensor->pix_clock);
188 	dev_dbg(to_dev(sensor),	"MT9M032 line time: %u ns\n", ns);
189 	return ns;
190 }
191 
mt9m032_update_timing(struct mt9m032 * sensor,struct v4l2_fract * interval)192 static int mt9m032_update_timing(struct mt9m032 *sensor,
193 				 struct v4l2_fract *interval)
194 {
195 	struct i2c_client *client = v4l2_get_subdevdata(&sensor->subdev);
196 	struct v4l2_rect *crop = &sensor->crop;
197 	unsigned int min_vblank;
198 	unsigned int vblank;
199 	u32 row_time;
200 
201 	if (!interval)
202 		interval = &sensor->frame_interval;
203 
204 	row_time = mt9m032_row_time(sensor, crop->width);
205 
206 	vblank = div_u64(1000000000ULL * interval->numerator,
207 			 (u64)row_time * interval->denominator)
208 	       - crop->height;
209 
210 	if (vblank > MT9M032_VBLANK_MAX) {
211 		/* hardware limits to 11 bit values */
212 		interval->denominator = 1000;
213 		interval->numerator =
214 			div_u64((crop->height + MT9M032_VBLANK_MAX) *
215 				(u64)row_time * interval->denominator,
216 				1000000000ULL);
217 		vblank = div_u64(1000000000ULL * interval->numerator,
218 				 (u64)row_time * interval->denominator)
219 		       - crop->height;
220 	}
221 	/* enforce minimal 1.6ms blanking time. */
222 	min_vblank = 1600000 / row_time;
223 	vblank = clamp_t(unsigned int, vblank, min_vblank, MT9M032_VBLANK_MAX);
224 
225 	return mt9m032_write(client, MT9M032_VBLANK, vblank);
226 }
227 
mt9m032_update_geom_timing(struct mt9m032 * sensor)228 static int mt9m032_update_geom_timing(struct mt9m032 *sensor)
229 {
230 	struct i2c_client *client = v4l2_get_subdevdata(&sensor->subdev);
231 	int ret;
232 
233 	ret = mt9m032_write(client, MT9M032_COLUMN_SIZE,
234 			    sensor->crop.width - 1);
235 	if (!ret)
236 		ret = mt9m032_write(client, MT9M032_ROW_SIZE,
237 				    sensor->crop.height - 1);
238 	if (!ret)
239 		ret = mt9m032_write(client, MT9M032_COLUMN_START,
240 				    sensor->crop.left);
241 	if (!ret)
242 		ret = mt9m032_write(client, MT9M032_ROW_START,
243 				    sensor->crop.top);
244 	if (!ret)
245 		ret = mt9m032_update_timing(sensor, NULL);
246 	return ret;
247 }
248 
update_formatter2(struct mt9m032 * sensor,bool streaming)249 static int update_formatter2(struct mt9m032 *sensor, bool streaming)
250 {
251 	struct i2c_client *client = v4l2_get_subdevdata(&sensor->subdev);
252 	u16 reg_val =   MT9M032_FORMATTER2_DOUT_EN
253 		      | 0x0070;  /* parts reserved! */
254 				 /* possibly for changing to 14-bit mode */
255 
256 	if (streaming)
257 		reg_val |= MT9M032_FORMATTER2_PIXCLK_EN;   /* pixclock enable */
258 
259 	return mt9m032_write(client, MT9M032_FORMATTER2, reg_val);
260 }
261 
mt9m032_setup_pll(struct mt9m032 * sensor)262 static int mt9m032_setup_pll(struct mt9m032 *sensor)
263 {
264 	static const struct aptina_pll_limits limits = {
265 		.ext_clock_min = 8000000,
266 		.ext_clock_max = 16500000,
267 		.int_clock_min = 2000000,
268 		.int_clock_max = 24000000,
269 		.out_clock_min = 322000000,
270 		.out_clock_max = 693000000,
271 		.pix_clock_max = 99000000,
272 		.n_min = 1,
273 		.n_max = 64,
274 		.m_min = 16,
275 		.m_max = 255,
276 		.p1_min = 6,
277 		.p1_max = 7,
278 	};
279 
280 	struct i2c_client *client = v4l2_get_subdevdata(&sensor->subdev);
281 	struct mt9m032_platform_data *pdata = sensor->pdata;
282 	struct aptina_pll pll;
283 	u16 reg_val;
284 	int ret;
285 
286 	pll.ext_clock = pdata->ext_clock;
287 	pll.pix_clock = pdata->pix_clock;
288 
289 	ret = aptina_pll_calculate(&client->dev, &limits, &pll);
290 	if (ret < 0)
291 		return ret;
292 
293 	sensor->pix_clock = pdata->pix_clock;
294 
295 	ret = mt9m032_write(client, MT9M032_PLL_CONFIG1,
296 			    (pll.m << MT9M032_PLL_CONFIG1_MUL_SHIFT) |
297 			    ((pll.n - 1) & MT9M032_PLL_CONFIG1_PREDIV_MASK));
298 	if (!ret)
299 		ret = mt9m032_write(client, MT9P031_PLL_CONTROL,
300 				    MT9P031_PLL_CONTROL_PWRON |
301 				    MT9P031_PLL_CONTROL_USEPLL);
302 	if (!ret)		/* more reserved, Continuous, Master Mode */
303 		ret = mt9m032_write(client, MT9M032_READ_MODE1, 0x8000 |
304 				    MT9M032_READ_MODE1_STROBE_START_EXP |
305 				    MT9M032_READ_MODE1_STROBE_END_SHUTTER);
306 	if (!ret) {
307 		reg_val = (pll.p1 == 6 ? MT9M032_FORMATTER1_PLL_P1_6 : 0)
308 			| MT9M032_FORMATTER1_PARALLEL | 0x001e; /* 14-bit */
309 		ret = mt9m032_write(client, MT9M032_FORMATTER1, reg_val);
310 	}
311 
312 	return ret;
313 }
314 
315 /* -----------------------------------------------------------------------------
316  * Subdev pad operations
317  */
318 
mt9m032_enum_mbus_code(struct v4l2_subdev * subdev,struct v4l2_subdev_pad_config * cfg,struct v4l2_subdev_mbus_code_enum * code)319 static int mt9m032_enum_mbus_code(struct v4l2_subdev *subdev,
320 				  struct v4l2_subdev_pad_config *cfg,
321 				  struct v4l2_subdev_mbus_code_enum *code)
322 {
323 	if (code->index != 0)
324 		return -EINVAL;
325 
326 	code->code = MEDIA_BUS_FMT_Y8_1X8;
327 	return 0;
328 }
329 
mt9m032_enum_frame_size(struct v4l2_subdev * subdev,struct v4l2_subdev_pad_config * cfg,struct v4l2_subdev_frame_size_enum * fse)330 static int mt9m032_enum_frame_size(struct v4l2_subdev *subdev,
331 				   struct v4l2_subdev_pad_config *cfg,
332 				   struct v4l2_subdev_frame_size_enum *fse)
333 {
334 	if (fse->index != 0 || fse->code != MEDIA_BUS_FMT_Y8_1X8)
335 		return -EINVAL;
336 
337 	fse->min_width = MT9M032_COLUMN_SIZE_DEF;
338 	fse->max_width = MT9M032_COLUMN_SIZE_DEF;
339 	fse->min_height = MT9M032_ROW_SIZE_DEF;
340 	fse->max_height = MT9M032_ROW_SIZE_DEF;
341 
342 	return 0;
343 }
344 
345 /**
346  * __mt9m032_get_pad_crop() - get crop rect
347  * @sensor: pointer to the sensor struct
348  * @cfg: v4l2_subdev_pad_config for getting the try crop rect from
349  * @which: select try or active crop rect
350  *
351  * Returns a pointer the current active or fh relative try crop rect
352  */
353 static struct v4l2_rect *
__mt9m032_get_pad_crop(struct mt9m032 * sensor,struct v4l2_subdev_pad_config * cfg,enum v4l2_subdev_format_whence which)354 __mt9m032_get_pad_crop(struct mt9m032 *sensor, struct v4l2_subdev_pad_config *cfg,
355 		       enum v4l2_subdev_format_whence which)
356 {
357 	switch (which) {
358 	case V4L2_SUBDEV_FORMAT_TRY:
359 		return v4l2_subdev_get_try_crop(&sensor->subdev, cfg, 0);
360 	case V4L2_SUBDEV_FORMAT_ACTIVE:
361 		return &sensor->crop;
362 	default:
363 		return NULL;
364 	}
365 }
366 
367 /**
368  * __mt9m032_get_pad_format() - get format
369  * @sensor: pointer to the sensor struct
370  * @cfg: v4l2_subdev_pad_config for getting the try format from
371  * @which: select try or active format
372  *
373  * Returns a pointer the current active or fh relative try format
374  */
375 static struct v4l2_mbus_framefmt *
__mt9m032_get_pad_format(struct mt9m032 * sensor,struct v4l2_subdev_pad_config * cfg,enum v4l2_subdev_format_whence which)376 __mt9m032_get_pad_format(struct mt9m032 *sensor, struct v4l2_subdev_pad_config *cfg,
377 			 enum v4l2_subdev_format_whence which)
378 {
379 	switch (which) {
380 	case V4L2_SUBDEV_FORMAT_TRY:
381 		return v4l2_subdev_get_try_format(&sensor->subdev, cfg, 0);
382 	case V4L2_SUBDEV_FORMAT_ACTIVE:
383 		return &sensor->format;
384 	default:
385 		return NULL;
386 	}
387 }
388 
mt9m032_get_pad_format(struct v4l2_subdev * subdev,struct v4l2_subdev_pad_config * cfg,struct v4l2_subdev_format * fmt)389 static int mt9m032_get_pad_format(struct v4l2_subdev *subdev,
390 				  struct v4l2_subdev_pad_config *cfg,
391 				  struct v4l2_subdev_format *fmt)
392 {
393 	struct mt9m032 *sensor = to_mt9m032(subdev);
394 
395 	mutex_lock(&sensor->lock);
396 	fmt->format = *__mt9m032_get_pad_format(sensor, cfg, fmt->which);
397 	mutex_unlock(&sensor->lock);
398 
399 	return 0;
400 }
401 
mt9m032_set_pad_format(struct v4l2_subdev * subdev,struct v4l2_subdev_pad_config * cfg,struct v4l2_subdev_format * fmt)402 static int mt9m032_set_pad_format(struct v4l2_subdev *subdev,
403 				  struct v4l2_subdev_pad_config *cfg,
404 				  struct v4l2_subdev_format *fmt)
405 {
406 	struct mt9m032 *sensor = to_mt9m032(subdev);
407 	int ret;
408 
409 	mutex_lock(&sensor->lock);
410 
411 	if (sensor->streaming && fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
412 		ret = -EBUSY;
413 		goto done;
414 	}
415 
416 	/* Scaling is not supported, the format is thus fixed. */
417 	fmt->format = *__mt9m032_get_pad_format(sensor, cfg, fmt->which);
418 	ret = 0;
419 
420 done:
421 	mutex_unlock(&sensor->lock);
422 	return ret;
423 }
424 
mt9m032_get_pad_selection(struct v4l2_subdev * subdev,struct v4l2_subdev_pad_config * cfg,struct v4l2_subdev_selection * sel)425 static int mt9m032_get_pad_selection(struct v4l2_subdev *subdev,
426 				     struct v4l2_subdev_pad_config *cfg,
427 				     struct v4l2_subdev_selection *sel)
428 {
429 	struct mt9m032 *sensor = to_mt9m032(subdev);
430 
431 	if (sel->target != V4L2_SEL_TGT_CROP)
432 		return -EINVAL;
433 
434 	mutex_lock(&sensor->lock);
435 	sel->r = *__mt9m032_get_pad_crop(sensor, cfg, sel->which);
436 	mutex_unlock(&sensor->lock);
437 
438 	return 0;
439 }
440 
mt9m032_set_pad_selection(struct v4l2_subdev * subdev,struct v4l2_subdev_pad_config * cfg,struct v4l2_subdev_selection * sel)441 static int mt9m032_set_pad_selection(struct v4l2_subdev *subdev,
442 				     struct v4l2_subdev_pad_config *cfg,
443 				     struct v4l2_subdev_selection *sel)
444 {
445 	struct mt9m032 *sensor = to_mt9m032(subdev);
446 	struct v4l2_mbus_framefmt *format;
447 	struct v4l2_rect *__crop;
448 	struct v4l2_rect rect;
449 	int ret = 0;
450 
451 	if (sel->target != V4L2_SEL_TGT_CROP)
452 		return -EINVAL;
453 
454 	mutex_lock(&sensor->lock);
455 
456 	if (sensor->streaming && sel->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
457 		ret = -EBUSY;
458 		goto done;
459 	}
460 
461 	/* Clamp the crop rectangle boundaries and align them to a multiple of 2
462 	 * pixels to ensure a GRBG Bayer pattern.
463 	 */
464 	rect.left = clamp(ALIGN(sel->r.left, 2), MT9M032_COLUMN_START_MIN,
465 			  MT9M032_COLUMN_START_MAX);
466 	rect.top = clamp(ALIGN(sel->r.top, 2), MT9M032_ROW_START_MIN,
467 			 MT9M032_ROW_START_MAX);
468 	rect.width = clamp_t(unsigned int, ALIGN(sel->r.width, 2),
469 			     MT9M032_COLUMN_SIZE_MIN, MT9M032_COLUMN_SIZE_MAX);
470 	rect.height = clamp_t(unsigned int, ALIGN(sel->r.height, 2),
471 			      MT9M032_ROW_SIZE_MIN, MT9M032_ROW_SIZE_MAX);
472 
473 	rect.width = min_t(unsigned int, rect.width,
474 			   MT9M032_PIXEL_ARRAY_WIDTH - rect.left);
475 	rect.height = min_t(unsigned int, rect.height,
476 			    MT9M032_PIXEL_ARRAY_HEIGHT - rect.top);
477 
478 	__crop = __mt9m032_get_pad_crop(sensor, cfg, sel->which);
479 
480 	if (rect.width != __crop->width || rect.height != __crop->height) {
481 		/* Reset the output image size if the crop rectangle size has
482 		 * been modified.
483 		 */
484 		format = __mt9m032_get_pad_format(sensor, cfg, sel->which);
485 		format->width = rect.width;
486 		format->height = rect.height;
487 	}
488 
489 	*__crop = rect;
490 	sel->r = rect;
491 
492 	if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE)
493 		ret = mt9m032_update_geom_timing(sensor);
494 
495 done:
496 	mutex_unlock(&sensor->lock);
497 	return ret;
498 }
499 
mt9m032_get_frame_interval(struct v4l2_subdev * subdev,struct v4l2_subdev_frame_interval * fi)500 static int mt9m032_get_frame_interval(struct v4l2_subdev *subdev,
501 				      struct v4l2_subdev_frame_interval *fi)
502 {
503 	struct mt9m032 *sensor = to_mt9m032(subdev);
504 
505 	mutex_lock(&sensor->lock);
506 	memset(fi, 0, sizeof(*fi));
507 	fi->interval = sensor->frame_interval;
508 	mutex_unlock(&sensor->lock);
509 
510 	return 0;
511 }
512 
mt9m032_set_frame_interval(struct v4l2_subdev * subdev,struct v4l2_subdev_frame_interval * fi)513 static int mt9m032_set_frame_interval(struct v4l2_subdev *subdev,
514 				      struct v4l2_subdev_frame_interval *fi)
515 {
516 	struct mt9m032 *sensor = to_mt9m032(subdev);
517 	int ret;
518 
519 	mutex_lock(&sensor->lock);
520 
521 	if (sensor->streaming) {
522 		ret = -EBUSY;
523 		goto done;
524 	}
525 
526 	/* Avoid divisions by 0. */
527 	if (fi->interval.denominator == 0)
528 		fi->interval.denominator = 1;
529 
530 	ret = mt9m032_update_timing(sensor, &fi->interval);
531 	if (!ret)
532 		sensor->frame_interval = fi->interval;
533 
534 done:
535 	mutex_unlock(&sensor->lock);
536 	return ret;
537 }
538 
mt9m032_s_stream(struct v4l2_subdev * subdev,int streaming)539 static int mt9m032_s_stream(struct v4l2_subdev *subdev, int streaming)
540 {
541 	struct mt9m032 *sensor = to_mt9m032(subdev);
542 	int ret;
543 
544 	mutex_lock(&sensor->lock);
545 	ret = update_formatter2(sensor, streaming);
546 	if (!ret)
547 		sensor->streaming = streaming;
548 	mutex_unlock(&sensor->lock);
549 
550 	return ret;
551 }
552 
553 /* -----------------------------------------------------------------------------
554  * V4L2 subdev core operations
555  */
556 
557 #ifdef CONFIG_VIDEO_ADV_DEBUG
mt9m032_g_register(struct v4l2_subdev * sd,struct v4l2_dbg_register * reg)558 static int mt9m032_g_register(struct v4l2_subdev *sd,
559 			      struct v4l2_dbg_register *reg)
560 {
561 	struct mt9m032 *sensor = to_mt9m032(sd);
562 	struct i2c_client *client = v4l2_get_subdevdata(&sensor->subdev);
563 	int val;
564 
565 	if (reg->reg > 0xff)
566 		return -EINVAL;
567 
568 	val = mt9m032_read(client, reg->reg);
569 	if (val < 0)
570 		return -EIO;
571 
572 	reg->size = 2;
573 	reg->val = val;
574 
575 	return 0;
576 }
577 
mt9m032_s_register(struct v4l2_subdev * sd,const struct v4l2_dbg_register * reg)578 static int mt9m032_s_register(struct v4l2_subdev *sd,
579 			      const struct v4l2_dbg_register *reg)
580 {
581 	struct mt9m032 *sensor = to_mt9m032(sd);
582 	struct i2c_client *client = v4l2_get_subdevdata(&sensor->subdev);
583 
584 	if (reg->reg > 0xff)
585 		return -EINVAL;
586 
587 	return mt9m032_write(client, reg->reg, reg->val);
588 }
589 #endif
590 
591 /* -----------------------------------------------------------------------------
592  * V4L2 subdev control operations
593  */
594 
update_read_mode2(struct mt9m032 * sensor,bool vflip,bool hflip)595 static int update_read_mode2(struct mt9m032 *sensor, bool vflip, bool hflip)
596 {
597 	struct i2c_client *client = v4l2_get_subdevdata(&sensor->subdev);
598 	int reg_val = (vflip << MT9M032_READ_MODE2_VFLIP_SHIFT)
599 		    | (hflip << MT9M032_READ_MODE2_HFLIP_SHIFT)
600 		    | MT9M032_READ_MODE2_ROW_BLC
601 		    | 0x0007;
602 
603 	return mt9m032_write(client, MT9M032_READ_MODE2, reg_val);
604 }
605 
mt9m032_set_gain(struct mt9m032 * sensor,s32 val)606 static int mt9m032_set_gain(struct mt9m032 *sensor, s32 val)
607 {
608 	struct i2c_client *client = v4l2_get_subdevdata(&sensor->subdev);
609 	int digital_gain_val;	/* in 1/8th (0..127) */
610 	int analog_mul;		/* 0 or 1 */
611 	int analog_gain_val;	/* in 1/16th. (0..63) */
612 	u16 reg_val;
613 
614 	digital_gain_val = 51; /* from setup example */
615 
616 	if (val < 63) {
617 		analog_mul = 0;
618 		analog_gain_val = val;
619 	} else {
620 		analog_mul = 1;
621 		analog_gain_val = val / 2;
622 	}
623 
624 	/* a_gain = (1 + analog_mul) + (analog_gain_val + 1) / 16 */
625 	/* overall_gain = a_gain * (1 + digital_gain_val / 8) */
626 
627 	reg_val = ((digital_gain_val & MT9M032_GAIN_DIGITAL_MASK)
628 		   << MT9M032_GAIN_DIGITAL_SHIFT)
629 		| ((analog_mul & 1) << MT9M032_GAIN_AMUL_SHIFT)
630 		| (analog_gain_val & MT9M032_GAIN_ANALOG_MASK);
631 
632 	return mt9m032_write(client, MT9M032_GAIN_ALL, reg_val);
633 }
634 
mt9m032_try_ctrl(struct v4l2_ctrl * ctrl)635 static int mt9m032_try_ctrl(struct v4l2_ctrl *ctrl)
636 {
637 	if (ctrl->id == V4L2_CID_GAIN && ctrl->val >= 63) {
638 		/* round because of multiplier used for values >= 63 */
639 		ctrl->val &= ~1;
640 	}
641 
642 	return 0;
643 }
644 
mt9m032_set_ctrl(struct v4l2_ctrl * ctrl)645 static int mt9m032_set_ctrl(struct v4l2_ctrl *ctrl)
646 {
647 	struct mt9m032 *sensor =
648 		container_of(ctrl->handler, struct mt9m032, ctrls);
649 	struct i2c_client *client = v4l2_get_subdevdata(&sensor->subdev);
650 	int ret;
651 
652 	switch (ctrl->id) {
653 	case V4L2_CID_GAIN:
654 		return mt9m032_set_gain(sensor, ctrl->val);
655 
656 	case V4L2_CID_HFLIP:
657 	/* case V4L2_CID_VFLIP: -- In the same cluster */
658 		return update_read_mode2(sensor, sensor->vflip->val,
659 					 sensor->hflip->val);
660 
661 	case V4L2_CID_EXPOSURE:
662 		ret = mt9m032_write(client, MT9M032_SHUTTER_WIDTH_HIGH,
663 				    (ctrl->val >> 16) & 0xffff);
664 		if (ret < 0)
665 			return ret;
666 
667 		return mt9m032_write(client, MT9M032_SHUTTER_WIDTH_LOW,
668 				     ctrl->val & 0xffff);
669 	}
670 
671 	return 0;
672 }
673 
674 static struct v4l2_ctrl_ops mt9m032_ctrl_ops = {
675 	.s_ctrl = mt9m032_set_ctrl,
676 	.try_ctrl = mt9m032_try_ctrl,
677 };
678 
679 /* -------------------------------------------------------------------------- */
680 
681 static const struct v4l2_subdev_core_ops mt9m032_core_ops = {
682 #ifdef CONFIG_VIDEO_ADV_DEBUG
683 	.g_register = mt9m032_g_register,
684 	.s_register = mt9m032_s_register,
685 #endif
686 };
687 
688 static const struct v4l2_subdev_video_ops mt9m032_video_ops = {
689 	.s_stream = mt9m032_s_stream,
690 	.g_frame_interval = mt9m032_get_frame_interval,
691 	.s_frame_interval = mt9m032_set_frame_interval,
692 };
693 
694 static const struct v4l2_subdev_pad_ops mt9m032_pad_ops = {
695 	.enum_mbus_code = mt9m032_enum_mbus_code,
696 	.enum_frame_size = mt9m032_enum_frame_size,
697 	.get_fmt = mt9m032_get_pad_format,
698 	.set_fmt = mt9m032_set_pad_format,
699 	.set_selection = mt9m032_set_pad_selection,
700 	.get_selection = mt9m032_get_pad_selection,
701 };
702 
703 static const struct v4l2_subdev_ops mt9m032_ops = {
704 	.core = &mt9m032_core_ops,
705 	.video = &mt9m032_video_ops,
706 	.pad = &mt9m032_pad_ops,
707 };
708 
709 /* -----------------------------------------------------------------------------
710  * Driver initialization and probing
711  */
712 
mt9m032_probe(struct i2c_client * client,const struct i2c_device_id * devid)713 static int mt9m032_probe(struct i2c_client *client,
714 			 const struct i2c_device_id *devid)
715 {
716 	struct mt9m032_platform_data *pdata = client->dev.platform_data;
717 	struct i2c_adapter *adapter = client->adapter;
718 	struct mt9m032 *sensor;
719 	int chip_version;
720 	int ret;
721 
722 	if (pdata == NULL) {
723 		dev_err(&client->dev, "No platform data\n");
724 		return -EINVAL;
725 	}
726 
727 	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) {
728 		dev_warn(&client->dev,
729 			 "I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD\n");
730 		return -EIO;
731 	}
732 
733 	if (!client->dev.platform_data)
734 		return -ENODEV;
735 
736 	sensor = devm_kzalloc(&client->dev, sizeof(*sensor), GFP_KERNEL);
737 	if (sensor == NULL)
738 		return -ENOMEM;
739 
740 	mutex_init(&sensor->lock);
741 
742 	sensor->pdata = pdata;
743 
744 	v4l2_i2c_subdev_init(&sensor->subdev, client, &mt9m032_ops);
745 	sensor->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
746 
747 	chip_version = mt9m032_read(client, MT9M032_CHIP_VERSION);
748 	if (chip_version != MT9M032_CHIP_VERSION_VALUE) {
749 		dev_err(&client->dev, "MT9M032 not detected, wrong version "
750 			"0x%04x\n", chip_version);
751 		ret = -ENODEV;
752 		goto error_sensor;
753 	}
754 
755 	dev_info(&client->dev, "MT9M032 detected at address 0x%02x\n",
756 		 client->addr);
757 
758 	sensor->frame_interval.numerator = 1;
759 	sensor->frame_interval.denominator = 30;
760 
761 	sensor->crop.left = MT9M032_COLUMN_START_DEF;
762 	sensor->crop.top = MT9M032_ROW_START_DEF;
763 	sensor->crop.width = MT9M032_COLUMN_SIZE_DEF;
764 	sensor->crop.height = MT9M032_ROW_SIZE_DEF;
765 
766 	sensor->format.width = sensor->crop.width;
767 	sensor->format.height = sensor->crop.height;
768 	sensor->format.code = MEDIA_BUS_FMT_Y8_1X8;
769 	sensor->format.field = V4L2_FIELD_NONE;
770 	sensor->format.colorspace = V4L2_COLORSPACE_SRGB;
771 
772 	v4l2_ctrl_handler_init(&sensor->ctrls, 5);
773 
774 	v4l2_ctrl_new_std(&sensor->ctrls, &mt9m032_ctrl_ops,
775 			  V4L2_CID_GAIN, 0, 127, 1, 64);
776 
777 	sensor->hflip = v4l2_ctrl_new_std(&sensor->ctrls,
778 					  &mt9m032_ctrl_ops,
779 					  V4L2_CID_HFLIP, 0, 1, 1, 0);
780 	sensor->vflip = v4l2_ctrl_new_std(&sensor->ctrls,
781 					  &mt9m032_ctrl_ops,
782 					  V4L2_CID_VFLIP, 0, 1, 1, 0);
783 
784 	v4l2_ctrl_new_std(&sensor->ctrls, &mt9m032_ctrl_ops,
785 			  V4L2_CID_EXPOSURE, MT9M032_SHUTTER_WIDTH_MIN,
786 			  MT9M032_SHUTTER_WIDTH_MAX, 1,
787 			  MT9M032_SHUTTER_WIDTH_DEF);
788 	v4l2_ctrl_new_std(&sensor->ctrls, &mt9m032_ctrl_ops,
789 			  V4L2_CID_PIXEL_RATE, pdata->pix_clock,
790 			  pdata->pix_clock, 1, pdata->pix_clock);
791 
792 	if (sensor->ctrls.error) {
793 		ret = sensor->ctrls.error;
794 		dev_err(&client->dev, "control initialization error %d\n", ret);
795 		goto error_ctrl;
796 	}
797 
798 	v4l2_ctrl_cluster(2, &sensor->hflip);
799 
800 	sensor->subdev.ctrl_handler = &sensor->ctrls;
801 	sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
802 	ret = media_entity_init(&sensor->subdev.entity, 1, &sensor->pad, 0);
803 	if (ret < 0)
804 		goto error_ctrl;
805 
806 	ret = mt9m032_write(client, MT9M032_RESET, 1);	/* reset on */
807 	if (ret < 0)
808 		goto error_entity;
809 	ret = mt9m032_write(client, MT9M032_RESET, 0);	/* reset off */
810 	if (ret < 0)
811 		goto error_entity;
812 
813 	ret = mt9m032_setup_pll(sensor);
814 	if (ret < 0)
815 		goto error_entity;
816 	usleep_range(10000, 11000);
817 
818 	ret = v4l2_ctrl_handler_setup(&sensor->ctrls);
819 	if (ret < 0)
820 		goto error_entity;
821 
822 	/* SIZE */
823 	ret = mt9m032_update_geom_timing(sensor);
824 	if (ret < 0)
825 		goto error_entity;
826 
827 	ret = mt9m032_write(client, 0x41, 0x0000);	/* reserved !!! */
828 	if (ret < 0)
829 		goto error_entity;
830 	ret = mt9m032_write(client, 0x42, 0x0003);	/* reserved !!! */
831 	if (ret < 0)
832 		goto error_entity;
833 	ret = mt9m032_write(client, 0x43, 0x0003);	/* reserved !!! */
834 	if (ret < 0)
835 		goto error_entity;
836 	ret = mt9m032_write(client, 0x7f, 0x0000);	/* reserved !!! */
837 	if (ret < 0)
838 		goto error_entity;
839 	if (sensor->pdata->invert_pixclock) {
840 		ret = mt9m032_write(client, MT9M032_PIX_CLK_CTRL,
841 				    MT9M032_PIX_CLK_CTRL_INV_PIXCLK);
842 		if (ret < 0)
843 			goto error_entity;
844 	}
845 
846 	ret = mt9m032_write(client, MT9M032_RESTART, 1); /* Restart on */
847 	if (ret < 0)
848 		goto error_entity;
849 	msleep(100);
850 	ret = mt9m032_write(client, MT9M032_RESTART, 0); /* Restart off */
851 	if (ret < 0)
852 		goto error_entity;
853 	msleep(100);
854 	ret = update_formatter2(sensor, false);
855 	if (ret < 0)
856 		goto error_entity;
857 
858 	return ret;
859 
860 error_entity:
861 	media_entity_cleanup(&sensor->subdev.entity);
862 error_ctrl:
863 	v4l2_ctrl_handler_free(&sensor->ctrls);
864 error_sensor:
865 	mutex_destroy(&sensor->lock);
866 	return ret;
867 }
868 
mt9m032_remove(struct i2c_client * client)869 static int mt9m032_remove(struct i2c_client *client)
870 {
871 	struct v4l2_subdev *subdev = i2c_get_clientdata(client);
872 	struct mt9m032 *sensor = to_mt9m032(subdev);
873 
874 	v4l2_device_unregister_subdev(subdev);
875 	v4l2_ctrl_handler_free(&sensor->ctrls);
876 	media_entity_cleanup(&subdev->entity);
877 	mutex_destroy(&sensor->lock);
878 	return 0;
879 }
880 
881 static const struct i2c_device_id mt9m032_id_table[] = {
882 	{ MT9M032_NAME, 0 },
883 	{ }
884 };
885 
886 MODULE_DEVICE_TABLE(i2c, mt9m032_id_table);
887 
888 static struct i2c_driver mt9m032_i2c_driver = {
889 	.driver = {
890 		.name = MT9M032_NAME,
891 	},
892 	.probe = mt9m032_probe,
893 	.remove = mt9m032_remove,
894 	.id_table = mt9m032_id_table,
895 };
896 
897 module_i2c_driver(mt9m032_i2c_driver);
898 
899 MODULE_AUTHOR("Martin Hostettler <martin@neutronstar.dyndns.org>");
900 MODULE_DESCRIPTION("MT9M032 camera sensor driver");
901 MODULE_LICENSE("GPL v2");
902