V4L/DVB (12535): soc-camera: remove .init() and .release() methods from struct soc_ca...
[cascardo/linux.git] / drivers / media / video / mt9m111.c
1 /*
2  * Driver for MT9M111/MT9M112 CMOS Image Sensor from Micron
3  *
4  * Copyright (C) 2008, Robert Jarzmik <robert.jarzmik@free.fr>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10 #include <linux/videodev2.h>
11 #include <linux/slab.h>
12 #include <linux/i2c.h>
13 #include <linux/log2.h>
14 #include <linux/gpio.h>
15 #include <linux/delay.h>
16
17 #include <media/v4l2-common.h>
18 #include <media/v4l2-chip-ident.h>
19 #include <media/soc_camera.h>
20
21 /*
22  * mt9m111 and mt9m112 i2c address is 0x5d or 0x48 (depending on SAddr pin)
23  * The platform has to define i2c_board_info and call i2c_register_board_info()
24  */
25
26 /* mt9m111: Sensor register addresses */
27 #define MT9M111_CHIP_VERSION            0x000
28 #define MT9M111_ROW_START               0x001
29 #define MT9M111_COLUMN_START            0x002
30 #define MT9M111_WINDOW_HEIGHT           0x003
31 #define MT9M111_WINDOW_WIDTH            0x004
32 #define MT9M111_HORIZONTAL_BLANKING_B   0x005
33 #define MT9M111_VERTICAL_BLANKING_B     0x006
34 #define MT9M111_HORIZONTAL_BLANKING_A   0x007
35 #define MT9M111_VERTICAL_BLANKING_A     0x008
36 #define MT9M111_SHUTTER_WIDTH           0x009
37 #define MT9M111_ROW_SPEED               0x00a
38 #define MT9M111_EXTRA_DELAY             0x00b
39 #define MT9M111_SHUTTER_DELAY           0x00c
40 #define MT9M111_RESET                   0x00d
41 #define MT9M111_READ_MODE_B             0x020
42 #define MT9M111_READ_MODE_A             0x021
43 #define MT9M111_FLASH_CONTROL           0x023
44 #define MT9M111_GREEN1_GAIN             0x02b
45 #define MT9M111_BLUE_GAIN               0x02c
46 #define MT9M111_RED_GAIN                0x02d
47 #define MT9M111_GREEN2_GAIN             0x02e
48 #define MT9M111_GLOBAL_GAIN             0x02f
49 #define MT9M111_CONTEXT_CONTROL         0x0c8
50 #define MT9M111_PAGE_MAP                0x0f0
51 #define MT9M111_BYTE_WISE_ADDR          0x0f1
52
53 #define MT9M111_RESET_SYNC_CHANGES      (1 << 15)
54 #define MT9M111_RESET_RESTART_BAD_FRAME (1 << 9)
55 #define MT9M111_RESET_SHOW_BAD_FRAMES   (1 << 8)
56 #define MT9M111_RESET_RESET_SOC         (1 << 5)
57 #define MT9M111_RESET_OUTPUT_DISABLE    (1 << 4)
58 #define MT9M111_RESET_CHIP_ENABLE       (1 << 3)
59 #define MT9M111_RESET_ANALOG_STANDBY    (1 << 2)
60 #define MT9M111_RESET_RESTART_FRAME     (1 << 1)
61 #define MT9M111_RESET_RESET_MODE        (1 << 0)
62
63 #define MT9M111_RMB_MIRROR_COLS         (1 << 1)
64 #define MT9M111_RMB_MIRROR_ROWS         (1 << 0)
65 #define MT9M111_CTXT_CTRL_RESTART       (1 << 15)
66 #define MT9M111_CTXT_CTRL_DEFECTCOR_B   (1 << 12)
67 #define MT9M111_CTXT_CTRL_RESIZE_B      (1 << 10)
68 #define MT9M111_CTXT_CTRL_CTRL2_B       (1 << 9)
69 #define MT9M111_CTXT_CTRL_GAMMA_B       (1 << 8)
70 #define MT9M111_CTXT_CTRL_XENON_EN      (1 << 7)
71 #define MT9M111_CTXT_CTRL_READ_MODE_B   (1 << 3)
72 #define MT9M111_CTXT_CTRL_LED_FLASH_EN  (1 << 2)
73 #define MT9M111_CTXT_CTRL_VBLANK_SEL_B  (1 << 1)
74 #define MT9M111_CTXT_CTRL_HBLANK_SEL_B  (1 << 0)
75 /*
76  * mt9m111: Colorpipe register addresses (0x100..0x1ff)
77  */
78 #define MT9M111_OPER_MODE_CTRL          0x106
79 #define MT9M111_OUTPUT_FORMAT_CTRL      0x108
80 #define MT9M111_REDUCER_XZOOM_B         0x1a0
81 #define MT9M111_REDUCER_XSIZE_B         0x1a1
82 #define MT9M111_REDUCER_YZOOM_B         0x1a3
83 #define MT9M111_REDUCER_YSIZE_B         0x1a4
84 #define MT9M111_REDUCER_XZOOM_A         0x1a6
85 #define MT9M111_REDUCER_XSIZE_A         0x1a7
86 #define MT9M111_REDUCER_YZOOM_A         0x1a9
87 #define MT9M111_REDUCER_YSIZE_A         0x1aa
88
89 #define MT9M111_OUTPUT_FORMAT_CTRL2_A   0x13a
90 #define MT9M111_OUTPUT_FORMAT_CTRL2_B   0x19b
91
92 #define MT9M111_OPMODE_AUTOEXPO_EN      (1 << 14)
93 #define MT9M111_OPMODE_AUTOWHITEBAL_EN  (1 << 1)
94
95 #define MT9M111_OUTFMT_PROCESSED_BAYER  (1 << 14)
96 #define MT9M111_OUTFMT_BYPASS_IFP       (1 << 10)
97 #define MT9M111_OUTFMT_INV_PIX_CLOCK    (1 << 9)
98 #define MT9M111_OUTFMT_RGB              (1 << 8)
99 #define MT9M111_OUTFMT_RGB565           (0x0 << 6)
100 #define MT9M111_OUTFMT_RGB555           (0x1 << 6)
101 #define MT9M111_OUTFMT_RGB444x          (0x2 << 6)
102 #define MT9M111_OUTFMT_RGBx444          (0x3 << 6)
103 #define MT9M111_OUTFMT_TST_RAMP_OFF     (0x0 << 4)
104 #define MT9M111_OUTFMT_TST_RAMP_COL     (0x1 << 4)
105 #define MT9M111_OUTFMT_TST_RAMP_ROW     (0x2 << 4)
106 #define MT9M111_OUTFMT_TST_RAMP_FRAME   (0x3 << 4)
107 #define MT9M111_OUTFMT_SHIFT_3_UP       (1 << 3)
108 #define MT9M111_OUTFMT_AVG_CHROMA       (1 << 2)
109 #define MT9M111_OUTFMT_SWAP_YCbCr_C_Y   (1 << 1)
110 #define MT9M111_OUTFMT_SWAP_RGB_EVEN    (1 << 1)
111 #define MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr (1 << 0)
112 /*
113  * mt9m111: Camera control register addresses (0x200..0x2ff not implemented)
114  */
115
116 #define reg_read(reg) mt9m111_reg_read(client, MT9M111_##reg)
117 #define reg_write(reg, val) mt9m111_reg_write(client, MT9M111_##reg, (val))
118 #define reg_set(reg, val) mt9m111_reg_set(client, MT9M111_##reg, (val))
119 #define reg_clear(reg, val) mt9m111_reg_clear(client, MT9M111_##reg, (val))
120
121 #define MT9M111_MIN_DARK_ROWS   8
122 #define MT9M111_MIN_DARK_COLS   24
123 #define MT9M111_MAX_HEIGHT      1024
124 #define MT9M111_MAX_WIDTH       1280
125
126 #define COL_FMT(_name, _depth, _fourcc, _colorspace) \
127         { .name = _name, .depth = _depth, .fourcc = _fourcc, \
128         .colorspace = _colorspace }
129 #define RGB_FMT(_name, _depth, _fourcc) \
130         COL_FMT(_name, _depth, _fourcc, V4L2_COLORSPACE_SRGB)
131 #define JPG_FMT(_name, _depth, _fourcc) \
132         COL_FMT(_name, _depth, _fourcc, V4L2_COLORSPACE_JPEG)
133
134 static const struct soc_camera_data_format mt9m111_colour_formats[] = {
135         JPG_FMT("CbYCrY 16 bit", 16, V4L2_PIX_FMT_UYVY),
136         JPG_FMT("CrYCbY 16 bit", 16, V4L2_PIX_FMT_VYUY),
137         JPG_FMT("YCbYCr 16 bit", 16, V4L2_PIX_FMT_YUYV),
138         JPG_FMT("YCrYCb 16 bit", 16, V4L2_PIX_FMT_YVYU),
139         RGB_FMT("RGB 565", 16, V4L2_PIX_FMT_RGB565),
140         RGB_FMT("RGB 555", 16, V4L2_PIX_FMT_RGB555),
141         RGB_FMT("Bayer (sRGB) 10 bit", 10, V4L2_PIX_FMT_SBGGR16),
142         RGB_FMT("Bayer (sRGB) 8 bit", 8, V4L2_PIX_FMT_SBGGR8),
143 };
144
145 enum mt9m111_context {
146         HIGHPOWER = 0,
147         LOWPOWER,
148 };
149
150 struct mt9m111 {
151         struct v4l2_subdev subdev;
152         int model;      /* V4L2_IDENT_MT9M11x* codes from v4l2-chip-ident.h */
153         enum mt9m111_context context;
154         struct v4l2_rect rect;
155         u32 pixfmt;
156         unsigned char autoexposure;
157         unsigned char datawidth;
158         unsigned int powered:1;
159         unsigned int hflip:1;
160         unsigned int vflip:1;
161         unsigned int swap_rgb_even_odd:1;
162         unsigned int swap_rgb_red_blue:1;
163         unsigned int swap_yuv_y_chromas:1;
164         unsigned int swap_yuv_cb_cr:1;
165         unsigned int autowhitebalance:1;
166 };
167
168 static struct mt9m111 *to_mt9m111(const struct i2c_client *client)
169 {
170         return container_of(i2c_get_clientdata(client), struct mt9m111, subdev);
171 }
172
173 static int reg_page_map_set(struct i2c_client *client, const u16 reg)
174 {
175         int ret;
176         u16 page;
177         static int lastpage = -1;       /* PageMap cache value */
178
179         page = (reg >> 8);
180         if (page == lastpage)
181                 return 0;
182         if (page > 2)
183                 return -EINVAL;
184
185         ret = i2c_smbus_write_word_data(client, MT9M111_PAGE_MAP, swab16(page));
186         if (!ret)
187                 lastpage = page;
188         return ret;
189 }
190
191 static int mt9m111_reg_read(struct i2c_client *client, const u16 reg)
192 {
193         int ret;
194
195         ret = reg_page_map_set(client, reg);
196         if (!ret)
197                 ret = swab16(i2c_smbus_read_word_data(client, reg & 0xff));
198
199         dev_dbg(&client->dev, "read  reg.%03x -> %04x\n", reg, ret);
200         return ret;
201 }
202
203 static int mt9m111_reg_write(struct i2c_client *client, const u16 reg,
204                              const u16 data)
205 {
206         int ret;
207
208         ret = reg_page_map_set(client, reg);
209         if (!ret)
210                 ret = i2c_smbus_write_word_data(client, reg & 0xff,
211                                                 swab16(data));
212         dev_dbg(&client->dev, "write reg.%03x = %04x -> %d\n", reg, data, ret);
213         return ret;
214 }
215
216 static int mt9m111_reg_set(struct i2c_client *client, const u16 reg,
217                            const u16 data)
218 {
219         int ret;
220
221         ret = mt9m111_reg_read(client, reg);
222         if (ret >= 0)
223                 ret = mt9m111_reg_write(client, reg, ret | data);
224         return ret;
225 }
226
227 static int mt9m111_reg_clear(struct i2c_client *client, const u16 reg,
228                              const u16 data)
229 {
230         int ret;
231
232         ret = mt9m111_reg_read(client, reg);
233         return mt9m111_reg_write(client, reg, ret & ~data);
234 }
235
236 static int mt9m111_set_context(struct i2c_client *client,
237                                enum mt9m111_context ctxt)
238 {
239         int valB = MT9M111_CTXT_CTRL_RESTART | MT9M111_CTXT_CTRL_DEFECTCOR_B
240                 | MT9M111_CTXT_CTRL_RESIZE_B | MT9M111_CTXT_CTRL_CTRL2_B
241                 | MT9M111_CTXT_CTRL_GAMMA_B | MT9M111_CTXT_CTRL_READ_MODE_B
242                 | MT9M111_CTXT_CTRL_VBLANK_SEL_B
243                 | MT9M111_CTXT_CTRL_HBLANK_SEL_B;
244         int valA = MT9M111_CTXT_CTRL_RESTART;
245
246         if (ctxt == HIGHPOWER)
247                 return reg_write(CONTEXT_CONTROL, valB);
248         else
249                 return reg_write(CONTEXT_CONTROL, valA);
250 }
251
252 static int mt9m111_setup_rect(struct i2c_client *client,
253                               struct v4l2_rect *rect)
254 {
255         struct mt9m111 *mt9m111 = to_mt9m111(client);
256         int ret, is_raw_format;
257         int width = rect->width;
258         int height = rect->height;
259
260         if (mt9m111->pixfmt == V4L2_PIX_FMT_SBGGR8 ||
261             mt9m111->pixfmt == V4L2_PIX_FMT_SBGGR16)
262                 is_raw_format = 1;
263         else
264                 is_raw_format = 0;
265
266         ret = reg_write(COLUMN_START, rect->left);
267         if (!ret)
268                 ret = reg_write(ROW_START, rect->top);
269
270         if (is_raw_format) {
271                 if (!ret)
272                         ret = reg_write(WINDOW_WIDTH, width);
273                 if (!ret)
274                         ret = reg_write(WINDOW_HEIGHT, height);
275         } else {
276                 if (!ret)
277                         ret = reg_write(REDUCER_XZOOM_B, MT9M111_MAX_WIDTH);
278                 if (!ret)
279                         ret = reg_write(REDUCER_YZOOM_B, MT9M111_MAX_HEIGHT);
280                 if (!ret)
281                         ret = reg_write(REDUCER_XSIZE_B, width);
282                 if (!ret)
283                         ret = reg_write(REDUCER_YSIZE_B, height);
284                 if (!ret)
285                         ret = reg_write(REDUCER_XZOOM_A, MT9M111_MAX_WIDTH);
286                 if (!ret)
287                         ret = reg_write(REDUCER_YZOOM_A, MT9M111_MAX_HEIGHT);
288                 if (!ret)
289                         ret = reg_write(REDUCER_XSIZE_A, width);
290                 if (!ret)
291                         ret = reg_write(REDUCER_YSIZE_A, height);
292         }
293
294         return ret;
295 }
296
297 static int mt9m111_setup_pixfmt(struct i2c_client *client, u16 outfmt)
298 {
299         int ret;
300
301         ret = reg_write(OUTPUT_FORMAT_CTRL2_A, outfmt);
302         if (!ret)
303                 ret = reg_write(OUTPUT_FORMAT_CTRL2_B, outfmt);
304         return ret;
305 }
306
307 static int mt9m111_setfmt_bayer8(struct i2c_client *client)
308 {
309         return mt9m111_setup_pixfmt(client, MT9M111_OUTFMT_PROCESSED_BAYER);
310 }
311
312 static int mt9m111_setfmt_bayer10(struct i2c_client *client)
313 {
314         return mt9m111_setup_pixfmt(client, MT9M111_OUTFMT_BYPASS_IFP);
315 }
316
317 static int mt9m111_setfmt_rgb565(struct i2c_client *client)
318 {
319         struct mt9m111 *mt9m111 = to_mt9m111(client);
320         int val = 0;
321
322         if (mt9m111->swap_rgb_red_blue)
323                 val |= MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr;
324         if (mt9m111->swap_rgb_even_odd)
325                 val |= MT9M111_OUTFMT_SWAP_RGB_EVEN;
326         val |= MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565;
327
328         return mt9m111_setup_pixfmt(client, val);
329 }
330
331 static int mt9m111_setfmt_rgb555(struct i2c_client *client)
332 {
333         struct mt9m111 *mt9m111 = to_mt9m111(client);
334         int val = 0;
335
336         if (mt9m111->swap_rgb_red_blue)
337                 val |= MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr;
338         if (mt9m111->swap_rgb_even_odd)
339                 val |= MT9M111_OUTFMT_SWAP_RGB_EVEN;
340         val |= MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB555;
341
342         return mt9m111_setup_pixfmt(client, val);
343 }
344
345 static int mt9m111_setfmt_yuv(struct i2c_client *client)
346 {
347         struct mt9m111 *mt9m111 = to_mt9m111(client);
348         int val = 0;
349
350         if (mt9m111->swap_yuv_cb_cr)
351                 val |= MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr;
352         if (mt9m111->swap_yuv_y_chromas)
353                 val |= MT9M111_OUTFMT_SWAP_YCbCr_C_Y;
354
355         return mt9m111_setup_pixfmt(client, val);
356 }
357
358 static int mt9m111_enable(struct i2c_client *client)
359 {
360         struct mt9m111 *mt9m111 = to_mt9m111(client);
361         int ret;
362
363         ret = reg_set(RESET, MT9M111_RESET_CHIP_ENABLE);
364         if (!ret)
365                 mt9m111->powered = 1;
366         return ret;
367 }
368
369 static int mt9m111_reset(struct i2c_client *client)
370 {
371         int ret;
372
373         ret = reg_set(RESET, MT9M111_RESET_RESET_MODE);
374         if (!ret)
375                 ret = reg_set(RESET, MT9M111_RESET_RESET_SOC);
376         if (!ret)
377                 ret = reg_clear(RESET, MT9M111_RESET_RESET_MODE
378                                 | MT9M111_RESET_RESET_SOC);
379
380         return ret;
381 }
382
383 static unsigned long mt9m111_query_bus_param(struct soc_camera_device *icd)
384 {
385         struct soc_camera_link *icl = to_soc_camera_link(icd);
386         unsigned long flags = SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING |
387                 SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_HIGH |
388                 SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8;
389
390         return soc_camera_apply_sensor_flags(icl, flags);
391 }
392
393 static int mt9m111_set_bus_param(struct soc_camera_device *icd, unsigned long f)
394 {
395         return 0;
396 }
397
398 static int mt9m111_make_rect(struct i2c_client *client,
399                              struct v4l2_rect *rect)
400 {
401         struct mt9m111 *mt9m111 = to_mt9m111(client);
402
403         if (mt9m111->pixfmt == V4L2_PIX_FMT_SBGGR8 ||
404             mt9m111->pixfmt == V4L2_PIX_FMT_SBGGR16) {
405                 /* Bayer format - even size lengths */
406                 rect->width     = ALIGN(rect->width, 2);
407                 rect->height    = ALIGN(rect->height, 2);
408                 /* Let the user play with the starting pixel */
409         }
410
411         /* FIXME: the datasheet doesn't specify minimum sizes */
412         soc_camera_limit_side(&rect->left, &rect->width,
413                      MT9M111_MIN_DARK_COLS, 2, MT9M111_MAX_WIDTH);
414
415         soc_camera_limit_side(&rect->top, &rect->height,
416                      MT9M111_MIN_DARK_ROWS, 2, MT9M111_MAX_HEIGHT);
417
418         return mt9m111_setup_rect(client, rect);
419 }
420
421 static int mt9m111_s_crop(struct v4l2_subdev *sd, struct v4l2_crop *a)
422 {
423         struct v4l2_rect rect = a->c;
424         struct i2c_client *client = sd->priv;
425         struct mt9m111 *mt9m111 = to_mt9m111(client);
426         int ret;
427
428         dev_dbg(&client->dev, "%s left=%d, top=%d, width=%d, height=%d\n",
429                 __func__, rect.left, rect.top, rect.width, rect.height);
430
431         ret = mt9m111_make_rect(client, &rect);
432         if (!ret)
433                 mt9m111->rect = rect;
434         return ret;
435 }
436
437 static int mt9m111_g_crop(struct v4l2_subdev *sd, struct v4l2_crop *a)
438 {
439         struct i2c_client *client = sd->priv;
440         struct mt9m111 *mt9m111 = to_mt9m111(client);
441
442         a->c    = mt9m111->rect;
443         a->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
444
445         return 0;
446 }
447
448 static int mt9m111_cropcap(struct v4l2_subdev *sd, struct v4l2_cropcap *a)
449 {
450         a->bounds.left                  = MT9M111_MIN_DARK_COLS;
451         a->bounds.top                   = MT9M111_MIN_DARK_ROWS;
452         a->bounds.width                 = MT9M111_MAX_WIDTH;
453         a->bounds.height                = MT9M111_MAX_HEIGHT;
454         a->defrect                      = a->bounds;
455         a->type                         = V4L2_BUF_TYPE_VIDEO_CAPTURE;
456         a->pixelaspect.numerator        = 1;
457         a->pixelaspect.denominator      = 1;
458
459         return 0;
460 }
461
462 static int mt9m111_g_fmt(struct v4l2_subdev *sd, struct v4l2_format *f)
463 {
464         struct i2c_client *client = sd->priv;
465         struct mt9m111 *mt9m111 = to_mt9m111(client);
466         struct v4l2_pix_format *pix = &f->fmt.pix;
467
468         pix->width              = mt9m111->rect.width;
469         pix->height             = mt9m111->rect.height;
470         pix->pixelformat        = mt9m111->pixfmt;
471         pix->field              = V4L2_FIELD_NONE;
472         pix->colorspace         = V4L2_COLORSPACE_SRGB;
473
474         return 0;
475 }
476
477 static int mt9m111_set_pixfmt(struct i2c_client *client, u32 pixfmt)
478 {
479         struct mt9m111 *mt9m111 = to_mt9m111(client);
480         int ret;
481
482         switch (pixfmt) {
483         case V4L2_PIX_FMT_SBGGR8:
484                 ret = mt9m111_setfmt_bayer8(client);
485                 break;
486         case V4L2_PIX_FMT_SBGGR16:
487                 ret = mt9m111_setfmt_bayer10(client);
488                 break;
489         case V4L2_PIX_FMT_RGB555:
490                 ret = mt9m111_setfmt_rgb555(client);
491                 break;
492         case V4L2_PIX_FMT_RGB565:
493                 ret = mt9m111_setfmt_rgb565(client);
494                 break;
495         case V4L2_PIX_FMT_UYVY:
496                 mt9m111->swap_yuv_y_chromas = 0;
497                 mt9m111->swap_yuv_cb_cr = 0;
498                 ret = mt9m111_setfmt_yuv(client);
499                 break;
500         case V4L2_PIX_FMT_VYUY:
501                 mt9m111->swap_yuv_y_chromas = 0;
502                 mt9m111->swap_yuv_cb_cr = 1;
503                 ret = mt9m111_setfmt_yuv(client);
504                 break;
505         case V4L2_PIX_FMT_YUYV:
506                 mt9m111->swap_yuv_y_chromas = 1;
507                 mt9m111->swap_yuv_cb_cr = 0;
508                 ret = mt9m111_setfmt_yuv(client);
509                 break;
510         case V4L2_PIX_FMT_YVYU:
511                 mt9m111->swap_yuv_y_chromas = 1;
512                 mt9m111->swap_yuv_cb_cr = 1;
513                 ret = mt9m111_setfmt_yuv(client);
514                 break;
515         default:
516                 dev_err(&client->dev, "Pixel format not handled : %x\n", pixfmt);
517                 ret = -EINVAL;
518         }
519
520         if (!ret)
521                 mt9m111->pixfmt = pixfmt;
522
523         return ret;
524 }
525
526 static int mt9m111_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *f)
527 {
528         struct i2c_client *client = sd->priv;
529         struct mt9m111 *mt9m111 = to_mt9m111(client);
530         struct v4l2_pix_format *pix = &f->fmt.pix;
531         struct v4l2_rect rect = {
532                 .left   = mt9m111->rect.left,
533                 .top    = mt9m111->rect.top,
534                 .width  = pix->width,
535                 .height = pix->height,
536         };
537         int ret;
538
539         dev_dbg(&client->dev, "%s fmt=%x left=%d, top=%d, width=%d, height=%d\n",
540                 __func__, pix->pixelformat, rect.left, rect.top, rect.width,
541                 rect.height);
542
543         ret = mt9m111_make_rect(client, &rect);
544         if (!ret)
545                 ret = mt9m111_set_pixfmt(client, pix->pixelformat);
546         if (!ret)
547                 mt9m111->rect = rect;
548         return ret;
549 }
550
551 static int mt9m111_try_fmt(struct v4l2_subdev *sd, struct v4l2_format *f)
552 {
553         struct v4l2_pix_format *pix = &f->fmt.pix;
554         bool bayer = pix->pixelformat == V4L2_PIX_FMT_SBGGR8 ||
555                 pix->pixelformat == V4L2_PIX_FMT_SBGGR16;
556
557         /*
558          * With Bayer format enforce even side lengths, but let the user play
559          * with the starting pixel
560          */
561
562         if (pix->height > MT9M111_MAX_HEIGHT)
563                 pix->height = MT9M111_MAX_HEIGHT;
564         else if (pix->height < 2)
565                 pix->height = 2;
566         else if (bayer)
567                 pix->height = ALIGN(pix->height, 2);
568
569         if (pix->width > MT9M111_MAX_WIDTH)
570                 pix->width = MT9M111_MAX_WIDTH;
571         else if (pix->width < 2)
572                 pix->width = 2;
573         else if (bayer)
574                 pix->width = ALIGN(pix->width, 2);
575
576         return 0;
577 }
578
579 static int mt9m111_g_chip_ident(struct v4l2_subdev *sd,
580                                 struct v4l2_dbg_chip_ident *id)
581 {
582         struct i2c_client *client = sd->priv;
583         struct mt9m111 *mt9m111 = to_mt9m111(client);
584
585         if (id->match.type != V4L2_CHIP_MATCH_I2C_ADDR)
586                 return -EINVAL;
587
588         if (id->match.addr != client->addr)
589                 return -ENODEV;
590
591         id->ident       = mt9m111->model;
592         id->revision    = 0;
593
594         return 0;
595 }
596
597 #ifdef CONFIG_VIDEO_ADV_DEBUG
598 static int mt9m111_g_register(struct v4l2_subdev *sd,
599                               struct v4l2_dbg_register *reg)
600 {
601         struct i2c_client *client = sd->priv;
602         int val;
603
604         if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0x2ff)
605                 return -EINVAL;
606         if (reg->match.addr != client->addr)
607                 return -ENODEV;
608
609         val = mt9m111_reg_read(client, reg->reg);
610         reg->size = 2;
611         reg->val = (u64)val;
612
613         if (reg->val > 0xffff)
614                 return -EIO;
615
616         return 0;
617 }
618
619 static int mt9m111_s_register(struct v4l2_subdev *sd,
620                               struct v4l2_dbg_register *reg)
621 {
622         struct i2c_client *client = sd->priv;
623
624         if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0x2ff)
625                 return -EINVAL;
626
627         if (reg->match.addr != client->addr)
628                 return -ENODEV;
629
630         if (mt9m111_reg_write(client, reg->reg, reg->val) < 0)
631                 return -EIO;
632
633         return 0;
634 }
635 #endif
636
637 static const struct v4l2_queryctrl mt9m111_controls[] = {
638         {
639                 .id             = V4L2_CID_VFLIP,
640                 .type           = V4L2_CTRL_TYPE_BOOLEAN,
641                 .name           = "Flip Verticaly",
642                 .minimum        = 0,
643                 .maximum        = 1,
644                 .step           = 1,
645                 .default_value  = 0,
646         }, {
647                 .id             = V4L2_CID_HFLIP,
648                 .type           = V4L2_CTRL_TYPE_BOOLEAN,
649                 .name           = "Flip Horizontaly",
650                 .minimum        = 0,
651                 .maximum        = 1,
652                 .step           = 1,
653                 .default_value  = 0,
654         }, {    /* gain = 1/32*val (=>gain=1 if val==32) */
655                 .id             = V4L2_CID_GAIN,
656                 .type           = V4L2_CTRL_TYPE_INTEGER,
657                 .name           = "Gain",
658                 .minimum        = 0,
659                 .maximum        = 63 * 2 * 2,
660                 .step           = 1,
661                 .default_value  = 32,
662                 .flags          = V4L2_CTRL_FLAG_SLIDER,
663         }, {
664                 .id             = V4L2_CID_EXPOSURE_AUTO,
665                 .type           = V4L2_CTRL_TYPE_BOOLEAN,
666                 .name           = "Auto Exposure",
667                 .minimum        = 0,
668                 .maximum        = 1,
669                 .step           = 1,
670                 .default_value  = 1,
671         }
672 };
673
674 static int mt9m111_resume(struct soc_camera_device *icd);
675
676 static struct soc_camera_ops mt9m111_ops = {
677         .resume                 = mt9m111_resume,
678         .query_bus_param        = mt9m111_query_bus_param,
679         .set_bus_param          = mt9m111_set_bus_param,
680         .controls               = mt9m111_controls,
681         .num_controls           = ARRAY_SIZE(mt9m111_controls),
682 };
683
684 static int mt9m111_set_flip(struct i2c_client *client, int flip, int mask)
685 {
686         struct mt9m111 *mt9m111 = to_mt9m111(client);
687         int ret;
688
689         if (mt9m111->context == HIGHPOWER) {
690                 if (flip)
691                         ret = reg_set(READ_MODE_B, mask);
692                 else
693                         ret = reg_clear(READ_MODE_B, mask);
694         } else {
695                 if (flip)
696                         ret = reg_set(READ_MODE_A, mask);
697                 else
698                         ret = reg_clear(READ_MODE_A, mask);
699         }
700
701         return ret;
702 }
703
704 static int mt9m111_get_global_gain(struct i2c_client *client)
705 {
706         int data;
707
708         data = reg_read(GLOBAL_GAIN);
709         if (data >= 0)
710                 return (data & 0x2f) * (1 << ((data >> 10) & 1)) *
711                         (1 << ((data >> 9) & 1));
712         return data;
713 }
714
715 static int mt9m111_set_global_gain(struct i2c_client *client, int gain)
716 {
717         struct soc_camera_device *icd = client->dev.platform_data;
718         u16 val;
719
720         if (gain > 63 * 2 * 2)
721                 return -EINVAL;
722
723         icd->gain = gain;
724         if ((gain >= 64 * 2) && (gain < 63 * 2 * 2))
725                 val = (1 << 10) | (1 << 9) | (gain / 4);
726         else if ((gain >= 64) && (gain < 64 * 2))
727                 val = (1 << 9) | (gain / 2);
728         else
729                 val = gain;
730
731         return reg_write(GLOBAL_GAIN, val);
732 }
733
734 static int mt9m111_set_autoexposure(struct i2c_client *client, int on)
735 {
736         struct mt9m111 *mt9m111 = to_mt9m111(client);
737         int ret;
738
739         if (on)
740                 ret = reg_set(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOEXPO_EN);
741         else
742                 ret = reg_clear(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOEXPO_EN);
743
744         if (!ret)
745                 mt9m111->autoexposure = on;
746
747         return ret;
748 }
749
750 static int mt9m111_set_autowhitebalance(struct i2c_client *client, int on)
751 {
752         struct mt9m111 *mt9m111 = to_mt9m111(client);
753         int ret;
754
755         if (on)
756                 ret = reg_set(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOWHITEBAL_EN);
757         else
758                 ret = reg_clear(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOWHITEBAL_EN);
759
760         if (!ret)
761                 mt9m111->autowhitebalance = on;
762
763         return ret;
764 }
765
766 static int mt9m111_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
767 {
768         struct i2c_client *client = sd->priv;
769         struct mt9m111 *mt9m111 = to_mt9m111(client);
770         int data;
771
772         switch (ctrl->id) {
773         case V4L2_CID_VFLIP:
774                 if (mt9m111->context == HIGHPOWER)
775                         data = reg_read(READ_MODE_B);
776                 else
777                         data = reg_read(READ_MODE_A);
778
779                 if (data < 0)
780                         return -EIO;
781                 ctrl->value = !!(data & MT9M111_RMB_MIRROR_ROWS);
782                 break;
783         case V4L2_CID_HFLIP:
784                 if (mt9m111->context == HIGHPOWER)
785                         data = reg_read(READ_MODE_B);
786                 else
787                         data = reg_read(READ_MODE_A);
788
789                 if (data < 0)
790                         return -EIO;
791                 ctrl->value = !!(data & MT9M111_RMB_MIRROR_COLS);
792                 break;
793         case V4L2_CID_GAIN:
794                 data = mt9m111_get_global_gain(client);
795                 if (data < 0)
796                         return data;
797                 ctrl->value = data;
798                 break;
799         case V4L2_CID_EXPOSURE_AUTO:
800                 ctrl->value = mt9m111->autoexposure;
801                 break;
802         case V4L2_CID_AUTO_WHITE_BALANCE:
803                 ctrl->value = mt9m111->autowhitebalance;
804                 break;
805         }
806         return 0;
807 }
808
809 static int mt9m111_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
810 {
811         struct i2c_client *client = sd->priv;
812         struct mt9m111 *mt9m111 = to_mt9m111(client);
813         const struct v4l2_queryctrl *qctrl;
814         int ret;
815
816         qctrl = soc_camera_find_qctrl(&mt9m111_ops, ctrl->id);
817         if (!qctrl)
818                 return -EINVAL;
819
820         switch (ctrl->id) {
821         case V4L2_CID_VFLIP:
822                 mt9m111->vflip = ctrl->value;
823                 ret = mt9m111_set_flip(client, ctrl->value,
824                                         MT9M111_RMB_MIRROR_ROWS);
825                 break;
826         case V4L2_CID_HFLIP:
827                 mt9m111->hflip = ctrl->value;
828                 ret = mt9m111_set_flip(client, ctrl->value,
829                                         MT9M111_RMB_MIRROR_COLS);
830                 break;
831         case V4L2_CID_GAIN:
832                 ret = mt9m111_set_global_gain(client, ctrl->value);
833                 break;
834         case V4L2_CID_EXPOSURE_AUTO:
835                 ret =  mt9m111_set_autoexposure(client, ctrl->value);
836                 break;
837         case V4L2_CID_AUTO_WHITE_BALANCE:
838                 ret =  mt9m111_set_autowhitebalance(client, ctrl->value);
839                 break;
840         default:
841                 ret = -EINVAL;
842         }
843
844         return ret;
845 }
846
847 static int mt9m111_restore_state(struct i2c_client *client)
848 {
849         struct mt9m111 *mt9m111 = to_mt9m111(client);
850         struct soc_camera_device *icd = client->dev.platform_data;
851
852         mt9m111_set_context(client, mt9m111->context);
853         mt9m111_set_pixfmt(client, mt9m111->pixfmt);
854         mt9m111_setup_rect(client, &mt9m111->rect);
855         mt9m111_set_flip(client, mt9m111->hflip, MT9M111_RMB_MIRROR_COLS);
856         mt9m111_set_flip(client, mt9m111->vflip, MT9M111_RMB_MIRROR_ROWS);
857         mt9m111_set_global_gain(client, icd->gain);
858         mt9m111_set_autoexposure(client, mt9m111->autoexposure);
859         mt9m111_set_autowhitebalance(client, mt9m111->autowhitebalance);
860         return 0;
861 }
862
863 static int mt9m111_resume(struct soc_camera_device *icd)
864 {
865         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
866         struct mt9m111 *mt9m111 = to_mt9m111(client);
867         int ret = 0;
868
869         if (mt9m111->powered) {
870                 ret = mt9m111_enable(client);
871                 if (!ret)
872                         ret = mt9m111_reset(client);
873                 if (!ret)
874                         ret = mt9m111_restore_state(client);
875         }
876         return ret;
877 }
878
879 static int mt9m111_init(struct i2c_client *client)
880 {
881         struct mt9m111 *mt9m111 = to_mt9m111(client);
882         int ret;
883
884         mt9m111->context = HIGHPOWER;
885         ret = mt9m111_enable(client);
886         if (!ret)
887                 ret = mt9m111_reset(client);
888         if (!ret)
889                 ret = mt9m111_set_context(client, mt9m111->context);
890         if (!ret)
891                 ret = mt9m111_set_autoexposure(client, mt9m111->autoexposure);
892         if (ret)
893                 dev_err(&client->dev, "mt9m11x init failed: %d\n", ret);
894         return ret;
895 }
896
897 /*
898  * Interface active, can use i2c. If it fails, it can indeed mean, that
899  * this wasn't our capture interface, so, we wait for the right one
900  */
901 static int mt9m111_video_probe(struct soc_camera_device *icd,
902                                struct i2c_client *client)
903 {
904         struct mt9m111 *mt9m111 = to_mt9m111(client);
905         s32 data;
906         int ret;
907
908         /*
909          * We must have a parent by now. And it cannot be a wrong one.
910          * So this entire test is completely redundant.
911          */
912         if (!icd->dev.parent ||
913             to_soc_camera_host(icd->dev.parent)->nr != icd->iface)
914                 return -ENODEV;
915
916         mt9m111->autoexposure = 1;
917         mt9m111->autowhitebalance = 1;
918
919         mt9m111->swap_rgb_even_odd = 1;
920         mt9m111->swap_rgb_red_blue = 1;
921
922         ret = mt9m111_init(client);
923         if (ret)
924                 goto ei2c;
925
926         data = reg_read(CHIP_VERSION);
927
928         switch (data) {
929         case 0x143a: /* MT9M111 */
930                 mt9m111->model = V4L2_IDENT_MT9M111;
931                 break;
932         case 0x148c: /* MT9M112 */
933                 mt9m111->model = V4L2_IDENT_MT9M112;
934                 break;
935         default:
936                 ret = -ENODEV;
937                 dev_err(&client->dev,
938                         "No MT9M11x chip detected, register read %x\n", data);
939                 goto ei2c;
940         }
941
942         icd->formats = mt9m111_colour_formats;
943         icd->num_formats = ARRAY_SIZE(mt9m111_colour_formats);
944
945         dev_info(&client->dev, "Detected a MT9M11x chip ID %x\n", data);
946
947 ei2c:
948         return ret;
949 }
950
951 static struct v4l2_subdev_core_ops mt9m111_subdev_core_ops = {
952         .g_ctrl         = mt9m111_g_ctrl,
953         .s_ctrl         = mt9m111_s_ctrl,
954         .g_chip_ident   = mt9m111_g_chip_ident,
955 #ifdef CONFIG_VIDEO_ADV_DEBUG
956         .g_register     = mt9m111_g_register,
957         .s_register     = mt9m111_s_register,
958 #endif
959 };
960
961 static struct v4l2_subdev_video_ops mt9m111_subdev_video_ops = {
962         .s_fmt          = mt9m111_s_fmt,
963         .g_fmt          = mt9m111_g_fmt,
964         .try_fmt        = mt9m111_try_fmt,
965         .s_crop         = mt9m111_s_crop,
966         .g_crop         = mt9m111_g_crop,
967         .cropcap        = mt9m111_cropcap,
968 };
969
970 static struct v4l2_subdev_ops mt9m111_subdev_ops = {
971         .core   = &mt9m111_subdev_core_ops,
972         .video  = &mt9m111_subdev_video_ops,
973 };
974
975 static int mt9m111_probe(struct i2c_client *client,
976                          const struct i2c_device_id *did)
977 {
978         struct mt9m111 *mt9m111;
979         struct soc_camera_device *icd = client->dev.platform_data;
980         struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
981         struct soc_camera_link *icl;
982         int ret;
983
984         if (!icd) {
985                 dev_err(&client->dev, "MT9M11x: missing soc-camera data!\n");
986                 return -EINVAL;
987         }
988
989         icl = to_soc_camera_link(icd);
990         if (!icl) {
991                 dev_err(&client->dev, "MT9M11x driver needs platform data\n");
992                 return -EINVAL;
993         }
994
995         if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) {
996                 dev_warn(&adapter->dev,
997                          "I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD\n");
998                 return -EIO;
999         }
1000
1001         mt9m111 = kzalloc(sizeof(struct mt9m111), GFP_KERNEL);
1002         if (!mt9m111)
1003                 return -ENOMEM;
1004
1005         v4l2_i2c_subdev_init(&mt9m111->subdev, client, &mt9m111_subdev_ops);
1006
1007         /* Second stage probe - when a capture adapter is there */
1008         icd->ops                = &mt9m111_ops;
1009         icd->y_skip_top         = 0;
1010
1011         mt9m111->rect.left      = MT9M111_MIN_DARK_COLS;
1012         mt9m111->rect.top       = MT9M111_MIN_DARK_ROWS;
1013         mt9m111->rect.width     = MT9M111_MAX_WIDTH;
1014         mt9m111->rect.height    = MT9M111_MAX_HEIGHT;
1015
1016         ret = mt9m111_video_probe(icd, client);
1017         if (ret) {
1018                 icd->ops = NULL;
1019                 i2c_set_clientdata(client, NULL);
1020                 kfree(mt9m111);
1021         }
1022
1023         return ret;
1024 }
1025
1026 static int mt9m111_remove(struct i2c_client *client)
1027 {
1028         struct mt9m111 *mt9m111 = to_mt9m111(client);
1029         struct soc_camera_device *icd = client->dev.platform_data;
1030
1031         icd->ops = NULL;
1032         i2c_set_clientdata(client, NULL);
1033         client->driver = NULL;
1034         kfree(mt9m111);
1035
1036         return 0;
1037 }
1038
1039 static const struct i2c_device_id mt9m111_id[] = {
1040         { "mt9m111", 0 },
1041         { }
1042 };
1043 MODULE_DEVICE_TABLE(i2c, mt9m111_id);
1044
1045 static struct i2c_driver mt9m111_i2c_driver = {
1046         .driver = {
1047                 .name = "mt9m111",
1048         },
1049         .probe          = mt9m111_probe,
1050         .remove         = mt9m111_remove,
1051         .id_table       = mt9m111_id,
1052 };
1053
1054 static int __init mt9m111_mod_init(void)
1055 {
1056         return i2c_add_driver(&mt9m111_i2c_driver);
1057 }
1058
1059 static void __exit mt9m111_mod_exit(void)
1060 {
1061         i2c_del_driver(&mt9m111_i2c_driver);
1062 }
1063
1064 module_init(mt9m111_mod_init);
1065 module_exit(mt9m111_mod_exit);
1066
1067 MODULE_DESCRIPTION("Micron MT9M111/MT9M112 Camera driver");
1068 MODULE_AUTHOR("Robert Jarzmik");
1069 MODULE_LICENSE("GPL");