media: v4l2-subdev: add subdev-wide state struct
[linux-2.6-microblaze.git] / drivers / media / i2c / mt9p031.c
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         clk_disable_unprepare(mt9p031->clk);
350 }
351
352 static int __mt9p031_set_power(struct mt9p031 *mt9p031, bool on)
353 {
354         struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
355         int ret;
356
357         if (!on) {
358                 mt9p031_power_off(mt9p031);
359                 return 0;
360         }
361
362         ret = mt9p031_power_on(mt9p031);
363         if (ret < 0)
364                 return ret;
365
366         ret = mt9p031_reset(mt9p031);
367         if (ret < 0) {
368                 dev_err(&client->dev, "Failed to reset the camera\n");
369                 return ret;
370         }
371
372         return v4l2_ctrl_handler_setup(&mt9p031->ctrls);
373 }
374
375 /* -----------------------------------------------------------------------------
376  * V4L2 subdev video operations
377  */
378
379 static int mt9p031_set_params(struct mt9p031 *mt9p031)
380 {
381         struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
382         struct v4l2_mbus_framefmt *format = &mt9p031->format;
383         const struct v4l2_rect *crop = &mt9p031->crop;
384         unsigned int hblank;
385         unsigned int vblank;
386         unsigned int xskip;
387         unsigned int yskip;
388         unsigned int xbin;
389         unsigned int ybin;
390         int ret;
391
392         /* Windows position and size.
393          *
394          * TODO: Make sure the start coordinates and window size match the
395          * skipping, binning and mirroring (see description of registers 2 and 4
396          * in table 13, and Binning section on page 41).
397          */
398         ret = mt9p031_write(client, MT9P031_COLUMN_START, crop->left);
399         if (ret < 0)
400                 return ret;
401         ret = mt9p031_write(client, MT9P031_ROW_START, crop->top);
402         if (ret < 0)
403                 return ret;
404         ret = mt9p031_write(client, MT9P031_WINDOW_WIDTH, crop->width - 1);
405         if (ret < 0)
406                 return ret;
407         ret = mt9p031_write(client, MT9P031_WINDOW_HEIGHT, crop->height - 1);
408         if (ret < 0)
409                 return ret;
410
411         /* Row and column binning and skipping. Use the maximum binning value
412          * compatible with the skipping settings.
413          */
414         xskip = DIV_ROUND_CLOSEST(crop->width, format->width);
415         yskip = DIV_ROUND_CLOSEST(crop->height, format->height);
416         xbin = 1 << (ffs(xskip) - 1);
417         ybin = 1 << (ffs(yskip) - 1);
418
419         ret = mt9p031_write(client, MT9P031_COLUMN_ADDRESS_MODE,
420                             ((xbin - 1) << 4) | (xskip - 1));
421         if (ret < 0)
422                 return ret;
423         ret = mt9p031_write(client, MT9P031_ROW_ADDRESS_MODE,
424                             ((ybin - 1) << 4) | (yskip - 1));
425         if (ret < 0)
426                 return ret;
427
428         /* Blanking - use minimum value for horizontal blanking and default
429          * value for vertical blanking.
430          */
431         hblank = 346 * ybin + 64 + (80 >> min_t(unsigned int, xbin, 3));
432         vblank = MT9P031_VERTICAL_BLANK_DEF;
433
434         ret = mt9p031_write(client, MT9P031_HORIZONTAL_BLANK, hblank - 1);
435         if (ret < 0)
436                 return ret;
437         ret = mt9p031_write(client, MT9P031_VERTICAL_BLANK, vblank - 1);
438         if (ret < 0)
439                 return ret;
440
441         return ret;
442 }
443
444 static int mt9p031_s_stream(struct v4l2_subdev *subdev, int enable)
445 {
446         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
447         int ret;
448
449         if (!enable) {
450                 /* Stop sensor readout */
451                 ret = mt9p031_set_output_control(mt9p031,
452                                                  MT9P031_OUTPUT_CONTROL_CEN, 0);
453                 if (ret < 0)
454                         return ret;
455
456                 return mt9p031_pll_disable(mt9p031);
457         }
458
459         ret = mt9p031_set_params(mt9p031);
460         if (ret < 0)
461                 return ret;
462
463         /* Switch to master "normal" mode */
464         ret = mt9p031_set_output_control(mt9p031, 0,
465                                          MT9P031_OUTPUT_CONTROL_CEN);
466         if (ret < 0)
467                 return ret;
468
469         return mt9p031_pll_enable(mt9p031);
470 }
471
472 static int mt9p031_enum_mbus_code(struct v4l2_subdev *subdev,
473                                   struct v4l2_subdev_state *sd_state,
474                                   struct v4l2_subdev_mbus_code_enum *code)
475 {
476         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
477
478         if (code->pad || code->index)
479                 return -EINVAL;
480
481         code->code = mt9p031->format.code;
482         return 0;
483 }
484
485 static int mt9p031_enum_frame_size(struct v4l2_subdev *subdev,
486                                    struct v4l2_subdev_state *sd_state,
487                                    struct v4l2_subdev_frame_size_enum *fse)
488 {
489         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
490
491         if (fse->index >= 8 || fse->code != mt9p031->format.code)
492                 return -EINVAL;
493
494         fse->min_width = MT9P031_WINDOW_WIDTH_DEF
495                        / min_t(unsigned int, 7, fse->index + 1);
496         fse->max_width = fse->min_width;
497         fse->min_height = MT9P031_WINDOW_HEIGHT_DEF / (fse->index + 1);
498         fse->max_height = fse->min_height;
499
500         return 0;
501 }
502
503 static struct v4l2_mbus_framefmt *
504 __mt9p031_get_pad_format(struct mt9p031 *mt9p031,
505                          struct v4l2_subdev_state *sd_state,
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, sd_state,
511                                                   pad);
512         case V4L2_SUBDEV_FORMAT_ACTIVE:
513                 return &mt9p031->format;
514         default:
515                 return NULL;
516         }
517 }
518
519 static struct v4l2_rect *
520 __mt9p031_get_pad_crop(struct mt9p031 *mt9p031,
521                        struct v4l2_subdev_state *sd_state,
522                        unsigned int pad, u32 which)
523 {
524         switch (which) {
525         case V4L2_SUBDEV_FORMAT_TRY:
526                 return v4l2_subdev_get_try_crop(&mt9p031->subdev, sd_state,
527                                                 pad);
528         case V4L2_SUBDEV_FORMAT_ACTIVE:
529                 return &mt9p031->crop;
530         default:
531                 return NULL;
532         }
533 }
534
535 static int mt9p031_get_format(struct v4l2_subdev *subdev,
536                               struct v4l2_subdev_state *sd_state,
537                               struct v4l2_subdev_format *fmt)
538 {
539         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
540
541         fmt->format = *__mt9p031_get_pad_format(mt9p031, sd_state, fmt->pad,
542                                                 fmt->which);
543         return 0;
544 }
545
546 static int mt9p031_set_format(struct v4l2_subdev *subdev,
547                               struct v4l2_subdev_state *sd_state,
548                               struct v4l2_subdev_format *format)
549 {
550         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
551         struct v4l2_mbus_framefmt *__format;
552         struct v4l2_rect *__crop;
553         unsigned int width;
554         unsigned int height;
555         unsigned int hratio;
556         unsigned int vratio;
557
558         __crop = __mt9p031_get_pad_crop(mt9p031, sd_state, format->pad,
559                                         format->which);
560
561         /* Clamp the width and height to avoid dividing by zero. */
562         width = clamp_t(unsigned int, ALIGN(format->format.width, 2),
563                         max_t(unsigned int, __crop->width / 7,
564                               MT9P031_WINDOW_WIDTH_MIN),
565                         __crop->width);
566         height = clamp_t(unsigned int, ALIGN(format->format.height, 2),
567                          max_t(unsigned int, __crop->height / 8,
568                                MT9P031_WINDOW_HEIGHT_MIN),
569                          __crop->height);
570
571         hratio = DIV_ROUND_CLOSEST(__crop->width, width);
572         vratio = DIV_ROUND_CLOSEST(__crop->height, height);
573
574         __format = __mt9p031_get_pad_format(mt9p031, sd_state, format->pad,
575                                             format->which);
576         __format->width = __crop->width / hratio;
577         __format->height = __crop->height / vratio;
578
579         format->format = *__format;
580
581         return 0;
582 }
583
584 static int mt9p031_get_selection(struct v4l2_subdev *subdev,
585                                  struct v4l2_subdev_state *sd_state,
586                                  struct v4l2_subdev_selection *sel)
587 {
588         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
589
590         if (sel->target != V4L2_SEL_TGT_CROP)
591                 return -EINVAL;
592
593         sel->r = *__mt9p031_get_pad_crop(mt9p031, sd_state, sel->pad,
594                                          sel->which);
595         return 0;
596 }
597
598 static int mt9p031_set_selection(struct v4l2_subdev *subdev,
599                                  struct v4l2_subdev_state *sd_state,
600                                  struct v4l2_subdev_selection *sel)
601 {
602         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
603         struct v4l2_mbus_framefmt *__format;
604         struct v4l2_rect *__crop;
605         struct v4l2_rect rect;
606
607         if (sel->target != V4L2_SEL_TGT_CROP)
608                 return -EINVAL;
609
610         /* Clamp the crop rectangle boundaries and align them to a multiple of 2
611          * pixels to ensure a GRBG Bayer pattern.
612          */
613         rect.left = clamp(ALIGN(sel->r.left, 2), MT9P031_COLUMN_START_MIN,
614                           MT9P031_COLUMN_START_MAX);
615         rect.top = clamp(ALIGN(sel->r.top, 2), MT9P031_ROW_START_MIN,
616                          MT9P031_ROW_START_MAX);
617         rect.width = clamp_t(unsigned int, ALIGN(sel->r.width, 2),
618                              MT9P031_WINDOW_WIDTH_MIN,
619                              MT9P031_WINDOW_WIDTH_MAX);
620         rect.height = clamp_t(unsigned int, ALIGN(sel->r.height, 2),
621                               MT9P031_WINDOW_HEIGHT_MIN,
622                               MT9P031_WINDOW_HEIGHT_MAX);
623
624         rect.width = min_t(unsigned int, rect.width,
625                            MT9P031_PIXEL_ARRAY_WIDTH - rect.left);
626         rect.height = min_t(unsigned int, rect.height,
627                             MT9P031_PIXEL_ARRAY_HEIGHT - rect.top);
628
629         __crop = __mt9p031_get_pad_crop(mt9p031, sd_state, sel->pad,
630                                         sel->which);
631
632         if (rect.width != __crop->width || rect.height != __crop->height) {
633                 /* Reset the output image size if the crop rectangle size has
634                  * been modified.
635                  */
636                 __format = __mt9p031_get_pad_format(mt9p031, sd_state,
637                                                     sel->pad,
638                                                     sel->which);
639                 __format->width = rect.width;
640                 __format->height = rect.height;
641         }
642
643         *__crop = rect;
644         sel->r = rect;
645
646         return 0;
647 }
648
649 /* -----------------------------------------------------------------------------
650  * V4L2 subdev control operations
651  */
652
653 #define V4L2_CID_BLC_AUTO               (V4L2_CID_USER_BASE | 0x1002)
654 #define V4L2_CID_BLC_TARGET_LEVEL       (V4L2_CID_USER_BASE | 0x1003)
655 #define V4L2_CID_BLC_ANALOG_OFFSET      (V4L2_CID_USER_BASE | 0x1004)
656 #define V4L2_CID_BLC_DIGITAL_OFFSET     (V4L2_CID_USER_BASE | 0x1005)
657
658 static int mt9p031_restore_blc(struct mt9p031 *mt9p031)
659 {
660         struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
661         int ret;
662
663         if (mt9p031->blc_auto->cur.val != 0) {
664                 ret = mt9p031_set_mode2(mt9p031, 0,
665                                         MT9P031_READ_MODE_2_ROW_BLC);
666                 if (ret < 0)
667                         return ret;
668         }
669
670         if (mt9p031->blc_offset->cur.val != 0) {
671                 ret = mt9p031_write(client, MT9P031_ROW_BLACK_TARGET,
672                                     mt9p031->blc_offset->cur.val);
673                 if (ret < 0)
674                         return ret;
675         }
676
677         return 0;
678 }
679
680 static int mt9p031_s_ctrl(struct v4l2_ctrl *ctrl)
681 {
682         struct mt9p031 *mt9p031 =
683                         container_of(ctrl->handler, struct mt9p031, ctrls);
684         struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
685         u16 data;
686         int ret;
687
688         if (ctrl->flags & V4L2_CTRL_FLAG_INACTIVE)
689                 return 0;
690
691         switch (ctrl->id) {
692         case V4L2_CID_EXPOSURE:
693                 ret = mt9p031_write(client, MT9P031_SHUTTER_WIDTH_UPPER,
694                                     (ctrl->val >> 16) & 0xffff);
695                 if (ret < 0)
696                         return ret;
697
698                 return mt9p031_write(client, MT9P031_SHUTTER_WIDTH_LOWER,
699                                      ctrl->val & 0xffff);
700
701         case V4L2_CID_GAIN:
702                 /* Gain is controlled by 2 analog stages and a digital stage.
703                  * Valid values for the 3 stages are
704                  *
705                  * Stage                Min     Max     Step
706                  * ------------------------------------------
707                  * First analog stage   x1      x2      1
708                  * Second analog stage  x1      x4      0.125
709                  * Digital stage        x1      x16     0.125
710                  *
711                  * To minimize noise, the gain stages should be used in the
712                  * second analog stage, first analog stage, digital stage order.
713                  * Gain from a previous stage should be pushed to its maximum
714                  * value before the next stage is used.
715                  */
716                 if (ctrl->val <= 32) {
717                         data = ctrl->val;
718                 } else if (ctrl->val <= 64) {
719                         ctrl->val &= ~1;
720                         data = (1 << 6) | (ctrl->val >> 1);
721                 } else {
722                         ctrl->val &= ~7;
723                         data = ((ctrl->val - 64) << 5) | (1 << 6) | 32;
724                 }
725
726                 return mt9p031_write(client, MT9P031_GLOBAL_GAIN, data);
727
728         case V4L2_CID_HFLIP:
729                 if (ctrl->val)
730                         return mt9p031_set_mode2(mt9p031,
731                                         0, MT9P031_READ_MODE_2_COL_MIR);
732                 else
733                         return mt9p031_set_mode2(mt9p031,
734                                         MT9P031_READ_MODE_2_COL_MIR, 0);
735
736         case V4L2_CID_VFLIP:
737                 if (ctrl->val)
738                         return mt9p031_set_mode2(mt9p031,
739                                         0, MT9P031_READ_MODE_2_ROW_MIR);
740                 else
741                         return mt9p031_set_mode2(mt9p031,
742                                         MT9P031_READ_MODE_2_ROW_MIR, 0);
743
744         case V4L2_CID_TEST_PATTERN:
745                 /* The digital side of the Black Level Calibration function must
746                  * be disabled when generating a test pattern to avoid artifacts
747                  * in the image. Activate (deactivate) the BLC-related controls
748                  * when the test pattern is enabled (disabled).
749                  */
750                 v4l2_ctrl_activate(mt9p031->blc_auto, ctrl->val == 0);
751                 v4l2_ctrl_activate(mt9p031->blc_offset, ctrl->val == 0);
752
753                 if (!ctrl->val) {
754                         /* Restore the BLC settings. */
755                         ret = mt9p031_restore_blc(mt9p031);
756                         if (ret < 0)
757                                 return ret;
758
759                         return mt9p031_write(client, MT9P031_TEST_PATTERN,
760                                              MT9P031_TEST_PATTERN_DISABLE);
761                 }
762
763                 ret = mt9p031_write(client, MT9P031_TEST_PATTERN_GREEN, 0x05a0);
764                 if (ret < 0)
765                         return ret;
766                 ret = mt9p031_write(client, MT9P031_TEST_PATTERN_RED, 0x0a50);
767                 if (ret < 0)
768                         return ret;
769                 ret = mt9p031_write(client, MT9P031_TEST_PATTERN_BLUE, 0x0aa0);
770                 if (ret < 0)
771                         return ret;
772
773                 /* Disable digital BLC when generating a test pattern. */
774                 ret = mt9p031_set_mode2(mt9p031, MT9P031_READ_MODE_2_ROW_BLC,
775                                         0);
776                 if (ret < 0)
777                         return ret;
778
779                 ret = mt9p031_write(client, MT9P031_ROW_BLACK_DEF_OFFSET, 0);
780                 if (ret < 0)
781                         return ret;
782
783                 return mt9p031_write(client, MT9P031_TEST_PATTERN,
784                                 ((ctrl->val - 1) << MT9P031_TEST_PATTERN_SHIFT)
785                                 | MT9P031_TEST_PATTERN_ENABLE);
786
787         case V4L2_CID_BLC_AUTO:
788                 ret = mt9p031_set_mode2(mt9p031,
789                                 ctrl->val ? 0 : MT9P031_READ_MODE_2_ROW_BLC,
790                                 ctrl->val ? MT9P031_READ_MODE_2_ROW_BLC : 0);
791                 if (ret < 0)
792                         return ret;
793
794                 return mt9p031_write(client, MT9P031_BLACK_LEVEL_CALIBRATION,
795                                      ctrl->val ? 0 : MT9P031_BLC_MANUAL_BLC);
796
797         case V4L2_CID_BLC_TARGET_LEVEL:
798                 return mt9p031_write(client, MT9P031_ROW_BLACK_TARGET,
799                                      ctrl->val);
800
801         case V4L2_CID_BLC_ANALOG_OFFSET:
802                 data = ctrl->val & ((1 << 9) - 1);
803
804                 ret = mt9p031_write(client, MT9P031_GREEN1_OFFSET, data);
805                 if (ret < 0)
806                         return ret;
807                 ret = mt9p031_write(client, MT9P031_GREEN2_OFFSET, data);
808                 if (ret < 0)
809                         return ret;
810                 ret = mt9p031_write(client, MT9P031_RED_OFFSET, data);
811                 if (ret < 0)
812                         return ret;
813                 return mt9p031_write(client, MT9P031_BLUE_OFFSET, data);
814
815         case V4L2_CID_BLC_DIGITAL_OFFSET:
816                 return mt9p031_write(client, MT9P031_ROW_BLACK_DEF_OFFSET,
817                                      ctrl->val & ((1 << 12) - 1));
818         }
819
820         return 0;
821 }
822
823 static const struct v4l2_ctrl_ops mt9p031_ctrl_ops = {
824         .s_ctrl = mt9p031_s_ctrl,
825 };
826
827 static const char * const mt9p031_test_pattern_menu[] = {
828         "Disabled",
829         "Color Field",
830         "Horizontal Gradient",
831         "Vertical Gradient",
832         "Diagonal Gradient",
833         "Classic Test Pattern",
834         "Walking 1s",
835         "Monochrome Horizontal Bars",
836         "Monochrome Vertical Bars",
837         "Vertical Color Bars",
838 };
839
840 static const struct v4l2_ctrl_config mt9p031_ctrls[] = {
841         {
842                 .ops            = &mt9p031_ctrl_ops,
843                 .id             = V4L2_CID_BLC_AUTO,
844                 .type           = V4L2_CTRL_TYPE_BOOLEAN,
845                 .name           = "BLC, Auto",
846                 .min            = 0,
847                 .max            = 1,
848                 .step           = 1,
849                 .def            = 1,
850                 .flags          = 0,
851         }, {
852                 .ops            = &mt9p031_ctrl_ops,
853                 .id             = V4L2_CID_BLC_TARGET_LEVEL,
854                 .type           = V4L2_CTRL_TYPE_INTEGER,
855                 .name           = "BLC Target Level",
856                 .min            = 0,
857                 .max            = 4095,
858                 .step           = 1,
859                 .def            = 168,
860                 .flags          = 0,
861         }, {
862                 .ops            = &mt9p031_ctrl_ops,
863                 .id             = V4L2_CID_BLC_ANALOG_OFFSET,
864                 .type           = V4L2_CTRL_TYPE_INTEGER,
865                 .name           = "BLC Analog Offset",
866                 .min            = -255,
867                 .max            = 255,
868                 .step           = 1,
869                 .def            = 32,
870                 .flags          = 0,
871         }, {
872                 .ops            = &mt9p031_ctrl_ops,
873                 .id             = V4L2_CID_BLC_DIGITAL_OFFSET,
874                 .type           = V4L2_CTRL_TYPE_INTEGER,
875                 .name           = "BLC Digital Offset",
876                 .min            = -2048,
877                 .max            = 2047,
878                 .step           = 1,
879                 .def            = 40,
880                 .flags          = 0,
881         }
882 };
883
884 /* -----------------------------------------------------------------------------
885  * V4L2 subdev core operations
886  */
887
888 static int mt9p031_set_power(struct v4l2_subdev *subdev, int on)
889 {
890         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
891         int ret = 0;
892
893         mutex_lock(&mt9p031->power_lock);
894
895         /* If the power count is modified from 0 to != 0 or from != 0 to 0,
896          * update the power state.
897          */
898         if (mt9p031->power_count == !on) {
899                 ret = __mt9p031_set_power(mt9p031, !!on);
900                 if (ret < 0)
901                         goto out;
902         }
903
904         /* Update the power count. */
905         mt9p031->power_count += on ? 1 : -1;
906         WARN_ON(mt9p031->power_count < 0);
907
908 out:
909         mutex_unlock(&mt9p031->power_lock);
910         return ret;
911 }
912
913 /* -----------------------------------------------------------------------------
914  * V4L2 subdev internal operations
915  */
916
917 static int mt9p031_registered(struct v4l2_subdev *subdev)
918 {
919         struct i2c_client *client = v4l2_get_subdevdata(subdev);
920         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
921         s32 data;
922         int ret;
923
924         ret = mt9p031_power_on(mt9p031);
925         if (ret < 0) {
926                 dev_err(&client->dev, "MT9P031 power up failed\n");
927                 return ret;
928         }
929
930         /* Read out the chip version register */
931         data = mt9p031_read(client, MT9P031_CHIP_VERSION);
932         mt9p031_power_off(mt9p031);
933
934         if (data != MT9P031_CHIP_VERSION_VALUE) {
935                 dev_err(&client->dev, "MT9P031 not detected, wrong version "
936                         "0x%04x\n", data);
937                 return -ENODEV;
938         }
939
940         dev_info(&client->dev, "MT9P031 detected at address 0x%02x\n",
941                  client->addr);
942
943         return 0;
944 }
945
946 static int mt9p031_open(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
947 {
948         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
949         struct v4l2_mbus_framefmt *format;
950         struct v4l2_rect *crop;
951
952         crop = v4l2_subdev_get_try_crop(subdev, fh->state, 0);
953         crop->left = MT9P031_COLUMN_START_DEF;
954         crop->top = MT9P031_ROW_START_DEF;
955         crop->width = MT9P031_WINDOW_WIDTH_DEF;
956         crop->height = MT9P031_WINDOW_HEIGHT_DEF;
957
958         format = v4l2_subdev_get_try_format(subdev, fh->state, 0);
959
960         if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
961                 format->code = MEDIA_BUS_FMT_Y12_1X12;
962         else
963                 format->code = MEDIA_BUS_FMT_SGRBG12_1X12;
964
965         format->width = MT9P031_WINDOW_WIDTH_DEF;
966         format->height = MT9P031_WINDOW_HEIGHT_DEF;
967         format->field = V4L2_FIELD_NONE;
968         format->colorspace = V4L2_COLORSPACE_SRGB;
969
970         return mt9p031_set_power(subdev, 1);
971 }
972
973 static int mt9p031_close(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
974 {
975         return mt9p031_set_power(subdev, 0);
976 }
977
978 static const struct v4l2_subdev_core_ops mt9p031_subdev_core_ops = {
979         .s_power        = mt9p031_set_power,
980 };
981
982 static const struct v4l2_subdev_video_ops mt9p031_subdev_video_ops = {
983         .s_stream       = mt9p031_s_stream,
984 };
985
986 static const struct v4l2_subdev_pad_ops mt9p031_subdev_pad_ops = {
987         .enum_mbus_code = mt9p031_enum_mbus_code,
988         .enum_frame_size = mt9p031_enum_frame_size,
989         .get_fmt = mt9p031_get_format,
990         .set_fmt = mt9p031_set_format,
991         .get_selection = mt9p031_get_selection,
992         .set_selection = mt9p031_set_selection,
993 };
994
995 static const struct v4l2_subdev_ops mt9p031_subdev_ops = {
996         .core   = &mt9p031_subdev_core_ops,
997         .video  = &mt9p031_subdev_video_ops,
998         .pad    = &mt9p031_subdev_pad_ops,
999 };
1000
1001 static const struct v4l2_subdev_internal_ops mt9p031_subdev_internal_ops = {
1002         .registered = mt9p031_registered,
1003         .open = mt9p031_open,
1004         .close = mt9p031_close,
1005 };
1006
1007 /* -----------------------------------------------------------------------------
1008  * Driver initialization and probing
1009  */
1010
1011 static struct mt9p031_platform_data *
1012 mt9p031_get_pdata(struct i2c_client *client)
1013 {
1014         struct mt9p031_platform_data *pdata;
1015         struct device_node *np;
1016
1017         if (!IS_ENABLED(CONFIG_OF) || !client->dev.of_node)
1018                 return client->dev.platform_data;
1019
1020         np = of_graph_get_next_endpoint(client->dev.of_node, NULL);
1021         if (!np)
1022                 return NULL;
1023
1024         pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
1025         if (!pdata)
1026                 goto done;
1027
1028         of_property_read_u32(np, "input-clock-frequency", &pdata->ext_freq);
1029         of_property_read_u32(np, "pixel-clock-frequency", &pdata->target_freq);
1030
1031 done:
1032         of_node_put(np);
1033         return pdata;
1034 }
1035
1036 static int mt9p031_probe(struct i2c_client *client,
1037                          const struct i2c_device_id *did)
1038 {
1039         struct mt9p031_platform_data *pdata = mt9p031_get_pdata(client);
1040         struct i2c_adapter *adapter = client->adapter;
1041         struct mt9p031 *mt9p031;
1042         unsigned int i;
1043         int ret;
1044
1045         if (pdata == NULL) {
1046                 dev_err(&client->dev, "No platform data\n");
1047                 return -EINVAL;
1048         }
1049
1050         if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) {
1051                 dev_warn(&client->dev,
1052                         "I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD\n");
1053                 return -EIO;
1054         }
1055
1056         mt9p031 = devm_kzalloc(&client->dev, sizeof(*mt9p031), GFP_KERNEL);
1057         if (mt9p031 == NULL)
1058                 return -ENOMEM;
1059
1060         mt9p031->pdata = pdata;
1061         mt9p031->output_control = MT9P031_OUTPUT_CONTROL_DEF;
1062         mt9p031->mode2 = MT9P031_READ_MODE_2_ROW_BLC;
1063         mt9p031->model = did->driver_data;
1064
1065         mt9p031->regulators[0].supply = "vdd";
1066         mt9p031->regulators[1].supply = "vdd_io";
1067         mt9p031->regulators[2].supply = "vaa";
1068
1069         ret = devm_regulator_bulk_get(&client->dev, 3, mt9p031->regulators);
1070         if (ret < 0) {
1071                 dev_err(&client->dev, "Unable to get regulators\n");
1072                 return ret;
1073         }
1074
1075         mutex_init(&mt9p031->power_lock);
1076
1077         v4l2_ctrl_handler_init(&mt9p031->ctrls, ARRAY_SIZE(mt9p031_ctrls) + 6);
1078
1079         v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1080                           V4L2_CID_EXPOSURE, MT9P031_SHUTTER_WIDTH_MIN,
1081                           MT9P031_SHUTTER_WIDTH_MAX, 1,
1082                           MT9P031_SHUTTER_WIDTH_DEF);
1083         v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1084                           V4L2_CID_GAIN, MT9P031_GLOBAL_GAIN_MIN,
1085                           MT9P031_GLOBAL_GAIN_MAX, 1, MT9P031_GLOBAL_GAIN_DEF);
1086         v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1087                           V4L2_CID_HFLIP, 0, 1, 1, 0);
1088         v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1089                           V4L2_CID_VFLIP, 0, 1, 1, 0);
1090         v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1091                           V4L2_CID_PIXEL_RATE, pdata->target_freq,
1092                           pdata->target_freq, 1, pdata->target_freq);
1093         v4l2_ctrl_new_std_menu_items(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1094                           V4L2_CID_TEST_PATTERN,
1095                           ARRAY_SIZE(mt9p031_test_pattern_menu) - 1, 0,
1096                           0, mt9p031_test_pattern_menu);
1097
1098         for (i = 0; i < ARRAY_SIZE(mt9p031_ctrls); ++i)
1099                 v4l2_ctrl_new_custom(&mt9p031->ctrls, &mt9p031_ctrls[i], NULL);
1100
1101         mt9p031->subdev.ctrl_handler = &mt9p031->ctrls;
1102
1103         if (mt9p031->ctrls.error) {
1104                 printk(KERN_INFO "%s: control initialization error %d\n",
1105                        __func__, mt9p031->ctrls.error);
1106                 ret = mt9p031->ctrls.error;
1107                 goto done;
1108         }
1109
1110         mt9p031->blc_auto = v4l2_ctrl_find(&mt9p031->ctrls, V4L2_CID_BLC_AUTO);
1111         mt9p031->blc_offset = v4l2_ctrl_find(&mt9p031->ctrls,
1112                                              V4L2_CID_BLC_DIGITAL_OFFSET);
1113
1114         v4l2_i2c_subdev_init(&mt9p031->subdev, client, &mt9p031_subdev_ops);
1115         mt9p031->subdev.internal_ops = &mt9p031_subdev_internal_ops;
1116
1117         mt9p031->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1118         mt9p031->pad.flags = MEDIA_PAD_FL_SOURCE;
1119         ret = media_entity_pads_init(&mt9p031->subdev.entity, 1, &mt9p031->pad);
1120         if (ret < 0)
1121                 goto done;
1122
1123         mt9p031->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1124
1125         mt9p031->crop.width = MT9P031_WINDOW_WIDTH_DEF;
1126         mt9p031->crop.height = MT9P031_WINDOW_HEIGHT_DEF;
1127         mt9p031->crop.left = MT9P031_COLUMN_START_DEF;
1128         mt9p031->crop.top = MT9P031_ROW_START_DEF;
1129
1130         if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
1131                 mt9p031->format.code = MEDIA_BUS_FMT_Y12_1X12;
1132         else
1133                 mt9p031->format.code = MEDIA_BUS_FMT_SGRBG12_1X12;
1134
1135         mt9p031->format.width = MT9P031_WINDOW_WIDTH_DEF;
1136         mt9p031->format.height = MT9P031_WINDOW_HEIGHT_DEF;
1137         mt9p031->format.field = V4L2_FIELD_NONE;
1138         mt9p031->format.colorspace = V4L2_COLORSPACE_SRGB;
1139
1140         mt9p031->reset = devm_gpiod_get_optional(&client->dev, "reset",
1141                                                  GPIOD_OUT_HIGH);
1142
1143         ret = mt9p031_clk_setup(mt9p031);
1144         if (ret)
1145                 goto done;
1146
1147         ret = v4l2_async_register_subdev(&mt9p031->subdev);
1148
1149 done:
1150         if (ret < 0) {
1151                 v4l2_ctrl_handler_free(&mt9p031->ctrls);
1152                 media_entity_cleanup(&mt9p031->subdev.entity);
1153                 mutex_destroy(&mt9p031->power_lock);
1154         }
1155
1156         return ret;
1157 }
1158
1159 static int mt9p031_remove(struct i2c_client *client)
1160 {
1161         struct v4l2_subdev *subdev = i2c_get_clientdata(client);
1162         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
1163
1164         v4l2_ctrl_handler_free(&mt9p031->ctrls);
1165         v4l2_async_unregister_subdev(subdev);
1166         media_entity_cleanup(&subdev->entity);
1167         mutex_destroy(&mt9p031->power_lock);
1168
1169         return 0;
1170 }
1171
1172 static const struct i2c_device_id mt9p031_id[] = {
1173         { "mt9p031", MT9P031_MODEL_COLOR },
1174         { "mt9p031m", MT9P031_MODEL_MONOCHROME },
1175         { }
1176 };
1177 MODULE_DEVICE_TABLE(i2c, mt9p031_id);
1178
1179 #if IS_ENABLED(CONFIG_OF)
1180 static const struct of_device_id mt9p031_of_match[] = {
1181         { .compatible = "aptina,mt9p031", },
1182         { .compatible = "aptina,mt9p031m", },
1183         { /* sentinel */ },
1184 };
1185 MODULE_DEVICE_TABLE(of, mt9p031_of_match);
1186 #endif
1187
1188 static struct i2c_driver mt9p031_i2c_driver = {
1189         .driver = {
1190                 .of_match_table = of_match_ptr(mt9p031_of_match),
1191                 .name = "mt9p031",
1192         },
1193         .probe          = mt9p031_probe,
1194         .remove         = mt9p031_remove,
1195         .id_table       = mt9p031_id,
1196 };
1197
1198 module_i2c_driver(mt9p031_i2c_driver);
1199
1200 MODULE_DESCRIPTION("Aptina MT9P031 Camera driver");
1201 MODULE_AUTHOR("Bastian Hecht <hechtb@gmail.com>");
1202 MODULE_LICENSE("GPL v2");