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