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