ima: fix bug in argument order
[sfrench/cifs-2.6.git] / drivers / media / i2c / mt9p031.c
1 /*
2  * Driver for MT9P031 CMOS Image Sensor from Aptina
3  *
4  * Copyright (C) 2011, Laurent Pinchart <laurent.pinchart@ideasonboard.com>
5  * Copyright (C) 2011, Javier Martin <javier.martin@vista-silicon.com>
6  * Copyright (C) 2011, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
7  *
8  * Based on the MT9V032 driver and Bastian Hecht's code.
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2 as
12  * published by the Free Software Foundation.
13  */
14
15 #include <linux/delay.h>
16 #include <linux/device.h>
17 #include <linux/gpio.h>
18 #include <linux/module.h>
19 #include <linux/i2c.h>
20 #include <linux/log2.h>
21 #include <linux/pm.h>
22 #include <linux/slab.h>
23 #include <linux/videodev2.h>
24
25 #include <media/mt9p031.h>
26 #include <media/v4l2-chip-ident.h>
27 #include <media/v4l2-ctrls.h>
28 #include <media/v4l2-device.h>
29 #include <media/v4l2-subdev.h>
30
31 #include "aptina-pll.h"
32
33 #define MT9P031_PIXEL_ARRAY_WIDTH                       2752
34 #define MT9P031_PIXEL_ARRAY_HEIGHT                      2004
35
36 #define MT9P031_CHIP_VERSION                            0x00
37 #define         MT9P031_CHIP_VERSION_VALUE              0x1801
38 #define MT9P031_ROW_START                               0x01
39 #define         MT9P031_ROW_START_MIN                   0
40 #define         MT9P031_ROW_START_MAX                   2004
41 #define         MT9P031_ROW_START_DEF                   54
42 #define MT9P031_COLUMN_START                            0x02
43 #define         MT9P031_COLUMN_START_MIN                0
44 #define         MT9P031_COLUMN_START_MAX                2750
45 #define         MT9P031_COLUMN_START_DEF                16
46 #define MT9P031_WINDOW_HEIGHT                           0x03
47 #define         MT9P031_WINDOW_HEIGHT_MIN               2
48 #define         MT9P031_WINDOW_HEIGHT_MAX               2006
49 #define         MT9P031_WINDOW_HEIGHT_DEF               1944
50 #define MT9P031_WINDOW_WIDTH                            0x04
51 #define         MT9P031_WINDOW_WIDTH_MIN                2
52 #define         MT9P031_WINDOW_WIDTH_MAX                2752
53 #define         MT9P031_WINDOW_WIDTH_DEF                2592
54 #define MT9P031_HORIZONTAL_BLANK                        0x05
55 #define         MT9P031_HORIZONTAL_BLANK_MIN            0
56 #define         MT9P031_HORIZONTAL_BLANK_MAX            4095
57 #define MT9P031_VERTICAL_BLANK                          0x06
58 #define         MT9P031_VERTICAL_BLANK_MIN              1
59 #define         MT9P031_VERTICAL_BLANK_MAX              4096
60 #define         MT9P031_VERTICAL_BLANK_DEF              26
61 #define MT9P031_OUTPUT_CONTROL                          0x07
62 #define         MT9P031_OUTPUT_CONTROL_CEN              2
63 #define         MT9P031_OUTPUT_CONTROL_SYN              1
64 #define         MT9P031_OUTPUT_CONTROL_DEF              0x1f82
65 #define MT9P031_SHUTTER_WIDTH_UPPER                     0x08
66 #define MT9P031_SHUTTER_WIDTH_LOWER                     0x09
67 #define         MT9P031_SHUTTER_WIDTH_MIN               1
68 #define         MT9P031_SHUTTER_WIDTH_MAX               1048575
69 #define         MT9P031_SHUTTER_WIDTH_DEF               1943
70 #define MT9P031_PLL_CONTROL                             0x10
71 #define         MT9P031_PLL_CONTROL_PWROFF              0x0050
72 #define         MT9P031_PLL_CONTROL_PWRON               0x0051
73 #define         MT9P031_PLL_CONTROL_USEPLL              0x0052
74 #define MT9P031_PLL_CONFIG_1                            0x11
75 #define MT9P031_PLL_CONFIG_2                            0x12
76 #define MT9P031_PIXEL_CLOCK_CONTROL                     0x0a
77 #define MT9P031_FRAME_RESTART                           0x0b
78 #define MT9P031_SHUTTER_DELAY                           0x0c
79 #define MT9P031_RST                                     0x0d
80 #define         MT9P031_RST_ENABLE                      1
81 #define         MT9P031_RST_DISABLE                     0
82 #define MT9P031_READ_MODE_1                             0x1e
83 #define MT9P031_READ_MODE_2                             0x20
84 #define         MT9P031_READ_MODE_2_ROW_MIR             (1 << 15)
85 #define         MT9P031_READ_MODE_2_COL_MIR             (1 << 14)
86 #define         MT9P031_READ_MODE_2_ROW_BLC             (1 << 6)
87 #define MT9P031_ROW_ADDRESS_MODE                        0x22
88 #define MT9P031_COLUMN_ADDRESS_MODE                     0x23
89 #define MT9P031_GLOBAL_GAIN                             0x35
90 #define         MT9P031_GLOBAL_GAIN_MIN                 8
91 #define         MT9P031_GLOBAL_GAIN_MAX                 1024
92 #define         MT9P031_GLOBAL_GAIN_DEF                 8
93 #define         MT9P031_GLOBAL_GAIN_MULT                (1 << 6)
94 #define MT9P031_ROW_BLACK_TARGET                        0x49
95 #define MT9P031_ROW_BLACK_DEF_OFFSET                    0x4b
96 #define MT9P031_GREEN1_OFFSET                           0x60
97 #define MT9P031_GREEN2_OFFSET                           0x61
98 #define MT9P031_BLACK_LEVEL_CALIBRATION                 0x62
99 #define         MT9P031_BLC_MANUAL_BLC                  (1 << 0)
100 #define MT9P031_RED_OFFSET                              0x63
101 #define MT9P031_BLUE_OFFSET                             0x64
102 #define MT9P031_TEST_PATTERN                            0xa0
103 #define         MT9P031_TEST_PATTERN_SHIFT              3
104 #define         MT9P031_TEST_PATTERN_ENABLE             (1 << 0)
105 #define         MT9P031_TEST_PATTERN_DISABLE            (0 << 0)
106 #define MT9P031_TEST_PATTERN_GREEN                      0xa1
107 #define MT9P031_TEST_PATTERN_RED                        0xa2
108 #define MT9P031_TEST_PATTERN_BLUE                       0xa3
109
110 enum mt9p031_model {
111         MT9P031_MODEL_COLOR,
112         MT9P031_MODEL_MONOCHROME,
113 };
114
115 struct mt9p031 {
116         struct v4l2_subdev subdev;
117         struct media_pad pad;
118         struct v4l2_rect crop;  /* Sensor window */
119         struct v4l2_mbus_framefmt format;
120         struct mt9p031_platform_data *pdata;
121         struct mutex power_lock; /* lock to protect power_count */
122         int power_count;
123
124         enum mt9p031_model model;
125         struct aptina_pll pll;
126         int reset;
127
128         struct v4l2_ctrl_handler ctrls;
129         struct v4l2_ctrl *blc_auto;
130         struct v4l2_ctrl *blc_offset;
131
132         /* Registers cache */
133         u16 output_control;
134         u16 mode2;
135 };
136
137 static struct mt9p031 *to_mt9p031(struct v4l2_subdev *sd)
138 {
139         return container_of(sd, struct mt9p031, subdev);
140 }
141
142 static int mt9p031_read(struct i2c_client *client, u8 reg)
143 {
144         return i2c_smbus_read_word_swapped(client, reg);
145 }
146
147 static int mt9p031_write(struct i2c_client *client, u8 reg, u16 data)
148 {
149         return i2c_smbus_write_word_swapped(client, reg, data);
150 }
151
152 static int mt9p031_set_output_control(struct mt9p031 *mt9p031, u16 clear,
153                                       u16 set)
154 {
155         struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
156         u16 value = (mt9p031->output_control & ~clear) | set;
157         int ret;
158
159         ret = mt9p031_write(client, MT9P031_OUTPUT_CONTROL, value);
160         if (ret < 0)
161                 return ret;
162
163         mt9p031->output_control = value;
164         return 0;
165 }
166
167 static int mt9p031_set_mode2(struct mt9p031 *mt9p031, u16 clear, u16 set)
168 {
169         struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
170         u16 value = (mt9p031->mode2 & ~clear) | set;
171         int ret;
172
173         ret = mt9p031_write(client, MT9P031_READ_MODE_2, value);
174         if (ret < 0)
175                 return ret;
176
177         mt9p031->mode2 = value;
178         return 0;
179 }
180
181 static int mt9p031_reset(struct mt9p031 *mt9p031)
182 {
183         struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
184         int ret;
185
186         /* Disable chip output, synchronous option update */
187         ret = mt9p031_write(client, MT9P031_RST, MT9P031_RST_ENABLE);
188         if (ret < 0)
189                 return ret;
190         ret = mt9p031_write(client, MT9P031_RST, MT9P031_RST_DISABLE);
191         if (ret < 0)
192                 return ret;
193
194         return mt9p031_set_output_control(mt9p031, MT9P031_OUTPUT_CONTROL_CEN,
195                                           0);
196 }
197
198 static int mt9p031_pll_setup(struct mt9p031 *mt9p031)
199 {
200         static const struct aptina_pll_limits limits = {
201                 .ext_clock_min = 6000000,
202                 .ext_clock_max = 27000000,
203                 .int_clock_min = 2000000,
204                 .int_clock_max = 13500000,
205                 .out_clock_min = 180000000,
206                 .out_clock_max = 360000000,
207                 .pix_clock_max = 96000000,
208                 .n_min = 1,
209                 .n_max = 64,
210                 .m_min = 16,
211                 .m_max = 255,
212                 .p1_min = 1,
213                 .p1_max = 128,
214         };
215
216         struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
217         struct mt9p031_platform_data *pdata = mt9p031->pdata;
218
219         mt9p031->pll.ext_clock = pdata->ext_freq;
220         mt9p031->pll.pix_clock = pdata->target_freq;
221
222         return aptina_pll_calculate(&client->dev, &limits, &mt9p031->pll);
223 }
224
225 static int mt9p031_pll_enable(struct mt9p031 *mt9p031)
226 {
227         struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
228         int ret;
229
230         ret = mt9p031_write(client, MT9P031_PLL_CONTROL,
231                             MT9P031_PLL_CONTROL_PWRON);
232         if (ret < 0)
233                 return ret;
234
235         ret = mt9p031_write(client, MT9P031_PLL_CONFIG_1,
236                             (mt9p031->pll.m << 8) | (mt9p031->pll.n - 1));
237         if (ret < 0)
238                 return ret;
239
240         ret = mt9p031_write(client, MT9P031_PLL_CONFIG_2, mt9p031->pll.p1 - 1);
241         if (ret < 0)
242                 return ret;
243
244         usleep_range(1000, 2000);
245         ret = mt9p031_write(client, MT9P031_PLL_CONTROL,
246                             MT9P031_PLL_CONTROL_PWRON |
247                             MT9P031_PLL_CONTROL_USEPLL);
248         return ret;
249 }
250
251 static inline int mt9p031_pll_disable(struct mt9p031 *mt9p031)
252 {
253         struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
254
255         return mt9p031_write(client, MT9P031_PLL_CONTROL,
256                              MT9P031_PLL_CONTROL_PWROFF);
257 }
258
259 static int mt9p031_power_on(struct mt9p031 *mt9p031)
260 {
261         /* Ensure RESET_BAR is low */
262         if (mt9p031->reset != -1) {
263                 gpio_set_value(mt9p031->reset, 0);
264                 usleep_range(1000, 2000);
265         }
266
267         /* Emable clock */
268         if (mt9p031->pdata->set_xclk)
269                 mt9p031->pdata->set_xclk(&mt9p031->subdev,
270                                          mt9p031->pdata->ext_freq);
271
272         /* Now RESET_BAR must be high */
273         if (mt9p031->reset != -1) {
274                 gpio_set_value(mt9p031->reset, 1);
275                 usleep_range(1000, 2000);
276         }
277
278         return 0;
279 }
280
281 static void mt9p031_power_off(struct mt9p031 *mt9p031)
282 {
283         if (mt9p031->reset != -1) {
284                 gpio_set_value(mt9p031->reset, 0);
285                 usleep_range(1000, 2000);
286         }
287
288         if (mt9p031->pdata->set_xclk)
289                 mt9p031->pdata->set_xclk(&mt9p031->subdev, 0);
290 }
291
292 static int __mt9p031_set_power(struct mt9p031 *mt9p031, bool on)
293 {
294         struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
295         int ret;
296
297         if (!on) {
298                 mt9p031_power_off(mt9p031);
299                 return 0;
300         }
301
302         ret = mt9p031_power_on(mt9p031);
303         if (ret < 0)
304                 return ret;
305
306         ret = mt9p031_reset(mt9p031);
307         if (ret < 0) {
308                 dev_err(&client->dev, "Failed to reset the camera\n");
309                 return ret;
310         }
311
312         return v4l2_ctrl_handler_setup(&mt9p031->ctrls);
313 }
314
315 /* -----------------------------------------------------------------------------
316  * V4L2 subdev video operations
317  */
318
319 static int mt9p031_set_params(struct mt9p031 *mt9p031)
320 {
321         struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
322         struct v4l2_mbus_framefmt *format = &mt9p031->format;
323         const struct v4l2_rect *crop = &mt9p031->crop;
324         unsigned int hblank;
325         unsigned int vblank;
326         unsigned int xskip;
327         unsigned int yskip;
328         unsigned int xbin;
329         unsigned int ybin;
330         int ret;
331
332         /* Windows position and size.
333          *
334          * TODO: Make sure the start coordinates and window size match the
335          * skipping, binning and mirroring (see description of registers 2 and 4
336          * in table 13, and Binning section on page 41).
337          */
338         ret = mt9p031_write(client, MT9P031_COLUMN_START, crop->left);
339         if (ret < 0)
340                 return ret;
341         ret = mt9p031_write(client, MT9P031_ROW_START, crop->top);
342         if (ret < 0)
343                 return ret;
344         ret = mt9p031_write(client, MT9P031_WINDOW_WIDTH, crop->width - 1);
345         if (ret < 0)
346                 return ret;
347         ret = mt9p031_write(client, MT9P031_WINDOW_HEIGHT, crop->height - 1);
348         if (ret < 0)
349                 return ret;
350
351         /* Row and column binning and skipping. Use the maximum binning value
352          * compatible with the skipping settings.
353          */
354         xskip = DIV_ROUND_CLOSEST(crop->width, format->width);
355         yskip = DIV_ROUND_CLOSEST(crop->height, format->height);
356         xbin = 1 << (ffs(xskip) - 1);
357         ybin = 1 << (ffs(yskip) - 1);
358
359         ret = mt9p031_write(client, MT9P031_COLUMN_ADDRESS_MODE,
360                             ((xbin - 1) << 4) | (xskip - 1));
361         if (ret < 0)
362                 return ret;
363         ret = mt9p031_write(client, MT9P031_ROW_ADDRESS_MODE,
364                             ((ybin - 1) << 4) | (yskip - 1));
365         if (ret < 0)
366                 return ret;
367
368         /* Blanking - use minimum value for horizontal blanking and default
369          * value for vertical blanking.
370          */
371         hblank = 346 * ybin + 64 + (80 >> min_t(unsigned int, xbin, 3));
372         vblank = MT9P031_VERTICAL_BLANK_DEF;
373
374         ret = mt9p031_write(client, MT9P031_HORIZONTAL_BLANK, hblank - 1);
375         if (ret < 0)
376                 return ret;
377         ret = mt9p031_write(client, MT9P031_VERTICAL_BLANK, vblank - 1);
378         if (ret < 0)
379                 return ret;
380
381         return ret;
382 }
383
384 static int mt9p031_s_stream(struct v4l2_subdev *subdev, int enable)
385 {
386         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
387         int ret;
388
389         if (!enable) {
390                 /* Stop sensor readout */
391                 ret = mt9p031_set_output_control(mt9p031,
392                                                  MT9P031_OUTPUT_CONTROL_CEN, 0);
393                 if (ret < 0)
394                         return ret;
395
396                 return mt9p031_pll_disable(mt9p031);
397         }
398
399         ret = mt9p031_set_params(mt9p031);
400         if (ret < 0)
401                 return ret;
402
403         /* Switch to master "normal" mode */
404         ret = mt9p031_set_output_control(mt9p031, 0,
405                                          MT9P031_OUTPUT_CONTROL_CEN);
406         if (ret < 0)
407                 return ret;
408
409         return mt9p031_pll_enable(mt9p031);
410 }
411
412 static int mt9p031_enum_mbus_code(struct v4l2_subdev *subdev,
413                                   struct v4l2_subdev_fh *fh,
414                                   struct v4l2_subdev_mbus_code_enum *code)
415 {
416         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
417
418         if (code->pad || code->index)
419                 return -EINVAL;
420
421         code->code = mt9p031->format.code;
422         return 0;
423 }
424
425 static int mt9p031_enum_frame_size(struct v4l2_subdev *subdev,
426                                    struct v4l2_subdev_fh *fh,
427                                    struct v4l2_subdev_frame_size_enum *fse)
428 {
429         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
430
431         if (fse->index >= 8 || fse->code != mt9p031->format.code)
432                 return -EINVAL;
433
434         fse->min_width = MT9P031_WINDOW_WIDTH_DEF
435                        / min_t(unsigned int, 7, fse->index + 1);
436         fse->max_width = fse->min_width;
437         fse->min_height = MT9P031_WINDOW_HEIGHT_DEF / (fse->index + 1);
438         fse->max_height = fse->min_height;
439
440         return 0;
441 }
442
443 static struct v4l2_mbus_framefmt *
444 __mt9p031_get_pad_format(struct mt9p031 *mt9p031, struct v4l2_subdev_fh *fh,
445                          unsigned int pad, u32 which)
446 {
447         switch (which) {
448         case V4L2_SUBDEV_FORMAT_TRY:
449                 return v4l2_subdev_get_try_format(fh, pad);
450         case V4L2_SUBDEV_FORMAT_ACTIVE:
451                 return &mt9p031->format;
452         default:
453                 return NULL;
454         }
455 }
456
457 static struct v4l2_rect *
458 __mt9p031_get_pad_crop(struct mt9p031 *mt9p031, struct v4l2_subdev_fh *fh,
459                      unsigned int pad, u32 which)
460 {
461         switch (which) {
462         case V4L2_SUBDEV_FORMAT_TRY:
463                 return v4l2_subdev_get_try_crop(fh, pad);
464         case V4L2_SUBDEV_FORMAT_ACTIVE:
465                 return &mt9p031->crop;
466         default:
467                 return NULL;
468         }
469 }
470
471 static int mt9p031_get_format(struct v4l2_subdev *subdev,
472                               struct v4l2_subdev_fh *fh,
473                               struct v4l2_subdev_format *fmt)
474 {
475         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
476
477         fmt->format = *__mt9p031_get_pad_format(mt9p031, fh, fmt->pad,
478                                                 fmt->which);
479         return 0;
480 }
481
482 static int mt9p031_set_format(struct v4l2_subdev *subdev,
483                               struct v4l2_subdev_fh *fh,
484                               struct v4l2_subdev_format *format)
485 {
486         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
487         struct v4l2_mbus_framefmt *__format;
488         struct v4l2_rect *__crop;
489         unsigned int width;
490         unsigned int height;
491         unsigned int hratio;
492         unsigned int vratio;
493
494         __crop = __mt9p031_get_pad_crop(mt9p031, fh, format->pad,
495                                         format->which);
496
497         /* Clamp the width and height to avoid dividing by zero. */
498         width = clamp_t(unsigned int, ALIGN(format->format.width, 2),
499                         max(__crop->width / 7, MT9P031_WINDOW_WIDTH_MIN),
500                         __crop->width);
501         height = clamp_t(unsigned int, ALIGN(format->format.height, 2),
502                         max(__crop->height / 8, MT9P031_WINDOW_HEIGHT_MIN),
503                         __crop->height);
504
505         hratio = DIV_ROUND_CLOSEST(__crop->width, width);
506         vratio = DIV_ROUND_CLOSEST(__crop->height, height);
507
508         __format = __mt9p031_get_pad_format(mt9p031, fh, format->pad,
509                                             format->which);
510         __format->width = __crop->width / hratio;
511         __format->height = __crop->height / vratio;
512
513         format->format = *__format;
514
515         return 0;
516 }
517
518 static int mt9p031_get_crop(struct v4l2_subdev *subdev,
519                             struct v4l2_subdev_fh *fh,
520                             struct v4l2_subdev_crop *crop)
521 {
522         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
523
524         crop->rect = *__mt9p031_get_pad_crop(mt9p031, fh, crop->pad,
525                                              crop->which);
526         return 0;
527 }
528
529 static int mt9p031_set_crop(struct v4l2_subdev *subdev,
530                             struct v4l2_subdev_fh *fh,
531                             struct v4l2_subdev_crop *crop)
532 {
533         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
534         struct v4l2_mbus_framefmt *__format;
535         struct v4l2_rect *__crop;
536         struct v4l2_rect rect;
537
538         /* Clamp the crop rectangle boundaries and align them to a multiple of 2
539          * pixels to ensure a GRBG Bayer pattern.
540          */
541         rect.left = clamp(ALIGN(crop->rect.left, 2), MT9P031_COLUMN_START_MIN,
542                           MT9P031_COLUMN_START_MAX);
543         rect.top = clamp(ALIGN(crop->rect.top, 2), MT9P031_ROW_START_MIN,
544                          MT9P031_ROW_START_MAX);
545         rect.width = clamp(ALIGN(crop->rect.width, 2),
546                            MT9P031_WINDOW_WIDTH_MIN,
547                            MT9P031_WINDOW_WIDTH_MAX);
548         rect.height = clamp(ALIGN(crop->rect.height, 2),
549                             MT9P031_WINDOW_HEIGHT_MIN,
550                             MT9P031_WINDOW_HEIGHT_MAX);
551
552         rect.width = min(rect.width, MT9P031_PIXEL_ARRAY_WIDTH - rect.left);
553         rect.height = min(rect.height, MT9P031_PIXEL_ARRAY_HEIGHT - rect.top);
554
555         __crop = __mt9p031_get_pad_crop(mt9p031, fh, crop->pad, crop->which);
556
557         if (rect.width != __crop->width || rect.height != __crop->height) {
558                 /* Reset the output image size if the crop rectangle size has
559                  * been modified.
560                  */
561                 __format = __mt9p031_get_pad_format(mt9p031, fh, crop->pad,
562                                                     crop->which);
563                 __format->width = rect.width;
564                 __format->height = rect.height;
565         }
566
567         *__crop = rect;
568         crop->rect = rect;
569
570         return 0;
571 }
572
573 /* -----------------------------------------------------------------------------
574  * V4L2 subdev control operations
575  */
576
577 #define V4L2_CID_TEST_PATTERN           (V4L2_CID_USER_BASE | 0x1001)
578 #define V4L2_CID_BLC_AUTO               (V4L2_CID_USER_BASE | 0x1002)
579 #define V4L2_CID_BLC_TARGET_LEVEL       (V4L2_CID_USER_BASE | 0x1003)
580 #define V4L2_CID_BLC_ANALOG_OFFSET      (V4L2_CID_USER_BASE | 0x1004)
581 #define V4L2_CID_BLC_DIGITAL_OFFSET     (V4L2_CID_USER_BASE | 0x1005)
582
583 static int mt9p031_s_ctrl(struct v4l2_ctrl *ctrl)
584 {
585         struct mt9p031 *mt9p031 =
586                         container_of(ctrl->handler, struct mt9p031, ctrls);
587         struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
588         u16 data;
589         int ret;
590
591         switch (ctrl->id) {
592         case V4L2_CID_EXPOSURE:
593                 ret = mt9p031_write(client, MT9P031_SHUTTER_WIDTH_UPPER,
594                                     (ctrl->val >> 16) & 0xffff);
595                 if (ret < 0)
596                         return ret;
597
598                 return mt9p031_write(client, MT9P031_SHUTTER_WIDTH_LOWER,
599                                      ctrl->val & 0xffff);
600
601         case V4L2_CID_GAIN:
602                 /* Gain is controlled by 2 analog stages and a digital stage.
603                  * Valid values for the 3 stages are
604                  *
605                  * Stage                Min     Max     Step
606                  * ------------------------------------------
607                  * First analog stage   x1      x2      1
608                  * Second analog stage  x1      x4      0.125
609                  * Digital stage        x1      x16     0.125
610                  *
611                  * To minimize noise, the gain stages should be used in the
612                  * second analog stage, first analog stage, digital stage order.
613                  * Gain from a previous stage should be pushed to its maximum
614                  * value before the next stage is used.
615                  */
616                 if (ctrl->val <= 32) {
617                         data = ctrl->val;
618                 } else if (ctrl->val <= 64) {
619                         ctrl->val &= ~1;
620                         data = (1 << 6) | (ctrl->val >> 1);
621                 } else {
622                         ctrl->val &= ~7;
623                         data = ((ctrl->val - 64) << 5) | (1 << 6) | 32;
624                 }
625
626                 return mt9p031_write(client, MT9P031_GLOBAL_GAIN, data);
627
628         case V4L2_CID_HFLIP:
629                 if (ctrl->val)
630                         return mt9p031_set_mode2(mt9p031,
631                                         0, MT9P031_READ_MODE_2_COL_MIR);
632                 else
633                         return mt9p031_set_mode2(mt9p031,
634                                         MT9P031_READ_MODE_2_COL_MIR, 0);
635
636         case V4L2_CID_VFLIP:
637                 if (ctrl->val)
638                         return mt9p031_set_mode2(mt9p031,
639                                         0, MT9P031_READ_MODE_2_ROW_MIR);
640                 else
641                         return mt9p031_set_mode2(mt9p031,
642                                         MT9P031_READ_MODE_2_ROW_MIR, 0);
643
644         case V4L2_CID_TEST_PATTERN:
645                 if (!ctrl->val) {
646                         /* Restore the black level compensation settings. */
647                         if (mt9p031->blc_auto->cur.val != 0) {
648                                 ret = mt9p031_s_ctrl(mt9p031->blc_auto);
649                                 if (ret < 0)
650                                         return ret;
651                         }
652                         if (mt9p031->blc_offset->cur.val != 0) {
653                                 ret = mt9p031_s_ctrl(mt9p031->blc_offset);
654                                 if (ret < 0)
655                                         return ret;
656                         }
657                         return mt9p031_write(client, MT9P031_TEST_PATTERN,
658                                              MT9P031_TEST_PATTERN_DISABLE);
659                 }
660
661                 ret = mt9p031_write(client, MT9P031_TEST_PATTERN_GREEN, 0x05a0);
662                 if (ret < 0)
663                         return ret;
664                 ret = mt9p031_write(client, MT9P031_TEST_PATTERN_RED, 0x0a50);
665                 if (ret < 0)
666                         return ret;
667                 ret = mt9p031_write(client, MT9P031_TEST_PATTERN_BLUE, 0x0aa0);
668                 if (ret < 0)
669                         return ret;
670
671                 /* Disable digital black level compensation when using a test
672                  * pattern.
673                  */
674                 ret = mt9p031_set_mode2(mt9p031, MT9P031_READ_MODE_2_ROW_BLC,
675                                         0);
676                 if (ret < 0)
677                         return ret;
678
679                 ret = mt9p031_write(client, MT9P031_ROW_BLACK_DEF_OFFSET, 0);
680                 if (ret < 0)
681                         return ret;
682
683                 return mt9p031_write(client, MT9P031_TEST_PATTERN,
684                                 ((ctrl->val - 1) << MT9P031_TEST_PATTERN_SHIFT)
685                                 | MT9P031_TEST_PATTERN_ENABLE);
686
687         case V4L2_CID_BLC_AUTO:
688                 ret = mt9p031_set_mode2(mt9p031,
689                                 ctrl->val ? 0 : MT9P031_READ_MODE_2_ROW_BLC,
690                                 ctrl->val ? MT9P031_READ_MODE_2_ROW_BLC : 0);
691                 if (ret < 0)
692                         return ret;
693
694                 return mt9p031_write(client, MT9P031_BLACK_LEVEL_CALIBRATION,
695                                      ctrl->val ? 0 : MT9P031_BLC_MANUAL_BLC);
696
697         case V4L2_CID_BLC_TARGET_LEVEL:
698                 return mt9p031_write(client, MT9P031_ROW_BLACK_TARGET,
699                                      ctrl->val);
700
701         case V4L2_CID_BLC_ANALOG_OFFSET:
702                 data = ctrl->val & ((1 << 9) - 1);
703
704                 ret = mt9p031_write(client, MT9P031_GREEN1_OFFSET, data);
705                 if (ret < 0)
706                         return ret;
707                 ret = mt9p031_write(client, MT9P031_GREEN2_OFFSET, data);
708                 if (ret < 0)
709                         return ret;
710                 ret = mt9p031_write(client, MT9P031_RED_OFFSET, data);
711                 if (ret < 0)
712                         return ret;
713                 return mt9p031_write(client, MT9P031_BLUE_OFFSET, data);
714
715         case V4L2_CID_BLC_DIGITAL_OFFSET:
716                 return mt9p031_write(client, MT9P031_ROW_BLACK_DEF_OFFSET,
717                                      ctrl->val & ((1 << 12) - 1));
718         }
719
720         return 0;
721 }
722
723 static struct v4l2_ctrl_ops mt9p031_ctrl_ops = {
724         .s_ctrl = mt9p031_s_ctrl,
725 };
726
727 static const char * const mt9p031_test_pattern_menu[] = {
728         "Disabled",
729         "Color Field",
730         "Horizontal Gradient",
731         "Vertical Gradient",
732         "Diagonal Gradient",
733         "Classic Test Pattern",
734         "Walking 1s",
735         "Monochrome Horizontal Bars",
736         "Monochrome Vertical Bars",
737         "Vertical Color Bars",
738 };
739
740 static const struct v4l2_ctrl_config mt9p031_ctrls[] = {
741         {
742                 .ops            = &mt9p031_ctrl_ops,
743                 .id             = V4L2_CID_TEST_PATTERN,
744                 .type           = V4L2_CTRL_TYPE_MENU,
745                 .name           = "Test Pattern",
746                 .min            = 0,
747                 .max            = ARRAY_SIZE(mt9p031_test_pattern_menu) - 1,
748                 .step           = 0,
749                 .def            = 0,
750                 .flags          = 0,
751                 .menu_skip_mask = 0,
752                 .qmenu          = mt9p031_test_pattern_menu,
753         }, {
754                 .ops            = &mt9p031_ctrl_ops,
755                 .id             = V4L2_CID_BLC_AUTO,
756                 .type           = V4L2_CTRL_TYPE_BOOLEAN,
757                 .name           = "BLC, Auto",
758                 .min            = 0,
759                 .max            = 1,
760                 .step           = 1,
761                 .def            = 1,
762                 .flags          = 0,
763         }, {
764                 .ops            = &mt9p031_ctrl_ops,
765                 .id             = V4L2_CID_BLC_TARGET_LEVEL,
766                 .type           = V4L2_CTRL_TYPE_INTEGER,
767                 .name           = "BLC Target Level",
768                 .min            = 0,
769                 .max            = 4095,
770                 .step           = 1,
771                 .def            = 168,
772                 .flags          = 0,
773         }, {
774                 .ops            = &mt9p031_ctrl_ops,
775                 .id             = V4L2_CID_BLC_ANALOG_OFFSET,
776                 .type           = V4L2_CTRL_TYPE_INTEGER,
777                 .name           = "BLC Analog Offset",
778                 .min            = -255,
779                 .max            = 255,
780                 .step           = 1,
781                 .def            = 32,
782                 .flags          = 0,
783         }, {
784                 .ops            = &mt9p031_ctrl_ops,
785                 .id             = V4L2_CID_BLC_DIGITAL_OFFSET,
786                 .type           = V4L2_CTRL_TYPE_INTEGER,
787                 .name           = "BLC Digital Offset",
788                 .min            = -2048,
789                 .max            = 2047,
790                 .step           = 1,
791                 .def            = 40,
792                 .flags          = 0,
793         }
794 };
795
796 /* -----------------------------------------------------------------------------
797  * V4L2 subdev core operations
798  */
799
800 static int mt9p031_set_power(struct v4l2_subdev *subdev, int on)
801 {
802         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
803         int ret = 0;
804
805         mutex_lock(&mt9p031->power_lock);
806
807         /* If the power count is modified from 0 to != 0 or from != 0 to 0,
808          * update the power state.
809          */
810         if (mt9p031->power_count == !on) {
811                 ret = __mt9p031_set_power(mt9p031, !!on);
812                 if (ret < 0)
813                         goto out;
814         }
815
816         /* Update the power count. */
817         mt9p031->power_count += on ? 1 : -1;
818         WARN_ON(mt9p031->power_count < 0);
819
820 out:
821         mutex_unlock(&mt9p031->power_lock);
822         return ret;
823 }
824
825 /* -----------------------------------------------------------------------------
826  * V4L2 subdev internal operations
827  */
828
829 static int mt9p031_registered(struct v4l2_subdev *subdev)
830 {
831         struct i2c_client *client = v4l2_get_subdevdata(subdev);
832         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
833         s32 data;
834         int ret;
835
836         ret = mt9p031_power_on(mt9p031);
837         if (ret < 0) {
838                 dev_err(&client->dev, "MT9P031 power up failed\n");
839                 return ret;
840         }
841
842         /* Read out the chip version register */
843         data = mt9p031_read(client, MT9P031_CHIP_VERSION);
844         if (data != MT9P031_CHIP_VERSION_VALUE) {
845                 dev_err(&client->dev, "MT9P031 not detected, wrong version "
846                         "0x%04x\n", data);
847                 return -ENODEV;
848         }
849
850         mt9p031_power_off(mt9p031);
851
852         dev_info(&client->dev, "MT9P031 detected at address 0x%02x\n",
853                  client->addr);
854
855         return ret;
856 }
857
858 static int mt9p031_open(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
859 {
860         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
861         struct v4l2_mbus_framefmt *format;
862         struct v4l2_rect *crop;
863
864         crop = v4l2_subdev_get_try_crop(fh, 0);
865         crop->left = MT9P031_COLUMN_START_DEF;
866         crop->top = MT9P031_ROW_START_DEF;
867         crop->width = MT9P031_WINDOW_WIDTH_DEF;
868         crop->height = MT9P031_WINDOW_HEIGHT_DEF;
869
870         format = v4l2_subdev_get_try_format(fh, 0);
871
872         if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
873                 format->code = V4L2_MBUS_FMT_Y12_1X12;
874         else
875                 format->code = V4L2_MBUS_FMT_SGRBG12_1X12;
876
877         format->width = MT9P031_WINDOW_WIDTH_DEF;
878         format->height = MT9P031_WINDOW_HEIGHT_DEF;
879         format->field = V4L2_FIELD_NONE;
880         format->colorspace = V4L2_COLORSPACE_SRGB;
881
882         return mt9p031_set_power(subdev, 1);
883 }
884
885 static int mt9p031_close(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
886 {
887         return mt9p031_set_power(subdev, 0);
888 }
889
890 static struct v4l2_subdev_core_ops mt9p031_subdev_core_ops = {
891         .s_power        = mt9p031_set_power,
892 };
893
894 static struct v4l2_subdev_video_ops mt9p031_subdev_video_ops = {
895         .s_stream       = mt9p031_s_stream,
896 };
897
898 static struct v4l2_subdev_pad_ops mt9p031_subdev_pad_ops = {
899         .enum_mbus_code = mt9p031_enum_mbus_code,
900         .enum_frame_size = mt9p031_enum_frame_size,
901         .get_fmt = mt9p031_get_format,
902         .set_fmt = mt9p031_set_format,
903         .get_crop = mt9p031_get_crop,
904         .set_crop = mt9p031_set_crop,
905 };
906
907 static struct v4l2_subdev_ops mt9p031_subdev_ops = {
908         .core   = &mt9p031_subdev_core_ops,
909         .video  = &mt9p031_subdev_video_ops,
910         .pad    = &mt9p031_subdev_pad_ops,
911 };
912
913 static const struct v4l2_subdev_internal_ops mt9p031_subdev_internal_ops = {
914         .registered = mt9p031_registered,
915         .open = mt9p031_open,
916         .close = mt9p031_close,
917 };
918
919 /* -----------------------------------------------------------------------------
920  * Driver initialization and probing
921  */
922
923 static int mt9p031_probe(struct i2c_client *client,
924                          const struct i2c_device_id *did)
925 {
926         struct mt9p031_platform_data *pdata = client->dev.platform_data;
927         struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
928         struct mt9p031 *mt9p031;
929         unsigned int i;
930         int ret;
931
932         if (pdata == NULL) {
933                 dev_err(&client->dev, "No platform data\n");
934                 return -EINVAL;
935         }
936
937         if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) {
938                 dev_warn(&client->dev,
939                         "I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD\n");
940                 return -EIO;
941         }
942
943         mt9p031 = kzalloc(sizeof(*mt9p031), GFP_KERNEL);
944         if (mt9p031 == NULL)
945                 return -ENOMEM;
946
947         mt9p031->pdata = pdata;
948         mt9p031->output_control = MT9P031_OUTPUT_CONTROL_DEF;
949         mt9p031->mode2 = MT9P031_READ_MODE_2_ROW_BLC;
950         mt9p031->model = did->driver_data;
951         mt9p031->reset = -1;
952
953         v4l2_ctrl_handler_init(&mt9p031->ctrls, ARRAY_SIZE(mt9p031_ctrls) + 5);
954
955         v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
956                           V4L2_CID_EXPOSURE, MT9P031_SHUTTER_WIDTH_MIN,
957                           MT9P031_SHUTTER_WIDTH_MAX, 1,
958                           MT9P031_SHUTTER_WIDTH_DEF);
959         v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
960                           V4L2_CID_GAIN, MT9P031_GLOBAL_GAIN_MIN,
961                           MT9P031_GLOBAL_GAIN_MAX, 1, MT9P031_GLOBAL_GAIN_DEF);
962         v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
963                           V4L2_CID_HFLIP, 0, 1, 1, 0);
964         v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
965                           V4L2_CID_VFLIP, 0, 1, 1, 0);
966         v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
967                           V4L2_CID_PIXEL_RATE, pdata->target_freq,
968                           pdata->target_freq, 1, pdata->target_freq);
969
970         for (i = 0; i < ARRAY_SIZE(mt9p031_ctrls); ++i)
971                 v4l2_ctrl_new_custom(&mt9p031->ctrls, &mt9p031_ctrls[i], NULL);
972
973         mt9p031->subdev.ctrl_handler = &mt9p031->ctrls;
974
975         if (mt9p031->ctrls.error) {
976                 printk(KERN_INFO "%s: control initialization error %d\n",
977                        __func__, mt9p031->ctrls.error);
978                 ret = mt9p031->ctrls.error;
979                 goto done;
980         }
981
982         mt9p031->blc_auto = v4l2_ctrl_find(&mt9p031->ctrls, V4L2_CID_BLC_AUTO);
983         mt9p031->blc_offset = v4l2_ctrl_find(&mt9p031->ctrls,
984                                              V4L2_CID_BLC_DIGITAL_OFFSET);
985
986         mutex_init(&mt9p031->power_lock);
987         v4l2_i2c_subdev_init(&mt9p031->subdev, client, &mt9p031_subdev_ops);
988         mt9p031->subdev.internal_ops = &mt9p031_subdev_internal_ops;
989
990         mt9p031->pad.flags = MEDIA_PAD_FL_SOURCE;
991         ret = media_entity_init(&mt9p031->subdev.entity, 1, &mt9p031->pad, 0);
992         if (ret < 0)
993                 goto done;
994
995         mt9p031->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
996
997         mt9p031->crop.width = MT9P031_WINDOW_WIDTH_DEF;
998         mt9p031->crop.height = MT9P031_WINDOW_HEIGHT_DEF;
999         mt9p031->crop.left = MT9P031_COLUMN_START_DEF;
1000         mt9p031->crop.top = MT9P031_ROW_START_DEF;
1001
1002         if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
1003                 mt9p031->format.code = V4L2_MBUS_FMT_Y12_1X12;
1004         else
1005                 mt9p031->format.code = V4L2_MBUS_FMT_SGRBG12_1X12;
1006
1007         mt9p031->format.width = MT9P031_WINDOW_WIDTH_DEF;
1008         mt9p031->format.height = MT9P031_WINDOW_HEIGHT_DEF;
1009         mt9p031->format.field = V4L2_FIELD_NONE;
1010         mt9p031->format.colorspace = V4L2_COLORSPACE_SRGB;
1011
1012         if (pdata->reset != -1) {
1013                 ret = gpio_request_one(pdata->reset, GPIOF_OUT_INIT_LOW,
1014                                        "mt9p031_rst");
1015                 if (ret < 0)
1016                         goto done;
1017
1018                 mt9p031->reset = pdata->reset;
1019         }
1020
1021         ret = mt9p031_pll_setup(mt9p031);
1022
1023 done:
1024         if (ret < 0) {
1025                 if (mt9p031->reset != -1)
1026                         gpio_free(mt9p031->reset);
1027
1028                 v4l2_ctrl_handler_free(&mt9p031->ctrls);
1029                 media_entity_cleanup(&mt9p031->subdev.entity);
1030                 kfree(mt9p031);
1031         }
1032
1033         return ret;
1034 }
1035
1036 static int mt9p031_remove(struct i2c_client *client)
1037 {
1038         struct v4l2_subdev *subdev = i2c_get_clientdata(client);
1039         struct mt9p031 *mt9p031 = to_mt9p031(subdev);
1040
1041         v4l2_ctrl_handler_free(&mt9p031->ctrls);
1042         v4l2_device_unregister_subdev(subdev);
1043         media_entity_cleanup(&subdev->entity);
1044         if (mt9p031->reset != -1)
1045                 gpio_free(mt9p031->reset);
1046         kfree(mt9p031);
1047
1048         return 0;
1049 }
1050
1051 static const struct i2c_device_id mt9p031_id[] = {
1052         { "mt9p031", MT9P031_MODEL_COLOR },
1053         { "mt9p031m", MT9P031_MODEL_MONOCHROME },
1054         { }
1055 };
1056 MODULE_DEVICE_TABLE(i2c, mt9p031_id);
1057
1058 static struct i2c_driver mt9p031_i2c_driver = {
1059         .driver = {
1060                 .name = "mt9p031",
1061         },
1062         .probe          = mt9p031_probe,
1063         .remove         = mt9p031_remove,
1064         .id_table       = mt9p031_id,
1065 };
1066
1067 module_i2c_driver(mt9p031_i2c_driver);
1068
1069 MODULE_DESCRIPTION("Aptina MT9P031 Camera driver");
1070 MODULE_AUTHOR("Bastian Hecht <hechtb@gmail.com>");
1071 MODULE_LICENSE("GPL v2");