V4L/DVB (10368): gspca - spca561: Fix bugs and rewrite the init/start of the rev72a.
[linux-2.6-block.git] / drivers / media / video / 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  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21  */
22
23 #define MODULE_NAME "spca561"
24
25 #include "gspca.h"
26
27 MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
28 MODULE_DESCRIPTION("GSPCA/SPCA561 USB Camera Driver");
29 MODULE_LICENSE("GPL");
30
31 /* specific webcam descriptor */
32 struct sd {
33         struct gspca_dev gspca_dev;     /* !! must be the first item */
34
35         __u16 exposure;                 /* rev12a only */
36 #define EXPOSURE_MIN 1
37 #define EXPOSURE_DEF 200
38 #define EXPOSURE_MAX (4095 - 900) /* see set_exposure */
39
40         __u8 contrast;                  /* rev72a only */
41 #define CONTRAST_MIN 0x00
42 #define CONTRAST_DEF 0x20
43 #define CONTRAST_MAX 0x3f
44
45         __u8 brightness;                /* rev72a only */
46 #define BRIGHTNESS_MIN 0
47 #define BRIGHTNESS_DEF 0x20
48 #define BRIGHTNESS_MAX 0x3f
49
50         __u8 white;
51 #define WHITE_MIN 1
52 #define WHITE_DEF 0x40
53 #define WHITE_MAX 0x7f
54
55         __u8 autogain;
56 #define AUTOGAIN_MIN 0
57 #define AUTOGAIN_DEF 1
58 #define AUTOGAIN_MAX 1
59
60         __u8 gain;                      /* rev12a only */
61 #define GAIN_MIN 0x0
62 #define GAIN_DEF 0x24
63 #define GAIN_MAX 0x24
64
65 #define EXPO12A_DEF 3
66         __u8 expo12a;           /* expo/gain? for rev 12a */
67
68         __u8 chip_revision;
69 #define Rev012A 0
70 #define Rev072A 1
71
72         signed char ag_cnt;
73 #define AG_CNT_START 13
74 };
75
76 static const struct v4l2_pix_format sif_012a_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_SPCA561, V4L2_FIELD_NONE,
88                 .bytesperline = 320,
89                 .sizeimage = 320 * 240 * 4 / 8,
90                 .colorspace = V4L2_COLORSPACE_SRGB,
91                 .priv = 1},
92         {352, 288, V4L2_PIX_FMT_SPCA561, V4L2_FIELD_NONE,
93                 .bytesperline = 352,
94                 .sizeimage = 352 * 288 * 4 / 8,
95                 .colorspace = V4L2_COLORSPACE_SRGB,
96                 .priv = 0},
97 };
98
99 static const struct v4l2_pix_format sif_072a_mode[] = {
100         {160, 120, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
101                 .bytesperline = 160,
102                 .sizeimage = 160 * 120,
103                 .colorspace = V4L2_COLORSPACE_SRGB,
104                 .priv = 3},
105         {176, 144, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
106                 .bytesperline = 176,
107                 .sizeimage = 176 * 144,
108                 .colorspace = V4L2_COLORSPACE_SRGB,
109                 .priv = 2},
110         {320, 240, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
111                 .bytesperline = 320,
112                 .sizeimage = 320 * 240,
113                 .colorspace = V4L2_COLORSPACE_SRGB,
114                 .priv = 1},
115         {352, 288, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
116                 .bytesperline = 352,
117                 .sizeimage = 352 * 288,
118                 .colorspace = V4L2_COLORSPACE_SRGB,
119                 .priv = 0},
120 };
121
122 /*
123  * Initialization data
124  * I'm not very sure how to split initialization from open data
125  * chunks. For now, we'll consider everything as initialization
126  */
127 /* Frame packet header offsets for the spca561 */
128 #define SPCA561_OFFSET_SNAP 1
129 #define SPCA561_OFFSET_TYPE 2
130 #define SPCA561_OFFSET_COMPRESS 3
131 #define SPCA561_OFFSET_FRAMSEQ   4
132 #define SPCA561_OFFSET_GPIO 5
133 #define SPCA561_OFFSET_USBBUFF 6
134 #define SPCA561_OFFSET_WIN2GRAVE 7
135 #define SPCA561_OFFSET_WIN2RAVE 8
136 #define SPCA561_OFFSET_WIN2BAVE 9
137 #define SPCA561_OFFSET_WIN2GBAVE 10
138 #define SPCA561_OFFSET_WIN1GRAVE 11
139 #define SPCA561_OFFSET_WIN1RAVE 12
140 #define SPCA561_OFFSET_WIN1BAVE 13
141 #define SPCA561_OFFSET_WIN1GBAVE 14
142 #define SPCA561_OFFSET_FREQ 15
143 #define SPCA561_OFFSET_VSYNC 16
144 #define SPCA561_INDEX_I2C_BASE 0x8800
145 #define SPCA561_SNAPBIT 0x20
146 #define SPCA561_SNAPCTRL 0x40
147
148 static const u16 rev72a_reset[][2] = {
149         {0x0000, 0x8114},       /* Software GPIO output data */
150         {0x0001, 0x8114},       /* Software GPIO output data */
151         {0x0000, 0x8112},       /* Some kind of reset */
152         {}
153 };
154 static const __u16 rev72a_init_data1[][2] = {
155         {0x0003, 0x8701},       /* PCLK clock delay adjustment */
156         {0x0001, 0x8703},       /* HSYNC from cmos inverted */
157         {0x0011, 0x8118},       /* Enable and conf sensor */
158         {0x0001, 0x8118},       /* Conf sensor */
159         {0x0092, 0x8804},       /* I know nothing about these */
160         {0x0010, 0x8802},       /* 0x88xx registers, so I won't */
161         {}
162 };
163 static const u16 rev72a_init_sensor1[][2] = {
164         {0x0001, 0x000d},
165         {0x0002, 0x0018},
166         {0x0004, 0x0165},
167         {0x0005, 0x0021},
168         {0x0007, 0x00aa},
169         {0x0020, 0x1504},
170         {0x0039, 0x0002},
171         {0x0035, 0x0010},
172         {0x0009, 0x1049},
173         {0x0028, 0x000b},
174         {0x003b, 0x000f},
175         {0x003c, 0x0000},
176         {}
177 };
178 static const __u16 rev72a_init_data2[][2] = {
179         {0x0018, 0x8601},       /* Pixel/line selection for color separation */
180         {0x0000, 0x8602},       /* Optical black level for user setting */
181         {0x0060, 0x8604},       /* Optical black horizontal offset */
182         {0x0002, 0x8605},       /* Optical black vertical offset */
183         {0x0000, 0x8603},       /* Non-automatic optical black level */
184         {0x0002, 0x865b},       /* Horizontal offset for valid pixels */
185         {0x0000, 0x865f},       /* Vertical valid pixels window (x2) */
186         {0x00b0, 0x865d},       /* Horizontal valid pixels window (x2) */
187         {0x0090, 0x865e},       /* Vertical valid lines window (x2) */
188         {0x00e0, 0x8406},       /* Memory buffer threshold */
189         {0x0000, 0x8660},       /* Compensation memory stuff */
190         {0x0002, 0x8201},       /* Output address for r/w serial EEPROM */
191         {0x0008, 0x8200},       /* Clear valid bit for serial EEPROM */
192         {0x0001, 0x8200},       /* OprMode to be executed by hardware */
193 /* from ms-win */
194         {0x0000, 0x8611},       /* R offset for white balance */
195         {0x00fd, 0x8612},       /* Gr offset for white balance */
196         {0x0003, 0x8613},       /* B offset for white balance */
197         {0x0000, 0x8614},       /* Gb offset for white balance */
198 /* from ms-win */
199         {0x0035, 0x8651},       /* R gain for white balance */
200         {0x0040, 0x8652},       /* Gr gain for white balance */
201         {0x005f, 0x8653},       /* B gain for white balance */
202         {0x0040, 0x8654},       /* Gb gain for white balance */
203         {0x0002, 0x8502},       /* Maximum average bit rate stuff */
204         {0x0011, 0x8802},
205
206         {0x0087, 0x8700},       /* Set master clock (96Mhz????) */
207         {0x0081, 0x8702},       /* Master clock output enable */
208
209         {0x0000, 0x8500},       /* Set image type (352x288 no compression) */
210         /* Originally was 0x0010 (352x288 compression) */
211
212         {0x0002, 0x865b},       /* Horizontal offset for valid pixels */
213         {0x0003, 0x865c},       /* Vertical offset for valid lines */
214         {}
215 };
216 static const u16 rev72a_init_sensor2[][2] = {
217         {0x0003, 0x0121},
218         {0x0004, 0x0165},
219         {0x0005, 0x002f},       /* blanking control column */
220         {0x0006, 0x0000},       /* blanking mode row*/
221         {0x000a, 0x0002},
222         {0x0009, 0x1061},       /* setexposure times && pixel clock
223                                  * 0001 0 | 000 0110 0001 */
224         {0x0035, 0x0014},
225         {}
226 };
227
228 /******************** QC Express etch2 stuff ********************/
229 static const __u16 Pb100_1map8300[][2] = {
230         /* reg, value */
231         {0x8320, 0x3304},
232
233         {0x8303, 0x0125},       /* image area */
234         {0x8304, 0x0169},
235         {0x8328, 0x000b},
236         {0x833c, 0x0001},               /*fixme: win:07*/
237
238         {0x832f, 0x1904},               /*fixme: was 0419*/
239         {0x8307, 0x00aa},
240         {0x8301, 0x0003},
241         {0x8302, 0x000e},
242         {}
243 };
244 static const __u16 Pb100_2map8300[][2] = {
245         /* reg, value */
246         {0x8339, 0x0000},
247         {0x8307, 0x00aa},
248         {}
249 };
250
251 static const __u16 spca561_161rev12A_data1[][2] = {
252         {0x29, 0x8118},         /* white balance - was 21 */
253         {0x08, 0x8114},         /* white balance - was 01 */
254         {0x0e, 0x8112},         /* white balance - was 00 */
255         {0x00, 0x8102},         /* white balance - new */
256         {0x92, 0x8804},
257         {0x04, 0x8802},         /* windows uses 08 */
258         {}
259 };
260 static const __u16 spca561_161rev12A_data2[][2] = {
261         {0x21, 0x8118},
262         {0x10, 0x8500},
263         {0x07, 0x8601},
264         {0x07, 0x8602},
265         {0x04, 0x8501},
266         {0x21, 0x8118},
267
268         {0x07, 0x8201},         /* windows uses 02 */
269         {0x08, 0x8200},
270         {0x01, 0x8200},
271
272         {0x00, 0x8114},
273         {0x01, 0x8114},         /* windows uses 00 */
274
275         {0x90, 0x8604},
276         {0x00, 0x8605},
277         {0xb0, 0x8603},
278
279         /* sensor gains */
280         {0x07, 0x8601},         /* white balance - new */
281         {0x07, 0x8602},         /* white balance - new */
282         {0x00, 0x8610},         /* *red */
283         {0x00, 0x8611},         /* 3f   *green */
284         {0x00, 0x8612},         /* green *blue */
285         {0x00, 0x8613},         /* blue *green */
286         {0x43, 0x8614},         /* green *red - white balance - was 0x35 */
287         {0x40, 0x8615},         /* 40   *green - white balance - was 0x35 */
288         {0x71, 0x8616},         /* 7a   *blue - white balance - was 0x35 */
289         {0x40, 0x8617},         /* 40   *green - white balance - was 0x35 */
290
291         {0x0c, 0x8620},         /* 0c */
292         {0xc8, 0x8631},         /* c8 */
293         {0xc8, 0x8634},         /* c8 */
294         {0x23, 0x8635},         /* 23 */
295         {0x1f, 0x8636},         /* 1f */
296         {0xdd, 0x8637},         /* dd */
297         {0xe1, 0x8638},         /* e1 */
298         {0x1d, 0x8639},         /* 1d */
299         {0x21, 0x863a},         /* 21 */
300         {0xe3, 0x863b},         /* e3 */
301         {0xdf, 0x863c},         /* df */
302         {0xf0, 0x8505},
303         {0x32, 0x850a},
304 /*      {0x99, 0x8700},          * - white balance - new (removed) */
305         {}
306 };
307
308 static void reg_w_val(struct usb_device *dev, __u16 index, __u8 value)
309 {
310         int ret;
311
312         ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
313                               0,                /* request */
314                               USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
315                               value, index, NULL, 0, 500);
316         PDEBUG(D_USBO, "reg write: 0x%02x:0x%02x", index, value);
317         if (ret < 0)
318                 PDEBUG(D_ERR, "reg write: error %d", ret);
319 }
320
321 static void write_vector(struct gspca_dev *gspca_dev,
322                         const __u16 data[][2])
323 {
324         struct usb_device *dev = gspca_dev->dev;
325         int i;
326
327         i = 0;
328         while (data[i][1] != 0) {
329                 reg_w_val(dev, data[i][1], data[i][0]);
330                 i++;
331         }
332 }
333
334 /* read 'len' bytes to gspca_dev->usb_buf */
335 static void reg_r(struct gspca_dev *gspca_dev,
336                   __u16 index, __u16 length)
337 {
338         usb_control_msg(gspca_dev->dev,
339                         usb_rcvctrlpipe(gspca_dev->dev, 0),
340                         0,                      /* request */
341                         USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
342                         0,                      /* value */
343                         index, gspca_dev->usb_buf, length, 500);
344 }
345
346 /* write 'len' bytes from gspca_dev->usb_buf */
347 static void reg_w_buf(struct gspca_dev *gspca_dev,
348                       __u16 index, __u16 len)
349 {
350         usb_control_msg(gspca_dev->dev,
351                         usb_sndctrlpipe(gspca_dev->dev, 0),
352                         0,                      /* request */
353                         USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
354                         0,                      /* value */
355                         index, gspca_dev->usb_buf, len, 500);
356 }
357
358 static void i2c_write(struct gspca_dev *gspca_dev, __u16 value, __u16 reg)
359 {
360         int retry = 60;
361
362         reg_w_val(gspca_dev->dev, 0x8801, reg);
363         reg_w_val(gspca_dev->dev, 0x8805, value);
364         reg_w_val(gspca_dev->dev, 0x8800, value >> 8);
365         do {
366                 reg_r(gspca_dev, 0x8803, 1);
367                 if (!gspca_dev->usb_buf[0])
368                         return;
369                 msleep(10);
370         } while (--retry);
371 }
372
373 static int i2c_read(struct gspca_dev *gspca_dev, __u16 reg, __u8 mode)
374 {
375         int retry = 60;
376         __u8 value;
377
378         reg_w_val(gspca_dev->dev, 0x8804, 0x92);
379         reg_w_val(gspca_dev->dev, 0x8801, reg);
380         reg_w_val(gspca_dev->dev, 0x8802, mode | 0x01);
381         do {
382                 reg_r(gspca_dev, 0x8803, 1);
383                 if (!gspca_dev->usb_buf[0]) {
384                         reg_r(gspca_dev, 0x8800, 1);
385                         value = gspca_dev->usb_buf[0];
386                         reg_r(gspca_dev, 0x8805, 1);
387                         return ((int) value << 8) | gspca_dev->usb_buf[0];
388                 }
389                 msleep(10);
390         } while (--retry);
391         return -1;
392 }
393
394 static void sensor_mapwrite(struct gspca_dev *gspca_dev,
395                             const __u16 (*sensormap)[2])
396 {
397         while ((*sensormap)[0]) {
398                 gspca_dev->usb_buf[0] = (*sensormap)[1];
399                 gspca_dev->usb_buf[1] = (*sensormap)[1] >> 8;
400                 reg_w_buf(gspca_dev, (*sensormap)[0], 2);
401                 sensormap++;
402         }
403 }
404
405 static void write_sensor_72a(struct gspca_dev *gspca_dev,
406                             const __u16 (*sensor)[2])
407 {
408         while ((*sensor)[0]) {
409                 i2c_write(gspca_dev, (*sensor)[1], (*sensor)[0]);
410                 sensor++;
411         }
412 }
413
414 static void init_161rev12A(struct gspca_dev *gspca_dev)
415 {
416         write_vector(gspca_dev, spca561_161rev12A_data1);
417         sensor_mapwrite(gspca_dev, Pb100_1map8300);
418 /*fixme: should be in sd_start*/
419         write_vector(gspca_dev, spca561_161rev12A_data2);
420         sensor_mapwrite(gspca_dev, Pb100_2map8300);
421 }
422
423 /* this function is called at probe time */
424 static int sd_config(struct gspca_dev *gspca_dev,
425                      const struct usb_device_id *id)
426 {
427         struct sd *sd = (struct sd *) gspca_dev;
428         struct cam *cam;
429         __u16 vendor, product;
430         __u8 data1, data2;
431
432         /* Read frm global register the USB product and vendor IDs, just to
433          * prove that we can communicate with the device.  This works, which
434          * confirms at we are communicating properly and that the device
435          * is a 561. */
436         reg_r(gspca_dev, 0x8104, 1);
437         data1 = gspca_dev->usb_buf[0];
438         reg_r(gspca_dev, 0x8105, 1);
439         data2 = gspca_dev->usb_buf[0];
440         vendor = (data2 << 8) | data1;
441         reg_r(gspca_dev, 0x8106, 1);
442         data1 = gspca_dev->usb_buf[0];
443         reg_r(gspca_dev, 0x8107, 1);
444         data2 = gspca_dev->usb_buf[0];
445         product = (data2 << 8) | data1;
446         if (vendor != id->idVendor || product != id->idProduct) {
447                 PDEBUG(D_PROBE, "Bad vendor / product from device");
448                 return -EINVAL;
449         }
450
451         cam = &gspca_dev->cam;
452         gspca_dev->nbalt = 7 + 1;       /* choose alternate 7 first */
453
454         sd->chip_revision = id->driver_info;
455         if (sd->chip_revision == Rev012A) {
456                 cam->cam_mode = sif_012a_mode;
457                 cam->nmodes = ARRAY_SIZE(sif_012a_mode);
458         } else {
459                 cam->cam_mode = sif_072a_mode;
460                 cam->nmodes = ARRAY_SIZE(sif_072a_mode);
461         }
462         sd->brightness = BRIGHTNESS_DEF;
463         sd->contrast = CONTRAST_DEF;
464         sd->white = WHITE_DEF;
465         sd->exposure = EXPOSURE_DEF;
466         sd->autogain = AUTOGAIN_DEF;
467         sd->gain = GAIN_DEF;
468         sd->expo12a = EXPO12A_DEF;
469         return 0;
470 }
471
472 /* this function is called at probe and resume time */
473 static int sd_init_12a(struct gspca_dev *gspca_dev)
474 {
475         PDEBUG(D_STREAM, "Chip revision: 012a");
476         init_161rev12A(gspca_dev);
477         return 0;
478 }
479 static int sd_init_72a(struct gspca_dev *gspca_dev)
480 {
481         PDEBUG(D_STREAM, "Chip revision: 072a");
482         write_vector(gspca_dev, rev72a_reset);
483         msleep(200);
484         write_vector(gspca_dev, rev72a_init_data1);
485         write_sensor_72a(gspca_dev, rev72a_init_sensor1);
486         write_vector(gspca_dev, rev72a_init_data2);
487         write_sensor_72a(gspca_dev, rev72a_init_sensor2);
488         reg_w_val(gspca_dev->dev, 0x8112, 0x30);
489         return 0;
490 }
491
492 /* rev 72a only */
493 static void setbrightness(struct gspca_dev *gspca_dev)
494 {
495         struct sd *sd = (struct sd *) gspca_dev;
496         struct usb_device *dev = gspca_dev->dev;
497         __u8 value;
498
499         value = sd->brightness;
500
501         /* offsets for white balance */
502         reg_w_val(dev, 0x8611, value);          /* R */
503         reg_w_val(dev, 0x8612, value);          /* Gr */
504         reg_w_val(dev, 0x8613, value);          /* B */
505         reg_w_val(dev, 0x8614, value);          /* Gb */
506 }
507
508 static void setwhite(struct gspca_dev *gspca_dev)
509 {
510         struct sd *sd = (struct sd *) gspca_dev;
511         __u16 white;
512         __u8 blue, red;
513         __u16 reg;
514
515         /* try to emulate MS-win as possible */
516         white = sd->white;
517         red = 0x20 + white * 3 / 8;
518         blue = 0x90 - white * 5 / 8;
519         if (sd->chip_revision == Rev012A) {
520                 reg = 0x8614;
521         } else {
522                 reg = 0x8651;
523                 red += sd->contrast - 0x20;
524                 blue += sd->contrast - 0x20;
525         }
526         reg_w_val(gspca_dev->dev, reg, red);
527         reg_w_val(gspca_dev->dev, reg + 2, blue);
528 }
529
530 static void setcontrast(struct gspca_dev *gspca_dev)
531 {
532         struct sd *sd = (struct sd *) gspca_dev;
533         struct usb_device *dev = gspca_dev->dev;
534         __u8 value;
535
536         if (sd->chip_revision != Rev072A)
537                 return;
538         value = sd->contrast + 0x20;
539
540         /* gains for white balance */
541         setwhite(gspca_dev);
542 /*      reg_w_val(dev, 0x8651, value);           * R - done by setwhite */
543         reg_w_val(dev, 0x8652, value);          /* Gr */
544 /*      reg_w_val(dev, 0x8653, value);           * B - done by setwhite */
545         reg_w_val(dev, 0x8654, value);          /* Gb */
546 }
547
548 /* rev 12a only */
549 static void setexposure(struct gspca_dev *gspca_dev)
550 {
551         struct sd *sd = (struct sd *) gspca_dev;
552         int expo;
553         int clock_divider;
554
555         /* Register 0x8309 controls exposure for the spca561,
556            the basic exposure setting goes from 1-2047, where 1 is completely
557            dark and 2047 is very bright. It not only influences exposure but
558            also the framerate (to allow for longer exposure) from 1 - 300 it
559            only raises the exposure time then from 300 - 600 it halves the
560            framerate to be able to further raise the exposure time and for every
561            300 more it halves the framerate again. This allows for a maximum
562            exposure time of circa 0.2 - 0.25 seconds (30 / (2000/3000) fps).
563            Sometimes this is not enough, the 1-2047 uses bits 0-10, bits 11-12
564            configure a divider for the base framerate which us used at the
565            exposure setting of 1-300. These bits configure the base framerate
566            according to the following formula: fps = 60 / (value + 2) */
567         if (sd->exposure < 2048) {
568                 expo = sd->exposure;
569                 clock_divider = 0;
570         } else {
571                 /* Add 900 to make the 0 setting of the second part of the
572                    exposure equal to the 2047 setting of the first part. */
573                 expo = (sd->exposure - 2048) + 900;
574                 clock_divider = 3;
575         }
576         expo |= clock_divider << 11;
577         gspca_dev->usb_buf[0] = expo;
578         gspca_dev->usb_buf[1] = expo >> 8;
579         reg_w_buf(gspca_dev, 0x8309, 2);
580 }
581
582 /* rev 12a only */
583 static void setgain(struct gspca_dev *gspca_dev)
584 {
585         struct sd *sd = (struct sd *) gspca_dev;
586
587         gspca_dev->usb_buf[0] = sd->gain;
588         gspca_dev->usb_buf[1] = 0;
589         reg_w_buf(gspca_dev, 0x8335, 2);
590 }
591
592 static void setautogain(struct gspca_dev *gspca_dev)
593 {
594         struct sd *sd = (struct sd *) gspca_dev;
595
596         if (sd->autogain)
597                 sd->ag_cnt = AG_CNT_START;
598         else
599                 sd->ag_cnt = -1;
600 }
601
602 static int sd_start_12a(struct gspca_dev *gspca_dev)
603 {
604         struct usb_device *dev = gspca_dev->dev;
605         int mode;
606         static const __u8 Reg8391[8] =
607                 {0x92, 0x30, 0x20, 0x00, 0x0c, 0x00, 0x00, 0x00};
608
609         mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
610         if (mode <= 1) {
611                 /* Use compression on 320x240 and above */
612                 reg_w_val(dev, 0x8500, 0x10 | mode);
613         } else {
614                 /* I couldn't get the compression to work below 320x240
615                  * Fortunately at these resolutions the bandwidth
616                  * is sufficient to push raw frames at ~20fps */
617                 reg_w_val(dev, 0x8500, mode);
618         }               /* -- qq@kuku.eu.org */
619
620         gspca_dev->usb_buf[0] = 0xaa;
621         gspca_dev->usb_buf[1] = 0x00;
622         reg_w_buf(gspca_dev, 0x8307, 2);
623         /* clock - lower 0x8X values lead to fps > 30 */
624         reg_w_val(gspca_dev->dev, 0x8700, 0x8a);
625                                         /* 0x8f 0x85 0x27 clock */
626         reg_w_val(gspca_dev->dev, 0x8112, 0x1e | 0x20);
627         reg_w_val(gspca_dev->dev, 0x850b, 0x03);
628         memcpy(gspca_dev->usb_buf, Reg8391, 8);
629         reg_w_buf(gspca_dev, 0x8391, 8);
630         reg_w_buf(gspca_dev, 0x8390, 8);
631         setwhite(gspca_dev);
632         setautogain(gspca_dev);
633 /*      setgain(gspca_dev);             */
634         setexposure(gspca_dev);
635         return 0;
636 }
637 static int sd_start_72a(struct gspca_dev *gspca_dev)
638 {
639         struct usb_device *dev = gspca_dev->dev;
640         int Clck;
641         int mode;
642
643         write_vector(gspca_dev, rev72a_reset);
644         msleep(200);
645         write_vector(gspca_dev, rev72a_init_data1);
646         write_sensor_72a(gspca_dev, rev72a_init_sensor1);
647
648         mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
649         switch (mode) {
650         default:
651 /*      case 0:
652         case 1: */
653                 Clck = 0x25;
654                 break;
655         case 2:
656                 Clck = 0x22;
657                 break;
658         case 3:
659                 Clck = 0x21;
660                 break;
661         }
662         reg_w_val(dev, 0x8500, mode);   /* mode */
663         reg_w_val(dev, 0x8700, Clck);   /* 0x27 clock */
664         write_sensor_72a(gspca_dev, rev72a_init_sensor2);
665         setcontrast(gspca_dev);
666 /*      setbrightness(gspca_dev);        * fixme: bad values */
667         setautogain(gspca_dev);
668         reg_w_val(dev, 0x8112, 0x10 | 0x20);
669         return 0;
670 }
671
672 static void sd_stopN(struct gspca_dev *gspca_dev)
673 {
674         struct sd *sd = (struct sd *) gspca_dev;
675
676         if (sd->chip_revision == Rev012A) {
677                 reg_w_val(gspca_dev->dev, 0x8112, 0x0e);
678         } else {
679                 reg_w_val(gspca_dev->dev, 0x8112, 0x20);
680 /*              reg_w_val(gspca_dev->dev, 0x8102, 0x00); ?? */
681         }
682 }
683
684 /* called on streamoff with alt 0 and on disconnect */
685 static void sd_stop0(struct gspca_dev *gspca_dev)
686 {
687         struct sd *sd = (struct sd *) gspca_dev;
688
689         if (!gspca_dev->present)
690                 return;
691         if (sd->chip_revision == Rev012A) {
692                 reg_w_val(gspca_dev->dev, 0x8118, 0x29);
693                 reg_w_val(gspca_dev->dev, 0x8114, 0x08);
694         }
695 /*      reg_w_val(gspca_dev->dev, 0x8114, 0); */
696 }
697
698 static void do_autogain(struct gspca_dev *gspca_dev)
699 {
700         struct sd *sd = (struct sd *) gspca_dev;
701         int expotimes;
702         int pixelclk;
703         int gainG;
704         __u8 R, Gr, Gb, B;
705         int y;
706         __u8 luma_mean = 110;
707         __u8 luma_delta = 20;
708         __u8 spring = 4;
709
710         if (sd->ag_cnt < 0)
711                 return;
712         if (--sd->ag_cnt >= 0)
713                 return;
714         sd->ag_cnt = AG_CNT_START;
715
716         switch (sd->chip_revision) {
717         case Rev072A:
718                 reg_r(gspca_dev, 0x8621, 1);
719                 Gr = gspca_dev->usb_buf[0];
720                 reg_r(gspca_dev, 0x8622, 1);
721                 R = gspca_dev->usb_buf[0];
722                 reg_r(gspca_dev, 0x8623, 1);
723                 B = gspca_dev->usb_buf[0];
724                 reg_r(gspca_dev, 0x8624, 1);
725                 Gb = gspca_dev->usb_buf[0];
726                 y = (77 * R + 75 * (Gr + Gb) + 29 * B) >> 8;
727                 /* u= (128*B-(43*(Gr+Gb+R))) >> 8; */
728                 /* v= (128*R-(53*(Gr+Gb))-21*B) >> 8; */
729                 /* PDEBUG(D_CONF,"reading Y %d U %d V %d ",y,u,v); */
730
731                 if (y < luma_mean - luma_delta ||
732                     y > luma_mean + luma_delta) {
733                         expotimes = i2c_read(gspca_dev, 0x09, 0x10);
734                         pixelclk = 0x0800;
735                         expotimes = expotimes & 0x07ff;
736                         /* PDEBUG(D_PACK,
737                                 "Exposition Times 0x%03X Clock 0x%04X ",
738                                 expotimes,pixelclk); */
739                         gainG = i2c_read(gspca_dev, 0x35, 0x10);
740                         /* PDEBUG(D_PACK,
741                                 "reading Gain register %d", gainG); */
742
743                         expotimes += (luma_mean - y) >> spring;
744                         gainG += (luma_mean - y) / 50;
745                         /* PDEBUG(D_PACK,
746                                 "compute expotimes %d gain %d",
747                                 expotimes,gainG); */
748
749                         if (gainG > 0x3f)
750                                 gainG = 0x3f;
751                         else if (gainG < 3)
752                                 gainG = 3;
753                         i2c_write(gspca_dev, gainG, 0x35);
754
755                         if (expotimes > 0x0256)
756                                 expotimes = 0x0256;
757                         else if (expotimes < 3)
758                                 expotimes = 3;
759                         i2c_write(gspca_dev, expotimes | pixelclk, 0x09);
760                 }
761                 break;
762         case Rev012A:
763                 reg_r(gspca_dev, 0x8330, 2);
764                 if (gspca_dev->usb_buf[1] > 0x08) {
765                         gspca_dev->usb_buf[0] = ++sd->expo12a;
766                         gspca_dev->usb_buf[1] = 0;
767                         reg_w_buf(gspca_dev, 0x8339, 2);
768                 } else if (gspca_dev->usb_buf[1] < 0x02) {
769                         gspca_dev->usb_buf[0] = --sd->expo12a;
770                         gspca_dev->usb_buf[1] = 0;
771                         reg_w_buf(gspca_dev, 0x8339, 2);
772                 }
773                 break;
774         }
775 }
776
777 static void sd_pkt_scan(struct gspca_dev *gspca_dev,
778                         struct gspca_frame *frame, /* target */
779                         __u8 *data,             /* isoc packet */
780                         int len)                /* iso packet length */
781 {
782         struct sd *sd = (struct sd *) gspca_dev;
783
784         len--;
785         switch (*data++) {                      /* sequence number */
786         case 0:                                 /* start of frame */
787                 frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame,
788                                         data, 0);
789                 if (data[1] & 0x10) {
790                         /* compressed bayer */
791                         gspca_frame_add(gspca_dev, FIRST_PACKET,
792                                         frame, data, len);
793                 } else {
794                         /* raw bayer (with a header, which we skip) */
795                         if (sd->chip_revision == Rev012A) {
796                                 data += 20;
797                                 len -= 20;
798                         } else {
799                                 data += 16;
800                                 len -= 16;
801                         }
802                         gspca_frame_add(gspca_dev, FIRST_PACKET,
803                                                 frame, data, len);
804                 }
805                 return;
806         case 0xff:                      /* drop (empty mpackets) */
807                 return;
808         }
809         gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len);
810 }
811
812 /* rev 72a only */
813 static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
814 {
815         struct sd *sd = (struct sd *) gspca_dev;
816
817         sd->brightness = val;
818         if (gspca_dev->streaming)
819                 setbrightness(gspca_dev);
820         return 0;
821 }
822
823 static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val)
824 {
825         struct sd *sd = (struct sd *) gspca_dev;
826
827         *val = sd->brightness;
828         return 0;
829 }
830
831 /* rev 72a only */
832 static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val)
833 {
834         struct sd *sd = (struct sd *) gspca_dev;
835
836         sd->contrast = val;
837         if (gspca_dev->streaming)
838                 setcontrast(gspca_dev);
839         return 0;
840 }
841
842 static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val)
843 {
844         struct sd *sd = (struct sd *) gspca_dev;
845
846         *val = sd->contrast;
847         return 0;
848 }
849
850 static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val)
851 {
852         struct sd *sd = (struct sd *) gspca_dev;
853
854         sd->autogain = val;
855         if (gspca_dev->streaming)
856                 setautogain(gspca_dev);
857         return 0;
858 }
859
860 static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val)
861 {
862         struct sd *sd = (struct sd *) gspca_dev;
863
864         *val = sd->autogain;
865         return 0;
866 }
867
868 static int sd_setwhite(struct gspca_dev *gspca_dev, __s32 val)
869 {
870         struct sd *sd = (struct sd *) gspca_dev;
871
872         sd->white = val;
873         if (gspca_dev->streaming)
874                 setwhite(gspca_dev);
875         return 0;
876 }
877
878 static int sd_getwhite(struct gspca_dev *gspca_dev, __s32 *val)
879 {
880         struct sd *sd = (struct sd *) gspca_dev;
881
882         *val = sd->white;
883         return 0;
884 }
885
886 /* rev12a only */
887 static int sd_setexposure(struct gspca_dev *gspca_dev, __s32 val)
888 {
889         struct sd *sd = (struct sd *) gspca_dev;
890
891         sd->exposure = val;
892         if (gspca_dev->streaming)
893                 setexposure(gspca_dev);
894         return 0;
895 }
896
897 static int sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val)
898 {
899         struct sd *sd = (struct sd *) gspca_dev;
900
901         *val = sd->exposure;
902         return 0;
903 }
904
905 /* rev12a only */
906 static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val)
907 {
908         struct sd *sd = (struct sd *) gspca_dev;
909
910         sd->gain = val;
911         if (gspca_dev->streaming)
912                 setgain(gspca_dev);
913         return 0;
914 }
915
916 static int sd_getgain(struct gspca_dev *gspca_dev, __s32 *val)
917 {
918         struct sd *sd = (struct sd *) gspca_dev;
919
920         *val = sd->gain;
921         return 0;
922 }
923
924 /* control tables */
925 static struct ctrl sd_ctrls_12a[] = {
926         {
927             {
928                 .id = V4L2_CID_DO_WHITE_BALANCE,
929                 .type = V4L2_CTRL_TYPE_INTEGER,
930                 .name = "White Balance",
931                 .minimum = WHITE_MIN,
932                 .maximum = WHITE_MAX,
933                 .step = 1,
934                 .default_value = WHITE_DEF,
935             },
936             .set = sd_setwhite,
937             .get = sd_getwhite,
938         },
939         {
940             {
941                 .id = V4L2_CID_EXPOSURE,
942                 .type = V4L2_CTRL_TYPE_INTEGER,
943                 .name = "Exposure",
944                 .minimum = EXPOSURE_MIN,
945                 .maximum = EXPOSURE_MAX,
946                 .step = 1,
947                 .default_value = EXPOSURE_DEF,
948             },
949             .set = sd_setexposure,
950             .get = sd_getexposure,
951         },
952         {
953             {
954                 .id = V4L2_CID_AUTOGAIN,
955                 .type = V4L2_CTRL_TYPE_BOOLEAN,
956                 .name = "Auto Gain",
957                 .minimum = AUTOGAIN_MIN,
958                 .maximum = AUTOGAIN_MAX,
959                 .step = 1,
960                 .default_value = AUTOGAIN_DEF,
961             },
962             .set = sd_setautogain,
963             .get = sd_getautogain,
964         },
965         {
966             {
967                 .id = V4L2_CID_GAIN,
968                 .type = V4L2_CTRL_TYPE_INTEGER,
969                 .name = "Gain",
970                 .minimum = GAIN_MIN,
971                 .maximum = GAIN_MAX,
972                 .step = 1,
973                 .default_value = GAIN_DEF,
974             },
975             .set = sd_setgain,
976             .get = sd_getgain,
977         },
978 };
979
980 static struct ctrl sd_ctrls_72a[] = {
981         {
982             {
983                 .id = V4L2_CID_DO_WHITE_BALANCE,
984                 .type = V4L2_CTRL_TYPE_INTEGER,
985                 .name = "White Balance",
986                 .minimum = WHITE_MIN,
987                 .maximum = WHITE_MAX,
988                 .step = 1,
989                 .default_value = WHITE_DEF,
990             },
991             .set = sd_setwhite,
992             .get = sd_getwhite,
993         },
994         {
995            {
996                 .id = V4L2_CID_BRIGHTNESS,
997                 .type = V4L2_CTRL_TYPE_INTEGER,
998                 .name = "Brightness",
999                 .minimum = BRIGHTNESS_MIN,
1000                 .maximum = BRIGHTNESS_MAX,
1001                 .step = 1,
1002                 .default_value = BRIGHTNESS_DEF,
1003             },
1004             .set = sd_setbrightness,
1005             .get = sd_getbrightness,
1006         },
1007         {
1008             {
1009                 .id = V4L2_CID_CONTRAST,
1010                 .type = V4L2_CTRL_TYPE_INTEGER,
1011                 .name = "Contrast",
1012                 .minimum = CONTRAST_MIN,
1013                 .maximum = CONTRAST_MAX,
1014                 .step = 1,
1015                 .default_value = CONTRAST_DEF,
1016             },
1017             .set = sd_setcontrast,
1018             .get = sd_getcontrast,
1019         },
1020         {
1021             {
1022                 .id = V4L2_CID_AUTOGAIN,
1023                 .type = V4L2_CTRL_TYPE_BOOLEAN,
1024                 .name = "Auto Gain",
1025                 .minimum = AUTOGAIN_MIN,
1026                 .maximum = AUTOGAIN_MAX,
1027                 .step = 1,
1028                 .default_value = AUTOGAIN_DEF,
1029             },
1030             .set = sd_setautogain,
1031             .get = sd_getautogain,
1032         },
1033 };
1034
1035 /* sub-driver description */
1036 static const struct sd_desc sd_desc_12a = {
1037         .name = MODULE_NAME,
1038         .ctrls = sd_ctrls_12a,
1039         .nctrls = ARRAY_SIZE(sd_ctrls_12a),
1040         .config = sd_config,
1041         .init = sd_init_12a,
1042         .start = sd_start_12a,
1043         .stopN = sd_stopN,
1044         .stop0 = sd_stop0,
1045         .pkt_scan = sd_pkt_scan,
1046 /*      .dq_callback = do_autogain,      * fixme */
1047 };
1048 static const struct sd_desc sd_desc_72a = {
1049         .name = MODULE_NAME,
1050         .ctrls = sd_ctrls_72a,
1051         .nctrls = ARRAY_SIZE(sd_ctrls_72a),
1052         .config = sd_config,
1053         .init = sd_init_72a,
1054         .start = sd_start_72a,
1055         .stopN = sd_stopN,
1056         .stop0 = sd_stop0,
1057         .pkt_scan = sd_pkt_scan,
1058         .dq_callback = do_autogain,
1059 };
1060 static const struct sd_desc *sd_desc[2] = {
1061         &sd_desc_12a,
1062         &sd_desc_72a
1063 };
1064
1065 /* -- module initialisation -- */
1066 static const __devinitdata struct usb_device_id device_table[] = {
1067         {USB_DEVICE(0x041e, 0x401a), .driver_info = Rev072A},
1068         {USB_DEVICE(0x041e, 0x403b), .driver_info = Rev012A},
1069         {USB_DEVICE(0x0458, 0x7004), .driver_info = Rev072A},
1070         {USB_DEVICE(0x046d, 0x0928), .driver_info = Rev012A},
1071         {USB_DEVICE(0x046d, 0x0929), .driver_info = Rev012A},
1072         {USB_DEVICE(0x046d, 0x092a), .driver_info = Rev012A},
1073         {USB_DEVICE(0x046d, 0x092b), .driver_info = Rev012A},
1074         {USB_DEVICE(0x046d, 0x092c), .driver_info = Rev012A},
1075         {USB_DEVICE(0x046d, 0x092d), .driver_info = Rev012A},
1076         {USB_DEVICE(0x046d, 0x092e), .driver_info = Rev012A},
1077         {USB_DEVICE(0x046d, 0x092f), .driver_info = Rev012A},
1078         {USB_DEVICE(0x04fc, 0x0561), .driver_info = Rev072A},
1079         {USB_DEVICE(0x060b, 0xa001), .driver_info = Rev072A},
1080         {USB_DEVICE(0x10fd, 0x7e50), .driver_info = Rev072A},
1081         {USB_DEVICE(0xabcd, 0xcdee), .driver_info = Rev072A},
1082         {}
1083 };
1084
1085 MODULE_DEVICE_TABLE(usb, device_table);
1086
1087 /* -- device connect -- */
1088 static int sd_probe(struct usb_interface *intf,
1089                     const struct usb_device_id *id)
1090 {
1091         return gspca_dev_probe(intf, id,
1092                                 sd_desc[id->driver_info],
1093                                 sizeof(struct sd),
1094                                THIS_MODULE);
1095 }
1096
1097 static struct usb_driver sd_driver = {
1098         .name = MODULE_NAME,
1099         .id_table = device_table,
1100         .probe = sd_probe,
1101         .disconnect = gspca_disconnect,
1102 #ifdef CONFIG_PM
1103         .suspend = gspca_suspend,
1104         .resume = gspca_resume,
1105 #endif
1106 };
1107
1108 /* -- module insert / remove -- */
1109 static int __init sd_mod_init(void)
1110 {
1111         int ret;
1112         ret = usb_register(&sd_driver);
1113         if (ret < 0)
1114                 return ret;
1115         PDEBUG(D_PROBE, "registered");
1116         return 0;
1117 }
1118 static void __exit sd_mod_exit(void)
1119 {
1120         usb_deregister(&sd_driver);
1121         PDEBUG(D_PROBE, "deregistered");
1122 }
1123
1124 module_init(sd_mod_init);
1125 module_exit(sd_mod_exit);