Linux-libre 4.14.12-gnu
[librecmc/linux-libre.git] / drivers / media / usb / gspca / spca561.c
1 /*
2  * Sunplus spca561 subdriver
3  *
4  * Copyright (C) 2004 Michel Xhaard mxhaard@magic.fr
5  *
6  * V4L2 by Jean-Francois Moine <http://moinejf.free.fr>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  */
18
19 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
20
21 #define MODULE_NAME "spca561"
22
23 #include <linux/input.h>
24 #include "gspca.h"
25
26 MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
27 MODULE_DESCRIPTION("GSPCA/SPCA561 USB Camera Driver");
28 MODULE_LICENSE("GPL");
29
30 #define EXPOSURE_MAX (2047 + 325)
31
32 /* specific webcam descriptor */
33 struct sd {
34         struct gspca_dev gspca_dev;     /* !! must be the first item */
35
36         struct { /* hue/contrast control cluster */
37                 struct v4l2_ctrl *contrast;
38                 struct v4l2_ctrl *hue;
39         };
40         struct v4l2_ctrl *autogain;
41
42 #define EXPO12A_DEF 3
43         __u8 expo12a;           /* expo/gain? for rev 12a */
44
45         __u8 chip_revision;
46 #define Rev012A 0
47 #define Rev072A 1
48
49         signed char ag_cnt;
50 #define AG_CNT_START 13
51 };
52
53 static const struct v4l2_pix_format sif_012a_mode[] = {
54         {160, 120, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
55                 .bytesperline = 160,
56                 .sizeimage = 160 * 120,
57                 .colorspace = V4L2_COLORSPACE_SRGB,
58                 .priv = 3},
59         {176, 144, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
60                 .bytesperline = 176,
61                 .sizeimage = 176 * 144,
62                 .colorspace = V4L2_COLORSPACE_SRGB,
63                 .priv = 2},
64         {320, 240, V4L2_PIX_FMT_SPCA561, V4L2_FIELD_NONE,
65                 .bytesperline = 320,
66                 .sizeimage = 320 * 240 * 4 / 8,
67                 .colorspace = V4L2_COLORSPACE_SRGB,
68                 .priv = 1},
69         {352, 288, V4L2_PIX_FMT_SPCA561, V4L2_FIELD_NONE,
70                 .bytesperline = 352,
71                 .sizeimage = 352 * 288 * 4 / 8,
72                 .colorspace = V4L2_COLORSPACE_SRGB,
73                 .priv = 0},
74 };
75
76 static const struct v4l2_pix_format sif_072a_mode[] = {
77         {160, 120, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
78                 .bytesperline = 160,
79                 .sizeimage = 160 * 120,
80                 .colorspace = V4L2_COLORSPACE_SRGB,
81                 .priv = 3},
82         {176, 144, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
83                 .bytesperline = 176,
84                 .sizeimage = 176 * 144,
85                 .colorspace = V4L2_COLORSPACE_SRGB,
86                 .priv = 2},
87         {320, 240, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
88                 .bytesperline = 320,
89                 .sizeimage = 320 * 240,
90                 .colorspace = V4L2_COLORSPACE_SRGB,
91                 .priv = 1},
92         {352, 288, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
93                 .bytesperline = 352,
94                 .sizeimage = 352 * 288,
95                 .colorspace = V4L2_COLORSPACE_SRGB,
96                 .priv = 0},
97 };
98
99 /*
100  * Initialization data
101  * I'm not very sure how to split initialization from open data
102  * chunks. For now, we'll consider everything as initialization
103  */
104 /* Frame packet header offsets for the spca561 */
105 #define SPCA561_OFFSET_SNAP 1
106 #define SPCA561_OFFSET_TYPE 2
107 #define SPCA561_OFFSET_COMPRESS 3
108 #define SPCA561_OFFSET_FRAMSEQ   4
109 #define SPCA561_OFFSET_GPIO 5
110 #define SPCA561_OFFSET_USBBUFF 6
111 #define SPCA561_OFFSET_WIN2GRAVE 7
112 #define SPCA561_OFFSET_WIN2RAVE 8
113 #define SPCA561_OFFSET_WIN2BAVE 9
114 #define SPCA561_OFFSET_WIN2GBAVE 10
115 #define SPCA561_OFFSET_WIN1GRAVE 11
116 #define SPCA561_OFFSET_WIN1RAVE 12
117 #define SPCA561_OFFSET_WIN1BAVE 13
118 #define SPCA561_OFFSET_WIN1GBAVE 14
119 #define SPCA561_OFFSET_FREQ 15
120 #define SPCA561_OFFSET_VSYNC 16
121 #define SPCA561_INDEX_I2C_BASE 0x8800
122 #define SPCA561_SNAPBIT 0x20
123 #define SPCA561_SNAPCTRL 0x40
124
125 static const u16 rev72a_reset[][2] = {
126         {0x0000, 0x8114},       /* Software GPIO output data */
127         {0x0001, 0x8114},       /* Software GPIO output data */
128         {0x0000, 0x8112},       /* Some kind of reset */
129         {}
130 };
131 static const __u16 rev72a_init_data1[][2] = {
132         {0x0003, 0x8701},       /* PCLK clock delay adjustment */
133         {0x0001, 0x8703},       /* HSYNC from cmos inverted */
134         {0x0011, 0x8118},       /* Enable and conf sensor */
135         {0x0001, 0x8118},       /* Conf sensor */
136         {0x0092, 0x8804},       /* I know nothing about these */
137         {0x0010, 0x8802},       /* 0x88xx registers, so I won't */
138         {}
139 };
140 static const u16 rev72a_init_sensor1[][2] = {
141         {0x0001, 0x000d},
142         {0x0002, 0x0018},
143         {0x0004, 0x0165},
144         {0x0005, 0x0021},
145         {0x0007, 0x00aa},
146         {0x0020, 0x1504},
147         {0x0039, 0x0002},
148         {0x0035, 0x0010},
149         {0x0009, 0x1049},
150         {0x0028, 0x000b},
151         {0x003b, 0x000f},
152         {0x003c, 0x0000},
153         {}
154 };
155 static const __u16 rev72a_init_data2[][2] = {
156         {0x0018, 0x8601},       /* Pixel/line selection for color separation */
157         {0x0000, 0x8602},       /* Optical black level for user setting */
158         {0x0060, 0x8604},       /* Optical black horizontal offset */
159         {0x0002, 0x8605},       /* Optical black vertical offset */
160         {0x0000, 0x8603},       /* Non-automatic optical black level */
161         {0x0002, 0x865b},       /* Horizontal offset for valid pixels */
162         {0x0000, 0x865f},       /* Vertical valid pixels window (x2) */
163         {0x00b0, 0x865d},       /* Horizontal valid pixels window (x2) */
164         {0x0090, 0x865e},       /* Vertical valid lines window (x2) */
165         {0x00e0, 0x8406},       /* Memory buffer threshold */
166         {0x0000, 0x8660},       /* Compensation memory stuff */
167         {0x0002, 0x8201},       /* Output address for r/w serial EEPROM */
168         {0x0008, 0x8200},       /* Clear valid bit for serial EEPROM */
169         {0x0001, 0x8200},       /* OprMode to be executed by hardware */
170 /* from ms-win */
171         {0x0000, 0x8611},       /* R offset for white balance */
172         {0x00fd, 0x8612},       /* Gr offset for white balance */
173         {0x0003, 0x8613},       /* B offset for white balance */
174         {0x0000, 0x8614},       /* Gb offset for white balance */
175 /* from ms-win */
176         {0x0035, 0x8651},       /* R gain for white balance */
177         {0x0040, 0x8652},       /* Gr gain for white balance */
178         {0x005f, 0x8653},       /* B gain for white balance */
179         {0x0040, 0x8654},       /* Gb gain for white balance */
180         {0x0002, 0x8502},       /* Maximum average bit rate stuff */
181         {0x0011, 0x8802},
182
183         {0x0087, 0x8700},       /* Set master clock (96Mhz????) */
184         {0x0081, 0x8702},       /* Master clock output enable */
185
186         {0x0000, 0x8500},       /* Set image type (352x288 no compression) */
187         /* Originally was 0x0010 (352x288 compression) */
188
189         {0x0002, 0x865b},       /* Horizontal offset for valid pixels */
190         {0x0003, 0x865c},       /* Vertical offset for valid lines */
191         {}
192 };
193 static const u16 rev72a_init_sensor2[][2] = {
194         {0x0003, 0x0121},
195         {0x0004, 0x0165},
196         {0x0005, 0x002f},       /* blanking control column */
197         {0x0006, 0x0000},       /* blanking mode row*/
198         {0x000a, 0x0002},
199         {0x0009, 0x1061},       /* setexposure times && pixel clock
200                                  * 0001 0 | 000 0110 0001 */
201         {0x0035, 0x0014},
202         {}
203 };
204
205 /******************** QC Express etch2 stuff ********************/
206 static const __u16 Pb100_1map8300[][2] = {
207         /* reg, value */
208         {0x8320, 0x3304},
209
210         {0x8303, 0x0125},       /* image area */
211         {0x8304, 0x0169},
212         {0x8328, 0x000b},
213         {0x833c, 0x0001},               /*fixme: win:07*/
214
215         {0x832f, 0x1904},               /*fixme: was 0419*/
216         {0x8307, 0x00aa},
217         {0x8301, 0x0003},
218         {0x8302, 0x000e},
219         {}
220 };
221 static const __u16 Pb100_2map8300[][2] = {
222         /* reg, value */
223         {0x8339, 0x0000},
224         {0x8307, 0x00aa},
225         {}
226 };
227
228 static const __u16 spca561_161rev12A_data1[][2] = {
229         {0x29, 0x8118},         /* Control register (various enable bits) */
230         {0x08, 0x8114},         /* GPIO: Led off */
231         {0x0e, 0x8112},         /* 0x0e stream off 0x3e stream on */
232         {0x00, 0x8102},         /* white balance - new */
233         {0x92, 0x8804},
234         {0x04, 0x8802},         /* windows uses 08 */
235         {}
236 };
237 static const __u16 spca561_161rev12A_data2[][2] = {
238         {0x21, 0x8118},
239         {0x10, 0x8500},
240         {0x07, 0x8601},
241         {0x07, 0x8602},
242         {0x04, 0x8501},
243
244         {0x07, 0x8201},         /* windows uses 02 */
245         {0x08, 0x8200},
246         {0x01, 0x8200},
247
248         {0x90, 0x8604},
249         {0x00, 0x8605},
250         {0xb0, 0x8603},
251
252         /* sensor gains */
253         {0x07, 0x8601},         /* white balance - new */
254         {0x07, 0x8602},         /* white balance - new */
255         {0x00, 0x8610},         /* *red */
256         {0x00, 0x8611},         /* 3f   *green */
257         {0x00, 0x8612},         /* green *blue */
258         {0x00, 0x8613},         /* blue *green */
259         {0x43, 0x8614},         /* green *red - white balance - was 0x35 */
260         {0x40, 0x8615},         /* 40   *green - white balance - was 0x35 */
261         {0x71, 0x8616},         /* 7a   *blue - white balance - was 0x35 */
262         {0x40, 0x8617},         /* 40   *green - white balance - was 0x35 */
263
264         {0x0c, 0x8620},         /* 0c */
265         {0xc8, 0x8631},         /* c8 */
266         {0xc8, 0x8634},         /* c8 */
267         {0x23, 0x8635},         /* 23 */
268         {0x1f, 0x8636},         /* 1f */
269         {0xdd, 0x8637},         /* dd */
270         {0xe1, 0x8638},         /* e1 */
271         {0x1d, 0x8639},         /* 1d */
272         {0x21, 0x863a},         /* 21 */
273         {0xe3, 0x863b},         /* e3 */
274         {0xdf, 0x863c},         /* df */
275         {0xf0, 0x8505},
276         {0x32, 0x850a},
277 /*      {0x99, 0x8700},          * - white balance - new (removed) */
278         /* HDG we used to do this in stop0, making the init state and the state
279            after a start / stop different, so do this here instead. */
280         {0x29, 0x8118},
281         {}
282 };
283
284 static void reg_w_val(struct gspca_dev *gspca_dev, __u16 index, __u8 value)
285 {
286         int ret;
287         struct usb_device *dev = gspca_dev->dev;
288
289         ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
290                               0,                /* request */
291                               USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
292                               value, index, NULL, 0, 500);
293         PDEBUG(D_USBO, "reg write: 0x%02x:0x%02x", index, value);
294         if (ret < 0)
295                 pr_err("reg write: error %d\n", ret);
296 }
297
298 static void write_vector(struct gspca_dev *gspca_dev,
299                         const __u16 data[][2])
300 {
301         int i;
302
303         i = 0;
304         while (data[i][1] != 0) {
305                 reg_w_val(gspca_dev, data[i][1], data[i][0]);
306                 i++;
307         }
308 }
309
310 /* read 'len' bytes to gspca_dev->usb_buf */
311 static void reg_r(struct gspca_dev *gspca_dev,
312                   __u16 index, __u16 length)
313 {
314         usb_control_msg(gspca_dev->dev,
315                         usb_rcvctrlpipe(gspca_dev->dev, 0),
316                         0,                      /* request */
317                         USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
318                         0,                      /* value */
319                         index, gspca_dev->usb_buf, length, 500);
320 }
321
322 /* write 'len' bytes from gspca_dev->usb_buf */
323 static void reg_w_buf(struct gspca_dev *gspca_dev,
324                       __u16 index, __u16 len)
325 {
326         usb_control_msg(gspca_dev->dev,
327                         usb_sndctrlpipe(gspca_dev->dev, 0),
328                         0,                      /* request */
329                         USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
330                         0,                      /* value */
331                         index, gspca_dev->usb_buf, len, 500);
332 }
333
334 static void i2c_write(struct gspca_dev *gspca_dev, __u16 value, __u16 reg)
335 {
336         int retry = 60;
337
338         reg_w_val(gspca_dev, 0x8801, reg);
339         reg_w_val(gspca_dev, 0x8805, value);
340         reg_w_val(gspca_dev, 0x8800, value >> 8);
341         do {
342                 reg_r(gspca_dev, 0x8803, 1);
343                 if (!gspca_dev->usb_buf[0])
344                         return;
345                 msleep(10);
346         } while (--retry);
347 }
348
349 static int i2c_read(struct gspca_dev *gspca_dev, __u16 reg, __u8 mode)
350 {
351         int retry = 60;
352         __u8 value;
353
354         reg_w_val(gspca_dev, 0x8804, 0x92);
355         reg_w_val(gspca_dev, 0x8801, reg);
356         reg_w_val(gspca_dev, 0x8802, mode | 0x01);
357         do {
358                 reg_r(gspca_dev, 0x8803, 1);
359                 if (!gspca_dev->usb_buf[0]) {
360                         reg_r(gspca_dev, 0x8800, 1);
361                         value = gspca_dev->usb_buf[0];
362                         reg_r(gspca_dev, 0x8805, 1);
363                         return ((int) value << 8) | gspca_dev->usb_buf[0];
364                 }
365                 msleep(10);
366         } while (--retry);
367         return -1;
368 }
369
370 static void sensor_mapwrite(struct gspca_dev *gspca_dev,
371                             const __u16 (*sensormap)[2])
372 {
373         while ((*sensormap)[0]) {
374                 gspca_dev->usb_buf[0] = (*sensormap)[1];
375                 gspca_dev->usb_buf[1] = (*sensormap)[1] >> 8;
376                 reg_w_buf(gspca_dev, (*sensormap)[0], 2);
377                 sensormap++;
378         }
379 }
380
381 static void write_sensor_72a(struct gspca_dev *gspca_dev,
382                             const __u16 (*sensor)[2])
383 {
384         while ((*sensor)[0]) {
385                 i2c_write(gspca_dev, (*sensor)[1], (*sensor)[0]);
386                 sensor++;
387         }
388 }
389
390 static void init_161rev12A(struct gspca_dev *gspca_dev)
391 {
392         write_vector(gspca_dev, spca561_161rev12A_data1);
393         sensor_mapwrite(gspca_dev, Pb100_1map8300);
394 /*fixme: should be in sd_start*/
395         write_vector(gspca_dev, spca561_161rev12A_data2);
396         sensor_mapwrite(gspca_dev, Pb100_2map8300);
397 }
398
399 /* this function is called at probe time */
400 static int sd_config(struct gspca_dev *gspca_dev,
401                      const struct usb_device_id *id)
402 {
403         struct sd *sd = (struct sd *) gspca_dev;
404         struct cam *cam;
405         __u16 vendor, product;
406         __u8 data1, data2;
407
408         /* Read frm global register the USB product and vendor IDs, just to
409          * prove that we can communicate with the device.  This works, which
410          * confirms at we are communicating properly and that the device
411          * is a 561. */
412         reg_r(gspca_dev, 0x8104, 1);
413         data1 = gspca_dev->usb_buf[0];
414         reg_r(gspca_dev, 0x8105, 1);
415         data2 = gspca_dev->usb_buf[0];
416         vendor = (data2 << 8) | data1;
417         reg_r(gspca_dev, 0x8106, 1);
418         data1 = gspca_dev->usb_buf[0];
419         reg_r(gspca_dev, 0x8107, 1);
420         data2 = gspca_dev->usb_buf[0];
421         product = (data2 << 8) | data1;
422         if (vendor != id->idVendor || product != id->idProduct) {
423                 PDEBUG(D_PROBE, "Bad vendor / product from device");
424                 return -EINVAL;
425         }
426
427         cam = &gspca_dev->cam;
428         cam->needs_full_bandwidth = 1;
429
430         sd->chip_revision = id->driver_info;
431         if (sd->chip_revision == Rev012A) {
432                 cam->cam_mode = sif_012a_mode;
433                 cam->nmodes = ARRAY_SIZE(sif_012a_mode);
434         } else {
435                 cam->cam_mode = sif_072a_mode;
436                 cam->nmodes = ARRAY_SIZE(sif_072a_mode);
437         }
438         sd->expo12a = EXPO12A_DEF;
439         return 0;
440 }
441
442 /* this function is called at probe and resume time */
443 static int sd_init_12a(struct gspca_dev *gspca_dev)
444 {
445         PDEBUG(D_STREAM, "Chip revision: 012a");
446         init_161rev12A(gspca_dev);
447         return 0;
448 }
449 static int sd_init_72a(struct gspca_dev *gspca_dev)
450 {
451         PDEBUG(D_STREAM, "Chip revision: 072a");
452         write_vector(gspca_dev, rev72a_reset);
453         msleep(200);
454         write_vector(gspca_dev, rev72a_init_data1);
455         write_sensor_72a(gspca_dev, rev72a_init_sensor1);
456         write_vector(gspca_dev, rev72a_init_data2);
457         write_sensor_72a(gspca_dev, rev72a_init_sensor2);
458         reg_w_val(gspca_dev, 0x8112, 0x30);
459         return 0;
460 }
461
462 static void setbrightness(struct gspca_dev *gspca_dev, s32 val)
463 {
464         struct sd *sd = (struct sd *) gspca_dev;
465         __u16 reg;
466
467         if (sd->chip_revision == Rev012A)
468                 reg = 0x8610;
469         else
470                 reg = 0x8611;
471
472         reg_w_val(gspca_dev, reg + 0, val);             /* R */
473         reg_w_val(gspca_dev, reg + 1, val);             /* Gr */
474         reg_w_val(gspca_dev, reg + 2, val);             /* B */
475         reg_w_val(gspca_dev, reg + 3, val);             /* Gb */
476 }
477
478 static void setwhite(struct gspca_dev *gspca_dev, s32 white, s32 contrast)
479 {
480         struct sd *sd = (struct sd *) gspca_dev;
481         __u8 blue, red;
482         __u16 reg;
483
484         /* try to emulate MS-win as possible */
485         red = 0x20 + white * 3 / 8;
486         blue = 0x90 - white * 5 / 8;
487         if (sd->chip_revision == Rev012A) {
488                 reg = 0x8614;
489         } else {
490                 reg = 0x8651;
491                 red += contrast - 0x20;
492                 blue += contrast - 0x20;
493                 reg_w_val(gspca_dev, 0x8652, contrast + 0x20); /* Gr */
494                 reg_w_val(gspca_dev, 0x8654, contrast + 0x20); /* Gb */
495         }
496         reg_w_val(gspca_dev, reg, red);
497         reg_w_val(gspca_dev, reg + 2, blue);
498 }
499
500 /* rev 12a only */
501 static void setexposure(struct gspca_dev *gspca_dev, s32 val)
502 {
503         int i, expo = 0;
504
505         /* Register 0x8309 controls exposure for the spca561,
506            the basic exposure setting goes from 1-2047, where 1 is completely
507            dark and 2047 is very bright. It not only influences exposure but
508            also the framerate (to allow for longer exposure) from 1 - 300 it
509            only raises the exposure time then from 300 - 600 it halves the
510            framerate to be able to further raise the exposure time and for every
511            300 more it halves the framerate again. This allows for a maximum
512            exposure time of circa 0.2 - 0.25 seconds (30 / (2000/3000) fps).
513            Sometimes this is not enough, the 1-2047 uses bits 0-10, bits 11-12
514            configure a divider for the base framerate which us used at the
515            exposure setting of 1-300. These bits configure the base framerate
516            according to the following formula: fps = 60 / (value + 2) */
517
518         /* We choose to use the high bits setting the fixed framerate divisor
519            asap, as setting high basic exposure setting without the fixed
520            divider in combination with high gains makes the cam stop */
521         int table[] =  { 0, 450, 550, 625, EXPOSURE_MAX };
522
523         for (i = 0; i < ARRAY_SIZE(table) - 1; i++) {
524                 if (val <= table[i + 1]) {
525                         expo  = val - table[i];
526                         if (i)
527                                 expo += 300;
528                         expo |= i << 11;
529                         break;
530                 }
531         }
532
533         gspca_dev->usb_buf[0] = expo;
534         gspca_dev->usb_buf[1] = expo >> 8;
535         reg_w_buf(gspca_dev, 0x8309, 2);
536 }
537
538 /* rev 12a only */
539 static void setgain(struct gspca_dev *gspca_dev, s32 val)
540 {
541         /* gain reg low 6 bits  0-63 gain, bit 6 and 7, both double the
542            sensitivity when set, so 31 + one of them set == 63, and 15
543            with both of them set == 63 */
544         if (val < 64)
545                 gspca_dev->usb_buf[0] = val;
546         else if (val < 128)
547                 gspca_dev->usb_buf[0] = (val / 2) | 0x40;
548         else
549                 gspca_dev->usb_buf[0] = (val / 4) | 0xc0;
550
551         gspca_dev->usb_buf[1] = 0;
552         reg_w_buf(gspca_dev, 0x8335, 2);
553 }
554
555 static void setautogain(struct gspca_dev *gspca_dev, s32 val)
556 {
557         struct sd *sd = (struct sd *) gspca_dev;
558
559         if (val)
560                 sd->ag_cnt = AG_CNT_START;
561         else
562                 sd->ag_cnt = -1;
563 }
564
565 static int sd_start_12a(struct gspca_dev *gspca_dev)
566 {
567         int mode;
568         static const __u8 Reg8391[8] =
569                 {0x92, 0x30, 0x20, 0x00, 0x0c, 0x00, 0x00, 0x00};
570
571         mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
572         if (mode <= 1) {
573                 /* Use compression on 320x240 and above */
574                 reg_w_val(gspca_dev, 0x8500, 0x10 | mode);
575         } else {
576                 /* I couldn't get the compression to work below 320x240
577                  * Fortunately at these resolutions the bandwidth
578                  * is sufficient to push raw frames at ~20fps */
579                 reg_w_val(gspca_dev, 0x8500, mode);
580         }               /* -- qq@kuku.eu.org */
581
582         gspca_dev->usb_buf[0] = 0xaa;
583         gspca_dev->usb_buf[1] = 0x00;
584         reg_w_buf(gspca_dev, 0x8307, 2);
585         /* clock - lower 0x8X values lead to fps > 30 */
586         reg_w_val(gspca_dev, 0x8700, 0x8a);
587                                         /* 0x8f 0x85 0x27 clock */
588         reg_w_val(gspca_dev, 0x8112, 0x1e | 0x20);
589         reg_w_val(gspca_dev, 0x850b, 0x03);
590         memcpy(gspca_dev->usb_buf, Reg8391, 8);
591         reg_w_buf(gspca_dev, 0x8391, 8);
592         reg_w_buf(gspca_dev, 0x8390, 8);
593
594         /* Led ON (bit 3 -> 0 */
595         reg_w_val(gspca_dev, 0x8114, 0x00);
596         return 0;
597 }
598 static int sd_start_72a(struct gspca_dev *gspca_dev)
599 {
600         struct sd *sd = (struct sd *) gspca_dev;
601         int Clck;
602         int mode;
603
604         write_vector(gspca_dev, rev72a_reset);
605         msleep(200);
606         write_vector(gspca_dev, rev72a_init_data1);
607         write_sensor_72a(gspca_dev, rev72a_init_sensor1);
608
609         mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
610         switch (mode) {
611         default:
612         case 0:
613                 Clck = 0x27;            /* ms-win 0x87 */
614                 break;
615         case 1:
616                 Clck = 0x25;
617                 break;
618         case 2:
619                 Clck = 0x22;
620                 break;
621         case 3:
622                 Clck = 0x21;
623                 break;
624         }
625         reg_w_val(gspca_dev, 0x8700, Clck);     /* 0x27 clock */
626         reg_w_val(gspca_dev, 0x8702, 0x81);
627         reg_w_val(gspca_dev, 0x8500, mode);     /* mode */
628         write_sensor_72a(gspca_dev, rev72a_init_sensor2);
629         setwhite(gspca_dev, v4l2_ctrl_g_ctrl(sd->hue),
630                         v4l2_ctrl_g_ctrl(sd->contrast));
631 /*      setbrightness(gspca_dev);        * fixme: bad values */
632         setautogain(gspca_dev, v4l2_ctrl_g_ctrl(sd->autogain));
633         reg_w_val(gspca_dev, 0x8112, 0x10 | 0x20);
634         return 0;
635 }
636
637 static void sd_stopN(struct gspca_dev *gspca_dev)
638 {
639         struct sd *sd = (struct sd *) gspca_dev;
640
641         if (sd->chip_revision == Rev012A) {
642                 reg_w_val(gspca_dev, 0x8112, 0x0e);
643                 /* Led Off (bit 3 -> 1 */
644                 reg_w_val(gspca_dev, 0x8114, 0x08);
645         } else {
646                 reg_w_val(gspca_dev, 0x8112, 0x20);
647 /*              reg_w_val(gspca_dev, 0x8102, 0x00); ?? */
648         }
649 }
650
651 static void do_autogain(struct gspca_dev *gspca_dev)
652 {
653         struct sd *sd = (struct sd *) gspca_dev;
654         int expotimes;
655         int pixelclk;
656         int gainG;
657         __u8 R, Gr, Gb, B;
658         int y;
659         __u8 luma_mean = 110;
660         __u8 luma_delta = 20;
661         __u8 spring = 4;
662
663         if (sd->ag_cnt < 0)
664                 return;
665         if (--sd->ag_cnt >= 0)
666                 return;
667         sd->ag_cnt = AG_CNT_START;
668
669         switch (sd->chip_revision) {
670         case Rev072A:
671                 reg_r(gspca_dev, 0x8621, 1);
672                 Gr = gspca_dev->usb_buf[0];
673                 reg_r(gspca_dev, 0x8622, 1);
674                 R = gspca_dev->usb_buf[0];
675                 reg_r(gspca_dev, 0x8623, 1);
676                 B = gspca_dev->usb_buf[0];
677                 reg_r(gspca_dev, 0x8624, 1);
678                 Gb = gspca_dev->usb_buf[0];
679                 y = (77 * R + 75 * (Gr + Gb) + 29 * B) >> 8;
680                 /* u= (128*B-(43*(Gr+Gb+R))) >> 8; */
681                 /* v= (128*R-(53*(Gr+Gb))-21*B) >> 8; */
682                 /* PDEBUG(D_CONF,"reading Y %d U %d V %d ",y,u,v); */
683
684                 if (y < luma_mean - luma_delta ||
685                     y > luma_mean + luma_delta) {
686                         expotimes = i2c_read(gspca_dev, 0x09, 0x10);
687                         pixelclk = 0x0800;
688                         expotimes = expotimes & 0x07ff;
689                         /* PDEBUG(D_PACK,
690                                 "Exposition Times 0x%03X Clock 0x%04X ",
691                                 expotimes,pixelclk); */
692                         gainG = i2c_read(gspca_dev, 0x35, 0x10);
693                         /* PDEBUG(D_PACK,
694                                 "reading Gain register %d", gainG); */
695
696                         expotimes += (luma_mean - y) >> spring;
697                         gainG += (luma_mean - y) / 50;
698                         /* PDEBUG(D_PACK,
699                                 "compute expotimes %d gain %d",
700                                 expotimes,gainG); */
701
702                         if (gainG > 0x3f)
703                                 gainG = 0x3f;
704                         else if (gainG < 3)
705                                 gainG = 3;
706                         i2c_write(gspca_dev, gainG, 0x35);
707
708                         if (expotimes > 0x0256)
709                                 expotimes = 0x0256;
710                         else if (expotimes < 3)
711                                 expotimes = 3;
712                         i2c_write(gspca_dev, expotimes | pixelclk, 0x09);
713                 }
714                 break;
715         }
716 }
717
718 static void sd_pkt_scan(struct gspca_dev *gspca_dev,
719                         u8 *data,               /* isoc packet */
720                         int len)                /* iso packet length */
721 {
722         struct sd *sd = (struct sd *) gspca_dev;
723
724         len--;
725         switch (*data++) {                      /* sequence number */
726         case 0:                                 /* start of frame */
727                 gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
728
729                 /* This should never happen */
730                 if (len < 2) {
731                         PERR("Short SOF packet, ignoring");
732                         gspca_dev->last_packet_type = DISCARD_PACKET;
733                         return;
734                 }
735
736 #if IS_ENABLED(CONFIG_INPUT)
737                 if (data[0] & 0x20) {
738                         input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
739                         input_sync(gspca_dev->input_dev);
740                         input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
741                         input_sync(gspca_dev->input_dev);
742                 }
743 #endif
744
745                 if (data[1] & 0x10) {
746                         /* compressed bayer */
747                         gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
748                 } else {
749                         /* raw bayer (with a header, which we skip) */
750                         if (sd->chip_revision == Rev012A) {
751                                 data += 20;
752                                 len -= 20;
753                         } else {
754                                 data += 16;
755                                 len -= 16;
756                         }
757                         gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
758                 }
759                 return;
760         case 0xff:                      /* drop (empty mpackets) */
761                 return;
762         }
763         gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
764 }
765
766 static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
767 {
768         struct gspca_dev *gspca_dev =
769                 container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
770         struct sd *sd = (struct sd *)gspca_dev;
771
772         gspca_dev->usb_err = 0;
773
774         if (!gspca_dev->streaming)
775                 return 0;
776
777         switch (ctrl->id) {
778         case V4L2_CID_BRIGHTNESS:
779                 setbrightness(gspca_dev, ctrl->val);
780                 break;
781         case V4L2_CID_CONTRAST:
782                 /* hue/contrast control cluster for 72a */
783                 setwhite(gspca_dev, sd->hue->val, ctrl->val);
784                 break;
785         case V4L2_CID_HUE:
786                 /* just plain hue control for 12a */
787                 setwhite(gspca_dev, ctrl->val, 0);
788                 break;
789         case V4L2_CID_EXPOSURE:
790                 setexposure(gspca_dev, ctrl->val);
791                 break;
792         case V4L2_CID_GAIN:
793                 setgain(gspca_dev, ctrl->val);
794                 break;
795         case V4L2_CID_AUTOGAIN:
796                 setautogain(gspca_dev, ctrl->val);
797                 break;
798         }
799         return gspca_dev->usb_err;
800 }
801
802 static const struct v4l2_ctrl_ops sd_ctrl_ops = {
803         .s_ctrl = sd_s_ctrl,
804 };
805
806 static int sd_init_controls_12a(struct gspca_dev *gspca_dev)
807 {
808         struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
809
810         gspca_dev->vdev.ctrl_handler = hdl;
811         v4l2_ctrl_handler_init(hdl, 3);
812         v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
813                         V4L2_CID_HUE, 1, 0x7f, 1, 0x40);
814         v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
815                         V4L2_CID_BRIGHTNESS, -128, 127, 1, 0);
816         v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
817                         V4L2_CID_EXPOSURE, 1, EXPOSURE_MAX, 1, 700);
818         v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
819                         V4L2_CID_GAIN, 0, 255, 1, 63);
820
821         if (hdl->error) {
822                 pr_err("Could not initialize controls\n");
823                 return hdl->error;
824         }
825         return 0;
826 }
827
828 static int sd_init_controls_72a(struct gspca_dev *gspca_dev)
829 {
830         struct sd *sd = (struct sd *)gspca_dev;
831         struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
832
833         gspca_dev->vdev.ctrl_handler = hdl;
834         v4l2_ctrl_handler_init(hdl, 4);
835         sd->contrast = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
836                         V4L2_CID_CONTRAST, 0, 0x3f, 1, 0x20);
837         sd->hue = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
838                         V4L2_CID_HUE, 1, 0x7f, 1, 0x40);
839         v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
840                         V4L2_CID_BRIGHTNESS, 0, 0x3f, 1, 0x20);
841         sd->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
842                         V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
843
844         if (hdl->error) {
845                 pr_err("Could not initialize controls\n");
846                 return hdl->error;
847         }
848         v4l2_ctrl_cluster(2, &sd->contrast);
849         return 0;
850 }
851
852 /* sub-driver description */
853 static const struct sd_desc sd_desc_12a = {
854         .name = MODULE_NAME,
855         .init_controls = sd_init_controls_12a,
856         .config = sd_config,
857         .init = sd_init_12a,
858         .start = sd_start_12a,
859         .stopN = sd_stopN,
860         .pkt_scan = sd_pkt_scan,
861 #if IS_ENABLED(CONFIG_INPUT)
862         .other_input = 1,
863 #endif
864 };
865 static const struct sd_desc sd_desc_72a = {
866         .name = MODULE_NAME,
867         .init_controls = sd_init_controls_72a,
868         .config = sd_config,
869         .init = sd_init_72a,
870         .start = sd_start_72a,
871         .stopN = sd_stopN,
872         .pkt_scan = sd_pkt_scan,
873         .dq_callback = do_autogain,
874 #if IS_ENABLED(CONFIG_INPUT)
875         .other_input = 1,
876 #endif
877 };
878 static const struct sd_desc *sd_desc[2] = {
879         &sd_desc_12a,
880         &sd_desc_72a
881 };
882
883 /* -- module initialisation -- */
884 static const struct usb_device_id device_table[] = {
885         {USB_DEVICE(0x041e, 0x401a), .driver_info = Rev072A},
886         {USB_DEVICE(0x041e, 0x403b), .driver_info = Rev012A},
887         {USB_DEVICE(0x0458, 0x7004), .driver_info = Rev072A},
888         {USB_DEVICE(0x0461, 0x0815), .driver_info = Rev072A},
889         {USB_DEVICE(0x046d, 0x0928), .driver_info = Rev012A},
890         {USB_DEVICE(0x046d, 0x0929), .driver_info = Rev012A},
891         {USB_DEVICE(0x046d, 0x092a), .driver_info = Rev012A},
892         {USB_DEVICE(0x046d, 0x092b), .driver_info = Rev012A},
893         {USB_DEVICE(0x046d, 0x092c), .driver_info = Rev012A},
894         {USB_DEVICE(0x046d, 0x092d), .driver_info = Rev012A},
895         {USB_DEVICE(0x046d, 0x092e), .driver_info = Rev012A},
896         {USB_DEVICE(0x046d, 0x092f), .driver_info = Rev012A},
897         {USB_DEVICE(0x04fc, 0x0561), .driver_info = Rev072A},
898         {USB_DEVICE(0x060b, 0xa001), .driver_info = Rev072A},
899         {USB_DEVICE(0x10fd, 0x7e50), .driver_info = Rev072A},
900         {USB_DEVICE(0xabcd, 0xcdee), .driver_info = Rev072A},
901         {}
902 };
903
904 MODULE_DEVICE_TABLE(usb, device_table);
905
906 /* -- device connect -- */
907 static int sd_probe(struct usb_interface *intf,
908                     const struct usb_device_id *id)
909 {
910         return gspca_dev_probe(intf, id,
911                                 sd_desc[id->driver_info],
912                                 sizeof(struct sd),
913                                THIS_MODULE);
914 }
915
916 static struct usb_driver sd_driver = {
917         .name = MODULE_NAME,
918         .id_table = device_table,
919         .probe = sd_probe,
920         .disconnect = gspca_disconnect,
921 #ifdef CONFIG_PM
922         .suspend = gspca_suspend,
923         .resume = gspca_resume,
924         .reset_resume = gspca_resume,
925 #endif
926 };
927
928 module_usb_driver(sd_driver);