1 // SPDX-License-Identifier: GPL-2.0-only
3 * Driver for MT9M111/MT9M112/MT9M131 CMOS Image Sensor from Micron/Aptina
5 * Copyright (C) 2008, Robert Jarzmik <robert.jarzmik@free.fr>
7 #include <linux/videodev2.h>
8 #include <linux/slab.h>
10 #include <linux/log2.h>
11 #include <linux/gpio.h>
12 #include <linux/delay.h>
13 #include <linux/regulator/consumer.h>
14 #include <linux/v4l2-mediabus.h>
15 #include <linux/module.h>
16 #include <linux/property.h>
18 #include <media/v4l2-async.h>
19 #include <media/v4l2-clk.h>
20 #include <media/v4l2-common.h>
21 #include <media/v4l2-ctrls.h>
22 #include <media/v4l2-device.h>
23 #include <media/v4l2-event.h>
24 #include <media/v4l2-fwnode.h>
27 * MT9M111, MT9M112 and MT9M131:
28 * i2c address is 0x48 or 0x5d (depending on SADDR pin)
29 * The platform has to define struct i2c_board_info objects and link to them
30 * from struct soc_camera_host_desc
34 * Sensor core register addresses (0x000..0x0ff)
36 #define MT9M111_CHIP_VERSION 0x000
37 #define MT9M111_ROW_START 0x001
38 #define MT9M111_COLUMN_START 0x002
39 #define MT9M111_WINDOW_HEIGHT 0x003
40 #define MT9M111_WINDOW_WIDTH 0x004
41 #define MT9M111_HORIZONTAL_BLANKING_B 0x005
42 #define MT9M111_VERTICAL_BLANKING_B 0x006
43 #define MT9M111_HORIZONTAL_BLANKING_A 0x007
44 #define MT9M111_VERTICAL_BLANKING_A 0x008
45 #define MT9M111_SHUTTER_WIDTH 0x009
46 #define MT9M111_ROW_SPEED 0x00a
47 #define MT9M111_EXTRA_DELAY 0x00b
48 #define MT9M111_SHUTTER_DELAY 0x00c
49 #define MT9M111_RESET 0x00d
50 #define MT9M111_READ_MODE_B 0x020
51 #define MT9M111_READ_MODE_A 0x021
52 #define MT9M111_FLASH_CONTROL 0x023
53 #define MT9M111_GREEN1_GAIN 0x02b
54 #define MT9M111_BLUE_GAIN 0x02c
55 #define MT9M111_RED_GAIN 0x02d
56 #define MT9M111_GREEN2_GAIN 0x02e
57 #define MT9M111_GLOBAL_GAIN 0x02f
58 #define MT9M111_CONTEXT_CONTROL 0x0c8
59 #define MT9M111_PAGE_MAP 0x0f0
60 #define MT9M111_BYTE_WISE_ADDR 0x0f1
62 #define MT9M111_RESET_SYNC_CHANGES (1 << 15)
63 #define MT9M111_RESET_RESTART_BAD_FRAME (1 << 9)
64 #define MT9M111_RESET_SHOW_BAD_FRAMES (1 << 8)
65 #define MT9M111_RESET_RESET_SOC (1 << 5)
66 #define MT9M111_RESET_OUTPUT_DISABLE (1 << 4)
67 #define MT9M111_RESET_CHIP_ENABLE (1 << 3)
68 #define MT9M111_RESET_ANALOG_STANDBY (1 << 2)
69 #define MT9M111_RESET_RESTART_FRAME (1 << 1)
70 #define MT9M111_RESET_RESET_MODE (1 << 0)
72 #define MT9M111_RM_FULL_POWER_RD (0 << 10)
73 #define MT9M111_RM_LOW_POWER_RD (1 << 10)
74 #define MT9M111_RM_COL_SKIP_4X (1 << 5)
75 #define MT9M111_RM_ROW_SKIP_4X (1 << 4)
76 #define MT9M111_RM_COL_SKIP_2X (1 << 3)
77 #define MT9M111_RM_ROW_SKIP_2X (1 << 2)
78 #define MT9M111_RMB_MIRROR_COLS (1 << 1)
79 #define MT9M111_RMB_MIRROR_ROWS (1 << 0)
80 #define MT9M111_CTXT_CTRL_RESTART (1 << 15)
81 #define MT9M111_CTXT_CTRL_DEFECTCOR_B (1 << 12)
82 #define MT9M111_CTXT_CTRL_RESIZE_B (1 << 10)
83 #define MT9M111_CTXT_CTRL_CTRL2_B (1 << 9)
84 #define MT9M111_CTXT_CTRL_GAMMA_B (1 << 8)
85 #define MT9M111_CTXT_CTRL_XENON_EN (1 << 7)
86 #define MT9M111_CTXT_CTRL_READ_MODE_B (1 << 3)
87 #define MT9M111_CTXT_CTRL_LED_FLASH_EN (1 << 2)
88 #define MT9M111_CTXT_CTRL_VBLANK_SEL_B (1 << 1)
89 #define MT9M111_CTXT_CTRL_HBLANK_SEL_B (1 << 0)
92 * Colorpipe register addresses (0x100..0x1ff)
94 #define MT9M111_OPER_MODE_CTRL 0x106
95 #define MT9M111_OUTPUT_FORMAT_CTRL 0x108
96 #define MT9M111_TPG_CTRL 0x148
97 #define MT9M111_REDUCER_XZOOM_B 0x1a0
98 #define MT9M111_REDUCER_XSIZE_B 0x1a1
99 #define MT9M111_REDUCER_YZOOM_B 0x1a3
100 #define MT9M111_REDUCER_YSIZE_B 0x1a4
101 #define MT9M111_REDUCER_XZOOM_A 0x1a6
102 #define MT9M111_REDUCER_XSIZE_A 0x1a7
103 #define MT9M111_REDUCER_YZOOM_A 0x1a9
104 #define MT9M111_REDUCER_YSIZE_A 0x1aa
105 #define MT9M111_EFFECTS_MODE 0x1e2
107 #define MT9M111_OUTPUT_FORMAT_CTRL2_A 0x13a
108 #define MT9M111_OUTPUT_FORMAT_CTRL2_B 0x19b
110 #define MT9M111_OPMODE_AUTOEXPO_EN (1 << 14)
111 #define MT9M111_OPMODE_AUTOWHITEBAL_EN (1 << 1)
112 #define MT9M111_OUTFMT_FLIP_BAYER_COL (1 << 9)
113 #define MT9M111_OUTFMT_FLIP_BAYER_ROW (1 << 8)
114 #define MT9M111_OUTFMT_PROCESSED_BAYER (1 << 14)
115 #define MT9M111_OUTFMT_BYPASS_IFP (1 << 10)
116 #define MT9M111_OUTFMT_INV_PIX_CLOCK (1 << 9)
117 #define MT9M111_OUTFMT_RGB (1 << 8)
118 #define MT9M111_OUTFMT_RGB565 (0 << 6)
119 #define MT9M111_OUTFMT_RGB555 (1 << 6)
120 #define MT9M111_OUTFMT_RGB444x (2 << 6)
121 #define MT9M111_OUTFMT_RGBx444 (3 << 6)
122 #define MT9M111_OUTFMT_TST_RAMP_OFF (0 << 4)
123 #define MT9M111_OUTFMT_TST_RAMP_COL (1 << 4)
124 #define MT9M111_OUTFMT_TST_RAMP_ROW (2 << 4)
125 #define MT9M111_OUTFMT_TST_RAMP_FRAME (3 << 4)
126 #define MT9M111_OUTFMT_SHIFT_3_UP (1 << 3)
127 #define MT9M111_OUTFMT_AVG_CHROMA (1 << 2)
128 #define MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN (1 << 1)
129 #define MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B (1 << 0)
130 #define MT9M111_TPG_SEL_MASK GENMASK(2, 0)
131 #define MT9M111_EFFECTS_MODE_MASK GENMASK(2, 0)
132 #define MT9M111_RM_PWR_MASK BIT(10)
133 #define MT9M111_RM_SKIP2_MASK GENMASK(3, 2)
136 * Camera control register addresses (0x200..0x2ff not implemented)
139 #define reg_read(reg) mt9m111_reg_read(client, MT9M111_##reg)
140 #define reg_write(reg, val) mt9m111_reg_write(client, MT9M111_##reg, (val))
141 #define reg_set(reg, val) mt9m111_reg_set(client, MT9M111_##reg, (val))
142 #define reg_clear(reg, val) mt9m111_reg_clear(client, MT9M111_##reg, (val))
143 #define reg_mask(reg, val, mask) mt9m111_reg_mask(client, MT9M111_##reg, \
146 #define MT9M111_MIN_DARK_ROWS 8
147 #define MT9M111_MIN_DARK_COLS 26
148 #define MT9M111_MAX_HEIGHT 1024
149 #define MT9M111_MAX_WIDTH 1280
151 struct mt9m111_context
{
159 u16 output_fmt_ctrl2
;
163 static struct mt9m111_context context_a
= {
164 .read_mode
= MT9M111_READ_MODE_A
,
165 .blanking_h
= MT9M111_HORIZONTAL_BLANKING_A
,
166 .blanking_v
= MT9M111_VERTICAL_BLANKING_A
,
167 .reducer_xzoom
= MT9M111_REDUCER_XZOOM_A
,
168 .reducer_yzoom
= MT9M111_REDUCER_YZOOM_A
,
169 .reducer_xsize
= MT9M111_REDUCER_XSIZE_A
,
170 .reducer_ysize
= MT9M111_REDUCER_YSIZE_A
,
171 .output_fmt_ctrl2
= MT9M111_OUTPUT_FORMAT_CTRL2_A
,
172 .control
= MT9M111_CTXT_CTRL_RESTART
,
175 static struct mt9m111_context context_b
= {
176 .read_mode
= MT9M111_READ_MODE_B
,
177 .blanking_h
= MT9M111_HORIZONTAL_BLANKING_B
,
178 .blanking_v
= MT9M111_VERTICAL_BLANKING_B
,
179 .reducer_xzoom
= MT9M111_REDUCER_XZOOM_B
,
180 .reducer_yzoom
= MT9M111_REDUCER_YZOOM_B
,
181 .reducer_xsize
= MT9M111_REDUCER_XSIZE_B
,
182 .reducer_ysize
= MT9M111_REDUCER_YSIZE_B
,
183 .output_fmt_ctrl2
= MT9M111_OUTPUT_FORMAT_CTRL2_B
,
184 .control
= MT9M111_CTXT_CTRL_RESTART
|
185 MT9M111_CTXT_CTRL_DEFECTCOR_B
| MT9M111_CTXT_CTRL_RESIZE_B
|
186 MT9M111_CTXT_CTRL_CTRL2_B
| MT9M111_CTXT_CTRL_GAMMA_B
|
187 MT9M111_CTXT_CTRL_READ_MODE_B
| MT9M111_CTXT_CTRL_VBLANK_SEL_B
|
188 MT9M111_CTXT_CTRL_HBLANK_SEL_B
,
191 /* MT9M111 has only one fixed colorspace per pixelcode */
192 struct mt9m111_datafmt
{
194 enum v4l2_colorspace colorspace
;
197 static const struct mt9m111_datafmt mt9m111_colour_fmts
[] = {
198 {MEDIA_BUS_FMT_YUYV8_2X8
, V4L2_COLORSPACE_SRGB
},
199 {MEDIA_BUS_FMT_YVYU8_2X8
, V4L2_COLORSPACE_SRGB
},
200 {MEDIA_BUS_FMT_UYVY8_2X8
, V4L2_COLORSPACE_SRGB
},
201 {MEDIA_BUS_FMT_VYUY8_2X8
, V4L2_COLORSPACE_SRGB
},
202 {MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE
, V4L2_COLORSPACE_SRGB
},
203 {MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE
, V4L2_COLORSPACE_SRGB
},
204 {MEDIA_BUS_FMT_RGB565_2X8_LE
, V4L2_COLORSPACE_SRGB
},
205 {MEDIA_BUS_FMT_RGB565_2X8_BE
, V4L2_COLORSPACE_SRGB
},
206 {MEDIA_BUS_FMT_BGR565_2X8_LE
, V4L2_COLORSPACE_SRGB
},
207 {MEDIA_BUS_FMT_BGR565_2X8_BE
, V4L2_COLORSPACE_SRGB
},
208 {MEDIA_BUS_FMT_SBGGR8_1X8
, V4L2_COLORSPACE_SRGB
},
209 {MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE
, V4L2_COLORSPACE_SRGB
},
212 enum mt9m111_mode_id
{
213 MT9M111_MODE_SXGA_8FPS
,
214 MT9M111_MODE_SXGA_15FPS
,
215 MT9M111_MODE_QSXGA_30FPS
,
219 struct mt9m111_mode_info
{
220 unsigned int sensor_w
;
221 unsigned int sensor_h
;
222 unsigned int max_image_w
;
223 unsigned int max_image_h
;
224 unsigned int max_fps
;
225 unsigned int reg_val
;
226 unsigned int reg_mask
;
230 struct v4l2_subdev subdev
;
231 struct v4l2_ctrl_handler hdl
;
232 struct v4l2_ctrl
*gain
;
233 struct mt9m111_context
*ctx
;
234 struct v4l2_rect rect
; /* cropping rectangle */
235 struct v4l2_clk
*clk
;
236 unsigned int width
; /* output */
237 unsigned int height
; /* sizes */
238 struct v4l2_fract frame_interval
;
239 const struct mt9m111_mode_info
*current_mode
;
240 struct mutex power_lock
; /* lock to protect power_count */
242 const struct mt9m111_datafmt
*fmt
;
243 int lastpage
; /* PageMap cache value */
244 struct regulator
*regulator
;
246 /* user point of view - 0: falling 1: rising edge */
247 unsigned int pclk_sample
:1;
248 #ifdef CONFIG_MEDIA_CONTROLLER
249 struct media_pad pad
;
253 static const struct mt9m111_mode_info mt9m111_mode_data
[MT9M111_NUM_MODES
] = {
254 [MT9M111_MODE_SXGA_8FPS
] = {
260 .reg_val
= MT9M111_RM_LOW_POWER_RD
,
261 .reg_mask
= MT9M111_RM_PWR_MASK
| MT9M111_RM_SKIP2_MASK
,
263 [MT9M111_MODE_SXGA_15FPS
] = {
269 .reg_val
= MT9M111_RM_FULL_POWER_RD
,
270 .reg_mask
= MT9M111_RM_PWR_MASK
| MT9M111_RM_SKIP2_MASK
,
272 [MT9M111_MODE_QSXGA_30FPS
] = {
278 .reg_val
= MT9M111_RM_LOW_POWER_RD
| MT9M111_RM_COL_SKIP_2X
|
279 MT9M111_RM_ROW_SKIP_2X
,
280 .reg_mask
= MT9M111_RM_PWR_MASK
| MT9M111_RM_SKIP2_MASK
,
284 /* Find a data format by a pixel code */
285 static const struct mt9m111_datafmt
*mt9m111_find_datafmt(struct mt9m111
*mt9m111
,
289 for (i
= 0; i
< ARRAY_SIZE(mt9m111_colour_fmts
); i
++)
290 if (mt9m111_colour_fmts
[i
].code
== code
)
291 return mt9m111_colour_fmts
+ i
;
296 static struct mt9m111
*to_mt9m111(const struct i2c_client
*client
)
298 return container_of(i2c_get_clientdata(client
), struct mt9m111
, subdev
);
301 static int reg_page_map_set(struct i2c_client
*client
, const u16 reg
)
305 struct mt9m111
*mt9m111
= to_mt9m111(client
);
308 if (page
== mt9m111
->lastpage
)
313 ret
= i2c_smbus_write_word_swapped(client
, MT9M111_PAGE_MAP
, page
);
315 mt9m111
->lastpage
= page
;
319 static int mt9m111_reg_read(struct i2c_client
*client
, const u16 reg
)
323 ret
= reg_page_map_set(client
, reg
);
325 ret
= i2c_smbus_read_word_swapped(client
, reg
& 0xff);
327 dev_dbg(&client
->dev
, "read reg.%03x -> %04x\n", reg
, ret
);
331 static int mt9m111_reg_write(struct i2c_client
*client
, const u16 reg
,
336 ret
= reg_page_map_set(client
, reg
);
338 ret
= i2c_smbus_write_word_swapped(client
, reg
& 0xff, data
);
339 dev_dbg(&client
->dev
, "write reg.%03x = %04x -> %d\n", reg
, data
, ret
);
343 static int mt9m111_reg_set(struct i2c_client
*client
, const u16 reg
,
348 ret
= mt9m111_reg_read(client
, reg
);
350 ret
= mt9m111_reg_write(client
, reg
, ret
| data
);
354 static int mt9m111_reg_clear(struct i2c_client
*client
, const u16 reg
,
359 ret
= mt9m111_reg_read(client
, reg
);
361 ret
= mt9m111_reg_write(client
, reg
, ret
& ~data
);
365 static int mt9m111_reg_mask(struct i2c_client
*client
, const u16 reg
,
366 const u16 data
, const u16 mask
)
370 ret
= mt9m111_reg_read(client
, reg
);
372 ret
= mt9m111_reg_write(client
, reg
, (ret
& ~mask
) | data
);
376 static int mt9m111_set_context(struct mt9m111
*mt9m111
,
377 struct mt9m111_context
*ctx
)
379 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
380 return reg_write(CONTEXT_CONTROL
, ctx
->control
);
383 static int mt9m111_setup_rect_ctx(struct mt9m111
*mt9m111
,
384 struct mt9m111_context
*ctx
, struct v4l2_rect
*rect
,
385 unsigned int width
, unsigned int height
)
387 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
388 int ret
= mt9m111_reg_write(client
, ctx
->reducer_xzoom
, rect
->width
);
390 ret
= mt9m111_reg_write(client
, ctx
->reducer_yzoom
, rect
->height
);
392 ret
= mt9m111_reg_write(client
, ctx
->reducer_xsize
, width
);
394 ret
= mt9m111_reg_write(client
, ctx
->reducer_ysize
, height
);
398 static int mt9m111_setup_geometry(struct mt9m111
*mt9m111
, struct v4l2_rect
*rect
,
399 int width
, int height
, u32 code
)
401 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
404 ret
= reg_write(COLUMN_START
, rect
->left
);
406 ret
= reg_write(ROW_START
, rect
->top
);
409 ret
= reg_write(WINDOW_WIDTH
, rect
->width
);
411 ret
= reg_write(WINDOW_HEIGHT
, rect
->height
);
413 if (code
!= MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE
) {
414 /* IFP in use, down-scaling possible */
416 ret
= mt9m111_setup_rect_ctx(mt9m111
, &context_b
,
417 rect
, width
, height
);
419 ret
= mt9m111_setup_rect_ctx(mt9m111
, &context_a
,
420 rect
, width
, height
);
423 dev_dbg(&client
->dev
, "%s(%x): %ux%u@%u:%u -> %ux%u = %d\n",
424 __func__
, code
, rect
->width
, rect
->height
, rect
->left
, rect
->top
,
430 static int mt9m111_enable(struct mt9m111
*mt9m111
)
432 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
433 return reg_write(RESET
, MT9M111_RESET_CHIP_ENABLE
);
436 static int mt9m111_reset(struct mt9m111
*mt9m111
)
438 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
441 ret
= reg_set(RESET
, MT9M111_RESET_RESET_MODE
);
443 ret
= reg_set(RESET
, MT9M111_RESET_RESET_SOC
);
445 ret
= reg_clear(RESET
, MT9M111_RESET_RESET_MODE
446 | MT9M111_RESET_RESET_SOC
);
451 static int mt9m111_set_selection(struct v4l2_subdev
*sd
,
452 struct v4l2_subdev_pad_config
*cfg
,
453 struct v4l2_subdev_selection
*sel
)
455 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
456 struct mt9m111
*mt9m111
= to_mt9m111(client
);
457 struct v4l2_rect rect
= sel
->r
;
461 if (sel
->which
!= V4L2_SUBDEV_FORMAT_ACTIVE
||
462 sel
->target
!= V4L2_SEL_TGT_CROP
)
465 if (mt9m111
->fmt
->code
== MEDIA_BUS_FMT_SBGGR8_1X8
||
466 mt9m111
->fmt
->code
== MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE
) {
467 /* Bayer format - even size lengths */
469 /* Let the user play with the starting pixel */
472 /* FIXME: the datasheet doesn't specify minimum sizes */
473 v4l_bound_align_image(&rect
.width
, 2, MT9M111_MAX_WIDTH
, align
,
474 &rect
.height
, 2, MT9M111_MAX_HEIGHT
, align
, 0);
475 rect
.left
= clamp(rect
.left
, MT9M111_MIN_DARK_COLS
,
476 MT9M111_MIN_DARK_COLS
+ MT9M111_MAX_WIDTH
-
478 rect
.top
= clamp(rect
.top
, MT9M111_MIN_DARK_ROWS
,
479 MT9M111_MIN_DARK_ROWS
+ MT9M111_MAX_HEIGHT
-
482 width
= min(mt9m111
->width
, rect
.width
);
483 height
= min(mt9m111
->height
, rect
.height
);
485 ret
= mt9m111_setup_geometry(mt9m111
, &rect
, width
, height
, mt9m111
->fmt
->code
);
487 mt9m111
->rect
= rect
;
488 mt9m111
->width
= width
;
489 mt9m111
->height
= height
;
495 static int mt9m111_get_selection(struct v4l2_subdev
*sd
,
496 struct v4l2_subdev_pad_config
*cfg
,
497 struct v4l2_subdev_selection
*sel
)
499 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
500 struct mt9m111
*mt9m111
= to_mt9m111(client
);
502 if (sel
->which
!= V4L2_SUBDEV_FORMAT_ACTIVE
)
505 switch (sel
->target
) {
506 case V4L2_SEL_TGT_CROP_BOUNDS
:
507 sel
->r
.left
= MT9M111_MIN_DARK_COLS
;
508 sel
->r
.top
= MT9M111_MIN_DARK_ROWS
;
509 sel
->r
.width
= MT9M111_MAX_WIDTH
;
510 sel
->r
.height
= MT9M111_MAX_HEIGHT
;
512 case V4L2_SEL_TGT_CROP
:
513 sel
->r
= mt9m111
->rect
;
520 static int mt9m111_get_fmt(struct v4l2_subdev
*sd
,
521 struct v4l2_subdev_pad_config
*cfg
,
522 struct v4l2_subdev_format
*format
)
524 struct v4l2_mbus_framefmt
*mf
= &format
->format
;
525 struct mt9m111
*mt9m111
= container_of(sd
, struct mt9m111
, subdev
);
530 if (format
->which
== V4L2_SUBDEV_FORMAT_TRY
) {
531 #ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
532 mf
= v4l2_subdev_get_try_format(sd
, cfg
, format
->pad
);
533 format
->format
= *mf
;
540 mf
->width
= mt9m111
->width
;
541 mf
->height
= mt9m111
->height
;
542 mf
->code
= mt9m111
->fmt
->code
;
543 mf
->colorspace
= mt9m111
->fmt
->colorspace
;
544 mf
->field
= V4L2_FIELD_NONE
;
545 mf
->ycbcr_enc
= V4L2_YCBCR_ENC_DEFAULT
;
546 mf
->quantization
= V4L2_QUANTIZATION_DEFAULT
;
547 mf
->xfer_func
= V4L2_XFER_FUNC_DEFAULT
;
552 static int mt9m111_set_pixfmt(struct mt9m111
*mt9m111
,
555 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
556 u16 data_outfmt2
, mask_outfmt2
= MT9M111_OUTFMT_PROCESSED_BAYER
|
557 MT9M111_OUTFMT_BYPASS_IFP
| MT9M111_OUTFMT_RGB
|
558 MT9M111_OUTFMT_RGB565
| MT9M111_OUTFMT_RGB555
|
559 MT9M111_OUTFMT_RGB444x
| MT9M111_OUTFMT_RGBx444
|
560 MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN
|
561 MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B
;
565 case MEDIA_BUS_FMT_SBGGR8_1X8
:
566 data_outfmt2
= MT9M111_OUTFMT_PROCESSED_BAYER
|
569 case MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE
:
570 data_outfmt2
= MT9M111_OUTFMT_BYPASS_IFP
| MT9M111_OUTFMT_RGB
;
572 case MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE
:
573 data_outfmt2
= MT9M111_OUTFMT_RGB
| MT9M111_OUTFMT_RGB555
|
574 MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN
;
576 case MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE
:
577 data_outfmt2
= MT9M111_OUTFMT_RGB
| MT9M111_OUTFMT_RGB555
;
579 case MEDIA_BUS_FMT_RGB565_2X8_LE
:
580 data_outfmt2
= MT9M111_OUTFMT_RGB
| MT9M111_OUTFMT_RGB565
|
581 MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN
;
583 case MEDIA_BUS_FMT_RGB565_2X8_BE
:
584 data_outfmt2
= MT9M111_OUTFMT_RGB
| MT9M111_OUTFMT_RGB565
;
586 case MEDIA_BUS_FMT_BGR565_2X8_BE
:
587 data_outfmt2
= MT9M111_OUTFMT_RGB
| MT9M111_OUTFMT_RGB565
|
588 MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B
;
590 case MEDIA_BUS_FMT_BGR565_2X8_LE
:
591 data_outfmt2
= MT9M111_OUTFMT_RGB
| MT9M111_OUTFMT_RGB565
|
592 MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN
|
593 MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B
;
595 case MEDIA_BUS_FMT_UYVY8_2X8
:
598 case MEDIA_BUS_FMT_VYUY8_2X8
:
599 data_outfmt2
= MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B
;
601 case MEDIA_BUS_FMT_YUYV8_2X8
:
602 data_outfmt2
= MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN
;
604 case MEDIA_BUS_FMT_YVYU8_2X8
:
605 data_outfmt2
= MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN
|
606 MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B
;
609 dev_err(&client
->dev
, "Pixel format not handled: %x\n", code
);
613 /* receiver samples on falling edge, chip-hw default is rising */
614 if (mt9m111
->pclk_sample
== 0)
615 mask_outfmt2
|= MT9M111_OUTFMT_INV_PIX_CLOCK
;
617 ret
= mt9m111_reg_mask(client
, context_a
.output_fmt_ctrl2
,
618 data_outfmt2
, mask_outfmt2
);
620 ret
= mt9m111_reg_mask(client
, context_b
.output_fmt_ctrl2
,
621 data_outfmt2
, mask_outfmt2
);
626 static int mt9m111_set_fmt(struct v4l2_subdev
*sd
,
627 struct v4l2_subdev_pad_config
*cfg
,
628 struct v4l2_subdev_format
*format
)
630 struct v4l2_mbus_framefmt
*mf
= &format
->format
;
631 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
632 struct mt9m111
*mt9m111
= container_of(sd
, struct mt9m111
, subdev
);
633 const struct mt9m111_datafmt
*fmt
;
634 struct v4l2_rect
*rect
= &mt9m111
->rect
;
638 if (mt9m111
->is_streaming
)
644 fmt
= mt9m111_find_datafmt(mt9m111
, mf
->code
);
646 bayer
= fmt
->code
== MEDIA_BUS_FMT_SBGGR8_1X8
||
647 fmt
->code
== MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE
;
650 * With Bayer format enforce even side lengths, but let the user play
651 * with the starting pixel
654 rect
->width
= ALIGN(rect
->width
, 2);
655 rect
->height
= ALIGN(rect
->height
, 2);
658 if (fmt
->code
== MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE
) {
659 /* IFP bypass mode, no scaling */
660 mf
->width
= rect
->width
;
661 mf
->height
= rect
->height
;
664 if (mf
->width
> rect
->width
)
665 mf
->width
= rect
->width
;
666 if (mf
->height
> rect
->height
)
667 mf
->height
= rect
->height
;
670 dev_dbg(&client
->dev
, "%s(): %ux%u, code=%x\n", __func__
,
671 mf
->width
, mf
->height
, fmt
->code
);
673 mf
->code
= fmt
->code
;
674 mf
->colorspace
= fmt
->colorspace
;
675 mf
->field
= V4L2_FIELD_NONE
;
676 mf
->ycbcr_enc
= V4L2_YCBCR_ENC_DEFAULT
;
677 mf
->quantization
= V4L2_QUANTIZATION_DEFAULT
;
678 mf
->xfer_func
= V4L2_XFER_FUNC_DEFAULT
;
680 if (format
->which
== V4L2_SUBDEV_FORMAT_TRY
) {
685 ret
= mt9m111_setup_geometry(mt9m111
, rect
, mf
->width
, mf
->height
, mf
->code
);
687 ret
= mt9m111_set_pixfmt(mt9m111
, mf
->code
);
689 mt9m111
->width
= mf
->width
;
690 mt9m111
->height
= mf
->height
;
697 static const struct mt9m111_mode_info
*
698 mt9m111_find_mode(struct mt9m111
*mt9m111
, unsigned int req_fps
,
699 unsigned int width
, unsigned int height
)
701 const struct mt9m111_mode_info
*mode
;
702 struct v4l2_rect
*sensor_rect
= &mt9m111
->rect
;
703 unsigned int gap
, gap_best
= (unsigned int) -1;
704 int i
, best_gap_idx
= MT9M111_MODE_SXGA_15FPS
;
705 bool skip_30fps
= false;
708 * The fps selection is based on the row, column skipping mechanism.
709 * So ensure that the sensor window is set to default else the fps
710 * aren't calculated correctly within the sensor hw.
712 if (sensor_rect
->width
!= MT9M111_MAX_WIDTH
||
713 sensor_rect
->height
!= MT9M111_MAX_HEIGHT
) {
714 dev_info(mt9m111
->subdev
.dev
,
715 "Framerate selection is not supported for cropped "
720 /* 30fps only supported for images not exceeding 640x512 */
721 if (width
> MT9M111_MAX_WIDTH
/ 2 || height
> MT9M111_MAX_HEIGHT
/ 2) {
722 dev_dbg(mt9m111
->subdev
.dev
,
723 "Framerates > 15fps are supported only for images "
724 "not exceeding 640x512\n");
728 /* find best matched fps */
729 for (i
= 0; i
< MT9M111_NUM_MODES
; i
++) {
730 unsigned int fps
= mt9m111_mode_data
[i
].max_fps
;
732 if (fps
== 30 && skip_30fps
)
735 gap
= abs(fps
- req_fps
);
736 if (gap
< gap_best
) {
743 * Use context a/b default timing values instead of calculate blanking
746 mode
= &mt9m111_mode_data
[best_gap_idx
];
747 mt9m111
->ctx
= (best_gap_idx
== MT9M111_MODE_QSXGA_30FPS
) ? &context_a
:
752 #ifdef CONFIG_VIDEO_ADV_DEBUG
753 static int mt9m111_g_register(struct v4l2_subdev
*sd
,
754 struct v4l2_dbg_register
*reg
)
756 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
759 if (reg
->reg
> 0x2ff)
762 val
= mt9m111_reg_read(client
, reg
->reg
);
766 if (reg
->val
> 0xffff)
772 static int mt9m111_s_register(struct v4l2_subdev
*sd
,
773 const struct v4l2_dbg_register
*reg
)
775 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
777 if (reg
->reg
> 0x2ff)
780 if (mt9m111_reg_write(client
, reg
->reg
, reg
->val
) < 0)
787 static int mt9m111_set_flip(struct mt9m111
*mt9m111
, int flip
, int mask
)
789 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
793 ret
= mt9m111_reg_set(client
, mt9m111
->ctx
->read_mode
, mask
);
795 ret
= mt9m111_reg_clear(client
, mt9m111
->ctx
->read_mode
, mask
);
800 static int mt9m111_get_global_gain(struct mt9m111
*mt9m111
)
802 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
805 data
= reg_read(GLOBAL_GAIN
);
807 return (data
& 0x2f) * (1 << ((data
>> 10) & 1)) *
808 (1 << ((data
>> 9) & 1));
812 static int mt9m111_set_global_gain(struct mt9m111
*mt9m111
, int gain
)
814 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
817 if (gain
> 63 * 2 * 2)
820 if ((gain
>= 64 * 2) && (gain
< 63 * 2 * 2))
821 val
= (1 << 10) | (1 << 9) | (gain
/ 4);
822 else if ((gain
>= 64) && (gain
< 64 * 2))
823 val
= (1 << 9) | (gain
/ 2);
827 return reg_write(GLOBAL_GAIN
, val
);
830 static int mt9m111_set_autoexposure(struct mt9m111
*mt9m111
, int val
)
832 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
834 if (val
== V4L2_EXPOSURE_AUTO
)
835 return reg_set(OPER_MODE_CTRL
, MT9M111_OPMODE_AUTOEXPO_EN
);
836 return reg_clear(OPER_MODE_CTRL
, MT9M111_OPMODE_AUTOEXPO_EN
);
839 static int mt9m111_set_autowhitebalance(struct mt9m111
*mt9m111
, int on
)
841 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
844 return reg_set(OPER_MODE_CTRL
, MT9M111_OPMODE_AUTOWHITEBAL_EN
);
845 return reg_clear(OPER_MODE_CTRL
, MT9M111_OPMODE_AUTOWHITEBAL_EN
);
848 static const char * const mt9m111_test_pattern_menu
[] = {
850 "Vertical monochrome gradient",
859 static int mt9m111_set_test_pattern(struct mt9m111
*mt9m111
, int val
)
861 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
863 return mt9m111_reg_mask(client
, MT9M111_TPG_CTRL
, val
,
864 MT9M111_TPG_SEL_MASK
);
867 static int mt9m111_set_colorfx(struct mt9m111
*mt9m111
, int val
)
869 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
870 static const struct v4l2_control colorfx
[] = {
871 { V4L2_COLORFX_NONE
, 0 },
872 { V4L2_COLORFX_BW
, 1 },
873 { V4L2_COLORFX_SEPIA
, 2 },
874 { V4L2_COLORFX_NEGATIVE
, 3 },
875 { V4L2_COLORFX_SOLARIZATION
, 4 },
879 for (i
= 0; i
< ARRAY_SIZE(colorfx
); i
++) {
880 if (colorfx
[i
].id
== val
) {
881 return mt9m111_reg_mask(client
, MT9M111_EFFECTS_MODE
,
883 MT9M111_EFFECTS_MODE_MASK
);
890 static int mt9m111_s_ctrl(struct v4l2_ctrl
*ctrl
)
892 struct mt9m111
*mt9m111
= container_of(ctrl
->handler
,
893 struct mt9m111
, hdl
);
897 return mt9m111_set_flip(mt9m111
, ctrl
->val
,
898 MT9M111_RMB_MIRROR_ROWS
);
900 return mt9m111_set_flip(mt9m111
, ctrl
->val
,
901 MT9M111_RMB_MIRROR_COLS
);
903 return mt9m111_set_global_gain(mt9m111
, ctrl
->val
);
904 case V4L2_CID_EXPOSURE_AUTO
:
905 return mt9m111_set_autoexposure(mt9m111
, ctrl
->val
);
906 case V4L2_CID_AUTO_WHITE_BALANCE
:
907 return mt9m111_set_autowhitebalance(mt9m111
, ctrl
->val
);
908 case V4L2_CID_TEST_PATTERN
:
909 return mt9m111_set_test_pattern(mt9m111
, ctrl
->val
);
910 case V4L2_CID_COLORFX
:
911 return mt9m111_set_colorfx(mt9m111
, ctrl
->val
);
917 static int mt9m111_suspend(struct mt9m111
*mt9m111
)
919 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
922 v4l2_ctrl_s_ctrl(mt9m111
->gain
, mt9m111_get_global_gain(mt9m111
));
924 ret
= reg_set(RESET
, MT9M111_RESET_RESET_MODE
);
926 ret
= reg_set(RESET
, MT9M111_RESET_RESET_SOC
|
927 MT9M111_RESET_OUTPUT_DISABLE
|
928 MT9M111_RESET_ANALOG_STANDBY
);
930 ret
= reg_clear(RESET
, MT9M111_RESET_CHIP_ENABLE
);
935 static void mt9m111_restore_state(struct mt9m111
*mt9m111
)
937 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
939 mt9m111_set_context(mt9m111
, mt9m111
->ctx
);
940 mt9m111_set_pixfmt(mt9m111
, mt9m111
->fmt
->code
);
941 mt9m111_setup_geometry(mt9m111
, &mt9m111
->rect
,
942 mt9m111
->width
, mt9m111
->height
, mt9m111
->fmt
->code
);
943 v4l2_ctrl_handler_setup(&mt9m111
->hdl
);
944 mt9m111_reg_mask(client
, mt9m111
->ctx
->read_mode
,
945 mt9m111
->current_mode
->reg_val
,
946 mt9m111
->current_mode
->reg_mask
);
949 static int mt9m111_resume(struct mt9m111
*mt9m111
)
951 int ret
= mt9m111_enable(mt9m111
);
953 ret
= mt9m111_reset(mt9m111
);
955 mt9m111_restore_state(mt9m111
);
960 static int mt9m111_init(struct mt9m111
*mt9m111
)
962 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
965 ret
= mt9m111_enable(mt9m111
);
967 ret
= mt9m111_reset(mt9m111
);
969 ret
= mt9m111_set_context(mt9m111
, mt9m111
->ctx
);
971 dev_err(&client
->dev
, "mt9m111 init failed: %d\n", ret
);
975 static int mt9m111_power_on(struct mt9m111
*mt9m111
)
977 struct i2c_client
*client
= v4l2_get_subdevdata(&mt9m111
->subdev
);
980 ret
= v4l2_clk_enable(mt9m111
->clk
);
984 ret
= regulator_enable(mt9m111
->regulator
);
986 goto out_clk_disable
;
988 ret
= mt9m111_resume(mt9m111
);
990 goto out_regulator_disable
;
994 out_regulator_disable
:
995 regulator_disable(mt9m111
->regulator
);
998 v4l2_clk_disable(mt9m111
->clk
);
1000 dev_err(&client
->dev
, "Failed to resume the sensor: %d\n", ret
);
1005 static void mt9m111_power_off(struct mt9m111
*mt9m111
)
1007 mt9m111_suspend(mt9m111
);
1008 regulator_disable(mt9m111
->regulator
);
1009 v4l2_clk_disable(mt9m111
->clk
);
1012 static int mt9m111_s_power(struct v4l2_subdev
*sd
, int on
)
1014 struct mt9m111
*mt9m111
= container_of(sd
, struct mt9m111
, subdev
);
1017 mutex_lock(&mt9m111
->power_lock
);
1020 * If the power count is modified from 0 to != 0 or from != 0 to 0,
1021 * update the power state.
1023 if (mt9m111
->power_count
== !on
) {
1025 ret
= mt9m111_power_on(mt9m111
);
1027 mt9m111_power_off(mt9m111
);
1031 /* Update the power count. */
1032 mt9m111
->power_count
+= on
? 1 : -1;
1033 WARN_ON(mt9m111
->power_count
< 0);
1036 mutex_unlock(&mt9m111
->power_lock
);
1040 static const struct v4l2_ctrl_ops mt9m111_ctrl_ops
= {
1041 .s_ctrl
= mt9m111_s_ctrl
,
1044 static const struct v4l2_subdev_core_ops mt9m111_subdev_core_ops
= {
1045 .s_power
= mt9m111_s_power
,
1046 .log_status
= v4l2_ctrl_subdev_log_status
,
1047 .subscribe_event
= v4l2_ctrl_subdev_subscribe_event
,
1048 .unsubscribe_event
= v4l2_event_subdev_unsubscribe
,
1049 #ifdef CONFIG_VIDEO_ADV_DEBUG
1050 .g_register
= mt9m111_g_register
,
1051 .s_register
= mt9m111_s_register
,
1055 static int mt9m111_g_frame_interval(struct v4l2_subdev
*sd
,
1056 struct v4l2_subdev_frame_interval
*fi
)
1058 struct mt9m111
*mt9m111
= container_of(sd
, struct mt9m111
, subdev
);
1060 fi
->interval
= mt9m111
->frame_interval
;
1065 static int mt9m111_s_frame_interval(struct v4l2_subdev
*sd
,
1066 struct v4l2_subdev_frame_interval
*fi
)
1068 struct mt9m111
*mt9m111
= container_of(sd
, struct mt9m111
, subdev
);
1069 const struct mt9m111_mode_info
*mode
;
1070 struct v4l2_fract
*fract
= &fi
->interval
;
1073 if (mt9m111
->is_streaming
)
1079 if (fract
->numerator
== 0) {
1080 fract
->denominator
= 30;
1081 fract
->numerator
= 1;
1084 fps
= DIV_ROUND_CLOSEST(fract
->denominator
, fract
->numerator
);
1086 /* Find best fitting mode. Do not update the mode if no one was found. */
1087 mode
= mt9m111_find_mode(mt9m111
, fps
, mt9m111
->width
, mt9m111
->height
);
1091 if (mode
->max_fps
!= fps
) {
1092 fract
->denominator
= mode
->max_fps
;
1093 fract
->numerator
= 1;
1096 mt9m111
->current_mode
= mode
;
1097 mt9m111
->frame_interval
= fi
->interval
;
1102 static int mt9m111_enum_mbus_code(struct v4l2_subdev
*sd
,
1103 struct v4l2_subdev_pad_config
*cfg
,
1104 struct v4l2_subdev_mbus_code_enum
*code
)
1106 if (code
->pad
|| code
->index
>= ARRAY_SIZE(mt9m111_colour_fmts
))
1109 code
->code
= mt9m111_colour_fmts
[code
->index
].code
;
1113 static int mt9m111_s_stream(struct v4l2_subdev
*sd
, int enable
)
1115 struct mt9m111
*mt9m111
= container_of(sd
, struct mt9m111
, subdev
);
1117 mt9m111
->is_streaming
= !!enable
;
1121 static int mt9m111_init_cfg(struct v4l2_subdev
*sd
,
1122 struct v4l2_subdev_pad_config
*cfg
)
1124 #ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
1125 struct v4l2_mbus_framefmt
*format
=
1126 v4l2_subdev_get_try_format(sd
, cfg
, 0);
1128 format
->width
= MT9M111_MAX_WIDTH
;
1129 format
->height
= MT9M111_MAX_HEIGHT
;
1130 format
->code
= mt9m111_colour_fmts
[0].code
;
1131 format
->colorspace
= mt9m111_colour_fmts
[0].colorspace
;
1132 format
->field
= V4L2_FIELD_NONE
;
1133 format
->ycbcr_enc
= V4L2_YCBCR_ENC_DEFAULT
;
1134 format
->quantization
= V4L2_QUANTIZATION_DEFAULT
;
1135 format
->xfer_func
= V4L2_XFER_FUNC_DEFAULT
;
1140 static int mt9m111_g_mbus_config(struct v4l2_subdev
*sd
,
1141 struct v4l2_mbus_config
*cfg
)
1143 struct mt9m111
*mt9m111
= container_of(sd
, struct mt9m111
, subdev
);
1145 cfg
->flags
= V4L2_MBUS_MASTER
|
1146 V4L2_MBUS_HSYNC_ACTIVE_HIGH
| V4L2_MBUS_VSYNC_ACTIVE_HIGH
|
1147 V4L2_MBUS_DATA_ACTIVE_HIGH
;
1149 cfg
->flags
|= mt9m111
->pclk_sample
? V4L2_MBUS_PCLK_SAMPLE_RISING
:
1150 V4L2_MBUS_PCLK_SAMPLE_FALLING
;
1152 cfg
->type
= V4L2_MBUS_PARALLEL
;
1157 static const struct v4l2_subdev_video_ops mt9m111_subdev_video_ops
= {
1158 .g_mbus_config
= mt9m111_g_mbus_config
,
1159 .s_stream
= mt9m111_s_stream
,
1160 .g_frame_interval
= mt9m111_g_frame_interval
,
1161 .s_frame_interval
= mt9m111_s_frame_interval
,
1164 static const struct v4l2_subdev_pad_ops mt9m111_subdev_pad_ops
= {
1165 .init_cfg
= mt9m111_init_cfg
,
1166 .enum_mbus_code
= mt9m111_enum_mbus_code
,
1167 .get_selection
= mt9m111_get_selection
,
1168 .set_selection
= mt9m111_set_selection
,
1169 .get_fmt
= mt9m111_get_fmt
,
1170 .set_fmt
= mt9m111_set_fmt
,
1173 static const struct v4l2_subdev_ops mt9m111_subdev_ops
= {
1174 .core
= &mt9m111_subdev_core_ops
,
1175 .video
= &mt9m111_subdev_video_ops
,
1176 .pad
= &mt9m111_subdev_pad_ops
,
1180 * Interface active, can use i2c. If it fails, it can indeed mean, that
1181 * this wasn't our capture interface, so, we wait for the right one
1183 static int mt9m111_video_probe(struct i2c_client
*client
)
1185 struct mt9m111
*mt9m111
= to_mt9m111(client
);
1189 ret
= mt9m111_s_power(&mt9m111
->subdev
, 1);
1193 data
= reg_read(CHIP_VERSION
);
1196 case 0x143a: /* MT9M111 or MT9M131 */
1197 dev_info(&client
->dev
,
1198 "Detected a MT9M111/MT9M131 chip ID %x\n", data
);
1200 case 0x148c: /* MT9M112 */
1201 dev_info(&client
->dev
, "Detected a MT9M112 chip ID %x\n", data
);
1204 dev_err(&client
->dev
,
1205 "No MT9M111/MT9M112/MT9M131 chip detected register read %x\n",
1211 ret
= mt9m111_init(mt9m111
);
1215 ret
= v4l2_ctrl_handler_setup(&mt9m111
->hdl
);
1218 mt9m111_s_power(&mt9m111
->subdev
, 0);
1222 static int mt9m111_probe_fw(struct i2c_client
*client
, struct mt9m111
*mt9m111
)
1224 struct v4l2_fwnode_endpoint bus_cfg
= {
1225 .bus_type
= V4L2_MBUS_PARALLEL
1227 struct fwnode_handle
*np
;
1230 np
= fwnode_graph_get_next_endpoint(dev_fwnode(&client
->dev
), NULL
);
1234 ret
= v4l2_fwnode_endpoint_parse(np
, &bus_cfg
);
1238 mt9m111
->pclk_sample
= !!(bus_cfg
.bus
.parallel
.flags
&
1239 V4L2_MBUS_PCLK_SAMPLE_RISING
);
1242 fwnode_handle_put(np
);
1246 static int mt9m111_probe(struct i2c_client
*client
)
1248 struct mt9m111
*mt9m111
;
1249 struct i2c_adapter
*adapter
= client
->adapter
;
1252 if (!i2c_check_functionality(adapter
, I2C_FUNC_SMBUS_WORD_DATA
)) {
1253 dev_warn(&adapter
->dev
,
1254 "I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD\n");
1258 mt9m111
= devm_kzalloc(&client
->dev
, sizeof(struct mt9m111
), GFP_KERNEL
);
1262 if (dev_fwnode(&client
->dev
)) {
1263 ret
= mt9m111_probe_fw(client
, mt9m111
);
1268 mt9m111
->clk
= v4l2_clk_get(&client
->dev
, "mclk");
1269 if (IS_ERR(mt9m111
->clk
))
1270 return PTR_ERR(mt9m111
->clk
);
1272 mt9m111
->regulator
= devm_regulator_get(&client
->dev
, "vdd");
1273 if (IS_ERR(mt9m111
->regulator
)) {
1274 dev_err(&client
->dev
, "regulator not found: %ld\n",
1275 PTR_ERR(mt9m111
->regulator
));
1276 return PTR_ERR(mt9m111
->regulator
);
1279 /* Default HIGHPOWER context */
1280 mt9m111
->ctx
= &context_b
;
1282 v4l2_i2c_subdev_init(&mt9m111
->subdev
, client
, &mt9m111_subdev_ops
);
1283 mt9m111
->subdev
.flags
|= V4L2_SUBDEV_FL_HAS_DEVNODE
|
1284 V4L2_SUBDEV_FL_HAS_EVENTS
;
1286 v4l2_ctrl_handler_init(&mt9m111
->hdl
, 7);
1287 v4l2_ctrl_new_std(&mt9m111
->hdl
, &mt9m111_ctrl_ops
,
1288 V4L2_CID_VFLIP
, 0, 1, 1, 0);
1289 v4l2_ctrl_new_std(&mt9m111
->hdl
, &mt9m111_ctrl_ops
,
1290 V4L2_CID_HFLIP
, 0, 1, 1, 0);
1291 v4l2_ctrl_new_std(&mt9m111
->hdl
, &mt9m111_ctrl_ops
,
1292 V4L2_CID_AUTO_WHITE_BALANCE
, 0, 1, 1, 1);
1293 mt9m111
->gain
= v4l2_ctrl_new_std(&mt9m111
->hdl
, &mt9m111_ctrl_ops
,
1294 V4L2_CID_GAIN
, 0, 63 * 2 * 2, 1, 32);
1295 v4l2_ctrl_new_std_menu(&mt9m111
->hdl
,
1296 &mt9m111_ctrl_ops
, V4L2_CID_EXPOSURE_AUTO
, 1, 0,
1297 V4L2_EXPOSURE_AUTO
);
1298 v4l2_ctrl_new_std_menu_items(&mt9m111
->hdl
,
1299 &mt9m111_ctrl_ops
, V4L2_CID_TEST_PATTERN
,
1300 ARRAY_SIZE(mt9m111_test_pattern_menu
) - 1, 0, 0,
1301 mt9m111_test_pattern_menu
);
1302 v4l2_ctrl_new_std_menu(&mt9m111
->hdl
, &mt9m111_ctrl_ops
,
1303 V4L2_CID_COLORFX
, V4L2_COLORFX_SOLARIZATION
,
1304 ~(BIT(V4L2_COLORFX_NONE
) |
1305 BIT(V4L2_COLORFX_BW
) |
1306 BIT(V4L2_COLORFX_SEPIA
) |
1307 BIT(V4L2_COLORFX_NEGATIVE
) |
1308 BIT(V4L2_COLORFX_SOLARIZATION
)),
1310 mt9m111
->subdev
.ctrl_handler
= &mt9m111
->hdl
;
1311 if (mt9m111
->hdl
.error
) {
1312 ret
= mt9m111
->hdl
.error
;
1316 #ifdef CONFIG_MEDIA_CONTROLLER
1317 mt9m111
->pad
.flags
= MEDIA_PAD_FL_SOURCE
;
1318 mt9m111
->subdev
.entity
.function
= MEDIA_ENT_F_CAM_SENSOR
;
1319 ret
= media_entity_pads_init(&mt9m111
->subdev
.entity
, 1, &mt9m111
->pad
);
1324 mt9m111
->current_mode
= &mt9m111_mode_data
[MT9M111_MODE_SXGA_15FPS
];
1325 mt9m111
->frame_interval
.numerator
= 1;
1326 mt9m111
->frame_interval
.denominator
= mt9m111
->current_mode
->max_fps
;
1328 /* Second stage probe - when a capture adapter is there */
1329 mt9m111
->rect
.left
= MT9M111_MIN_DARK_COLS
;
1330 mt9m111
->rect
.top
= MT9M111_MIN_DARK_ROWS
;
1331 mt9m111
->rect
.width
= MT9M111_MAX_WIDTH
;
1332 mt9m111
->rect
.height
= MT9M111_MAX_HEIGHT
;
1333 mt9m111
->width
= mt9m111
->rect
.width
;
1334 mt9m111
->height
= mt9m111
->rect
.height
;
1335 mt9m111
->fmt
= &mt9m111_colour_fmts
[0];
1336 mt9m111
->lastpage
= -1;
1337 mutex_init(&mt9m111
->power_lock
);
1339 ret
= mt9m111_video_probe(client
);
1341 goto out_entityclean
;
1343 mt9m111
->subdev
.dev
= &client
->dev
;
1344 ret
= v4l2_async_register_subdev(&mt9m111
->subdev
);
1346 goto out_entityclean
;
1351 #ifdef CONFIG_MEDIA_CONTROLLER
1352 media_entity_cleanup(&mt9m111
->subdev
.entity
);
1355 v4l2_ctrl_handler_free(&mt9m111
->hdl
);
1357 v4l2_clk_put(mt9m111
->clk
);
1362 static int mt9m111_remove(struct i2c_client
*client
)
1364 struct mt9m111
*mt9m111
= to_mt9m111(client
);
1366 v4l2_async_unregister_subdev(&mt9m111
->subdev
);
1367 media_entity_cleanup(&mt9m111
->subdev
.entity
);
1368 v4l2_clk_put(mt9m111
->clk
);
1369 v4l2_ctrl_handler_free(&mt9m111
->hdl
);
1373 static const struct of_device_id mt9m111_of_match
[] = {
1374 { .compatible
= "micron,mt9m111", },
1377 MODULE_DEVICE_TABLE(of
, mt9m111_of_match
);
1379 static const struct i2c_device_id mt9m111_id
[] = {
1383 MODULE_DEVICE_TABLE(i2c
, mt9m111_id
);
1385 static struct i2c_driver mt9m111_i2c_driver
= {
1388 .of_match_table
= of_match_ptr(mt9m111_of_match
),
1390 .probe_new
= mt9m111_probe
,
1391 .remove
= mt9m111_remove
,
1392 .id_table
= mt9m111_id
,
1395 module_i2c_driver(mt9m111_i2c_driver
);
1397 MODULE_DESCRIPTION("Micron/Aptina MT9M111/MT9M112/MT9M131 Camera driver");
1398 MODULE_AUTHOR("Robert Jarzmik");
1399 MODULE_LICENSE("GPL");