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