4ec544f4a845fdc034bc4e83307c98f671704811
[sfrench/cifs-2.6.git] / drivers / media / usb / gspca / sn9c20x.c
1 /*
2  *      Sonix sn9c201 sn9c202 library
3  *
4  * Copyright (C) 2012 Jean-Francois Moine <http://moinejf.free.fr>
5  *      Copyright (C) 2008-2009 microdia project <microdia@googlegroups.com>
6  *      Copyright (C) 2009 Brian Johnson <brijohn@gmail.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21  */
22
23 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
24
25 #include <linux/input.h>
26
27 #include "gspca.h"
28 #include "jpeg.h"
29
30 #include <media/v4l2-chip-ident.h>
31 #include <linux/dmi.h>
32
33 MODULE_AUTHOR("Brian Johnson <brijohn@gmail.com>, "
34                 "microdia project <microdia@googlegroups.com>");
35 MODULE_DESCRIPTION("GSPCA/SN9C20X USB Camera Driver");
36 MODULE_LICENSE("GPL");
37
38 /*
39  * Pixel format private data
40  */
41 #define SCALE_MASK      0x0f
42 #define SCALE_160x120   0
43 #define SCALE_320x240   1
44 #define SCALE_640x480   2
45 #define SCALE_1280x1024 3
46 #define MODE_RAW        0x10
47 #define MODE_JPEG       0x20
48 #define MODE_SXGA       0x80
49
50 #define SENSOR_OV9650   0
51 #define SENSOR_OV9655   1
52 #define SENSOR_SOI968   2
53 #define SENSOR_OV7660   3
54 #define SENSOR_OV7670   4
55 #define SENSOR_MT9V011  5
56 #define SENSOR_MT9V111  6
57 #define SENSOR_MT9V112  7
58 #define SENSOR_MT9M001  8
59 #define SENSOR_MT9M111  9
60 #define SENSOR_MT9M112  10
61 #define SENSOR_HV7131R  11
62 #define SENSOR_MT9VPRB  12
63
64 /* camera flags */
65 #define HAS_NO_BUTTON   0x1
66 #define LED_REVERSE     0x2 /* some cameras unset gpio to turn on leds */
67 #define FLIP_DETECT     0x4
68
69 /* specific webcam descriptor */
70 struct sd {
71         struct gspca_dev gspca_dev;
72
73         struct { /* color control cluster */
74                 struct v4l2_ctrl *brightness;
75                 struct v4l2_ctrl *contrast;
76                 struct v4l2_ctrl *saturation;
77                 struct v4l2_ctrl *hue;
78         };
79         struct { /* blue/red balance control cluster */
80                 struct v4l2_ctrl *blue;
81                 struct v4l2_ctrl *red;
82         };
83         struct { /* h/vflip control cluster */
84                 struct v4l2_ctrl *hflip;
85                 struct v4l2_ctrl *vflip;
86         };
87         struct v4l2_ctrl *gamma;
88         struct { /* autogain and exposure or gain control cluster */
89                 struct v4l2_ctrl *autogain;
90                 struct v4l2_ctrl *exposure;
91                 struct v4l2_ctrl *gain;
92         };
93         struct v4l2_ctrl *jpegqual;
94
95         struct work_struct work;
96         struct workqueue_struct *work_thread;
97
98         u32 pktsz;                      /* (used by pkt_scan) */
99         u16 npkt;
100         s8 nchg;
101         u8 fmt;                         /* (used for JPEG QTAB update */
102
103 #define MIN_AVG_LUM 80
104 #define MAX_AVG_LUM 130
105         atomic_t avg_lum;
106         u8 old_step;
107         u8 older_step;
108         u8 exposure_step;
109
110         u8 i2c_addr;
111         u8 i2c_intf;
112         u8 sensor;
113         u8 hstart;
114         u8 vstart;
115
116         u8 jpeg_hdr[JPEG_HDR_SZ];
117
118         u8 flags;
119 };
120
121 static void qual_upd(struct work_struct *work);
122
123 struct i2c_reg_u8 {
124         u8 reg;
125         u8 val;
126 };
127
128 struct i2c_reg_u16 {
129         u8 reg;
130         u16 val;
131 };
132
133 static const struct dmi_system_id flip_dmi_table[] = {
134         {
135                 .ident = "MSI MS-1034",
136                 .matches = {
137                         DMI_MATCH(DMI_SYS_VENDOR, "MICRO-STAR INT'L CO.,LTD."),
138                         DMI_MATCH(DMI_PRODUCT_NAME, "MS-1034"),
139                         DMI_MATCH(DMI_PRODUCT_VERSION, "0341")
140                 }
141         },
142         {
143                 .ident = "MSI MS-1632",
144                 .matches = {
145                         DMI_MATCH(DMI_BOARD_VENDOR, "MSI"),
146                         DMI_MATCH(DMI_BOARD_NAME, "MS-1632")
147                 }
148         },
149         {
150                 .ident = "MSI MS-1633X",
151                 .matches = {
152                         DMI_MATCH(DMI_BOARD_VENDOR, "MSI"),
153                         DMI_MATCH(DMI_BOARD_NAME, "MS-1633X")
154                 }
155         },
156         {
157                 .ident = "MSI MS-1635X",
158                 .matches = {
159                         DMI_MATCH(DMI_BOARD_VENDOR, "MSI"),
160                         DMI_MATCH(DMI_BOARD_NAME, "MS-1635X")
161                 }
162         },
163         {
164                 .ident = "ASUSTeK W7J",
165                 .matches = {
166                         DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."),
167                         DMI_MATCH(DMI_BOARD_NAME, "W7J       ")
168                 }
169         },
170         {}
171 };
172
173 static const struct v4l2_pix_format vga_mode[] = {
174         {160, 120, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
175                 .bytesperline = 160,
176                 .sizeimage = 160 * 120 * 4 / 8 + 590,
177                 .colorspace = V4L2_COLORSPACE_JPEG,
178                 .priv = SCALE_160x120 | MODE_JPEG},
179         {160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
180                 .bytesperline = 160,
181                 .sizeimage = 160 * 120,
182                 .colorspace = V4L2_COLORSPACE_SRGB,
183                 .priv = SCALE_160x120 | MODE_RAW},
184         {160, 120, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
185                 .bytesperline = 160,
186                 .sizeimage = 240 * 120,
187                 .colorspace = V4L2_COLORSPACE_SRGB,
188                 .priv = SCALE_160x120},
189         {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
190                 .bytesperline = 320,
191                 .sizeimage = 320 * 240 * 4 / 8 + 590,
192                 .colorspace = V4L2_COLORSPACE_JPEG,
193                 .priv = SCALE_320x240 | MODE_JPEG},
194         {320, 240, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
195                 .bytesperline = 320,
196                 .sizeimage = 320 * 240 ,
197                 .colorspace = V4L2_COLORSPACE_SRGB,
198                 .priv = SCALE_320x240 | MODE_RAW},
199         {320, 240, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
200                 .bytesperline = 320,
201                 .sizeimage = 480 * 240 ,
202                 .colorspace = V4L2_COLORSPACE_SRGB,
203                 .priv = SCALE_320x240},
204         {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
205                 .bytesperline = 640,
206                 .sizeimage = 640 * 480 * 4 / 8 + 590,
207                 .colorspace = V4L2_COLORSPACE_JPEG,
208                 .priv = SCALE_640x480 | MODE_JPEG},
209         {640, 480, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
210                 .bytesperline = 640,
211                 .sizeimage = 640 * 480,
212                 .colorspace = V4L2_COLORSPACE_SRGB,
213                 .priv = SCALE_640x480 | MODE_RAW},
214         {640, 480, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
215                 .bytesperline = 640,
216                 .sizeimage = 960 * 480,
217                 .colorspace = V4L2_COLORSPACE_SRGB,
218                 .priv = SCALE_640x480},
219 };
220
221 static const struct v4l2_pix_format sxga_mode[] = {
222         {160, 120, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
223                 .bytesperline = 160,
224                 .sizeimage = 160 * 120 * 4 / 8 + 590,
225                 .colorspace = V4L2_COLORSPACE_JPEG,
226                 .priv = SCALE_160x120 | MODE_JPEG},
227         {160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
228                 .bytesperline = 160,
229                 .sizeimage = 160 * 120,
230                 .colorspace = V4L2_COLORSPACE_SRGB,
231                 .priv = SCALE_160x120 | MODE_RAW},
232         {160, 120, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
233                 .bytesperline = 160,
234                 .sizeimage = 240 * 120,
235                 .colorspace = V4L2_COLORSPACE_SRGB,
236                 .priv = SCALE_160x120},
237         {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
238                 .bytesperline = 320,
239                 .sizeimage = 320 * 240 * 4 / 8 + 590,
240                 .colorspace = V4L2_COLORSPACE_JPEG,
241                 .priv = SCALE_320x240 | MODE_JPEG},
242         {320, 240, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
243                 .bytesperline = 320,
244                 .sizeimage = 320 * 240 ,
245                 .colorspace = V4L2_COLORSPACE_SRGB,
246                 .priv = SCALE_320x240 | MODE_RAW},
247         {320, 240, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
248                 .bytesperline = 320,
249                 .sizeimage = 480 * 240 ,
250                 .colorspace = V4L2_COLORSPACE_SRGB,
251                 .priv = SCALE_320x240},
252         {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
253                 .bytesperline = 640,
254                 .sizeimage = 640 * 480 * 4 / 8 + 590,
255                 .colorspace = V4L2_COLORSPACE_JPEG,
256                 .priv = SCALE_640x480 | MODE_JPEG},
257         {640, 480, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
258                 .bytesperline = 640,
259                 .sizeimage = 640 * 480,
260                 .colorspace = V4L2_COLORSPACE_SRGB,
261                 .priv = SCALE_640x480 | MODE_RAW},
262         {640, 480, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
263                 .bytesperline = 640,
264                 .sizeimage = 960 * 480,
265                 .colorspace = V4L2_COLORSPACE_SRGB,
266                 .priv = SCALE_640x480},
267         {1280, 1024, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
268                 .bytesperline = 1280,
269                 .sizeimage = 1280 * 1024,
270                 .colorspace = V4L2_COLORSPACE_SRGB,
271                 .priv = SCALE_1280x1024 | MODE_RAW | MODE_SXGA},
272 };
273
274 static const struct v4l2_pix_format mono_mode[] = {
275         {160, 120, V4L2_PIX_FMT_GREY, V4L2_FIELD_NONE,
276                 .bytesperline = 160,
277                 .sizeimage = 160 * 120,
278                 .colorspace = V4L2_COLORSPACE_SRGB,
279                 .priv = SCALE_160x120 | MODE_RAW},
280         {320, 240, V4L2_PIX_FMT_GREY, V4L2_FIELD_NONE,
281                 .bytesperline = 320,
282                 .sizeimage = 320 * 240 ,
283                 .colorspace = V4L2_COLORSPACE_SRGB,
284                 .priv = SCALE_320x240 | MODE_RAW},
285         {640, 480, V4L2_PIX_FMT_GREY, V4L2_FIELD_NONE,
286                 .bytesperline = 640,
287                 .sizeimage = 640 * 480,
288                 .colorspace = V4L2_COLORSPACE_SRGB,
289                 .priv = SCALE_640x480 | MODE_RAW},
290         {1280, 1024, V4L2_PIX_FMT_GREY, V4L2_FIELD_NONE,
291                 .bytesperline = 1280,
292                 .sizeimage = 1280 * 1024,
293                 .colorspace = V4L2_COLORSPACE_SRGB,
294                 .priv = SCALE_1280x1024 | MODE_RAW | MODE_SXGA},
295 };
296
297 static const s16 hsv_red_x[] = {
298         41,  44,  46,  48,  50,  52,  54,  56,
299         58,  60,  62,  64,  66,  68,  70,  72,
300         74,  76,  78,  80,  81,  83,  85,  87,
301         88,  90,  92,  93,  95,  97,  98, 100,
302         101, 102, 104, 105, 107, 108, 109, 110,
303         112, 113, 114, 115, 116, 117, 118, 119,
304         120, 121, 122, 123, 123, 124, 125, 125,
305         126, 127, 127, 128, 128, 129, 129, 129,
306         130, 130, 130, 130, 131, 131, 131, 131,
307         131, 131, 131, 131, 130, 130, 130, 130,
308         129, 129, 129, 128, 128, 127, 127, 126,
309         125, 125, 124, 123, 122, 122, 121, 120,
310         119, 118, 117, 116, 115, 114, 112, 111,
311         110, 109, 107, 106, 105, 103, 102, 101,
312         99,  98,  96,  94,  93,  91,  90,  88,
313         86,  84,  83,  81,  79,  77,  75,  74,
314         72,  70,  68,  66,  64,  62,  60,  58,
315         56,  54,  52,  49,  47,  45,  43,  41,
316         39,  36,  34,  32,  30,  28,  25,  23,
317         21,  19,  16,  14,  12,   9,   7,   5,
318         3,   0,  -1,  -3,  -6,  -8, -10, -12,
319         -15, -17, -19, -22, -24, -26, -28, -30,
320         -33, -35, -37, -39, -41, -44, -46, -48,
321         -50, -52, -54, -56, -58, -60, -62, -64,
322         -66, -68, -70, -72, -74, -76, -78, -80,
323         -81, -83, -85, -87, -88, -90, -92, -93,
324         -95, -97, -98, -100, -101, -102, -104, -105,
325         -107, -108, -109, -110, -112, -113, -114, -115,
326         -116, -117, -118, -119, -120, -121, -122, -123,
327         -123, -124, -125, -125, -126, -127, -127, -128,
328         -128, -128, -128, -128, -128, -128, -128, -128,
329         -128, -128, -128, -128, -128, -128, -128, -128,
330         -128, -128, -128, -128, -128, -128, -128, -128,
331         -128, -127, -127, -126, -125, -125, -124, -123,
332         -122, -122, -121, -120, -119, -118, -117, -116,
333         -115, -114, -112, -111, -110, -109, -107, -106,
334         -105, -103, -102, -101, -99, -98, -96, -94,
335         -93, -91, -90, -88, -86, -84, -83, -81,
336         -79, -77, -75, -74, -72, -70, -68, -66,
337         -64, -62, -60, -58, -56, -54, -52, -49,
338         -47, -45, -43, -41, -39, -36, -34, -32,
339         -30, -28, -25, -23, -21, -19, -16, -14,
340         -12,  -9,  -7,  -5,  -3,   0,   1,   3,
341         6,   8,  10,  12,  15,  17,  19,  22,
342         24,  26,  28,  30,  33,  35,  37,  39, 41
343 };
344
345 static const s16 hsv_red_y[] = {
346         82,  80,  78,  76,  74,  73,  71,  69,
347         67,  65,  63,  61,  58,  56,  54,  52,
348         50,  48,  46,  44,  41,  39,  37,  35,
349         32,  30,  28,  26,  23,  21,  19,  16,
350         14,  12,  10,   7,   5,   3,   0,  -1,
351         -3,  -6,  -8, -10, -13, -15, -17, -19,
352         -22, -24, -26, -29, -31, -33, -35, -38,
353         -40, -42, -44, -46, -48, -51, -53, -55,
354         -57, -59, -61, -63, -65, -67, -69, -71,
355         -73, -75, -77, -79, -81, -82, -84, -86,
356         -88, -89, -91, -93, -94, -96, -98, -99,
357         -101, -102, -104, -105, -106, -108, -109, -110,
358         -112, -113, -114, -115, -116, -117, -119, -120,
359         -120, -121, -122, -123, -124, -125, -126, -126,
360         -127, -128, -128, -128, -128, -128, -128, -128,
361         -128, -128, -128, -128, -128, -128, -128, -128,
362         -128, -128, -128, -128, -128, -128, -128, -128,
363         -128, -128, -128, -128, -128, -128, -128, -128,
364         -127, -127, -126, -125, -125, -124, -123, -122,
365         -121, -120, -119, -118, -117, -116, -115, -114,
366         -113, -111, -110, -109, -107, -106, -105, -103,
367         -102, -100, -99, -97, -96, -94, -92, -91,
368         -89, -87, -85, -84, -82, -80, -78, -76,
369         -74, -73, -71, -69, -67, -65, -63, -61,
370         -58, -56, -54, -52, -50, -48, -46, -44,
371         -41, -39, -37, -35, -32, -30, -28, -26,
372         -23, -21, -19, -16, -14, -12, -10,  -7,
373         -5,  -3,   0,   1,   3,   6,   8,  10,
374         13,  15,  17,  19,  22,  24,  26,  29,
375         31,  33,  35,  38,  40,  42,  44,  46,
376         48,  51,  53,  55,  57,  59,  61,  63,
377         65,  67,  69,  71,  73,  75,  77,  79,
378         81,  82,  84,  86,  88,  89,  91,  93,
379         94,  96,  98,  99, 101, 102, 104, 105,
380         106, 108, 109, 110, 112, 113, 114, 115,
381         116, 117, 119, 120, 120, 121, 122, 123,
382         124, 125, 126, 126, 127, 128, 128, 129,
383         129, 130, 130, 131, 131, 131, 131, 132,
384         132, 132, 132, 132, 132, 132, 132, 132,
385         132, 132, 132, 131, 131, 131, 130, 130,
386         130, 129, 129, 128, 127, 127, 126, 125,
387         125, 124, 123, 122, 121, 120, 119, 118,
388         117, 116, 115, 114, 113, 111, 110, 109,
389         107, 106, 105, 103, 102, 100,  99,  97,
390         96, 94, 92, 91, 89, 87, 85, 84, 82
391 };
392
393 static const s16 hsv_green_x[] = {
394         -124, -124, -125, -125, -125, -125, -125, -125,
395         -125, -126, -126, -125, -125, -125, -125, -125,
396         -125, -124, -124, -124, -123, -123, -122, -122,
397         -121, -121, -120, -120, -119, -118, -117, -117,
398         -116, -115, -114, -113, -112, -111, -110, -109,
399         -108, -107, -105, -104, -103, -102, -100, -99,
400         -98, -96, -95, -93, -92, -91, -89, -87,
401         -86, -84, -83, -81, -79, -77, -76, -74,
402         -72, -70, -69, -67, -65, -63, -61, -59,
403         -57, -55, -53, -51, -49, -47, -45, -43,
404         -41, -39, -37, -35, -33, -30, -28, -26,
405         -24, -22, -20, -18, -15, -13, -11,  -9,
406         -7,  -4,  -2,   0,   1,   3,   6,   8,
407         10,  12,  14,  17,  19,  21,  23,  25,
408         27,  29,  32,  34,  36,  38,  40,  42,
409         44,  46,  48,  50,  52,  54,  56,  58,
410         60,  62,  64,  66,  68,  70,  71,  73,
411         75,  77,  78,  80,  82,  83,  85,  87,
412         88,  90,  91,  93,  94,  96,  97,  98,
413         100, 101, 102, 104, 105, 106, 107, 108,
414         109, 111, 112, 113, 113, 114, 115, 116,
415         117, 118, 118, 119, 120, 120, 121, 122,
416         122, 123, 123, 124, 124, 124, 125, 125,
417         125, 125, 125, 125, 125, 126, 126, 125,
418         125, 125, 125, 125, 125, 124, 124, 124,
419         123, 123, 122, 122, 121, 121, 120, 120,
420         119, 118, 117, 117, 116, 115, 114, 113,
421         112, 111, 110, 109, 108, 107, 105, 104,
422         103, 102, 100,  99,  98,  96,  95,  93,
423         92,  91,  89,  87,  86,  84,  83,  81,
424         79,  77,  76,  74,  72,  70,  69,  67,
425         65,  63,  61,  59,  57,  55,  53,  51,
426         49,  47,  45,  43,  41,  39,  37,  35,
427         33,  30,  28,  26,  24,  22,  20,  18,
428         15,  13,  11,   9,   7,   4,   2,   0,
429         -1,  -3,  -6,  -8, -10, -12, -14, -17,
430         -19, -21, -23, -25, -27, -29, -32, -34,
431         -36, -38, -40, -42, -44, -46, -48, -50,
432         -52, -54, -56, -58, -60, -62, -64, -66,
433         -68, -70, -71, -73, -75, -77, -78, -80,
434         -82, -83, -85, -87, -88, -90, -91, -93,
435         -94, -96, -97, -98, -100, -101, -102, -104,
436         -105, -106, -107, -108, -109, -111, -112, -113,
437         -113, -114, -115, -116, -117, -118, -118, -119,
438         -120, -120, -121, -122, -122, -123, -123, -124, -124
439 };
440
441 static const s16 hsv_green_y[] = {
442         -100, -99, -98, -97, -95, -94, -93, -91,
443         -90, -89, -87, -86, -84, -83, -81, -80,
444         -78, -76, -75, -73, -71, -70, -68, -66,
445         -64, -63, -61, -59, -57, -55, -53, -51,
446         -49, -48, -46, -44, -42, -40, -38, -36,
447         -34, -32, -30, -27, -25, -23, -21, -19,
448         -17, -15, -13, -11,  -9,  -7,  -4,  -2,
449         0,   1,   3,   5,   7,   9,  11,  14,
450         16,  18,  20,  22,  24,  26,  28,  30,
451         32,  34,  36,  38,  40,  42,  44,  46,
452         48,  50,  52,  54,  56,  58,  59,  61,
453         63,  65,  67,  68,  70,  72,  74,  75,
454         77,  78,  80,  82,  83,  85,  86,  88,
455         89,  90,  92,  93,  95,  96,  97,  98,
456         100, 101, 102, 103, 104, 105, 106, 107,
457         108, 109, 110, 111, 112, 112, 113, 114,
458         115, 115, 116, 116, 117, 117, 118, 118,
459         119, 119, 119, 120, 120, 120, 120, 120,
460         121, 121, 121, 121, 121, 121, 120, 120,
461         120, 120, 120, 119, 119, 119, 118, 118,
462         117, 117, 116, 116, 115, 114, 114, 113,
463         112, 111, 111, 110, 109, 108, 107, 106,
464         105, 104, 103, 102, 100,  99,  98,  97,
465         95,  94,  93,  91,  90,  89,  87,  86,
466         84,  83,  81,  80,  78,  76,  75,  73,
467         71,  70,  68,  66,  64,  63,  61,  59,
468         57,  55,  53,  51,  49,  48,  46,  44,
469         42,  40,  38,  36,  34,  32,  30,  27,
470         25,  23,  21,  19,  17,  15,  13,  11,
471         9,   7,   4,   2,   0,  -1,  -3,  -5,
472         -7,  -9, -11, -14, -16, -18, -20, -22,
473         -24, -26, -28, -30, -32, -34, -36, -38,
474         -40, -42, -44, -46, -48, -50, -52, -54,
475         -56, -58, -59, -61, -63, -65, -67, -68,
476         -70, -72, -74, -75, -77, -78, -80, -82,
477         -83, -85, -86, -88, -89, -90, -92, -93,
478         -95, -96, -97, -98, -100, -101, -102, -103,
479         -104, -105, -106, -107, -108, -109, -110, -111,
480         -112, -112, -113, -114, -115, -115, -116, -116,
481         -117, -117, -118, -118, -119, -119, -119, -120,
482         -120, -120, -120, -120, -121, -121, -121, -121,
483         -121, -121, -120, -120, -120, -120, -120, -119,
484         -119, -119, -118, -118, -117, -117, -116, -116,
485         -115, -114, -114, -113, -112, -111, -111, -110,
486         -109, -108, -107, -106, -105, -104, -103, -102, -100
487 };
488
489 static const s16 hsv_blue_x[] = {
490         112, 113, 114, 114, 115, 116, 117, 117,
491         118, 118, 119, 119, 120, 120, 120, 121,
492         121, 121, 122, 122, 122, 122, 122, 122,
493         122, 122, 122, 122, 122, 122, 121, 121,
494         121, 120, 120, 120, 119, 119, 118, 118,
495         117, 116, 116, 115, 114, 113, 113, 112,
496         111, 110, 109, 108, 107, 106, 105, 104,
497         103, 102, 100,  99,  98,  97,  95,  94,
498         93,  91,  90,  88,  87,  85,  84,  82,
499         80,  79,  77,  76,  74,  72,  70,  69,
500         67,  65,  63,  61,  60,  58,  56,  54,
501         52,  50,  48,  46,  44,  42,  40,  38,
502         36,  34,  32,  30,  28,  26,  24,  22,
503         19,  17,  15,  13,  11,   9,   7,   5,
504         2,   0,  -1,  -3,  -5,  -7,  -9, -12,
505         -14, -16, -18, -20, -22, -24, -26, -28,
506         -31, -33, -35, -37, -39, -41, -43, -45,
507         -47, -49, -51, -53, -54, -56, -58, -60,
508         -62, -64, -66, -67, -69, -71, -73, -74,
509         -76, -78, -79, -81, -83, -84, -86, -87,
510         -89, -90, -92, -93, -94, -96, -97, -98,
511         -99, -101, -102, -103, -104, -105, -106, -107,
512         -108, -109, -110, -111, -112, -113, -114, -114,
513         -115, -116, -117, -117, -118, -118, -119, -119,
514         -120, -120, -120, -121, -121, -121, -122, -122,
515         -122, -122, -122, -122, -122, -122, -122, -122,
516         -122, -122, -121, -121, -121, -120, -120, -120,
517         -119, -119, -118, -118, -117, -116, -116, -115,
518         -114, -113, -113, -112, -111, -110, -109, -108,
519         -107, -106, -105, -104, -103, -102, -100, -99,
520         -98, -97, -95, -94, -93, -91, -90, -88,
521         -87, -85, -84, -82, -80, -79, -77, -76,
522         -74, -72, -70, -69, -67, -65, -63, -61,
523         -60, -58, -56, -54, -52, -50, -48, -46,
524         -44, -42, -40, -38, -36, -34, -32, -30,
525         -28, -26, -24, -22, -19, -17, -15, -13,
526         -11,  -9,  -7,  -5,  -2,   0,   1,   3,
527         5,   7,   9,  12,  14,  16,  18,  20,
528         22,  24,  26,  28,  31,  33,  35,  37,
529         39,  41,  43,  45,  47,  49,  51,  53,
530         54,  56,  58,  60,  62,  64,  66,  67,
531         69,  71,  73,  74,  76,  78,  79,  81,
532         83,  84,  86,  87,  89,  90,  92,  93,
533         94,  96,  97,  98,  99, 101, 102, 103,
534         104, 105, 106, 107, 108, 109, 110, 111, 112
535 };
536
537 static const s16 hsv_blue_y[] = {
538         -11, -13, -15, -17, -19, -21, -23, -25,
539         -27, -29, -31, -33, -35, -37, -39, -41,
540         -43, -45, -46, -48, -50, -52, -54, -55,
541         -57, -59, -61, -62, -64, -66, -67, -69,
542         -71, -72, -74, -75, -77, -78, -80, -81,
543         -83, -84, -86, -87, -88, -90, -91, -92,
544         -93, -95, -96, -97, -98, -99, -100, -101,
545         -102, -103, -104, -105, -106, -106, -107, -108,
546         -109, -109, -110, -111, -111, -112, -112, -113,
547         -113, -114, -114, -114, -115, -115, -115, -115,
548         -116, -116, -116, -116, -116, -116, -116, -116,
549         -116, -115, -115, -115, -115, -114, -114, -114,
550         -113, -113, -112, -112, -111, -111, -110, -110,
551         -109, -108, -108, -107, -106, -105, -104, -103,
552         -102, -101, -100, -99, -98, -97, -96, -95,
553         -94, -93, -91, -90, -89, -88, -86, -85,
554         -84, -82, -81, -79, -78, -76, -75, -73,
555         -71, -70, -68, -67, -65, -63, -62, -60,
556         -58, -56, -55, -53, -51, -49, -47, -45,
557         -44, -42, -40, -38, -36, -34, -32, -30,
558         -28, -26, -24, -22, -20, -18, -16, -14,
559         -12, -10,  -8,  -6,  -4,  -2,   0,   1,
560         3,   5,   7,   9,  11,  13,  15,  17,
561         19,  21,  23,  25,  27,  29,  31,  33,
562         35,  37,  39,  41,  43,  45,  46,  48,
563         50,  52,  54,  55,  57,  59,  61,  62,
564         64,  66,  67,  69,  71,  72,  74,  75,
565         77,  78,  80,  81,  83,  84,  86,  87,
566         88,  90,  91,  92,  93,  95,  96,  97,
567         98,  99, 100, 101, 102, 103, 104, 105,
568         106, 106, 107, 108, 109, 109, 110, 111,
569         111, 112, 112, 113, 113, 114, 114, 114,
570         115, 115, 115, 115, 116, 116, 116, 116,
571         116, 116, 116, 116, 116, 115, 115, 115,
572         115, 114, 114, 114, 113, 113, 112, 112,
573         111, 111, 110, 110, 109, 108, 108, 107,
574         106, 105, 104, 103, 102, 101, 100,  99,
575         98,  97,  96,  95,  94,  93,  91,  90,
576         89,  88,  86,  85,  84,  82,  81,  79,
577         78,  76,  75,  73,  71,  70,  68,  67,
578         65,  63,  62,  60,  58,  56,  55,  53,
579         51,  49,  47,  45,  44,  42,  40,  38,
580         36,  34,  32,  30,  28,  26,  24,  22,
581         20,  18,  16,  14,  12,  10,   8,   6,
582         4,   2,   0,  -1,  -3,  -5,  -7,  -9, -11
583 };
584
585 static const u16 i2c_ident[] = {
586         V4L2_IDENT_OV9650,
587         V4L2_IDENT_OV9655,
588         V4L2_IDENT_SOI968,
589         V4L2_IDENT_OV7660,
590         V4L2_IDENT_OV7670,
591         V4L2_IDENT_MT9V011,
592         V4L2_IDENT_MT9V111,
593         V4L2_IDENT_MT9V112,
594         V4L2_IDENT_MT9M001C12ST,
595         V4L2_IDENT_MT9M111,
596         V4L2_IDENT_MT9M112,
597         V4L2_IDENT_HV7131R,
598 [SENSOR_MT9VPRB] = V4L2_IDENT_UNKNOWN,
599 };
600
601 static const u16 bridge_init[][2] = {
602         {0x1000, 0x78}, {0x1001, 0x40}, {0x1002, 0x1c},
603         {0x1020, 0x80}, {0x1061, 0x01}, {0x1067, 0x40},
604         {0x1068, 0x30}, {0x1069, 0x20}, {0x106a, 0x10},
605         {0x106b, 0x08}, {0x1188, 0x87}, {0x11a1, 0x00},
606         {0x11a2, 0x00}, {0x11a3, 0x6a}, {0x11a4, 0x50},
607         {0x11ab, 0x00}, {0x11ac, 0x00}, {0x11ad, 0x50},
608         {0x11ae, 0x3c}, {0x118a, 0x04}, {0x0395, 0x04},
609         {0x11b8, 0x3a}, {0x118b, 0x0e}, {0x10f7, 0x05},
610         {0x10f8, 0x14}, {0x10fa, 0xff}, {0x10f9, 0x00},
611         {0x11ba, 0x0a}, {0x11a5, 0x2d}, {0x11a6, 0x2d},
612         {0x11a7, 0x3a}, {0x11a8, 0x05}, {0x11a9, 0x04},
613         {0x11aa, 0x3f}, {0x11af, 0x28}, {0x11b0, 0xd8},
614         {0x11b1, 0x14}, {0x11b2, 0xec}, {0x11b3, 0x32},
615         {0x11b4, 0xdd}, {0x11b5, 0x32}, {0x11b6, 0xdd},
616         {0x10e0, 0x2c}, {0x11bc, 0x40}, {0x11bd, 0x01},
617         {0x11be, 0xf0}, {0x11bf, 0x00}, {0x118c, 0x1f},
618         {0x118d, 0x1f}, {0x118e, 0x1f}, {0x118f, 0x1f},
619         {0x1180, 0x01}, {0x1181, 0x00}, {0x1182, 0x01},
620         {0x1183, 0x00}, {0x1184, 0x50}, {0x1185, 0x80},
621         {0x1007, 0x00}
622 };
623
624 /* Gain = (bit[3:0] / 16 + 1) * (bit[4] + 1) * (bit[5] + 1) * (bit[6] + 1) */
625 static const u8 ov_gain[] = {
626         0x00 /* 1x */, 0x04 /* 1.25x */, 0x08 /* 1.5x */, 0x0c /* 1.75x */,
627         0x10 /* 2x */, 0x12 /* 2.25x */, 0x14 /* 2.5x */, 0x16 /* 2.75x */,
628         0x18 /* 3x */, 0x1a /* 3.25x */, 0x1c /* 3.5x */, 0x1e /* 3.75x */,
629         0x30 /* 4x */, 0x31 /* 4.25x */, 0x32 /* 4.5x */, 0x33 /* 4.75x */,
630         0x34 /* 5x */, 0x35 /* 5.25x */, 0x36 /* 5.5x */, 0x37 /* 5.75x */,
631         0x38 /* 6x */, 0x39 /* 6.25x */, 0x3a /* 6.5x */, 0x3b /* 6.75x */,
632         0x3c /* 7x */, 0x3d /* 7.25x */, 0x3e /* 7.5x */, 0x3f /* 7.75x */,
633         0x70 /* 8x */
634 };
635
636 /* Gain = (bit[8] + 1) * (bit[7] + 1) * (bit[6:0] * 0.03125) */
637 static const u16 micron1_gain[] = {
638         /* 1x   1.25x   1.5x    1.75x */
639         0x0020, 0x0028, 0x0030, 0x0038,
640         /* 2x   2.25x   2.5x    2.75x */
641         0x00a0, 0x00a4, 0x00a8, 0x00ac,
642         /* 3x   3.25x   3.5x    3.75x */
643         0x00b0, 0x00b4, 0x00b8, 0x00bc,
644         /* 4x   4.25x   4.5x    4.75x */
645         0x00c0, 0x00c4, 0x00c8, 0x00cc,
646         /* 5x   5.25x   5.5x    5.75x */
647         0x00d0, 0x00d4, 0x00d8, 0x00dc,
648         /* 6x   6.25x   6.5x    6.75x */
649         0x00e0, 0x00e4, 0x00e8, 0x00ec,
650         /* 7x   7.25x   7.5x    7.75x */
651         0x00f0, 0x00f4, 0x00f8, 0x00fc,
652         /* 8x */
653         0x01c0
654 };
655
656 /* mt9m001 sensor uses a different gain formula then other micron sensors */
657 /* Gain = (bit[6] + 1) * (bit[5-0] * 0.125) */
658 static const u16 micron2_gain[] = {
659         /* 1x   1.25x   1.5x    1.75x */
660         0x0008, 0x000a, 0x000c, 0x000e,
661         /* 2x   2.25x   2.5x    2.75x */
662         0x0010, 0x0012, 0x0014, 0x0016,
663         /* 3x   3.25x   3.5x    3.75x */
664         0x0018, 0x001a, 0x001c, 0x001e,
665         /* 4x   4.25x   4.5x    4.75x */
666         0x0020, 0x0051, 0x0052, 0x0053,
667         /* 5x   5.25x   5.5x    5.75x */
668         0x0054, 0x0055, 0x0056, 0x0057,
669         /* 6x   6.25x   6.5x    6.75x */
670         0x0058, 0x0059, 0x005a, 0x005b,
671         /* 7x   7.25x   7.5x    7.75x */
672         0x005c, 0x005d, 0x005e, 0x005f,
673         /* 8x */
674         0x0060
675 };
676
677 /* Gain = .5 + bit[7:0] / 16 */
678 static const u8 hv7131r_gain[] = {
679         0x08 /* 1x */, 0x0c /* 1.25x */, 0x10 /* 1.5x */, 0x14 /* 1.75x */,
680         0x18 /* 2x */, 0x1c /* 2.25x */, 0x20 /* 2.5x */, 0x24 /* 2.75x */,
681         0x28 /* 3x */, 0x2c /* 3.25x */, 0x30 /* 3.5x */, 0x34 /* 3.75x */,
682         0x38 /* 4x */, 0x3c /* 4.25x */, 0x40 /* 4.5x */, 0x44 /* 4.75x */,
683         0x48 /* 5x */, 0x4c /* 5.25x */, 0x50 /* 5.5x */, 0x54 /* 5.75x */,
684         0x58 /* 6x */, 0x5c /* 6.25x */, 0x60 /* 6.5x */, 0x64 /* 6.75x */,
685         0x68 /* 7x */, 0x6c /* 7.25x */, 0x70 /* 7.5x */, 0x74 /* 7.75x */,
686         0x78 /* 8x */
687 };
688
689 static const struct i2c_reg_u8 soi968_init[] = {
690         {0x0c, 0x00}, {0x0f, 0x1f},
691         {0x11, 0x80}, {0x38, 0x52}, {0x1e, 0x00},
692         {0x33, 0x08}, {0x35, 0x8c}, {0x36, 0x0c},
693         {0x37, 0x04}, {0x45, 0x04}, {0x47, 0xff},
694         {0x3e, 0x00}, {0x3f, 0x00}, {0x3b, 0x20},
695         {0x3a, 0x96}, {0x3d, 0x0a}, {0x14, 0x8e},
696         {0x13, 0x8b}, {0x12, 0x40}, {0x17, 0x13},
697         {0x18, 0x63}, {0x19, 0x01}, {0x1a, 0x79},
698         {0x32, 0x24}, {0x03, 0x00}, {0x11, 0x40},
699         {0x2a, 0x10}, {0x2b, 0xe0}, {0x10, 0x32},
700         {0x00, 0x00}, {0x01, 0x80}, {0x02, 0x80},
701 };
702
703 static const struct i2c_reg_u8 ov7660_init[] = {
704         {0x0e, 0x80}, {0x0d, 0x08}, {0x0f, 0xc3},
705         {0x04, 0xc3}, {0x10, 0x40}, {0x11, 0x40},
706         {0x12, 0x05}, {0x13, 0xba}, {0x14, 0x2a},
707         /* HDG Set hstart and hstop, datasheet default 0x11, 0x61, using
708            0x10, 0x61 and sd->hstart, vstart = 3, fixes ugly colored borders */
709         {0x17, 0x10}, {0x18, 0x61},
710         {0x37, 0x0f}, {0x38, 0x02}, {0x39, 0x43},
711         {0x3a, 0x00}, {0x69, 0x90}, {0x2d, 0x00},
712         {0x2e, 0x00}, {0x01, 0x78}, {0x02, 0x50},
713 };
714
715 static const struct i2c_reg_u8 ov7670_init[] = {
716         {0x11, 0x80}, {0x3a, 0x04}, {0x12, 0x01},
717         {0x32, 0xb6}, {0x03, 0x0a}, {0x0c, 0x00}, {0x3e, 0x00},
718         {0x70, 0x3a}, {0x71, 0x35}, {0x72, 0x11}, {0x73, 0xf0},
719         {0xa2, 0x02}, {0x13, 0xe0}, {0x00, 0x00}, {0x10, 0x00},
720         {0x0d, 0x40}, {0x14, 0x28}, {0xa5, 0x05}, {0xab, 0x07},
721         {0x24, 0x95}, {0x25, 0x33}, {0x26, 0xe3}, {0x9f, 0x75},
722         {0xa0, 0x65}, {0xa1, 0x0b}, {0xa6, 0xd8}, {0xa7, 0xd8},
723         {0xa8, 0xf0}, {0xa9, 0x90}, {0xaa, 0x94}, {0x13, 0xe5},
724         {0x0e, 0x61}, {0x0f, 0x4b}, {0x16, 0x02}, {0x1e, 0x27},
725         {0x21, 0x02}, {0x22, 0x91}, {0x29, 0x07}, {0x33, 0x0b},
726         {0x35, 0x0b}, {0x37, 0x1d}, {0x38, 0x71}, {0x39, 0x2a},
727         {0x3c, 0x78}, {0x4d, 0x40}, {0x4e, 0x20}, {0x69, 0x00},
728         {0x74, 0x19}, {0x8d, 0x4f}, {0x8e, 0x00}, {0x8f, 0x00},
729         {0x90, 0x00}, {0x91, 0x00}, {0x96, 0x00}, {0x9a, 0x80},
730         {0xb0, 0x84}, {0xb1, 0x0c}, {0xb2, 0x0e}, {0xb3, 0x82},
731         {0xb8, 0x0a}, {0x43, 0x0a}, {0x44, 0xf0}, {0x45, 0x20},
732         {0x46, 0x7d}, {0x47, 0x29}, {0x48, 0x4a}, {0x59, 0x8c},
733         {0x5a, 0xa5}, {0x5b, 0xde}, {0x5c, 0x96}, {0x5d, 0x66},
734         {0x5e, 0x10}, {0x6c, 0x0a}, {0x6d, 0x55}, {0x6e, 0x11},
735         {0x6f, 0x9e}, {0x6a, 0x40}, {0x01, 0x40}, {0x02, 0x40},
736         {0x13, 0xe7}, {0x4f, 0x6e}, {0x50, 0x70}, {0x51, 0x02},
737         {0x52, 0x1d}, {0x53, 0x56}, {0x54, 0x73}, {0x55, 0x0a},
738         {0x56, 0x55}, {0x57, 0x80}, {0x58, 0x9e}, {0x41, 0x08},
739         {0x3f, 0x02}, {0x75, 0x03}, {0x76, 0x63}, {0x4c, 0x04},
740         {0x77, 0x06}, {0x3d, 0x02}, {0x4b, 0x09}, {0xc9, 0x30},
741         {0x41, 0x08}, {0x56, 0x48}, {0x34, 0x11}, {0xa4, 0x88},
742         {0x96, 0x00}, {0x97, 0x30}, {0x98, 0x20}, {0x99, 0x30},
743         {0x9a, 0x84}, {0x9b, 0x29}, {0x9c, 0x03}, {0x9d, 0x99},
744         {0x9e, 0x7f}, {0x78, 0x04}, {0x79, 0x01}, {0xc8, 0xf0},
745         {0x79, 0x0f}, {0xc8, 0x00}, {0x79, 0x10}, {0xc8, 0x7e},
746         {0x79, 0x0a}, {0xc8, 0x80}, {0x79, 0x0b}, {0xc8, 0x01},
747         {0x79, 0x0c}, {0xc8, 0x0f}, {0x79, 0x0d}, {0xc8, 0x20},
748         {0x79, 0x09}, {0xc8, 0x80}, {0x79, 0x02}, {0xc8, 0xc0},
749         {0x79, 0x03}, {0xc8, 0x40}, {0x79, 0x05}, {0xc8, 0x30},
750         {0x79, 0x26}, {0x62, 0x20}, {0x63, 0x00}, {0x64, 0x06},
751         {0x65, 0x00}, {0x66, 0x05}, {0x94, 0x05}, {0x95, 0x0a},
752         {0x17, 0x13}, {0x18, 0x01}, {0x19, 0x02}, {0x1a, 0x7a},
753         {0x46, 0x59}, {0x47, 0x30}, {0x58, 0x9a}, {0x59, 0x84},
754         {0x5a, 0x91}, {0x5b, 0x57}, {0x5c, 0x75}, {0x5d, 0x6d},
755         {0x5e, 0x13}, {0x64, 0x07}, {0x94, 0x07}, {0x95, 0x0d},
756         {0xa6, 0xdf}, {0xa7, 0xdf}, {0x48, 0x4d}, {0x51, 0x00},
757         {0x6b, 0x0a}, {0x11, 0x80}, {0x2a, 0x00}, {0x2b, 0x00},
758         {0x92, 0x00}, {0x93, 0x00}, {0x55, 0x0a}, {0x56, 0x60},
759         {0x4f, 0x6e}, {0x50, 0x70}, {0x51, 0x00}, {0x52, 0x1d},
760         {0x53, 0x56}, {0x54, 0x73}, {0x58, 0x9a}, {0x4f, 0x6e},
761         {0x50, 0x70}, {0x51, 0x00}, {0x52, 0x1d}, {0x53, 0x56},
762         {0x54, 0x73}, {0x58, 0x9a}, {0x3f, 0x01}, {0x7b, 0x03},
763         {0x7c, 0x09}, {0x7d, 0x16}, {0x7e, 0x38}, {0x7f, 0x47},
764         {0x80, 0x53}, {0x81, 0x5e}, {0x82, 0x6a}, {0x83, 0x74},
765         {0x84, 0x80}, {0x85, 0x8c}, {0x86, 0x9b}, {0x87, 0xb2},
766         {0x88, 0xcc}, {0x89, 0xe5}, {0x7a, 0x24}, {0x3b, 0x00},
767         {0x9f, 0x76}, {0xa0, 0x65}, {0x13, 0xe2}, {0x6b, 0x0a},
768         {0x11, 0x80}, {0x2a, 0x00}, {0x2b, 0x00}, {0x92, 0x00},
769         {0x93, 0x00},
770 };
771
772 static const struct i2c_reg_u8 ov9650_init[] = {
773         {0x00, 0x00}, {0x01, 0x78},
774         {0x02, 0x78}, {0x03, 0x36}, {0x04, 0x03},
775         {0x05, 0x00}, {0x06, 0x00}, {0x08, 0x00},
776         {0x09, 0x01}, {0x0c, 0x00}, {0x0d, 0x00},
777         {0x0e, 0xa0}, {0x0f, 0x52}, {0x10, 0x7c},
778         {0x11, 0x80}, {0x12, 0x45}, {0x13, 0xc2},
779         {0x14, 0x2e}, {0x15, 0x00}, {0x16, 0x07},
780         {0x17, 0x24}, {0x18, 0xc5}, {0x19, 0x00},
781         {0x1a, 0x3c}, {0x1b, 0x00}, {0x1e, 0x04},
782         {0x1f, 0x00}, {0x24, 0x78}, {0x25, 0x68},
783         {0x26, 0xd4}, {0x27, 0x80}, {0x28, 0x80},
784         {0x29, 0x30}, {0x2a, 0x00}, {0x2b, 0x00},
785         {0x2c, 0x80}, {0x2d, 0x00}, {0x2e, 0x00},
786         {0x2f, 0x00}, {0x30, 0x08}, {0x31, 0x30},
787         {0x32, 0x84}, {0x33, 0xe2}, {0x34, 0xbf},
788         {0x35, 0x81}, {0x36, 0xf9}, {0x37, 0x00},
789         {0x38, 0x93}, {0x39, 0x50}, {0x3a, 0x01},
790         {0x3b, 0x01}, {0x3c, 0x73}, {0x3d, 0x19},
791         {0x3e, 0x0b}, {0x3f, 0x80}, {0x40, 0xc1},
792         {0x41, 0x00}, {0x42, 0x08}, {0x67, 0x80},
793         {0x68, 0x80}, {0x69, 0x40}, {0x6a, 0x00},
794         {0x6b, 0x0a}, {0x8b, 0x06}, {0x8c, 0x20},
795         {0x8d, 0x00}, {0x8e, 0x00}, {0x8f, 0xdf},
796         {0x92, 0x00}, {0x93, 0x00}, {0x94, 0x88},
797         {0x95, 0x88}, {0x96, 0x04}, {0xa1, 0x00},
798         {0xa5, 0x80}, {0xa8, 0x80}, {0xa9, 0xb8},
799         {0xaa, 0x92}, {0xab, 0x0a},
800 };
801
802 static const struct i2c_reg_u8 ov9655_init[] = {
803         {0x0e, 0x61}, {0x11, 0x80}, {0x13, 0xba},
804         {0x14, 0x2e}, {0x16, 0x24}, {0x1e, 0x04}, {0x27, 0x08},
805         {0x28, 0x08}, {0x29, 0x15}, {0x2c, 0x08}, {0x34, 0x3d},
806         {0x35, 0x00}, {0x38, 0x12}, {0x0f, 0x42}, {0x39, 0x57},
807         {0x3a, 0x00}, {0x3b, 0xcc}, {0x3c, 0x0c}, {0x3d, 0x19},
808         {0x3e, 0x0c}, {0x3f, 0x01}, {0x41, 0x40}, {0x42, 0x80},
809         {0x45, 0x46}, {0x46, 0x62}, {0x47, 0x2a}, {0x48, 0x3c},
810         {0x4a, 0xf0}, {0x4b, 0xdc}, {0x4c, 0xdc}, {0x4d, 0xdc},
811         {0x4e, 0xdc}, {0x6c, 0x04}, {0x6f, 0x9e}, {0x70, 0x05},
812         {0x71, 0x78}, {0x77, 0x02}, {0x8a, 0x23}, {0x90, 0x7e},
813         {0x91, 0x7c}, {0x9f, 0x6e}, {0xa0, 0x6e}, {0xa5, 0x68},
814         {0xa6, 0x60}, {0xa8, 0xc1}, {0xa9, 0xfa}, {0xaa, 0x92},
815         {0xab, 0x04}, {0xac, 0x80}, {0xad, 0x80}, {0xae, 0x80},
816         {0xaf, 0x80}, {0xb2, 0xf2}, {0xb3, 0x20}, {0xb5, 0x00},
817         {0xb6, 0xaf}, {0xbb, 0xae}, {0xbc, 0x44}, {0xbd, 0x44},
818         {0xbe, 0x3b}, {0xbf, 0x3a}, {0xc1, 0xc8}, {0xc2, 0x01},
819         {0xc4, 0x00}, {0xc6, 0x85}, {0xc7, 0x81}, {0xc9, 0xe0},
820         {0xca, 0xe8}, {0xcc, 0xd8}, {0xcd, 0x93}, {0x2d, 0x00},
821         {0x2e, 0x00}, {0x01, 0x80}, {0x02, 0x80}, {0x12, 0x61},
822         {0x36, 0xfa}, {0x8c, 0x8d}, {0xc0, 0xaa}, {0x69, 0x0a},
823         {0x03, 0x09}, {0x17, 0x16}, {0x18, 0x6e}, {0x19, 0x01},
824         {0x1a, 0x3e}, {0x32, 0x09}, {0x2a, 0x10}, {0x2b, 0x0a},
825         {0x92, 0x00}, {0x93, 0x00}, {0xa1, 0x00}, {0x10, 0x7c},
826         {0x04, 0x03}, {0x00, 0x13},
827 };
828
829 static const struct i2c_reg_u16 mt9v112_init[] = {
830         {0xf0, 0x0000}, {0x0d, 0x0021}, {0x0d, 0x0020},
831         {0x34, 0xc019}, {0x0a, 0x0011}, {0x0b, 0x000b},
832         {0x20, 0x0703}, {0x35, 0x2022}, {0xf0, 0x0001},
833         {0x05, 0x0000}, {0x06, 0x340c}, {0x3b, 0x042a},
834         {0x3c, 0x0400}, {0xf0, 0x0002}, {0x2e, 0x0c58},
835         {0x5b, 0x0001}, {0xc8, 0x9f0b}, {0xf0, 0x0001},
836         {0x9b, 0x5300}, {0xf0, 0x0000}, {0x2b, 0x0020},
837         {0x2c, 0x002a}, {0x2d, 0x0032}, {0x2e, 0x0020},
838         {0x09, 0x01dc}, {0x01, 0x000c}, {0x02, 0x0020},
839         {0x03, 0x01e0}, {0x04, 0x0280}, {0x06, 0x000c},
840         {0x05, 0x0098}, {0x20, 0x0703}, {0x09, 0x01f2},
841         {0x2b, 0x00a0}, {0x2c, 0x00a0}, {0x2d, 0x00a0},
842         {0x2e, 0x00a0}, {0x01, 0x000c}, {0x02, 0x0020},
843         {0x03, 0x01e0}, {0x04, 0x0280}, {0x06, 0x000c},
844         {0x05, 0x0098}, {0x09, 0x01c1}, {0x2b, 0x00ae},
845         {0x2c, 0x00ae}, {0x2d, 0x00ae}, {0x2e, 0x00ae},
846 };
847
848 static const struct i2c_reg_u16 mt9v111_init[] = {
849         {0x01, 0x0004}, {0x0d, 0x0001}, {0x0d, 0x0000},
850         {0x01, 0x0001}, {0x05, 0x0004}, {0x2d, 0xe0a0},
851         {0x2e, 0x0c64}, {0x2f, 0x0064}, {0x06, 0x600e},
852         {0x08, 0x0480}, {0x01, 0x0004}, {0x02, 0x0016},
853         {0x03, 0x01e7}, {0x04, 0x0287}, {0x05, 0x0004},
854         {0x06, 0x002d}, {0x07, 0x3002}, {0x08, 0x0008},
855         {0x0e, 0x0008}, {0x20, 0x0000}
856 };
857
858 static const struct i2c_reg_u16 mt9v011_init[] = {
859         {0x07, 0x0002}, {0x0d, 0x0001}, {0x0d, 0x0000},
860         {0x01, 0x0008}, {0x02, 0x0016}, {0x03, 0x01e1},
861         {0x04, 0x0281}, {0x05, 0x0083}, {0x06, 0x0006},
862         {0x0d, 0x0002}, {0x0a, 0x0000}, {0x0b, 0x0000},
863         {0x0c, 0x0000}, {0x0d, 0x0000}, {0x0e, 0x0000},
864         {0x0f, 0x0000}, {0x10, 0x0000}, {0x11, 0x0000},
865         {0x12, 0x0000}, {0x13, 0x0000}, {0x14, 0x0000},
866         {0x15, 0x0000}, {0x16, 0x0000}, {0x17, 0x0000},
867         {0x18, 0x0000}, {0x19, 0x0000}, {0x1a, 0x0000},
868         {0x1b, 0x0000}, {0x1c, 0x0000}, {0x1d, 0x0000},
869         {0x32, 0x0000}, {0x20, 0x1101}, {0x21, 0x0000},
870         {0x22, 0x0000}, {0x23, 0x0000}, {0x24, 0x0000},
871         {0x25, 0x0000}, {0x26, 0x0000}, {0x27, 0x0024},
872         {0x2f, 0xf7b0}, {0x30, 0x0005}, {0x31, 0x0000},
873         {0x32, 0x0000}, {0x33, 0x0000}, {0x34, 0x0100},
874         {0x3d, 0x068f}, {0x40, 0x01e0}, {0x41, 0x00d1},
875         {0x44, 0x0082}, {0x5a, 0x0000}, {0x5b, 0x0000},
876         {0x5c, 0x0000}, {0x5d, 0x0000}, {0x5e, 0x0000},
877         {0x5f, 0xa31d}, {0x62, 0x0611}, {0x0a, 0x0000},
878         {0x06, 0x0029}, {0x05, 0x0009}, {0x20, 0x1101},
879         {0x20, 0x1101}, {0x09, 0x0064}, {0x07, 0x0003},
880         {0x2b, 0x0033}, {0x2c, 0x00a0}, {0x2d, 0x00a0},
881         {0x2e, 0x0033}, {0x07, 0x0002}, {0x06, 0x0000},
882         {0x06, 0x0029}, {0x05, 0x0009},
883 };
884
885 static const struct i2c_reg_u16 mt9m001_init[] = {
886         {0x0d, 0x0001},
887         {0x0d, 0x0000},
888         {0x04, 0x0500},         /* hres = 1280 */
889         {0x03, 0x0400},         /* vres = 1024 */
890         {0x20, 0x1100},
891         {0x06, 0x0010},
892         {0x2b, 0x0024},
893         {0x2e, 0x0024},
894         {0x35, 0x0024},
895         {0x2d, 0x0020},
896         {0x2c, 0x0020},
897         {0x09, 0x0ad4},
898         {0x35, 0x0057},
899 };
900
901 static const struct i2c_reg_u16 mt9m111_init[] = {
902         {0xf0, 0x0000}, {0x0d, 0x0021}, {0x0d, 0x0008},
903         {0xf0, 0x0001}, {0x3a, 0x4300}, {0x9b, 0x4300},
904         {0x06, 0x708e}, {0xf0, 0x0002}, {0x2e, 0x0a1e},
905         {0xf0, 0x0000},
906 };
907
908 static const struct i2c_reg_u16 mt9m112_init[] = {
909         {0xf0, 0x0000}, {0x0d, 0x0021}, {0x0d, 0x0008},
910         {0xf0, 0x0001}, {0x3a, 0x4300}, {0x9b, 0x4300},
911         {0x06, 0x708e}, {0xf0, 0x0002}, {0x2e, 0x0a1e},
912         {0xf0, 0x0000},
913 };
914
915 static const struct i2c_reg_u8 hv7131r_init[] = {
916         {0x02, 0x08}, {0x02, 0x00}, {0x01, 0x08},
917         {0x02, 0x00}, {0x20, 0x00}, {0x21, 0xd0},
918         {0x22, 0x00}, {0x23, 0x09}, {0x01, 0x08},
919         {0x01, 0x08}, {0x01, 0x08}, {0x25, 0x07},
920         {0x26, 0xc3}, {0x27, 0x50}, {0x30, 0x62},
921         {0x31, 0x10}, {0x32, 0x06}, {0x33, 0x10},
922         {0x20, 0x00}, {0x21, 0xd0}, {0x22, 0x00},
923         {0x23, 0x09}, {0x01, 0x08},
924 };
925
926 static void reg_r(struct gspca_dev *gspca_dev, u16 reg, u16 length)
927 {
928         struct usb_device *dev = gspca_dev->dev;
929         int result;
930
931         if (gspca_dev->usb_err < 0)
932                 return;
933         result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
934                         0x00,
935                         USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
936                         reg,
937                         0x00,
938                         gspca_dev->usb_buf,
939                         length,
940                         500);
941         if (unlikely(result < 0 || result != length)) {
942                 pr_err("Read register %02x failed %d\n", reg, result);
943                 gspca_dev->usb_err = result;
944         }
945 }
946
947 static void reg_w(struct gspca_dev *gspca_dev, u16 reg,
948                  const u8 *buffer, int length)
949 {
950         struct usb_device *dev = gspca_dev->dev;
951         int result;
952
953         if (gspca_dev->usb_err < 0)
954                 return;
955         memcpy(gspca_dev->usb_buf, buffer, length);
956         result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
957                         0x08,
958                         USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
959                         reg,
960                         0x00,
961                         gspca_dev->usb_buf,
962                         length,
963                         500);
964         if (unlikely(result < 0 || result != length)) {
965                 pr_err("Write register %02x failed %d\n", reg, result);
966                 gspca_dev->usb_err = result;
967         }
968 }
969
970 static void reg_w1(struct gspca_dev *gspca_dev, u16 reg, const u8 value)
971 {
972         reg_w(gspca_dev, reg, &value, 1);
973 }
974
975 static void i2c_w(struct gspca_dev *gspca_dev, const u8 *buffer)
976 {
977         int i;
978
979         reg_w(gspca_dev, 0x10c0, buffer, 8);
980         for (i = 0; i < 5; i++) {
981                 reg_r(gspca_dev, 0x10c0, 1);
982                 if (gspca_dev->usb_err < 0)
983                         return;
984                 if (gspca_dev->usb_buf[0] & 0x04) {
985                         if (gspca_dev->usb_buf[0] & 0x08) {
986                                 pr_err("i2c_w error\n");
987                                 gspca_dev->usb_err = -EIO;
988                         }
989                         return;
990                 }
991                 msleep(10);
992         }
993         pr_err("i2c_w reg %02x no response\n", buffer[2]);
994 /*      gspca_dev->usb_err = -EIO;      fixme: may occur */
995 }
996
997 static void i2c_w1(struct gspca_dev *gspca_dev, u8 reg, u8 val)
998 {
999         struct sd *sd = (struct sd *) gspca_dev;
1000         u8 row[8];
1001
1002         /*
1003          * from the point of view of the bridge, the length
1004          * includes the address
1005          */
1006         row[0] = sd->i2c_intf | (2 << 4);
1007         row[1] = sd->i2c_addr;
1008         row[2] = reg;
1009         row[3] = val;
1010         row[4] = 0x00;
1011         row[5] = 0x00;
1012         row[6] = 0x00;
1013         row[7] = 0x10;
1014
1015         i2c_w(gspca_dev, row);
1016 }
1017
1018 static void i2c_w1_buf(struct gspca_dev *gspca_dev,
1019                         const struct i2c_reg_u8 *buf, int sz)
1020 {
1021         while (--sz >= 0) {
1022                 i2c_w1(gspca_dev, buf->reg, buf->val);
1023                 buf++;
1024         }
1025 }
1026
1027 static void i2c_w2(struct gspca_dev *gspca_dev, u8 reg, u16 val)
1028 {
1029         struct sd *sd = (struct sd *) gspca_dev;
1030         u8 row[8];
1031
1032         /*
1033          * from the point of view of the bridge, the length
1034          * includes the address
1035          */
1036         row[0] = sd->i2c_intf | (3 << 4);
1037         row[1] = sd->i2c_addr;
1038         row[2] = reg;
1039         row[3] = val >> 8;
1040         row[4] = val;
1041         row[5] = 0x00;
1042         row[6] = 0x00;
1043         row[7] = 0x10;
1044
1045         i2c_w(gspca_dev, row);
1046 }
1047
1048 static void i2c_w2_buf(struct gspca_dev *gspca_dev,
1049                         const struct i2c_reg_u16 *buf, int sz)
1050 {
1051         while (--sz >= 0) {
1052                 i2c_w2(gspca_dev, buf->reg, buf->val);
1053                 buf++;
1054         }
1055 }
1056
1057 static void i2c_r1(struct gspca_dev *gspca_dev, u8 reg, u8 *val)
1058 {
1059         struct sd *sd = (struct sd *) gspca_dev;
1060         u8 row[8];
1061
1062         row[0] = sd->i2c_intf | (1 << 4);
1063         row[1] = sd->i2c_addr;
1064         row[2] = reg;
1065         row[3] = 0;
1066         row[4] = 0;
1067         row[5] = 0;
1068         row[6] = 0;
1069         row[7] = 0x10;
1070         i2c_w(gspca_dev, row);
1071         row[0] = sd->i2c_intf | (1 << 4) | 0x02;
1072         row[2] = 0;
1073         i2c_w(gspca_dev, row);
1074         reg_r(gspca_dev, 0x10c2, 5);
1075         *val = gspca_dev->usb_buf[4];
1076 }
1077
1078 static void i2c_r2(struct gspca_dev *gspca_dev, u8 reg, u16 *val)
1079 {
1080         struct sd *sd = (struct sd *) gspca_dev;
1081         u8 row[8];
1082
1083         row[0] = sd->i2c_intf | (1 << 4);
1084         row[1] = sd->i2c_addr;
1085         row[2] = reg;
1086         row[3] = 0;
1087         row[4] = 0;
1088         row[5] = 0;
1089         row[6] = 0;
1090         row[7] = 0x10;
1091         i2c_w(gspca_dev, row);
1092         row[0] = sd->i2c_intf | (2 << 4) | 0x02;
1093         row[2] = 0;
1094         i2c_w(gspca_dev, row);
1095         reg_r(gspca_dev, 0x10c2, 5);
1096         *val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4];
1097 }
1098
1099 static void ov9650_init_sensor(struct gspca_dev *gspca_dev)
1100 {
1101         u16 id;
1102         struct sd *sd = (struct sd *) gspca_dev;
1103
1104         i2c_r2(gspca_dev, 0x1c, &id);
1105         if (gspca_dev->usb_err < 0)
1106                 return;
1107
1108         if (id != 0x7fa2) {
1109                 pr_err("sensor id for ov9650 doesn't match (0x%04x)\n", id);
1110                 gspca_dev->usb_err = -ENODEV;
1111                 return;
1112         }
1113
1114         i2c_w1(gspca_dev, 0x12, 0x80);          /* sensor reset */
1115         msleep(200);
1116         i2c_w1_buf(gspca_dev, ov9650_init, ARRAY_SIZE(ov9650_init));
1117         if (gspca_dev->usb_err < 0)
1118                 pr_err("OV9650 sensor initialization failed\n");
1119         sd->hstart = 1;
1120         sd->vstart = 7;
1121 }
1122
1123 static void ov9655_init_sensor(struct gspca_dev *gspca_dev)
1124 {
1125         struct sd *sd = (struct sd *) gspca_dev;
1126
1127         i2c_w1(gspca_dev, 0x12, 0x80);          /* sensor reset */
1128         msleep(200);
1129         i2c_w1_buf(gspca_dev, ov9655_init, ARRAY_SIZE(ov9655_init));
1130         if (gspca_dev->usb_err < 0)
1131                 pr_err("OV9655 sensor initialization failed\n");
1132
1133         sd->hstart = 1;
1134         sd->vstart = 2;
1135 }
1136
1137 static void soi968_init_sensor(struct gspca_dev *gspca_dev)
1138 {
1139         struct sd *sd = (struct sd *) gspca_dev;
1140
1141         i2c_w1(gspca_dev, 0x12, 0x80);          /* sensor reset */
1142         msleep(200);
1143         i2c_w1_buf(gspca_dev, soi968_init, ARRAY_SIZE(soi968_init));
1144         if (gspca_dev->usb_err < 0)
1145                 pr_err("SOI968 sensor initialization failed\n");
1146
1147         sd->hstart = 60;
1148         sd->vstart = 11;
1149 }
1150
1151 static void ov7660_init_sensor(struct gspca_dev *gspca_dev)
1152 {
1153         struct sd *sd = (struct sd *) gspca_dev;
1154
1155         i2c_w1(gspca_dev, 0x12, 0x80);          /* sensor reset */
1156         msleep(200);
1157         i2c_w1_buf(gspca_dev, ov7660_init, ARRAY_SIZE(ov7660_init));
1158         if (gspca_dev->usb_err < 0)
1159                 pr_err("OV7660 sensor initialization failed\n");
1160         sd->hstart = 3;
1161         sd->vstart = 3;
1162 }
1163
1164 static void ov7670_init_sensor(struct gspca_dev *gspca_dev)
1165 {
1166         struct sd *sd = (struct sd *) gspca_dev;
1167
1168         i2c_w1(gspca_dev, 0x12, 0x80);          /* sensor reset */
1169         msleep(200);
1170         i2c_w1_buf(gspca_dev, ov7670_init, ARRAY_SIZE(ov7670_init));
1171         if (gspca_dev->usb_err < 0)
1172                 pr_err("OV7670 sensor initialization failed\n");
1173
1174         sd->hstart = 0;
1175         sd->vstart = 1;
1176 }
1177
1178 static void mt9v_init_sensor(struct gspca_dev *gspca_dev)
1179 {
1180         struct sd *sd = (struct sd *) gspca_dev;
1181         u16 value;
1182
1183         sd->i2c_addr = 0x5d;
1184         i2c_r2(gspca_dev, 0xff, &value);
1185         if (gspca_dev->usb_err >= 0
1186          && value == 0x8243) {
1187                 i2c_w2_buf(gspca_dev, mt9v011_init, ARRAY_SIZE(mt9v011_init));
1188                 if (gspca_dev->usb_err < 0) {
1189                         pr_err("MT9V011 sensor initialization failed\n");
1190                         return;
1191                 }
1192                 sd->hstart = 2;
1193                 sd->vstart = 2;
1194                 sd->sensor = SENSOR_MT9V011;
1195                 pr_info("MT9V011 sensor detected\n");
1196                 return;
1197         }
1198
1199         gspca_dev->usb_err = 0;
1200         sd->i2c_addr = 0x5c;
1201         i2c_w2(gspca_dev, 0x01, 0x0004);
1202         i2c_r2(gspca_dev, 0xff, &value);
1203         if (gspca_dev->usb_err >= 0
1204          && value == 0x823a) {
1205                 i2c_w2_buf(gspca_dev, mt9v111_init, ARRAY_SIZE(mt9v111_init));
1206                 if (gspca_dev->usb_err < 0) {
1207                         pr_err("MT9V111 sensor initialization failed\n");
1208                         return;
1209                 }
1210                 sd->hstart = 2;
1211                 sd->vstart = 2;
1212                 sd->sensor = SENSOR_MT9V111;
1213                 pr_info("MT9V111 sensor detected\n");
1214                 return;
1215         }
1216
1217         gspca_dev->usb_err = 0;
1218         sd->i2c_addr = 0x5d;
1219         i2c_w2(gspca_dev, 0xf0, 0x0000);
1220         if (gspca_dev->usb_err < 0) {
1221                 gspca_dev->usb_err = 0;
1222                 sd->i2c_addr = 0x48;
1223                 i2c_w2(gspca_dev, 0xf0, 0x0000);
1224         }
1225         i2c_r2(gspca_dev, 0x00, &value);
1226         if (gspca_dev->usb_err >= 0
1227          && value == 0x1229) {
1228                 i2c_w2_buf(gspca_dev, mt9v112_init, ARRAY_SIZE(mt9v112_init));
1229                 if (gspca_dev->usb_err < 0) {
1230                         pr_err("MT9V112 sensor initialization failed\n");
1231                         return;
1232                 }
1233                 sd->hstart = 6;
1234                 sd->vstart = 2;
1235                 sd->sensor = SENSOR_MT9V112;
1236                 pr_info("MT9V112 sensor detected\n");
1237                 return;
1238         }
1239
1240         gspca_dev->usb_err = -ENODEV;
1241 }
1242
1243 static void mt9m112_init_sensor(struct gspca_dev *gspca_dev)
1244 {
1245         struct sd *sd = (struct sd *) gspca_dev;
1246
1247         i2c_w2_buf(gspca_dev, mt9m112_init, ARRAY_SIZE(mt9m112_init));
1248         if (gspca_dev->usb_err < 0)
1249                 pr_err("MT9M112 sensor initialization failed\n");
1250
1251         sd->hstart = 0;
1252         sd->vstart = 2;
1253 }
1254
1255 static void mt9m111_init_sensor(struct gspca_dev *gspca_dev)
1256 {
1257         struct sd *sd = (struct sd *) gspca_dev;
1258
1259         i2c_w2_buf(gspca_dev, mt9m111_init, ARRAY_SIZE(mt9m111_init));
1260         if (gspca_dev->usb_err < 0)
1261                 pr_err("MT9M111 sensor initialization failed\n");
1262
1263         sd->hstart = 0;
1264         sd->vstart = 2;
1265 }
1266
1267 static void mt9m001_init_sensor(struct gspca_dev *gspca_dev)
1268 {
1269         struct sd *sd = (struct sd *) gspca_dev;
1270         u16 id;
1271
1272         i2c_r2(gspca_dev, 0x00, &id);
1273         if (gspca_dev->usb_err < 0)
1274                 return;
1275
1276         /* must be 0x8411 or 0x8421 for colour sensor and 8431 for bw */
1277         switch (id) {
1278         case 0x8411:
1279         case 0x8421:
1280                 pr_info("MT9M001 color sensor detected\n");
1281                 break;
1282         case 0x8431:
1283                 pr_info("MT9M001 mono sensor detected\n");
1284                 break;
1285         default:
1286                 pr_err("No MT9M001 chip detected, ID = %x\n\n", id);
1287                 gspca_dev->usb_err = -ENODEV;
1288                 return;
1289         }
1290
1291         i2c_w2_buf(gspca_dev, mt9m001_init, ARRAY_SIZE(mt9m001_init));
1292         if (gspca_dev->usb_err < 0)
1293                 pr_err("MT9M001 sensor initialization failed\n");
1294
1295         sd->hstart = 1;
1296         sd->vstart = 1;
1297 }
1298
1299 static void hv7131r_init_sensor(struct gspca_dev *gspca_dev)
1300 {
1301         struct sd *sd = (struct sd *) gspca_dev;
1302
1303         i2c_w1_buf(gspca_dev, hv7131r_init, ARRAY_SIZE(hv7131r_init));
1304         if (gspca_dev->usb_err < 0)
1305                 pr_err("HV7131R Sensor initialization failed\n");
1306
1307         sd->hstart = 0;
1308         sd->vstart = 1;
1309 }
1310
1311 static void set_cmatrix(struct gspca_dev *gspca_dev,
1312                 s32 brightness, s32 contrast, s32 satur, s32 hue)
1313 {
1314         s32 hue_coord, hue_index = 180 + hue;
1315         u8 cmatrix[21];
1316
1317         memset(cmatrix, 0, sizeof cmatrix);
1318         cmatrix[2] = (contrast * 0x25 / 0x100) + 0x26;
1319         cmatrix[0] = 0x13 + (cmatrix[2] - 0x26) * 0x13 / 0x25;
1320         cmatrix[4] = 0x07 + (cmatrix[2] - 0x26) * 0x07 / 0x25;
1321         cmatrix[18] = brightness - 0x80;
1322
1323         hue_coord = (hsv_red_x[hue_index] * satur) >> 8;
1324         cmatrix[6] = hue_coord;
1325         cmatrix[7] = (hue_coord >> 8) & 0x0f;
1326
1327         hue_coord = (hsv_red_y[hue_index] * satur) >> 8;
1328         cmatrix[8] = hue_coord;
1329         cmatrix[9] = (hue_coord >> 8) & 0x0f;
1330
1331         hue_coord = (hsv_green_x[hue_index] * satur) >> 8;
1332         cmatrix[10] = hue_coord;
1333         cmatrix[11] = (hue_coord >> 8) & 0x0f;
1334
1335         hue_coord = (hsv_green_y[hue_index] * satur) >> 8;
1336         cmatrix[12] = hue_coord;
1337         cmatrix[13] = (hue_coord >> 8) & 0x0f;
1338
1339         hue_coord = (hsv_blue_x[hue_index] * satur) >> 8;
1340         cmatrix[14] = hue_coord;
1341         cmatrix[15] = (hue_coord >> 8) & 0x0f;
1342
1343         hue_coord = (hsv_blue_y[hue_index] * satur) >> 8;
1344         cmatrix[16] = hue_coord;
1345         cmatrix[17] = (hue_coord >> 8) & 0x0f;
1346
1347         reg_w(gspca_dev, 0x10e1, cmatrix, 21);
1348 }
1349
1350 static void set_gamma(struct gspca_dev *gspca_dev, s32 val)
1351 {
1352         u8 gamma[17];
1353         u8 gval = val * 0xb8 / 0x100;
1354
1355         gamma[0] = 0x0a;
1356         gamma[1] = 0x13 + (gval * (0xcb - 0x13) / 0xb8);
1357         gamma[2] = 0x25 + (gval * (0xee - 0x25) / 0xb8);
1358         gamma[3] = 0x37 + (gval * (0xfa - 0x37) / 0xb8);
1359         gamma[4] = 0x45 + (gval * (0xfc - 0x45) / 0xb8);
1360         gamma[5] = 0x55 + (gval * (0xfb - 0x55) / 0xb8);
1361         gamma[6] = 0x65 + (gval * (0xfc - 0x65) / 0xb8);
1362         gamma[7] = 0x74 + (gval * (0xfd - 0x74) / 0xb8);
1363         gamma[8] = 0x83 + (gval * (0xfe - 0x83) / 0xb8);
1364         gamma[9] = 0x92 + (gval * (0xfc - 0x92) / 0xb8);
1365         gamma[10] = 0xa1 + (gval * (0xfc - 0xa1) / 0xb8);
1366         gamma[11] = 0xb0 + (gval * (0xfc - 0xb0) / 0xb8);
1367         gamma[12] = 0xbf + (gval * (0xfb - 0xbf) / 0xb8);
1368         gamma[13] = 0xce + (gval * (0xfb - 0xce) / 0xb8);
1369         gamma[14] = 0xdf + (gval * (0xfd - 0xdf) / 0xb8);
1370         gamma[15] = 0xea + (gval * (0xf9 - 0xea) / 0xb8);
1371         gamma[16] = 0xf5;
1372
1373         reg_w(gspca_dev, 0x1190, gamma, 17);
1374 }
1375
1376 static void set_redblue(struct gspca_dev *gspca_dev, s32 blue, s32 red)
1377 {
1378         reg_w1(gspca_dev, 0x118c, red);
1379         reg_w1(gspca_dev, 0x118f, blue);
1380 }
1381
1382 static void set_hvflip(struct gspca_dev *gspca_dev, s32 hflip, s32 vflip)
1383 {
1384         u8 value, tslb;
1385         u16 value2;
1386         struct sd *sd = (struct sd *) gspca_dev;
1387
1388         if ((sd->flags & FLIP_DETECT) && dmi_check_system(flip_dmi_table)) {
1389                 hflip = !hflip;
1390                 vflip = !vflip;
1391         }
1392
1393         switch (sd->sensor) {
1394         case SENSOR_OV7660:
1395                 value = 0x01;
1396                 if (hflip)
1397                         value |= 0x20;
1398                 if (vflip) {
1399                         value |= 0x10;
1400                         sd->vstart = 2;
1401                 } else {
1402                         sd->vstart = 3;
1403                 }
1404                 reg_w1(gspca_dev, 0x1182, sd->vstart);
1405                 i2c_w1(gspca_dev, 0x1e, value);
1406                 break;
1407         case SENSOR_OV9650:
1408                 i2c_r1(gspca_dev, 0x1e, &value);
1409                 value &= ~0x30;
1410                 tslb = 0x01;
1411                 if (hflip)
1412                         value |= 0x20;
1413                 if (vflip) {
1414                         value |= 0x10;
1415                         tslb = 0x49;
1416                 }
1417                 i2c_w1(gspca_dev, 0x1e, value);
1418                 i2c_w1(gspca_dev, 0x3a, tslb);
1419                 break;
1420         case SENSOR_MT9V111:
1421         case SENSOR_MT9V011:
1422                 i2c_r2(gspca_dev, 0x20, &value2);
1423                 value2 &= ~0xc0a0;
1424                 if (hflip)
1425                         value2 |= 0x8080;
1426                 if (vflip)
1427                         value2 |= 0x4020;
1428                 i2c_w2(gspca_dev, 0x20, value2);
1429                 break;
1430         case SENSOR_MT9M112:
1431         case SENSOR_MT9M111:
1432         case SENSOR_MT9V112:
1433                 i2c_r2(gspca_dev, 0x20, &value2);
1434                 value2 &= ~0x0003;
1435                 if (hflip)
1436                         value2 |= 0x0002;
1437                 if (vflip)
1438                         value2 |= 0x0001;
1439                 i2c_w2(gspca_dev, 0x20, value2);
1440                 break;
1441         case SENSOR_HV7131R:
1442                 i2c_r1(gspca_dev, 0x01, &value);
1443                 value &= ~0x03;
1444                 if (vflip)
1445                         value |= 0x01;
1446                 if (hflip)
1447                         value |= 0x02;
1448                 i2c_w1(gspca_dev, 0x01, value);
1449                 break;
1450         }
1451 }
1452
1453 static void set_exposure(struct gspca_dev *gspca_dev, s32 expo)
1454 {
1455         struct sd *sd = (struct sd *) gspca_dev;
1456         u8 exp[8] = {sd->i2c_intf, sd->i2c_addr,
1457                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
1458         int expo2;
1459
1460         if (gspca_dev->streaming)
1461                 exp[7] = 0x1e;
1462
1463         switch (sd->sensor) {
1464         case SENSOR_OV7660:
1465         case SENSOR_OV7670:
1466         case SENSOR_OV9655:
1467         case SENSOR_OV9650:
1468                 if (expo > 547)
1469                         expo2 = 547;
1470                 else
1471                         expo2 = expo;
1472                 exp[0] |= (2 << 4);
1473                 exp[2] = 0x10;                  /* AECH */
1474                 exp[3] = expo2 >> 2;
1475                 exp[7] = 0x10;
1476                 i2c_w(gspca_dev, exp);
1477                 exp[2] = 0x04;                  /* COM1 */
1478                 exp[3] = expo2 & 0x0003;
1479                 exp[7] = 0x10;
1480                 i2c_w(gspca_dev, exp);
1481                 expo -= expo2;
1482                 exp[7] = 0x1e;
1483                 exp[0] |= (3 << 4);
1484                 exp[2] = 0x2d;                  /* ADVFL & ADVFH */
1485                 exp[3] = expo;
1486                 exp[4] = expo >> 8;
1487                 break;
1488         case SENSOR_MT9M001:
1489         case SENSOR_MT9V112:
1490         case SENSOR_MT9V011:
1491                 exp[0] |= (3 << 4);
1492                 exp[2] = 0x09;
1493                 exp[3] = expo >> 8;
1494                 exp[4] = expo;
1495                 break;
1496         case SENSOR_HV7131R:
1497                 exp[0] |= (4 << 4);
1498                 exp[2] = 0x25;
1499                 exp[3] = expo >> 5;
1500                 exp[4] = expo << 3;
1501                 exp[5] = 0;
1502                 break;
1503         default:
1504                 return;
1505         }
1506         i2c_w(gspca_dev, exp);
1507 }
1508
1509 static void set_gain(struct gspca_dev *gspca_dev, s32 g)
1510 {
1511         struct sd *sd = (struct sd *) gspca_dev;
1512         u8 gain[8] = {sd->i2c_intf, sd->i2c_addr,
1513                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
1514
1515         if (gspca_dev->streaming)
1516                 gain[7] = 0x15;         /* or 1d ? */
1517
1518         switch (sd->sensor) {
1519         case SENSOR_OV7660:
1520         case SENSOR_OV7670:
1521         case SENSOR_SOI968:
1522         case SENSOR_OV9655:
1523         case SENSOR_OV9650:
1524                 gain[0] |= (2 << 4);
1525                 gain[3] = ov_gain[g];
1526                 break;
1527         case SENSOR_MT9V011:
1528                 gain[0] |= (3 << 4);
1529                 gain[2] = 0x35;
1530                 gain[3] = micron1_gain[g] >> 8;
1531                 gain[4] = micron1_gain[g];
1532                 break;
1533         case SENSOR_MT9V112:
1534                 gain[0] |= (3 << 4);
1535                 gain[2] = 0x2f;
1536                 gain[3] = micron1_gain[g] >> 8;
1537                 gain[4] = micron1_gain[g];
1538                 break;
1539         case SENSOR_MT9M001:
1540                 gain[0] |= (3 << 4);
1541                 gain[2] = 0x2f;
1542                 gain[3] = micron2_gain[g] >> 8;
1543                 gain[4] = micron2_gain[g];
1544                 break;
1545         case SENSOR_HV7131R:
1546                 gain[0] |= (2 << 4);
1547                 gain[2] = 0x30;
1548                 gain[3] = hv7131r_gain[g];
1549                 break;
1550         default:
1551                 return;
1552         }
1553         i2c_w(gspca_dev, gain);
1554 }
1555
1556 static void set_quality(struct gspca_dev *gspca_dev, s32 val)
1557 {
1558         struct sd *sd = (struct sd *) gspca_dev;
1559
1560         jpeg_set_qual(sd->jpeg_hdr, val);
1561         reg_w1(gspca_dev, 0x1061, 0x01);        /* stop transfer */
1562         reg_w1(gspca_dev, 0x10e0, sd->fmt | 0x20); /* write QTAB */
1563         reg_w(gspca_dev, 0x1100, &sd->jpeg_hdr[JPEG_QT0_OFFSET], 64);
1564         reg_w(gspca_dev, 0x1140, &sd->jpeg_hdr[JPEG_QT1_OFFSET], 64);
1565         reg_w1(gspca_dev, 0x1061, 0x03);        /* restart transfer */
1566         reg_w1(gspca_dev, 0x10e0, sd->fmt);
1567         sd->fmt ^= 0x0c;                        /* invert QTAB use + write */
1568         reg_w1(gspca_dev, 0x10e0, sd->fmt);
1569 }
1570
1571 #ifdef CONFIG_VIDEO_ADV_DEBUG
1572 static int sd_dbg_g_register(struct gspca_dev *gspca_dev,
1573                         struct v4l2_dbg_register *reg)
1574 {
1575         struct sd *sd = (struct sd *) gspca_dev;
1576
1577         switch (reg->match.type) {
1578         case V4L2_CHIP_MATCH_HOST:
1579                 if (reg->match.addr != 0)
1580                         return -EINVAL;
1581                 if (reg->reg < 0x1000 || reg->reg > 0x11ff)
1582                         return -EINVAL;
1583                 reg_r(gspca_dev, reg->reg, 1);
1584                 reg->val = gspca_dev->usb_buf[0];
1585                 return gspca_dev->usb_err;
1586         case V4L2_CHIP_MATCH_I2C_ADDR:
1587                 if (reg->match.addr != sd->i2c_addr)
1588                         return -EINVAL;
1589                 if (sd->sensor >= SENSOR_MT9V011 &&
1590                     sd->sensor <= SENSOR_MT9M112) {
1591                         i2c_r2(gspca_dev, reg->reg, (u16 *) &reg->val);
1592                 } else {
1593                         i2c_r1(gspca_dev, reg->reg, (u8 *) &reg->val);
1594                 }
1595                 return gspca_dev->usb_err;
1596         }
1597         return -EINVAL;
1598 }
1599
1600 static int sd_dbg_s_register(struct gspca_dev *gspca_dev,
1601                         struct v4l2_dbg_register *reg)
1602 {
1603         struct sd *sd = (struct sd *) gspca_dev;
1604
1605         switch (reg->match.type) {
1606         case V4L2_CHIP_MATCH_HOST:
1607                 if (reg->match.addr != 0)
1608                         return -EINVAL;
1609                 if (reg->reg < 0x1000 || reg->reg > 0x11ff)
1610                         return -EINVAL;
1611                 reg_w1(gspca_dev, reg->reg, reg->val);
1612                 return gspca_dev->usb_err;
1613         case V4L2_CHIP_MATCH_I2C_ADDR:
1614                 if (reg->match.addr != sd->i2c_addr)
1615                         return -EINVAL;
1616                 if (sd->sensor >= SENSOR_MT9V011 &&
1617                     sd->sensor <= SENSOR_MT9M112) {
1618                         i2c_w2(gspca_dev, reg->reg, reg->val);
1619                 } else {
1620                         i2c_w1(gspca_dev, reg->reg, reg->val);
1621                 }
1622                 return gspca_dev->usb_err;
1623         }
1624         return -EINVAL;
1625 }
1626 #endif
1627
1628 static int sd_chip_ident(struct gspca_dev *gspca_dev,
1629                         struct v4l2_dbg_chip_ident *chip)
1630 {
1631         struct sd *sd = (struct sd *) gspca_dev;
1632
1633         switch (chip->match.type) {
1634         case V4L2_CHIP_MATCH_HOST:
1635                 if (chip->match.addr != 0)
1636                         return -EINVAL;
1637                 chip->revision = 0;
1638                 chip->ident = V4L2_IDENT_SN9C20X;
1639                 return 0;
1640         case V4L2_CHIP_MATCH_I2C_ADDR:
1641                 if (chip->match.addr != sd->i2c_addr)
1642                         return -EINVAL;
1643                 chip->revision = 0;
1644                 chip->ident = i2c_ident[sd->sensor];
1645                 return 0;
1646         }
1647         return -EINVAL;
1648 }
1649
1650 static int sd_config(struct gspca_dev *gspca_dev,
1651                         const struct usb_device_id *id)
1652 {
1653         struct sd *sd = (struct sd *) gspca_dev;
1654         struct cam *cam;
1655
1656         cam = &gspca_dev->cam;
1657         cam->needs_full_bandwidth = 1;
1658
1659         sd->sensor = id->driver_info >> 8;
1660         sd->i2c_addr = id->driver_info;
1661         sd->flags = id->driver_info >> 16;
1662         sd->i2c_intf = 0x80;                    /* i2c 100 Kb/s */
1663
1664         switch (sd->sensor) {
1665         case SENSOR_MT9M112:
1666         case SENSOR_MT9M111:
1667         case SENSOR_OV9650:
1668         case SENSOR_SOI968:
1669                 cam->cam_mode = sxga_mode;
1670                 cam->nmodes = ARRAY_SIZE(sxga_mode);
1671                 break;
1672         case SENSOR_MT9M001:
1673                 cam->cam_mode = mono_mode;
1674                 cam->nmodes = ARRAY_SIZE(mono_mode);
1675                 break;
1676         case SENSOR_HV7131R:
1677                 sd->i2c_intf = 0x81;                    /* i2c 400 Kb/s */
1678                 /* fall thru */
1679         default:
1680                 cam->cam_mode = vga_mode;
1681                 cam->nmodes = ARRAY_SIZE(vga_mode);
1682                 break;
1683         }
1684
1685         sd->old_step = 0;
1686         sd->older_step = 0;
1687         sd->exposure_step = 16;
1688
1689         INIT_WORK(&sd->work, qual_upd);
1690
1691         return 0;
1692 }
1693
1694 static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
1695 {
1696         struct gspca_dev *gspca_dev =
1697                 container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
1698         struct sd *sd = (struct sd *)gspca_dev;
1699
1700         gspca_dev->usb_err = 0;
1701
1702         if (!gspca_dev->streaming)
1703                 return 0;
1704
1705         switch (ctrl->id) {
1706         /* color control cluster */
1707         case V4L2_CID_BRIGHTNESS:
1708                 set_cmatrix(gspca_dev, sd->brightness->val,
1709                         sd->contrast->val, sd->saturation->val, sd->hue->val);
1710                 break;
1711         case V4L2_CID_GAMMA:
1712                 set_gamma(gspca_dev, ctrl->val);
1713                 break;
1714         /* blue/red balance cluster */
1715         case V4L2_CID_BLUE_BALANCE:
1716                 set_redblue(gspca_dev, sd->blue->val, sd->red->val);
1717                 break;
1718         /* h/vflip cluster */
1719         case V4L2_CID_HFLIP:
1720                 set_hvflip(gspca_dev, sd->hflip->val, sd->vflip->val);
1721                 break;
1722         /* standalone exposure control */
1723         case V4L2_CID_EXPOSURE:
1724                 set_exposure(gspca_dev, ctrl->val);
1725                 break;
1726         /* standalone gain control */
1727         case V4L2_CID_GAIN:
1728                 set_gain(gspca_dev, ctrl->val);
1729                 break;
1730         /* autogain + exposure or gain control cluster */
1731         case V4L2_CID_AUTOGAIN:
1732                 if (sd->sensor == SENSOR_SOI968)
1733                         set_gain(gspca_dev, sd->gain->val);
1734                 else
1735                         set_exposure(gspca_dev, sd->exposure->val);
1736                 break;
1737         case V4L2_CID_JPEG_COMPRESSION_QUALITY:
1738                 set_quality(gspca_dev, ctrl->val);
1739                 break;
1740         }
1741         return gspca_dev->usb_err;
1742 }
1743
1744 static const struct v4l2_ctrl_ops sd_ctrl_ops = {
1745         .s_ctrl = sd_s_ctrl,
1746 };
1747
1748 static int sd_init_controls(struct gspca_dev *gspca_dev)
1749 {
1750         struct sd *sd = (struct sd *) gspca_dev;
1751         struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
1752
1753         gspca_dev->vdev.ctrl_handler = hdl;
1754         v4l2_ctrl_handler_init(hdl, 13);
1755
1756         sd->brightness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1757                         V4L2_CID_BRIGHTNESS, 0, 255, 1, 127);
1758         sd->contrast = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1759                         V4L2_CID_CONTRAST, 0, 255, 1, 127);
1760         sd->saturation = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1761                         V4L2_CID_SATURATION, 0, 255, 1, 127);
1762         sd->hue = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1763                         V4L2_CID_HUE, -180, 180, 1, 0);
1764
1765         sd->gamma = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1766                         V4L2_CID_GAMMA, 0, 255, 1, 0x10);
1767
1768         sd->blue = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1769                         V4L2_CID_BLUE_BALANCE, 0, 127, 1, 0x28);
1770         sd->red = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1771                         V4L2_CID_RED_BALANCE, 0, 127, 1, 0x28);
1772
1773         if (sd->sensor != SENSOR_OV9655 && sd->sensor != SENSOR_SOI968 &&
1774             sd->sensor != SENSOR_OV7670 && sd->sensor != SENSOR_MT9M001 &&
1775             sd->sensor != SENSOR_MT9VPRB) {
1776                 sd->hflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1777                         V4L2_CID_HFLIP, 0, 1, 1, 0);
1778                 sd->vflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1779                         V4L2_CID_VFLIP, 0, 1, 1, 0);
1780         }
1781
1782         if (sd->sensor != SENSOR_SOI968 && sd->sensor != SENSOR_MT9VPRB &&
1783             sd->sensor != SENSOR_MT9M112 && sd->sensor != SENSOR_MT9M111 &&
1784             sd->sensor != SENSOR_MT9V111)
1785                 sd->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1786                         V4L2_CID_EXPOSURE, 0, 0x1780, 1, 0x33);
1787
1788         if (sd->sensor != SENSOR_MT9VPRB && sd->sensor != SENSOR_MT9M112 &&
1789             sd->sensor != SENSOR_MT9M111 && sd->sensor != SENSOR_MT9V111) {
1790                 sd->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1791                         V4L2_CID_GAIN, 0, 28, 1, 0);
1792                 sd->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1793                         V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
1794         }
1795
1796         sd->jpegqual = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1797                         V4L2_CID_JPEG_COMPRESSION_QUALITY, 50, 90, 1, 80);
1798         if (hdl->error) {
1799                 pr_err("Could not initialize controls\n");
1800                 return hdl->error;
1801         }
1802
1803         v4l2_ctrl_cluster(4, &sd->brightness);
1804         v4l2_ctrl_cluster(2, &sd->blue);
1805         if (sd->hflip)
1806                 v4l2_ctrl_cluster(2, &sd->hflip);
1807         if (sd->autogain) {
1808                 if (sd->sensor == SENSOR_SOI968)
1809                         /* this sensor doesn't have the exposure control and
1810                            autogain is clustered with gain instead. This works
1811                            because sd->exposure == NULL. */
1812                         v4l2_ctrl_auto_cluster(3, &sd->autogain, 0, false);
1813                 else
1814                         /* Otherwise autogain is clustered with exposure. */
1815                         v4l2_ctrl_auto_cluster(2, &sd->autogain, 0, false);
1816         }
1817         return 0;
1818 }
1819
1820 static int sd_init(struct gspca_dev *gspca_dev)
1821 {
1822         struct sd *sd = (struct sd *) gspca_dev;
1823         int i;
1824         u8 value;
1825         u8 i2c_init[9] =
1826                 {0x80, sd->i2c_addr, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03};
1827
1828         for (i = 0; i < ARRAY_SIZE(bridge_init); i++) {
1829                 value = bridge_init[i][1];
1830                 reg_w(gspca_dev, bridge_init[i][0], &value, 1);
1831                 if (gspca_dev->usb_err < 0) {
1832                         pr_err("Device initialization failed\n");
1833                         return gspca_dev->usb_err;
1834                 }
1835         }
1836
1837         if (sd->flags & LED_REVERSE)
1838                 reg_w1(gspca_dev, 0x1006, 0x00);
1839         else
1840                 reg_w1(gspca_dev, 0x1006, 0x20);
1841
1842         reg_w(gspca_dev, 0x10c0, i2c_init, 9);
1843         if (gspca_dev->usb_err < 0) {
1844                 pr_err("Device initialization failed\n");
1845                 return gspca_dev->usb_err;
1846         }
1847
1848         switch (sd->sensor) {
1849         case SENSOR_OV9650:
1850                 ov9650_init_sensor(gspca_dev);
1851                 if (gspca_dev->usb_err < 0)
1852                         break;
1853                 pr_info("OV9650 sensor detected\n");
1854                 break;
1855         case SENSOR_OV9655:
1856                 ov9655_init_sensor(gspca_dev);
1857                 if (gspca_dev->usb_err < 0)
1858                         break;
1859                 pr_info("OV9655 sensor detected\n");
1860                 break;
1861         case SENSOR_SOI968:
1862                 soi968_init_sensor(gspca_dev);
1863                 if (gspca_dev->usb_err < 0)
1864                         break;
1865                 pr_info("SOI968 sensor detected\n");
1866                 break;
1867         case SENSOR_OV7660:
1868                 ov7660_init_sensor(gspca_dev);
1869                 if (gspca_dev->usb_err < 0)
1870                         break;
1871                 pr_info("OV7660 sensor detected\n");
1872                 break;
1873         case SENSOR_OV7670:
1874                 ov7670_init_sensor(gspca_dev);
1875                 if (gspca_dev->usb_err < 0)
1876                         break;
1877                 pr_info("OV7670 sensor detected\n");
1878                 break;
1879         case SENSOR_MT9VPRB:
1880                 mt9v_init_sensor(gspca_dev);
1881                 if (gspca_dev->usb_err < 0)
1882                         break;
1883                 pr_info("MT9VPRB sensor detected\n");
1884                 break;
1885         case SENSOR_MT9M111:
1886                 mt9m111_init_sensor(gspca_dev);
1887                 if (gspca_dev->usb_err < 0)
1888                         break;
1889                 pr_info("MT9M111 sensor detected\n");
1890                 break;
1891         case SENSOR_MT9M112:
1892                 mt9m112_init_sensor(gspca_dev);
1893                 if (gspca_dev->usb_err < 0)
1894                         break;
1895                 pr_info("MT9M112 sensor detected\n");
1896                 break;
1897         case SENSOR_MT9M001:
1898                 mt9m001_init_sensor(gspca_dev);
1899                 if (gspca_dev->usb_err < 0)
1900                         break;
1901                 break;
1902         case SENSOR_HV7131R:
1903                 hv7131r_init_sensor(gspca_dev);
1904                 if (gspca_dev->usb_err < 0)
1905                         break;
1906                 pr_info("HV7131R sensor detected\n");
1907                 break;
1908         default:
1909                 pr_err("Unsupported sensor\n");
1910                 gspca_dev->usb_err = -ENODEV;
1911         }
1912         return gspca_dev->usb_err;
1913 }
1914
1915 static void configure_sensor_output(struct gspca_dev *gspca_dev, int mode)
1916 {
1917         struct sd *sd = (struct sd *) gspca_dev;
1918         u8 value;
1919
1920         switch (sd->sensor) {
1921         case SENSOR_SOI968:
1922                 if (mode & MODE_SXGA) {
1923                         i2c_w1(gspca_dev, 0x17, 0x1d);
1924                         i2c_w1(gspca_dev, 0x18, 0xbd);
1925                         i2c_w1(gspca_dev, 0x19, 0x01);
1926                         i2c_w1(gspca_dev, 0x1a, 0x81);
1927                         i2c_w1(gspca_dev, 0x12, 0x00);
1928                         sd->hstart = 140;
1929                         sd->vstart = 19;
1930                 } else {
1931                         i2c_w1(gspca_dev, 0x17, 0x13);
1932                         i2c_w1(gspca_dev, 0x18, 0x63);
1933                         i2c_w1(gspca_dev, 0x19, 0x01);
1934                         i2c_w1(gspca_dev, 0x1a, 0x79);
1935                         i2c_w1(gspca_dev, 0x12, 0x40);
1936                         sd->hstart = 60;
1937                         sd->vstart = 11;
1938                 }
1939                 break;
1940         case SENSOR_OV9650:
1941                 if (mode & MODE_SXGA) {
1942                         i2c_w1(gspca_dev, 0x17, 0x1b);
1943                         i2c_w1(gspca_dev, 0x18, 0xbc);
1944                         i2c_w1(gspca_dev, 0x19, 0x01);
1945                         i2c_w1(gspca_dev, 0x1a, 0x82);
1946                         i2c_r1(gspca_dev, 0x12, &value);
1947                         i2c_w1(gspca_dev, 0x12, value & 0x07);
1948                 } else {
1949                         i2c_w1(gspca_dev, 0x17, 0x24);
1950                         i2c_w1(gspca_dev, 0x18, 0xc5);
1951                         i2c_w1(gspca_dev, 0x19, 0x00);
1952                         i2c_w1(gspca_dev, 0x1a, 0x3c);
1953                         i2c_r1(gspca_dev, 0x12, &value);
1954                         i2c_w1(gspca_dev, 0x12, (value & 0x7) | 0x40);
1955                 }
1956                 break;
1957         case SENSOR_MT9M112:
1958         case SENSOR_MT9M111:
1959                 if (mode & MODE_SXGA) {
1960                         i2c_w2(gspca_dev, 0xf0, 0x0002);
1961                         i2c_w2(gspca_dev, 0xc8, 0x970b);
1962                         i2c_w2(gspca_dev, 0xf0, 0x0000);
1963                 } else {
1964                         i2c_w2(gspca_dev, 0xf0, 0x0002);
1965                         i2c_w2(gspca_dev, 0xc8, 0x8000);
1966                         i2c_w2(gspca_dev, 0xf0, 0x0000);
1967                 }
1968                 break;
1969         }
1970 }
1971
1972 static int sd_isoc_init(struct gspca_dev *gspca_dev)
1973 {
1974         struct usb_interface *intf;
1975         u32 flags = gspca_dev->cam.cam_mode[(int)gspca_dev->curr_mode].priv;
1976
1977         /*
1978          * When using the SN9C20X_I420 fmt the sn9c20x needs more bandwidth
1979          * than our regular bandwidth calculations reserve, so we force the
1980          * use of a specific altsetting when using the SN9C20X_I420 fmt.
1981          */
1982         if (!(flags & (MODE_RAW | MODE_JPEG))) {
1983                 intf = usb_ifnum_to_if(gspca_dev->dev, gspca_dev->iface);
1984
1985                 if (intf->num_altsetting != 9) {
1986                         pr_warn("sn9c20x camera with unknown number of alt "
1987                                 "settings (%d), please report!\n",
1988                                 intf->num_altsetting);
1989                         gspca_dev->alt = intf->num_altsetting;
1990                         return 0;
1991                 }
1992
1993                 switch (gspca_dev->width) {
1994                 case 160: /* 160x120 */
1995                         gspca_dev->alt = 2;
1996                         break;
1997                 case 320: /* 320x240 */
1998                         gspca_dev->alt = 6;
1999                         break;
2000                 default:  /* >= 640x480 */
2001                         gspca_dev->alt = 9;
2002                         break;
2003                 }
2004         }
2005
2006         return 0;
2007 }
2008
2009 #define HW_WIN(mode, hstart, vstart) \
2010 ((const u8 []){hstart, 0, vstart, 0, \
2011 (mode & MODE_SXGA ? 1280 >> 4 : 640 >> 4), \
2012 (mode & MODE_SXGA ? 1024 >> 3 : 480 >> 3)})
2013
2014 #define CLR_WIN(width, height) \
2015 ((const u8 [])\
2016 {0, width >> 2, 0, height >> 1,\
2017 ((width >> 10) & 0x01) | ((height >> 8) & 0x6)})
2018
2019 static int sd_start(struct gspca_dev *gspca_dev)
2020 {
2021         struct sd *sd = (struct sd *) gspca_dev;
2022         int mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
2023         int width = gspca_dev->width;
2024         int height = gspca_dev->height;
2025         u8 fmt, scale = 0;
2026
2027         jpeg_define(sd->jpeg_hdr, height, width,
2028                         0x21);
2029         jpeg_set_qual(sd->jpeg_hdr, v4l2_ctrl_g_ctrl(sd->jpegqual));
2030
2031         if (mode & MODE_RAW)
2032                 fmt = 0x2d;
2033         else if (mode & MODE_JPEG)
2034                 fmt = 0x24;
2035         else
2036                 fmt = 0x2f;     /* YUV 420 */
2037         sd->fmt = fmt;
2038
2039         switch (mode & SCALE_MASK) {
2040         case SCALE_1280x1024:
2041                 scale = 0xc0;
2042                 pr_info("Set 1280x1024\n");
2043                 break;
2044         case SCALE_640x480:
2045                 scale = 0x80;
2046                 pr_info("Set 640x480\n");
2047                 break;
2048         case SCALE_320x240:
2049                 scale = 0x90;
2050                 pr_info("Set 320x240\n");
2051                 break;
2052         case SCALE_160x120:
2053                 scale = 0xa0;
2054                 pr_info("Set 160x120\n");
2055                 break;
2056         }
2057
2058         configure_sensor_output(gspca_dev, mode);
2059         reg_w(gspca_dev, 0x1100, &sd->jpeg_hdr[JPEG_QT0_OFFSET], 64);
2060         reg_w(gspca_dev, 0x1140, &sd->jpeg_hdr[JPEG_QT1_OFFSET], 64);
2061         reg_w(gspca_dev, 0x10fb, CLR_WIN(width, height), 5);
2062         reg_w(gspca_dev, 0x1180, HW_WIN(mode, sd->hstart, sd->vstart), 6);
2063         reg_w1(gspca_dev, 0x1189, scale);
2064         reg_w1(gspca_dev, 0x10e0, fmt);
2065
2066         set_cmatrix(gspca_dev, v4l2_ctrl_g_ctrl(sd->brightness),
2067                         v4l2_ctrl_g_ctrl(sd->contrast),
2068                         v4l2_ctrl_g_ctrl(sd->saturation),
2069                         v4l2_ctrl_g_ctrl(sd->hue));
2070         set_gamma(gspca_dev, v4l2_ctrl_g_ctrl(sd->gamma));
2071         set_redblue(gspca_dev, v4l2_ctrl_g_ctrl(sd->blue),
2072                         v4l2_ctrl_g_ctrl(sd->red));
2073         if (sd->gain)
2074                 set_gain(gspca_dev, v4l2_ctrl_g_ctrl(sd->gain));
2075         if (sd->exposure)
2076                 set_exposure(gspca_dev, v4l2_ctrl_g_ctrl(sd->exposure));
2077         if (sd->hflip)
2078                 set_hvflip(gspca_dev, v4l2_ctrl_g_ctrl(sd->hflip),
2079                                 v4l2_ctrl_g_ctrl(sd->vflip));
2080
2081         reg_w1(gspca_dev, 0x1007, 0x20);
2082         reg_w1(gspca_dev, 0x1061, 0x03);
2083
2084         /* if JPEG, prepare the compression quality update */
2085         if (mode & MODE_JPEG) {
2086                 sd->pktsz = sd->npkt = 0;
2087                 sd->nchg = 0;
2088                 sd->work_thread =
2089                         create_singlethread_workqueue(KBUILD_MODNAME);
2090         }
2091
2092         return gspca_dev->usb_err;
2093 }
2094
2095 static void sd_stopN(struct gspca_dev *gspca_dev)
2096 {
2097         reg_w1(gspca_dev, 0x1007, 0x00);
2098         reg_w1(gspca_dev, 0x1061, 0x01);
2099 }
2100
2101 /* called on streamoff with alt==0 and on disconnect */
2102 /* the usb_lock is held at entry - restore on exit */
2103 static void sd_stop0(struct gspca_dev *gspca_dev)
2104 {
2105         struct sd *sd = (struct sd *) gspca_dev;
2106
2107         if (sd->work_thread != NULL) {
2108                 mutex_unlock(&gspca_dev->usb_lock);
2109                 destroy_workqueue(sd->work_thread);
2110                 mutex_lock(&gspca_dev->usb_lock);
2111                 sd->work_thread = NULL;
2112         }
2113 }
2114
2115 static void do_autoexposure(struct gspca_dev *gspca_dev, u16 avg_lum)
2116 {
2117         struct sd *sd = (struct sd *) gspca_dev;
2118         s32 cur_exp = v4l2_ctrl_g_ctrl(sd->exposure);
2119         s32 max = sd->exposure->maximum - sd->exposure_step;
2120         s32 min = sd->exposure->minimum + sd->exposure_step;
2121         s16 new_exp;
2122
2123         /*
2124          * some hardcoded values are present
2125          * like those for maximal/minimal exposure
2126          * and exposure steps
2127          */
2128         if (avg_lum < MIN_AVG_LUM) {
2129                 if (cur_exp > max)
2130                         return;
2131
2132                 new_exp = cur_exp + sd->exposure_step;
2133                 if (new_exp > max)
2134                         new_exp = max;
2135                 if (new_exp < min)
2136                         new_exp = min;
2137                 v4l2_ctrl_s_ctrl(sd->exposure, new_exp);
2138
2139                 sd->older_step = sd->old_step;
2140                 sd->old_step = 1;
2141
2142                 if (sd->old_step ^ sd->older_step)
2143                         sd->exposure_step /= 2;
2144                 else
2145                         sd->exposure_step += 2;
2146         }
2147         if (avg_lum > MAX_AVG_LUM) {
2148                 if (cur_exp < min)
2149                         return;
2150                 new_exp = cur_exp - sd->exposure_step;
2151                 if (new_exp > max)
2152                         new_exp = max;
2153                 if (new_exp < min)
2154                         new_exp = min;
2155                 v4l2_ctrl_s_ctrl(sd->exposure, new_exp);
2156                 sd->older_step = sd->old_step;
2157                 sd->old_step = 0;
2158
2159                 if (sd->old_step ^ sd->older_step)
2160                         sd->exposure_step /= 2;
2161                 else
2162                         sd->exposure_step += 2;
2163         }
2164 }
2165
2166 static void do_autogain(struct gspca_dev *gspca_dev, u16 avg_lum)
2167 {
2168         struct sd *sd = (struct sd *) gspca_dev;
2169         s32 cur_gain = v4l2_ctrl_g_ctrl(sd->gain);
2170
2171         if (avg_lum < MIN_AVG_LUM && cur_gain < sd->gain->maximum)
2172                 v4l2_ctrl_s_ctrl(sd->gain, cur_gain + 1);
2173         if (avg_lum > MAX_AVG_LUM && cur_gain > sd->gain->minimum)
2174                 v4l2_ctrl_s_ctrl(sd->gain, cur_gain - 1);
2175 }
2176
2177 static void sd_dqcallback(struct gspca_dev *gspca_dev)
2178 {
2179         struct sd *sd = (struct sd *) gspca_dev;
2180         int avg_lum;
2181
2182         if (sd->autogain == NULL || !v4l2_ctrl_g_ctrl(sd->autogain))
2183                 return;
2184
2185         avg_lum = atomic_read(&sd->avg_lum);
2186         if (sd->sensor == SENSOR_SOI968)
2187                 do_autogain(gspca_dev, avg_lum);
2188         else
2189                 do_autoexposure(gspca_dev, avg_lum);
2190 }
2191
2192 /* JPEG quality update */
2193 /* This function is executed from a work queue. */
2194 static void qual_upd(struct work_struct *work)
2195 {
2196         struct sd *sd = container_of(work, struct sd, work);
2197         struct gspca_dev *gspca_dev = &sd->gspca_dev;
2198         s32 qual = v4l2_ctrl_g_ctrl(sd->jpegqual);
2199
2200         /* To protect gspca_dev->usb_buf and gspca_dev->usb_err */
2201         mutex_lock(&gspca_dev->usb_lock);
2202         PDEBUG(D_STREAM, "qual_upd %d%%", qual);
2203         gspca_dev->usb_err = 0;
2204         set_quality(gspca_dev, qual);
2205         mutex_unlock(&gspca_dev->usb_lock);
2206 }
2207
2208 #if IS_ENABLED(CONFIG_INPUT)
2209 static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
2210                         u8 *data,               /* interrupt packet */
2211                         int len)                /* interrupt packet length */
2212 {
2213         struct sd *sd = (struct sd *) gspca_dev;
2214
2215         if (!(sd->flags & HAS_NO_BUTTON) && len == 1) {
2216                 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
2217                 input_sync(gspca_dev->input_dev);
2218                 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
2219                 input_sync(gspca_dev->input_dev);
2220                 return 0;
2221         }
2222         return -EINVAL;
2223 }
2224 #endif
2225
2226 /* check the JPEG compression */
2227 static void transfer_check(struct gspca_dev *gspca_dev,
2228                         u8 *data)
2229 {
2230         struct sd *sd = (struct sd *) gspca_dev;
2231         int new_qual, r;
2232
2233         new_qual = 0;
2234
2235         /* if USB error, discard the frame and decrease the quality */
2236         if (data[6] & 0x08) {                           /* USB FIFO full */
2237                 gspca_dev->last_packet_type = DISCARD_PACKET;
2238                 new_qual = -5;
2239         } else {
2240
2241                 /* else, compute the filling rate and a new JPEG quality */
2242                 r = (sd->pktsz * 100) /
2243                         (sd->npkt *
2244                                 gspca_dev->urb[0]->iso_frame_desc[0].length);
2245                 if (r >= 85)
2246                         new_qual = -3;
2247                 else if (r < 75)
2248                         new_qual = 2;
2249         }
2250         if (new_qual != 0) {
2251                 sd->nchg += new_qual;
2252                 if (sd->nchg < -6 || sd->nchg >= 12) {
2253                         /* Note: we are in interrupt context, so we can't
2254                            use v4l2_ctrl_g/s_ctrl here. Access the value
2255                            directly instead. */
2256                         s32 curqual = sd->jpegqual->cur.val;
2257                         sd->nchg = 0;
2258                         new_qual += curqual;
2259                         if (new_qual < sd->jpegqual->minimum)
2260                                 new_qual = sd->jpegqual->minimum;
2261                         else if (new_qual > sd->jpegqual->maximum)
2262                                 new_qual = sd->jpegqual->maximum;
2263                         if (new_qual != curqual) {
2264                                 sd->jpegqual->cur.val = new_qual;
2265                                 queue_work(sd->work_thread, &sd->work);
2266                         }
2267                 }
2268         } else {
2269                 sd->nchg = 0;
2270         }
2271         sd->pktsz = sd->npkt = 0;
2272 }
2273
2274 static void sd_pkt_scan(struct gspca_dev *gspca_dev,
2275                         u8 *data,                       /* isoc packet */
2276                         int len)                        /* iso packet length */
2277 {
2278         struct sd *sd = (struct sd *) gspca_dev;
2279         int avg_lum, is_jpeg;
2280         static const u8 frame_header[] =
2281                 {0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96};
2282
2283         is_jpeg = (sd->fmt & 0x03) == 0;
2284         if (len >= 64 && memcmp(data, frame_header, 6) == 0) {
2285                 avg_lum = ((data[35] >> 2) & 3) |
2286                            (data[20] << 2) |
2287                            (data[19] << 10);
2288                 avg_lum += ((data[35] >> 4) & 3) |
2289                             (data[22] << 2) |
2290                             (data[21] << 10);
2291                 avg_lum += ((data[35] >> 6) & 3) |
2292                             (data[24] << 2) |
2293                             (data[23] << 10);
2294                 avg_lum += (data[36] & 3) |
2295                            (data[26] << 2) |
2296                            (data[25] << 10);
2297                 avg_lum += ((data[36] >> 2) & 3) |
2298                             (data[28] << 2) |
2299                             (data[27] << 10);
2300                 avg_lum += ((data[36] >> 4) & 3) |
2301                             (data[30] << 2) |
2302                             (data[29] << 10);
2303                 avg_lum += ((data[36] >> 6) & 3) |
2304                             (data[32] << 2) |
2305                             (data[31] << 10);
2306                 avg_lum += ((data[44] >> 4) & 3) |
2307                             (data[34] << 2) |
2308                             (data[33] << 10);
2309                 avg_lum >>= 9;
2310                 atomic_set(&sd->avg_lum, avg_lum);
2311
2312                 if (is_jpeg)
2313                         transfer_check(gspca_dev, data);
2314
2315                 gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
2316                 len -= 64;
2317                 if (len == 0)
2318                         return;
2319                 data += 64;
2320         }
2321         if (gspca_dev->last_packet_type == LAST_PACKET) {
2322                 if (is_jpeg) {
2323                         gspca_frame_add(gspca_dev, FIRST_PACKET,
2324                                 sd->jpeg_hdr, JPEG_HDR_SZ);
2325                         gspca_frame_add(gspca_dev, INTER_PACKET,
2326                                 data, len);
2327                 } else {
2328                         gspca_frame_add(gspca_dev, FIRST_PACKET,
2329                                 data, len);
2330                 }
2331         } else {
2332                 /* if JPEG, count the packets and their size */
2333                 if (is_jpeg) {
2334                         sd->npkt++;
2335                         sd->pktsz += len;
2336                 }
2337                 gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
2338         }
2339 }
2340
2341 /* sub-driver description */
2342 static const struct sd_desc sd_desc = {
2343         .name = KBUILD_MODNAME,
2344         .config = sd_config,
2345         .init = sd_init,
2346         .init_controls = sd_init_controls,
2347         .isoc_init = sd_isoc_init,
2348         .start = sd_start,
2349         .stopN = sd_stopN,
2350         .stop0 = sd_stop0,
2351         .pkt_scan = sd_pkt_scan,
2352 #if IS_ENABLED(CONFIG_INPUT)
2353         .int_pkt_scan = sd_int_pkt_scan,
2354 #endif
2355         .dq_callback = sd_dqcallback,
2356 #ifdef CONFIG_VIDEO_ADV_DEBUG
2357         .set_register = sd_dbg_s_register,
2358         .get_register = sd_dbg_g_register,
2359 #endif
2360         .get_chip_ident = sd_chip_ident,
2361 };
2362
2363 #define SN9C20X(sensor, i2c_addr, flags) \
2364         .driver_info =  ((flags & 0xff) << 16) \
2365                         | (SENSOR_ ## sensor << 8) \
2366                         | (i2c_addr)
2367
2368 static const struct usb_device_id device_table[] = {
2369         {USB_DEVICE(0x0c45, 0x6240), SN9C20X(MT9M001, 0x5d, 0)},
2370         {USB_DEVICE(0x0c45, 0x6242), SN9C20X(MT9M111, 0x5d, 0)},
2371         {USB_DEVICE(0x0c45, 0x6248), SN9C20X(OV9655, 0x30, 0)},
2372         {USB_DEVICE(0x0c45, 0x624c), SN9C20X(MT9M112, 0x5d, 0)},
2373         {USB_DEVICE(0x0c45, 0x624e), SN9C20X(SOI968, 0x30, LED_REVERSE)},
2374         {USB_DEVICE(0x0c45, 0x624f), SN9C20X(OV9650, 0x30,
2375                                              (FLIP_DETECT | HAS_NO_BUTTON))},
2376         {USB_DEVICE(0x0c45, 0x6251), SN9C20X(OV9650, 0x30, 0)},
2377         {USB_DEVICE(0x0c45, 0x6253), SN9C20X(OV9650, 0x30, 0)},
2378         {USB_DEVICE(0x0c45, 0x6260), SN9C20X(OV7670, 0x21, 0)},
2379         {USB_DEVICE(0x0c45, 0x6270), SN9C20X(MT9VPRB, 0x00, 0)},
2380         {USB_DEVICE(0x0c45, 0x627b), SN9C20X(OV7660, 0x21, FLIP_DETECT)},
2381         {USB_DEVICE(0x0c45, 0x627c), SN9C20X(HV7131R, 0x11, 0)},
2382         {USB_DEVICE(0x0c45, 0x627f), SN9C20X(OV9650, 0x30, 0)},
2383         {USB_DEVICE(0x0c45, 0x6280), SN9C20X(MT9M001, 0x5d, 0)},
2384         {USB_DEVICE(0x0c45, 0x6282), SN9C20X(MT9M111, 0x5d, 0)},
2385         {USB_DEVICE(0x0c45, 0x6288), SN9C20X(OV9655, 0x30, 0)},
2386         {USB_DEVICE(0x0c45, 0x628c), SN9C20X(MT9M112, 0x5d, 0)},
2387         {USB_DEVICE(0x0c45, 0x628e), SN9C20X(SOI968, 0x30, 0)},
2388         {USB_DEVICE(0x0c45, 0x628f), SN9C20X(OV9650, 0x30, 0)},
2389         {USB_DEVICE(0x0c45, 0x62a0), SN9C20X(OV7670, 0x21, 0)},
2390         {USB_DEVICE(0x0c45, 0x62b0), SN9C20X(MT9VPRB, 0x00, 0)},
2391         {USB_DEVICE(0x0c45, 0x62b3), SN9C20X(OV9655, 0x30, LED_REVERSE)},
2392         {USB_DEVICE(0x0c45, 0x62bb), SN9C20X(OV7660, 0x21, LED_REVERSE)},
2393         {USB_DEVICE(0x0c45, 0x62bc), SN9C20X(HV7131R, 0x11, 0)},
2394         {USB_DEVICE(0x045e, 0x00f4), SN9C20X(OV9650, 0x30, 0)},
2395         {USB_DEVICE(0x145f, 0x013d), SN9C20X(OV7660, 0x21, 0)},
2396         {USB_DEVICE(0x0458, 0x7029), SN9C20X(HV7131R, 0x11, 0)},
2397         {USB_DEVICE(0x0458, 0x704a), SN9C20X(MT9M112, 0x5d, 0)},
2398         {USB_DEVICE(0x0458, 0x704c), SN9C20X(MT9M112, 0x5d, 0)},
2399         {USB_DEVICE(0xa168, 0x0610), SN9C20X(HV7131R, 0x11, 0)},
2400         {USB_DEVICE(0xa168, 0x0611), SN9C20X(HV7131R, 0x11, 0)},
2401         {USB_DEVICE(0xa168, 0x0613), SN9C20X(HV7131R, 0x11, 0)},
2402         {USB_DEVICE(0xa168, 0x0618), SN9C20X(HV7131R, 0x11, 0)},
2403         {USB_DEVICE(0xa168, 0x0614), SN9C20X(MT9M111, 0x5d, 0)},
2404         {USB_DEVICE(0xa168, 0x0615), SN9C20X(MT9M111, 0x5d, 0)},
2405         {USB_DEVICE(0xa168, 0x0617), SN9C20X(MT9M111, 0x5d, 0)},
2406         {}
2407 };
2408 MODULE_DEVICE_TABLE(usb, device_table);
2409
2410 /* -- device connect -- */
2411 static int sd_probe(struct usb_interface *intf,
2412                     const struct usb_device_id *id)
2413 {
2414         return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
2415                                 THIS_MODULE);
2416 }
2417
2418 static struct usb_driver sd_driver = {
2419         .name = KBUILD_MODNAME,
2420         .id_table = device_table,
2421         .probe = sd_probe,
2422         .disconnect = gspca_disconnect,
2423 #ifdef CONFIG_PM
2424         .suspend = gspca_suspend,
2425         .resume = gspca_resume,
2426         .reset_resume = gspca_resume,
2427 #endif
2428 };
2429
2430 module_usb_driver(sd_driver);