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