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