2 * Driver for MT9T031 CMOS Image Sensor from Micron
4 * Copyright (C) 2008, Guennadi Liakhovetski, DENX Software Engineering <lg@denx.de>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
11 #include <linux/device.h>
12 #include <linux/i2c.h>
13 #include <linux/log2.h>
15 #include <linux/slab.h>
16 #include <linux/v4l2-mediabus.h>
17 #include <linux/videodev2.h>
18 #include <linux/module.h>
20 #include <media/soc_camera.h>
21 #include <media/v4l2-clk.h>
22 #include <media/v4l2-subdev.h>
23 #include <media/v4l2-ctrls.h>
26 * ATTENTION: this driver still cannot be used outside of the soc-camera
27 * framework because of its PM implementation, using the video_device node.
28 * If hardware becomes available for testing, alternative PM approaches shall
29 * be considered and tested.
33 * mt9t031 i2c address 0x5d
34 * The platform has to define struct i2c_board_info objects and link to them
35 * from struct soc_camera_host_desc
38 /* mt9t031 selected register addresses */
39 #define MT9T031_CHIP_VERSION 0x00
40 #define MT9T031_ROW_START 0x01
41 #define MT9T031_COLUMN_START 0x02
42 #define MT9T031_WINDOW_HEIGHT 0x03
43 #define MT9T031_WINDOW_WIDTH 0x04
44 #define MT9T031_HORIZONTAL_BLANKING 0x05
45 #define MT9T031_VERTICAL_BLANKING 0x06
46 #define MT9T031_OUTPUT_CONTROL 0x07
47 #define MT9T031_SHUTTER_WIDTH_UPPER 0x08
48 #define MT9T031_SHUTTER_WIDTH 0x09
49 #define MT9T031_PIXEL_CLOCK_CONTROL 0x0a
50 #define MT9T031_FRAME_RESTART 0x0b
51 #define MT9T031_SHUTTER_DELAY 0x0c
52 #define MT9T031_RESET 0x0d
53 #define MT9T031_READ_MODE_1 0x1e
54 #define MT9T031_READ_MODE_2 0x20
55 #define MT9T031_READ_MODE_3 0x21
56 #define MT9T031_ROW_ADDRESS_MODE 0x22
57 #define MT9T031_COLUMN_ADDRESS_MODE 0x23
58 #define MT9T031_GLOBAL_GAIN 0x35
59 #define MT9T031_CHIP_ENABLE 0xF8
61 #define MT9T031_MAX_HEIGHT 1536
62 #define MT9T031_MAX_WIDTH 2048
63 #define MT9T031_MIN_HEIGHT 2
64 #define MT9T031_MIN_WIDTH 18
65 #define MT9T031_HORIZONTAL_BLANK 142
66 #define MT9T031_VERTICAL_BLANK 25
67 #define MT9T031_COLUMN_SKIP 32
68 #define MT9T031_ROW_SKIP 20
71 struct v4l2_subdev subdev
;
72 struct v4l2_ctrl_handler hdl
;
74 /* exposure/auto-exposure cluster */
75 struct v4l2_ctrl
*autoexposure
;
76 struct v4l2_ctrl
*exposure
;
78 struct v4l2_rect rect
; /* Sensor window */
83 unsigned short y_skip_top
; /* Lines to skip at the top */
86 static struct mt9t031
*to_mt9t031(const struct i2c_client
*client
)
88 return container_of(i2c_get_clientdata(client
), struct mt9t031
, subdev
);
91 static int reg_read(struct i2c_client
*client
, const u8 reg
)
93 return i2c_smbus_read_word_swapped(client
, reg
);
96 static int reg_write(struct i2c_client
*client
, const u8 reg
,
99 return i2c_smbus_write_word_swapped(client
, reg
, data
);
102 static int reg_set(struct i2c_client
*client
, const u8 reg
,
107 ret
= reg_read(client
, reg
);
110 return reg_write(client
, reg
, ret
| data
);
113 static int reg_clear(struct i2c_client
*client
, const u8 reg
,
118 ret
= reg_read(client
, reg
);
121 return reg_write(client
, reg
, ret
& ~data
);
124 static int set_shutter(struct i2c_client
*client
, const u32 data
)
128 ret
= reg_write(client
, MT9T031_SHUTTER_WIDTH_UPPER
, data
>> 16);
131 ret
= reg_write(client
, MT9T031_SHUTTER_WIDTH
, data
& 0xffff);
136 static int get_shutter(struct i2c_client
*client
, u32
*data
)
140 ret
= reg_read(client
, MT9T031_SHUTTER_WIDTH_UPPER
);
144 ret
= reg_read(client
, MT9T031_SHUTTER_WIDTH
);
145 *data
|= ret
& 0xffff;
147 return ret
< 0 ? ret
: 0;
150 static int mt9t031_idle(struct i2c_client
*client
)
154 /* Disable chip output, synchronous option update */
155 ret
= reg_write(client
, MT9T031_RESET
, 1);
157 ret
= reg_write(client
, MT9T031_RESET
, 0);
159 ret
= reg_clear(client
, MT9T031_OUTPUT_CONTROL
, 2);
161 return ret
>= 0 ? 0 : -EIO
;
164 static int mt9t031_s_stream(struct v4l2_subdev
*sd
, int enable
)
166 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
170 /* Switch to master "normal" mode */
171 ret
= reg_set(client
, MT9T031_OUTPUT_CONTROL
, 2);
173 /* Stop sensor readout */
174 ret
= reg_clear(client
, MT9T031_OUTPUT_CONTROL
, 2);
182 /* target must be _even_ */
183 static u16
mt9t031_skip(s32
*source
, s32 target
, s32 max
)
187 if (*source
< target
+ target
/ 2) {
192 skip
= min(max
, *source
+ target
/ 2) / target
;
195 *source
= target
* skip
;
200 /* rect is the sensor rectangle, the caller guarantees parameter validity */
201 static int mt9t031_set_params(struct i2c_client
*client
,
202 struct v4l2_rect
*rect
, u16 xskip
, u16 yskip
)
204 struct mt9t031
*mt9t031
= to_mt9t031(client
);
207 const u16 hblank
= MT9T031_HORIZONTAL_BLANK
,
208 vblank
= MT9T031_VERTICAL_BLANK
;
210 xbin
= min(xskip
, (u16
)3);
211 ybin
= min(yskip
, (u16
)3);
214 * Could just do roundup(rect->left, [xy]bin * 2); but this is cheaper.
215 * There is always a valid suitably aligned value. The worst case is
216 * xbin = 3, width = 2048. Then we will start at 36, the last read out
217 * pixel will be 2083, which is < 2085 - first black pixel.
219 * MT9T031 datasheet imposes window left border alignment, depending on
220 * the selected xskip. Failing to conform to this requirement produces
221 * dark horizontal stripes in the image. However, even obeying to this
222 * requirement doesn't eliminate the stripes in all configurations. They
223 * appear "locally reproducibly," but can differ between tests under
224 * different lighting conditions.
234 rect
->left
= rect
->left
> roundup(MT9T031_COLUMN_SKIP
, 6) ?
235 (rect
->left
/ 6) * 6 : roundup(MT9T031_COLUMN_SKIP
, 6);
240 dev_dbg(&client
->dev
, "skip %u:%u, rect %ux%u@%u:%u\n",
241 xskip
, yskip
, rect
->width
, rect
->height
, rect
->left
, rect
->top
);
243 /* Disable register update, reconfigure atomically */
244 ret
= reg_set(client
, MT9T031_OUTPUT_CONTROL
, 1);
248 /* Blanking and start values - default... */
249 ret
= reg_write(client
, MT9T031_HORIZONTAL_BLANKING
, hblank
);
251 ret
= reg_write(client
, MT9T031_VERTICAL_BLANKING
, vblank
);
253 if (yskip
!= mt9t031
->yskip
|| xskip
!= mt9t031
->xskip
) {
254 /* Binning, skipping */
256 ret
= reg_write(client
, MT9T031_COLUMN_ADDRESS_MODE
,
257 ((xbin
- 1) << 4) | (xskip
- 1));
259 ret
= reg_write(client
, MT9T031_ROW_ADDRESS_MODE
,
260 ((ybin
- 1) << 4) | (yskip
- 1));
262 dev_dbg(&client
->dev
, "new physical left %u, top %u\n",
263 rect
->left
, rect
->top
);
266 * The caller provides a supported format, as guaranteed by
267 * .set_fmt(FORMAT_TRY), soc_camera_s_selection() and soc_camera_cropcap()
270 ret
= reg_write(client
, MT9T031_COLUMN_START
, rect
->left
);
272 ret
= reg_write(client
, MT9T031_ROW_START
, rect
->top
);
274 ret
= reg_write(client
, MT9T031_WINDOW_WIDTH
, rect
->width
- 1);
276 ret
= reg_write(client
, MT9T031_WINDOW_HEIGHT
,
277 rect
->height
+ mt9t031
->y_skip_top
- 1);
278 if (ret
>= 0 && v4l2_ctrl_g_ctrl(mt9t031
->autoexposure
) == V4L2_EXPOSURE_AUTO
) {
279 mt9t031
->total_h
= rect
->height
+ mt9t031
->y_skip_top
+ vblank
;
281 ret
= set_shutter(client
, mt9t031
->total_h
);
284 /* Re-enable register update, commit all changes */
286 ret
= reg_clear(client
, MT9T031_OUTPUT_CONTROL
, 1);
289 mt9t031
->rect
= *rect
;
290 mt9t031
->xskip
= xskip
;
291 mt9t031
->yskip
= yskip
;
294 return ret
< 0 ? ret
: 0;
297 static int mt9t031_set_selection(struct v4l2_subdev
*sd
,
298 struct v4l2_subdev_pad_config
*cfg
,
299 struct v4l2_subdev_selection
*sel
)
301 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
302 struct mt9t031
*mt9t031
= to_mt9t031(client
);
303 struct v4l2_rect rect
= sel
->r
;
305 if (sel
->which
!= V4L2_SUBDEV_FORMAT_ACTIVE
||
306 sel
->target
!= V4L2_SEL_TGT_CROP
)
309 rect
.width
= ALIGN(rect
.width
, 2);
310 rect
.height
= ALIGN(rect
.height
, 2);
312 soc_camera_limit_side(&rect
.left
, &rect
.width
,
313 MT9T031_COLUMN_SKIP
, MT9T031_MIN_WIDTH
, MT9T031_MAX_WIDTH
);
315 soc_camera_limit_side(&rect
.top
, &rect
.height
,
316 MT9T031_ROW_SKIP
, MT9T031_MIN_HEIGHT
, MT9T031_MAX_HEIGHT
);
318 return mt9t031_set_params(client
, &rect
, mt9t031
->xskip
, mt9t031
->yskip
);
321 static int mt9t031_get_selection(struct v4l2_subdev
*sd
,
322 struct v4l2_subdev_pad_config
*cfg
,
323 struct v4l2_subdev_selection
*sel
)
325 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
326 struct mt9t031
*mt9t031
= to_mt9t031(client
);
328 if (sel
->which
!= V4L2_SUBDEV_FORMAT_ACTIVE
)
331 switch (sel
->target
) {
332 case V4L2_SEL_TGT_CROP_BOUNDS
:
333 case V4L2_SEL_TGT_CROP_DEFAULT
:
334 sel
->r
.left
= MT9T031_COLUMN_SKIP
;
335 sel
->r
.top
= MT9T031_ROW_SKIP
;
336 sel
->r
.width
= MT9T031_MAX_WIDTH
;
337 sel
->r
.height
= MT9T031_MAX_HEIGHT
;
339 case V4L2_SEL_TGT_CROP
:
340 sel
->r
= mt9t031
->rect
;
347 static int mt9t031_get_fmt(struct v4l2_subdev
*sd
,
348 struct v4l2_subdev_pad_config
*cfg
,
349 struct v4l2_subdev_format
*format
)
351 struct v4l2_mbus_framefmt
*mf
= &format
->format
;
352 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
353 struct mt9t031
*mt9t031
= to_mt9t031(client
);
358 mf
->width
= mt9t031
->rect
.width
/ mt9t031
->xskip
;
359 mf
->height
= mt9t031
->rect
.height
/ mt9t031
->yskip
;
360 mf
->code
= MEDIA_BUS_FMT_SBGGR10_1X10
;
361 mf
->colorspace
= V4L2_COLORSPACE_SRGB
;
362 mf
->field
= V4L2_FIELD_NONE
;
368 * If a user window larger than sensor window is requested, we'll increase the
371 static int mt9t031_set_fmt(struct v4l2_subdev
*sd
,
372 struct v4l2_subdev_pad_config
*cfg
,
373 struct v4l2_subdev_format
*format
)
375 struct v4l2_mbus_framefmt
*mf
= &format
->format
;
376 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
377 struct mt9t031
*mt9t031
= to_mt9t031(client
);
379 struct v4l2_rect rect
= mt9t031
->rect
;
384 mf
->code
= MEDIA_BUS_FMT_SBGGR10_1X10
;
385 mf
->colorspace
= V4L2_COLORSPACE_SRGB
;
386 v4l_bound_align_image(
387 &mf
->width
, MT9T031_MIN_WIDTH
, MT9T031_MAX_WIDTH
, 1,
388 &mf
->height
, MT9T031_MIN_HEIGHT
, MT9T031_MAX_HEIGHT
, 1, 0);
390 if (format
->which
== V4L2_SUBDEV_FORMAT_TRY
) {
396 * Width and height are within limits.
397 * S_FMT: use binning and skipping for scaling
399 xskip
= mt9t031_skip(&rect
.width
, mf
->width
, MT9T031_MAX_WIDTH
);
400 yskip
= mt9t031_skip(&rect
.height
, mf
->height
, MT9T031_MAX_HEIGHT
);
402 mf
->code
= MEDIA_BUS_FMT_SBGGR10_1X10
;
403 mf
->colorspace
= V4L2_COLORSPACE_SRGB
;
405 /* mt9t031_set_params() doesn't change width and height */
406 return mt9t031_set_params(client
, &rect
, xskip
, yskip
);
409 #ifdef CONFIG_VIDEO_ADV_DEBUG
410 static int mt9t031_g_register(struct v4l2_subdev
*sd
,
411 struct v4l2_dbg_register
*reg
)
413 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
419 reg
->val
= reg_read(client
, reg
->reg
);
421 if (reg
->val
> 0xffff)
427 static int mt9t031_s_register(struct v4l2_subdev
*sd
,
428 const struct v4l2_dbg_register
*reg
)
430 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
435 if (reg_write(client
, reg
->reg
, reg
->val
) < 0)
442 static int mt9t031_g_volatile_ctrl(struct v4l2_ctrl
*ctrl
)
444 struct mt9t031
*mt9t031
= container_of(ctrl
->handler
,
445 struct mt9t031
, hdl
);
446 const u32 shutter_max
= MT9T031_MAX_HEIGHT
+ MT9T031_VERTICAL_BLANK
;
450 case V4L2_CID_EXPOSURE_AUTO
:
451 min
= mt9t031
->exposure
->minimum
;
452 max
= mt9t031
->exposure
->maximum
;
453 mt9t031
->exposure
->val
=
454 (shutter_max
/ 2 + (mt9t031
->total_h
- 1) * (max
- min
))
461 static int mt9t031_s_ctrl(struct v4l2_ctrl
*ctrl
)
463 struct mt9t031
*mt9t031
= container_of(ctrl
->handler
,
464 struct mt9t031
, hdl
);
465 struct v4l2_subdev
*sd
= &mt9t031
->subdev
;
466 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
467 struct v4l2_ctrl
*exp
= mt9t031
->exposure
;
473 data
= reg_set(client
, MT9T031_READ_MODE_2
, 0x8000);
475 data
= reg_clear(client
, MT9T031_READ_MODE_2
, 0x8000);
481 data
= reg_set(client
, MT9T031_READ_MODE_2
, 0x4000);
483 data
= reg_clear(client
, MT9T031_READ_MODE_2
, 0x4000);
488 /* See Datasheet Table 7, Gain settings. */
489 if (ctrl
->val
<= ctrl
->default_value
) {
490 /* Pack it into 0..1 step 0.125, register values 0..8 */
491 unsigned long range
= ctrl
->default_value
- ctrl
->minimum
;
492 data
= ((ctrl
->val
- (s32
)ctrl
->minimum
) * 8 + range
/ 2) / range
;
494 dev_dbg(&client
->dev
, "Setting gain %d\n", data
);
495 data
= reg_write(client
, MT9T031_GLOBAL_GAIN
, data
);
499 /* Pack it into 1.125..128 variable step, register values 9..0x7860 */
500 /* We assume qctrl->maximum - qctrl->default_value - 1 > 0 */
501 unsigned long range
= ctrl
->maximum
- ctrl
->default_value
- 1;
502 /* calculated gain: map 65..127 to 9..1024 step 0.125 */
503 unsigned long gain
= ((ctrl
->val
- (s32
)ctrl
->default_value
- 1) *
504 1015 + range
/ 2) / range
+ 9;
506 if (gain
<= 32) /* calculated gain 9..32 -> 9..32 */
508 else if (gain
<= 64) /* calculated gain 33..64 -> 0x51..0x60 */
509 data
= ((gain
- 32) * 16 + 16) / 32 + 80;
511 /* calculated gain 65..1024 -> (1..120) << 8 + 0x60 */
512 data
= (((gain
- 64 + 7) * 32) & 0xff00) | 0x60;
514 dev_dbg(&client
->dev
, "Set gain from 0x%x to 0x%x\n",
515 reg_read(client
, MT9T031_GLOBAL_GAIN
), data
);
516 data
= reg_write(client
, MT9T031_GLOBAL_GAIN
, data
);
522 case V4L2_CID_EXPOSURE_AUTO
:
523 if (ctrl
->val
== V4L2_EXPOSURE_MANUAL
) {
524 unsigned int range
= exp
->maximum
- exp
->minimum
;
525 unsigned int shutter
= ((exp
->val
- (s32
)exp
->minimum
) * 1048 +
526 range
/ 2) / range
+ 1;
529 get_shutter(client
, &old
);
530 dev_dbg(&client
->dev
, "Set shutter from %u to %u\n",
532 if (set_shutter(client
, shutter
) < 0)
535 const u16 vblank
= MT9T031_VERTICAL_BLANK
;
536 mt9t031
->total_h
= mt9t031
->rect
.height
+
537 mt9t031
->y_skip_top
+ vblank
;
539 if (set_shutter(client
, mt9t031
->total_h
) < 0)
551 * This function does nothing for now but must be present for pm to work
553 static int mt9t031_runtime_suspend(struct device
*dev
)
560 * COLUMN_ADDRESS_MODE and ROW_ADDRESS_MODE are not rewritten if unchanged
561 * they are however changed at reset if the platform hook is present
562 * thus we rewrite them with the values stored by the driver
564 static int mt9t031_runtime_resume(struct device
*dev
)
566 struct video_device
*vdev
= to_video_device(dev
);
567 struct v4l2_subdev
*sd
= soc_camera_vdev_to_subdev(vdev
);
568 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
569 struct mt9t031
*mt9t031
= to_mt9t031(client
);
574 xbin
= min(mt9t031
->xskip
, (u16
)3);
575 ybin
= min(mt9t031
->yskip
, (u16
)3);
577 ret
= reg_write(client
, MT9T031_COLUMN_ADDRESS_MODE
,
578 ((xbin
- 1) << 4) | (mt9t031
->xskip
- 1));
582 ret
= reg_write(client
, MT9T031_ROW_ADDRESS_MODE
,
583 ((ybin
- 1) << 4) | (mt9t031
->yskip
- 1));
590 static const struct dev_pm_ops mt9t031_dev_pm_ops
= {
591 .runtime_suspend
= mt9t031_runtime_suspend
,
592 .runtime_resume
= mt9t031_runtime_resume
,
595 static struct device_type mt9t031_dev_type
= {
597 .pm
= &mt9t031_dev_pm_ops
,
600 static int mt9t031_s_power(struct v4l2_subdev
*sd
, int on
)
602 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
603 struct soc_camera_subdev_desc
*ssdd
= soc_camera_i2c_to_desc(client
);
604 struct video_device
*vdev
= soc_camera_i2c_to_vdev(client
);
605 struct mt9t031
*mt9t031
= to_mt9t031(client
);
609 ret
= soc_camera_power_on(&client
->dev
, ssdd
, mt9t031
->clk
);
613 /* Not needed during probing, when vdev isn't available yet */
614 vdev
->dev
.type
= &mt9t031_dev_type
;
617 vdev
->dev
.type
= NULL
;
618 soc_camera_power_off(&client
->dev
, ssdd
, mt9t031
->clk
);
625 * Interface active, can use i2c. If it fails, it can indeed mean, that
626 * this wasn't our capture interface, so, we wait for the right one
628 static int mt9t031_video_probe(struct i2c_client
*client
)
630 struct mt9t031
*mt9t031
= to_mt9t031(client
);
634 ret
= mt9t031_s_power(&mt9t031
->subdev
, 1);
638 ret
= mt9t031_idle(client
);
640 dev_err(&client
->dev
, "Failed to initialise the camera\n");
644 /* Read out the chip version register */
645 data
= reg_read(client
, MT9T031_CHIP_VERSION
);
651 dev_err(&client
->dev
,
652 "No MT9T031 chip detected, register read %x\n", data
);
657 dev_info(&client
->dev
, "Detected a MT9T031 chip ID %x\n", data
);
659 ret
= v4l2_ctrl_handler_setup(&mt9t031
->hdl
);
662 mt9t031_s_power(&mt9t031
->subdev
, 0);
667 static int mt9t031_g_skip_top_lines(struct v4l2_subdev
*sd
, u32
*lines
)
669 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
670 struct mt9t031
*mt9t031
= to_mt9t031(client
);
672 *lines
= mt9t031
->y_skip_top
;
677 static const struct v4l2_ctrl_ops mt9t031_ctrl_ops
= {
678 .g_volatile_ctrl
= mt9t031_g_volatile_ctrl
,
679 .s_ctrl
= mt9t031_s_ctrl
,
682 static struct v4l2_subdev_core_ops mt9t031_subdev_core_ops
= {
683 .s_power
= mt9t031_s_power
,
684 #ifdef CONFIG_VIDEO_ADV_DEBUG
685 .g_register
= mt9t031_g_register
,
686 .s_register
= mt9t031_s_register
,
690 static int mt9t031_enum_mbus_code(struct v4l2_subdev
*sd
,
691 struct v4l2_subdev_pad_config
*cfg
,
692 struct v4l2_subdev_mbus_code_enum
*code
)
694 if (code
->pad
|| code
->index
)
697 code
->code
= MEDIA_BUS_FMT_SBGGR10_1X10
;
701 static int mt9t031_g_mbus_config(struct v4l2_subdev
*sd
,
702 struct v4l2_mbus_config
*cfg
)
704 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
705 struct soc_camera_subdev_desc
*ssdd
= soc_camera_i2c_to_desc(client
);
707 cfg
->flags
= V4L2_MBUS_MASTER
| V4L2_MBUS_PCLK_SAMPLE_RISING
|
708 V4L2_MBUS_PCLK_SAMPLE_FALLING
| V4L2_MBUS_HSYNC_ACTIVE_HIGH
|
709 V4L2_MBUS_VSYNC_ACTIVE_HIGH
| V4L2_MBUS_DATA_ACTIVE_HIGH
;
710 cfg
->type
= V4L2_MBUS_PARALLEL
;
711 cfg
->flags
= soc_camera_apply_board_flags(ssdd
, cfg
);
716 static int mt9t031_s_mbus_config(struct v4l2_subdev
*sd
,
717 const struct v4l2_mbus_config
*cfg
)
719 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
720 struct soc_camera_subdev_desc
*ssdd
= soc_camera_i2c_to_desc(client
);
722 if (soc_camera_apply_board_flags(ssdd
, cfg
) &
723 V4L2_MBUS_PCLK_SAMPLE_FALLING
)
724 return reg_clear(client
, MT9T031_PIXEL_CLOCK_CONTROL
, 0x8000);
726 return reg_set(client
, MT9T031_PIXEL_CLOCK_CONTROL
, 0x8000);
729 static struct v4l2_subdev_video_ops mt9t031_subdev_video_ops
= {
730 .s_stream
= mt9t031_s_stream
,
731 .g_mbus_config
= mt9t031_g_mbus_config
,
732 .s_mbus_config
= mt9t031_s_mbus_config
,
735 static const struct v4l2_subdev_sensor_ops mt9t031_subdev_sensor_ops
= {
736 .g_skip_top_lines
= mt9t031_g_skip_top_lines
,
739 static const struct v4l2_subdev_pad_ops mt9t031_subdev_pad_ops
= {
740 .enum_mbus_code
= mt9t031_enum_mbus_code
,
741 .get_selection
= mt9t031_get_selection
,
742 .set_selection
= mt9t031_set_selection
,
743 .get_fmt
= mt9t031_get_fmt
,
744 .set_fmt
= mt9t031_set_fmt
,
747 static struct v4l2_subdev_ops mt9t031_subdev_ops
= {
748 .core
= &mt9t031_subdev_core_ops
,
749 .video
= &mt9t031_subdev_video_ops
,
750 .sensor
= &mt9t031_subdev_sensor_ops
,
751 .pad
= &mt9t031_subdev_pad_ops
,
754 static int mt9t031_probe(struct i2c_client
*client
,
755 const struct i2c_device_id
*did
)
757 struct mt9t031
*mt9t031
;
758 struct soc_camera_subdev_desc
*ssdd
= soc_camera_i2c_to_desc(client
);
759 struct i2c_adapter
*adapter
= to_i2c_adapter(client
->dev
.parent
);
763 dev_err(&client
->dev
, "MT9T031 driver needs platform data\n");
767 if (!i2c_check_functionality(adapter
, I2C_FUNC_SMBUS_WORD_DATA
)) {
768 dev_warn(&adapter
->dev
,
769 "I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD\n");
773 mt9t031
= devm_kzalloc(&client
->dev
, sizeof(struct mt9t031
), GFP_KERNEL
);
777 v4l2_i2c_subdev_init(&mt9t031
->subdev
, client
, &mt9t031_subdev_ops
);
778 v4l2_ctrl_handler_init(&mt9t031
->hdl
, 5);
779 v4l2_ctrl_new_std(&mt9t031
->hdl
, &mt9t031_ctrl_ops
,
780 V4L2_CID_VFLIP
, 0, 1, 1, 0);
781 v4l2_ctrl_new_std(&mt9t031
->hdl
, &mt9t031_ctrl_ops
,
782 V4L2_CID_HFLIP
, 0, 1, 1, 0);
783 v4l2_ctrl_new_std(&mt9t031
->hdl
, &mt9t031_ctrl_ops
,
784 V4L2_CID_GAIN
, 0, 127, 1, 64);
787 * Simulated autoexposure. If enabled, we calculate shutter width
788 * ourselves in the driver based on vertical blanking and frame width
790 mt9t031
->autoexposure
= v4l2_ctrl_new_std_menu(&mt9t031
->hdl
,
791 &mt9t031_ctrl_ops
, V4L2_CID_EXPOSURE_AUTO
, 1, 0,
793 mt9t031
->exposure
= v4l2_ctrl_new_std(&mt9t031
->hdl
, &mt9t031_ctrl_ops
,
794 V4L2_CID_EXPOSURE
, 1, 255, 1, 255);
796 mt9t031
->subdev
.ctrl_handler
= &mt9t031
->hdl
;
797 if (mt9t031
->hdl
.error
)
798 return mt9t031
->hdl
.error
;
800 v4l2_ctrl_auto_cluster(2, &mt9t031
->autoexposure
,
801 V4L2_EXPOSURE_MANUAL
, true);
803 mt9t031
->y_skip_top
= 0;
804 mt9t031
->rect
.left
= MT9T031_COLUMN_SKIP
;
805 mt9t031
->rect
.top
= MT9T031_ROW_SKIP
;
806 mt9t031
->rect
.width
= MT9T031_MAX_WIDTH
;
807 mt9t031
->rect
.height
= MT9T031_MAX_HEIGHT
;
812 mt9t031
->clk
= v4l2_clk_get(&client
->dev
, "mclk");
813 if (IS_ERR(mt9t031
->clk
)) {
814 ret
= PTR_ERR(mt9t031
->clk
);
818 ret
= mt9t031_video_probe(client
);
820 v4l2_clk_put(mt9t031
->clk
);
822 v4l2_ctrl_handler_free(&mt9t031
->hdl
);
828 static int mt9t031_remove(struct i2c_client
*client
)
830 struct mt9t031
*mt9t031
= to_mt9t031(client
);
832 v4l2_clk_put(mt9t031
->clk
);
833 v4l2_device_unregister_subdev(&mt9t031
->subdev
);
834 v4l2_ctrl_handler_free(&mt9t031
->hdl
);
839 static const struct i2c_device_id mt9t031_id
[] = {
843 MODULE_DEVICE_TABLE(i2c
, mt9t031_id
);
845 static struct i2c_driver mt9t031_i2c_driver
= {
849 .probe
= mt9t031_probe
,
850 .remove
= mt9t031_remove
,
851 .id_table
= mt9t031_id
,
854 module_i2c_driver(mt9t031_i2c_driver
);
856 MODULE_DESCRIPTION("Micron MT9T031 Camera driver");
857 MODULE_AUTHOR("Guennadi Liakhovetski <lg@denx.de>");
858 MODULE_LICENSE("GPL v2");