Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris...
[sfrench/cifs-2.6.git] / drivers / media / usb / gspca / pac7302.c
1 /*
2  * Pixart PAC7302 driver
3  *
4  * Copyright (C) 2008-2012 Jean-Francois Moine <http://moinejf.free.fr>
5  * Copyright (C) 2005 Thomas Kaiser thomas@kaiser-linux.li
6  *
7  * Separated from Pixart PAC7311 library by Márton Németh
8  * Camera button input handling by Márton Németh <nm127@freemail.hu>
9  * Copyright (C) 2009-2010 Márton Németh <nm127@freemail.hu>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24  */
25
26 /*
27  * Some documentation about various registers as determined by trial and error.
28  *
29  * Register page 0:
30  *
31  * Address      Description
32  * 0x02         Red balance control
33  * 0x03         Green balance control
34  * 0x04         Blue balance control
35  *                   Valus are inverted (0=max, 255=min).
36  *                   The Windows driver uses a quadratic approach to map
37  *                   the settable values (0-200) on register values:
38  *                   min=0x80, default=0x40, max=0x20
39  * 0x0f-0x20    Colors, saturation and exposure control
40  * 0xa2-0xab    Brightness, contrast and gamma control
41  * 0xb6         Sharpness control (bits 0-4)
42  *
43  * Register page 1:
44  *
45  * Address      Description
46  * 0x78         Global control, bit 6 controls the LED (inverted)
47  * 0x80         Compression balance, 2 interesting settings:
48  *              0x0f Default
49  *              0x50 Values >= this switch the camera to a lower compression,
50  *                   using the same table for both luminance and chrominance.
51  *                   This gives a sharper picture. Only usable when running
52  *                   at < 15 fps! Note currently the driver does not use this
53  *                   as the quality gain is small and the generated JPG-s are
54  *                   only understood by v4l-utils >= 0.8.9
55  *
56  * Register page 3:
57  *
58  * Address      Description
59  * 0x02         Clock divider 3-63, fps = 90 / val. Must be a multiple of 3 on
60  *              the 7302, so one of 3, 6, 9, ..., except when between 6 and 12?
61  * 0x03         Variable framerate ctrl reg2==3: 0 -> ~30 fps, 255 -> ~22fps
62  * 0x04         Another var framerate ctrl reg2==3, reg3==0: 0 -> ~30 fps,
63  *              63 -> ~27 fps, the 2 msb's must always be 1 !!
64  * 0x05         Another var framerate ctrl reg2==3, reg3==0, reg4==0xc0:
65  *              1 -> ~30 fps, 2 -> ~20 fps
66  * 0x0e         Exposure bits 0-7, 0-448, 0 = use full frame time
67  * 0x0f         Exposure bit 8, 0-448, 448 = no exposure at all
68  * 0x10         Gain 0-31
69  * 0x12         Another gain 0-31, unlike 0x10 this one seems to start with an
70  *              amplification value of 1 rather then 0 at its lowest setting
71  * 0x21         Bitfield: 0-1 unused, 2-3 vflip/hflip, 4-5 unknown, 6-7 unused
72  * 0x80         Another framerate control, best left at 1, moving it from 1 to
73  *              2 causes the framerate to become 3/4th of what it was, and
74  *              also seems to cause pixel averaging, resulting in an effective
75  *              resolution of 320x240 and thus a much blockier image
76  *
77  * The registers are accessed in the following functions:
78  *
79  * Page | Register   | Function
80  * -----+------------+---------------------------------------------------
81  *  0   | 0x0f..0x20 | setcolors()
82  *  0   | 0xa2..0xab | setbrightcont()
83  *  0   | 0xb6       | setsharpness()
84  *  0   | 0xc5       | setredbalance()
85  *  0   | 0xc6       | setwhitebalance()
86  *  0   | 0xc7       | setbluebalance()
87  *  0   | 0xdc       | setbrightcont(), setcolors()
88  *  3   | 0x02       | setexposure()
89  *  3   | 0x10, 0x12 | setgain()
90  *  3   | 0x11       | setcolors(), setgain(), setexposure(), sethvflip()
91  *  3   | 0x21       | sethvflip()
92  */
93
94 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
95
96 #include <linux/input.h>
97 #include <media/v4l2-chip-ident.h>
98 #include "gspca.h"
99 /* Include pac common sof detection functions */
100 #include "pac_common.h"
101
102 #define PAC7302_GAIN_DEFAULT      15
103 #define PAC7302_GAIN_KNEE         42
104 #define PAC7302_EXPOSURE_DEFAULT  66 /* 33 ms / 30 fps */
105 #define PAC7302_EXPOSURE_KNEE    133 /* 66 ms / 15 fps */
106
107 MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>, "
108                 "Thomas Kaiser thomas@kaiser-linux.li");
109 MODULE_DESCRIPTION("Pixart PAC7302");
110 MODULE_LICENSE("GPL");
111
112 struct sd {
113         struct gspca_dev gspca_dev;             /* !! must be the first item */
114
115         struct { /* brightness / contrast cluster */
116                 struct v4l2_ctrl *brightness;
117                 struct v4l2_ctrl *contrast;
118         };
119         struct v4l2_ctrl *saturation;
120         struct v4l2_ctrl *white_balance;
121         struct v4l2_ctrl *red_balance;
122         struct v4l2_ctrl *blue_balance;
123         struct { /* flip cluster */
124                 struct v4l2_ctrl *hflip;
125                 struct v4l2_ctrl *vflip;
126         };
127         struct v4l2_ctrl *sharpness;
128         u8 flags;
129 #define FL_HFLIP 0x01           /* mirrored by default */
130 #define FL_VFLIP 0x02           /* vertical flipped by default */
131
132         u8 sof_read;
133         s8 autogain_ignore_frames;
134
135         atomic_t avg_lum;
136 };
137
138 static const struct v4l2_pix_format vga_mode[] = {
139         {640, 480, V4L2_PIX_FMT_PJPG, V4L2_FIELD_NONE,
140                 .bytesperline = 640,
141                 .sizeimage = 640 * 480 * 3 / 8 + 590,
142                 .colorspace = V4L2_COLORSPACE_JPEG,
143         },
144 };
145
146 #define LOAD_PAGE3              255
147 #define END_OF_SEQUENCE         0
148
149 static const u8 init_7302[] = {
150 /*      index,value */
151         0xff, 0x01,             /* page 1 */
152         0x78, 0x00,             /* deactivate */
153         0xff, 0x01,
154         0x78, 0x40,             /* led off */
155 };
156 static const u8 start_7302[] = {
157 /*      index, len, [value]* */
158         0xff, 1,        0x00,           /* page 0 */
159         0x00, 12,       0x01, 0x40, 0x40, 0x40, 0x01, 0xe0, 0x02, 0x80,
160                         0x00, 0x00, 0x00, 0x00,
161         0x0d, 24,       0x03, 0x01, 0x00, 0xb5, 0x07, 0xcb, 0x00, 0x00,
162                         0x07, 0xc8, 0x00, 0xea, 0x07, 0xcf, 0x07, 0xf7,
163                         0x07, 0x7e, 0x01, 0x0b, 0x00, 0x00, 0x00, 0x11,
164         0x26, 2,        0xaa, 0xaa,
165         0x2e, 1,        0x31,
166         0x38, 1,        0x01,
167         0x3a, 3,        0x14, 0xff, 0x5a,
168         0x43, 11,       0x00, 0x0a, 0x18, 0x11, 0x01, 0x2c, 0x88, 0x11,
169                         0x00, 0x54, 0x11,
170         0x55, 1,        0x00,
171         0x62, 4,        0x10, 0x1e, 0x1e, 0x18,
172         0x6b, 1,        0x00,
173         0x6e, 3,        0x08, 0x06, 0x00,
174         0x72, 3,        0x00, 0xff, 0x00,
175         0x7d, 23,       0x01, 0x01, 0x58, 0x46, 0x50, 0x3c, 0x50, 0x3c,
176                         0x54, 0x46, 0x54, 0x56, 0x52, 0x50, 0x52, 0x50,
177                         0x56, 0x64, 0xa4, 0x00, 0xda, 0x00, 0x00,
178         0xa2, 10,       0x22, 0x2c, 0x3c, 0x54, 0x69, 0x7c, 0x9c, 0xb9,
179                         0xd2, 0xeb,
180         0xaf, 1,        0x02,
181         0xb5, 2,        0x08, 0x08,
182         0xb8, 2,        0x08, 0x88,
183         0xc4, 4,        0xae, 0x01, 0x04, 0x01,
184         0xcc, 1,        0x00,
185         0xd1, 11,       0x01, 0x30, 0x49, 0x5e, 0x6f, 0x7f, 0x8e, 0xa9,
186                         0xc1, 0xd7, 0xec,
187         0xdc, 1,        0x01,
188         0xff, 1,        0x01,           /* page 1 */
189         0x12, 3,        0x02, 0x00, 0x01,
190         0x3e, 2,        0x00, 0x00,
191         0x76, 5,        0x01, 0x20, 0x40, 0x00, 0xf2,
192         0x7c, 1,        0x00,
193         0x7f, 10,       0x4b, 0x0f, 0x01, 0x2c, 0x02, 0x58, 0x03, 0x20,
194                         0x02, 0x00,
195         0x96, 5,        0x01, 0x10, 0x04, 0x01, 0x04,
196         0xc8, 14,       0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
197                         0x07, 0x00, 0x01, 0x07, 0x04, 0x01,
198         0xd8, 1,        0x01,
199         0xdb, 2,        0x00, 0x01,
200         0xde, 7,        0x00, 0x01, 0x04, 0x04, 0x00, 0x00, 0x00,
201         0xe6, 4,        0x00, 0x00, 0x00, 0x01,
202         0xeb, 1,        0x00,
203         0xff, 1,        0x02,           /* page 2 */
204         0x22, 1,        0x00,
205         0xff, 1,        0x03,           /* page 3 */
206         0, LOAD_PAGE3,                  /* load the page 3 */
207         0x11, 1,        0x01,
208         0xff, 1,        0x02,           /* page 2 */
209         0x13, 1,        0x00,
210         0x22, 4,        0x1f, 0xa4, 0xf0, 0x96,
211         0x27, 2,        0x14, 0x0c,
212         0x2a, 5,        0xc8, 0x00, 0x18, 0x12, 0x22,
213         0x64, 8,        0x00, 0x00, 0xf0, 0x01, 0x14, 0x44, 0x44, 0x44,
214         0x6e, 1,        0x08,
215         0xff, 1,        0x01,           /* page 1 */
216         0x78, 1,        0x00,
217         0, END_OF_SEQUENCE              /* end of sequence */
218 };
219
220 #define SKIP            0xaa
221 /* page 3 - the value SKIP says skip the index - see reg_w_page() */
222 static const u8 page3_7302[] = {
223         0x90, 0x40, 0x03, 0x00, 0xc0, 0x01, 0x14, 0x16,
224         0x14, 0x12, 0x00, 0x00, 0x00, 0x02, 0x33, 0x00,
225         0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226         0x00, 0x00, 0x00, 0x47, 0x01, 0xb3, 0x01, 0x00,
227         0x00, 0x08, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x21,
228         0x00, 0x00, 0x00, 0x54, 0xf4, 0x02, 0x52, 0x54,
229         0xa4, 0xb8, 0xe0, 0x2a, 0xf6, 0x00, 0x00, 0x00,
230         0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231         0x00, 0xfc, 0x00, 0xf2, 0x1f, 0x04, 0x00, 0x00,
232         SKIP, 0x00, 0x00, 0xc0, 0xc0, 0x10, 0x00, 0x00,
233         0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
234         0x00, 0x40, 0xff, 0x03, 0x19, 0x00, 0x00, 0x00,
235         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
236         0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xc8, 0xc8,
237         0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,
238         0x08, 0x10, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00,
239         0x01, 0x00, 0x02, 0x47, 0x00, 0x00, 0x00, 0x00,
240         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
241         0x00, 0x02, 0xfa, 0x00, 0x64, 0x5a, 0x28, 0x00,
242         0x00
243 };
244
245 static void reg_w_buf(struct gspca_dev *gspca_dev,
246                 u8 index,
247                   const u8 *buffer, int len)
248 {
249         int ret;
250
251         if (gspca_dev->usb_err < 0)
252                 return;
253         memcpy(gspca_dev->usb_buf, buffer, len);
254         ret = usb_control_msg(gspca_dev->dev,
255                         usb_sndctrlpipe(gspca_dev->dev, 0),
256                         0,              /* request */
257                         USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
258                         0,              /* value */
259                         index, gspca_dev->usb_buf, len,
260                         500);
261         if (ret < 0) {
262                 pr_err("reg_w_buf failed i: %02x error %d\n",
263                        index, ret);
264                 gspca_dev->usb_err = ret;
265         }
266 }
267
268
269 static void reg_w(struct gspca_dev *gspca_dev,
270                 u8 index,
271                 u8 value)
272 {
273         int ret;
274
275         if (gspca_dev->usb_err < 0)
276                 return;
277         gspca_dev->usb_buf[0] = value;
278         ret = usb_control_msg(gspca_dev->dev,
279                         usb_sndctrlpipe(gspca_dev->dev, 0),
280                         0,                      /* request */
281                         USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
282                         0, index, gspca_dev->usb_buf, 1,
283                         500);
284         if (ret < 0) {
285                 pr_err("reg_w() failed i: %02x v: %02x error %d\n",
286                        index, value, ret);
287                 gspca_dev->usb_err = ret;
288         }
289 }
290
291 static void reg_w_seq(struct gspca_dev *gspca_dev,
292                 const u8 *seq, int len)
293 {
294         while (--len >= 0) {
295                 reg_w(gspca_dev, seq[0], seq[1]);
296                 seq += 2;
297         }
298 }
299
300 /* load the beginning of a page */
301 static void reg_w_page(struct gspca_dev *gspca_dev,
302                         const u8 *page, int len)
303 {
304         int index;
305         int ret = 0;
306
307         if (gspca_dev->usb_err < 0)
308                 return;
309         for (index = 0; index < len; index++) {
310                 if (page[index] == SKIP)                /* skip this index */
311                         continue;
312                 gspca_dev->usb_buf[0] = page[index];
313                 ret = usb_control_msg(gspca_dev->dev,
314                                 usb_sndctrlpipe(gspca_dev->dev, 0),
315                                 0,                      /* request */
316                         USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
317                                 0, index, gspca_dev->usb_buf, 1,
318                                 500);
319                 if (ret < 0) {
320                         pr_err("reg_w_page() failed i: %02x v: %02x error %d\n",
321                                index, page[index], ret);
322                         gspca_dev->usb_err = ret;
323                         break;
324                 }
325         }
326 }
327
328 /* output a variable sequence */
329 static void reg_w_var(struct gspca_dev *gspca_dev,
330                         const u8 *seq,
331                         const u8 *page3, unsigned int page3_len)
332 {
333         int index, len;
334
335         for (;;) {
336                 index = *seq++;
337                 len = *seq++;
338                 switch (len) {
339                 case END_OF_SEQUENCE:
340                         return;
341                 case LOAD_PAGE3:
342                         reg_w_page(gspca_dev, page3, page3_len);
343                         break;
344                 default:
345 #ifdef GSPCA_DEBUG
346                         if (len > USB_BUF_SZ) {
347                                 PDEBUG(D_ERR|D_STREAM,
348                                         "Incorrect variable sequence");
349                                 return;
350                         }
351 #endif
352                         while (len > 0) {
353                                 if (len < 8) {
354                                         reg_w_buf(gspca_dev,
355                                                 index, seq, len);
356                                         seq += len;
357                                         break;
358                                 }
359                                 reg_w_buf(gspca_dev, index, seq, 8);
360                                 seq += 8;
361                                 index += 8;
362                                 len -= 8;
363                         }
364                 }
365         }
366         /* not reached */
367 }
368
369 /* this function is called at probe time for pac7302 */
370 static int sd_config(struct gspca_dev *gspca_dev,
371                         const struct usb_device_id *id)
372 {
373         struct sd *sd = (struct sd *) gspca_dev;
374         struct cam *cam;
375
376         cam = &gspca_dev->cam;
377
378         cam->cam_mode = vga_mode;       /* only 640x480 */
379         cam->nmodes = ARRAY_SIZE(vga_mode);
380
381         sd->flags = id->driver_info;
382         return 0;
383 }
384
385 static void setbrightcont(struct gspca_dev *gspca_dev)
386 {
387         struct sd *sd = (struct sd *) gspca_dev;
388         int i, v;
389         static const u8 max[10] =
390                 {0x29, 0x33, 0x42, 0x5a, 0x6e, 0x80, 0x9f, 0xbb,
391                  0xd4, 0xec};
392         static const u8 delta[10] =
393                 {0x35, 0x33, 0x33, 0x2f, 0x2a, 0x25, 0x1e, 0x17,
394                  0x11, 0x0b};
395
396         reg_w(gspca_dev, 0xff, 0x00);           /* page 0 */
397         for (i = 0; i < 10; i++) {
398                 v = max[i];
399                 v += (sd->brightness->val - sd->brightness->maximum)
400                         * 150 / sd->brightness->maximum; /* 200 ? */
401                 v -= delta[i] * sd->contrast->val / sd->contrast->maximum;
402                 if (v < 0)
403                         v = 0;
404                 else if (v > 0xff)
405                         v = 0xff;
406                 reg_w(gspca_dev, 0xa2 + i, v);
407         }
408         reg_w(gspca_dev, 0xdc, 0x01);
409 }
410
411 static void setcolors(struct gspca_dev *gspca_dev)
412 {
413         struct sd *sd = (struct sd *) gspca_dev;
414         int i, v;
415         static const int a[9] =
416                 {217, -212, 0, -101, 170, -67, -38, -315, 355};
417         static const int b[9] =
418                 {19, 106, 0, 19, 106, 1, 19, 106, 1};
419
420         reg_w(gspca_dev, 0xff, 0x03);                   /* page 3 */
421         reg_w(gspca_dev, 0x11, 0x01);
422         reg_w(gspca_dev, 0xff, 0x00);                   /* page 0 */
423         for (i = 0; i < 9; i++) {
424                 v = a[i] * sd->saturation->val / sd->saturation->maximum;
425                 v += b[i];
426                 reg_w(gspca_dev, 0x0f + 2 * i, (v >> 8) & 0x07);
427                 reg_w(gspca_dev, 0x0f + 2 * i + 1, v);
428         }
429         reg_w(gspca_dev, 0xdc, 0x01);
430 }
431
432 static void setwhitebalance(struct gspca_dev *gspca_dev)
433 {
434         struct sd *sd = (struct sd *) gspca_dev;
435
436         reg_w(gspca_dev, 0xff, 0x00);           /* page 0 */
437         reg_w(gspca_dev, 0xc6, sd->white_balance->val);
438
439         reg_w(gspca_dev, 0xdc, 0x01);
440 }
441
442 static void setredbalance(struct gspca_dev *gspca_dev)
443 {
444         struct sd *sd = (struct sd *) gspca_dev;
445
446         reg_w(gspca_dev, 0xff, 0x00);           /* page 0 */
447         reg_w(gspca_dev, 0xc5, sd->red_balance->val);
448
449         reg_w(gspca_dev, 0xdc, 0x01);
450 }
451
452 static void setbluebalance(struct gspca_dev *gspca_dev)
453 {
454         struct sd *sd = (struct sd *) gspca_dev;
455
456         reg_w(gspca_dev, 0xff, 0x00);                   /* page 0 */
457         reg_w(gspca_dev, 0xc7, sd->blue_balance->val);
458
459         reg_w(gspca_dev, 0xdc, 0x01);
460 }
461
462 static void setgain(struct gspca_dev *gspca_dev)
463 {
464         u8 reg10, reg12;
465
466         if (gspca_dev->gain->val < 32) {
467                 reg10 = gspca_dev->gain->val;
468                 reg12 = 0;
469         } else {
470                 reg10 = 31;
471                 reg12 = gspca_dev->gain->val - 31;
472         }
473
474         reg_w(gspca_dev, 0xff, 0x03);                   /* page 3 */
475         reg_w(gspca_dev, 0x10, reg10);
476         reg_w(gspca_dev, 0x12, reg12);
477
478         /* load registers to sensor (Bit 0, auto clear) */
479         reg_w(gspca_dev, 0x11, 0x01);
480 }
481
482 static void setexposure(struct gspca_dev *gspca_dev)
483 {
484         u8 clockdiv;
485         u16 exposure;
486
487         /*
488          * Register 2 of frame 3 contains the clock divider configuring the
489          * no fps according to the formula: 90 / reg. sd->exposure is the
490          * desired exposure time in 0.5 ms.
491          */
492         clockdiv = (90 * gspca_dev->exposure->val + 1999) / 2000;
493
494         /*
495          * Note clockdiv = 3 also works, but when running at 30 fps, depending
496          * on the scene being recorded, the camera switches to another
497          * quantization table for certain JPEG blocks, and we don't know how
498          * to decompress these blocks. So we cap the framerate at 15 fps.
499          */
500         if (clockdiv < 6)
501                 clockdiv = 6;
502         else if (clockdiv > 63)
503                 clockdiv = 63;
504
505         /*
506          * Register 2 MUST be a multiple of 3, except when between 6 and 12?
507          * Always round up, otherwise we cannot get the desired frametime
508          * using the partial frame time exposure control.
509          */
510         if (clockdiv < 6 || clockdiv > 12)
511                 clockdiv = ((clockdiv + 2) / 3) * 3;
512
513         /*
514          * frame exposure time in ms = 1000 * clockdiv / 90    ->
515          * exposure = (sd->exposure / 2) * 448 / (1000 * clockdiv / 90)
516          */
517         exposure = (gspca_dev->exposure->val * 45 * 448) / (1000 * clockdiv);
518         /* 0 = use full frametime, 448 = no exposure, reverse it */
519         exposure = 448 - exposure;
520
521         reg_w(gspca_dev, 0xff, 0x03);                   /* page 3 */
522         reg_w(gspca_dev, 0x02, clockdiv);
523         reg_w(gspca_dev, 0x0e, exposure & 0xff);
524         reg_w(gspca_dev, 0x0f, exposure >> 8);
525
526         /* load registers to sensor (Bit 0, auto clear) */
527         reg_w(gspca_dev, 0x11, 0x01);
528 }
529
530 static void sethvflip(struct gspca_dev *gspca_dev)
531 {
532         struct sd *sd = (struct sd *) gspca_dev;
533         u8 data, hflip, vflip;
534
535         hflip = sd->hflip->val;
536         if (sd->flags & FL_HFLIP)
537                 hflip = !hflip;
538         vflip = sd->vflip->val;
539         if (sd->flags & FL_VFLIP)
540                 vflip = !vflip;
541
542         reg_w(gspca_dev, 0xff, 0x03);                   /* page 3 */
543         data = (hflip ? 0x08 : 0x00) | (vflip ? 0x04 : 0x00);
544         reg_w(gspca_dev, 0x21, data);
545
546         /* load registers to sensor (Bit 0, auto clear) */
547         reg_w(gspca_dev, 0x11, 0x01);
548 }
549
550 static void setsharpness(struct gspca_dev *gspca_dev)
551 {
552         struct sd *sd = (struct sd *) gspca_dev;
553
554         reg_w(gspca_dev, 0xff, 0x00);           /* page 0 */
555         reg_w(gspca_dev, 0xb6, sd->sharpness->val);
556
557         reg_w(gspca_dev, 0xdc, 0x01);
558 }
559
560 /* this function is called at probe and resume time for pac7302 */
561 static int sd_init(struct gspca_dev *gspca_dev)
562 {
563         reg_w_seq(gspca_dev, init_7302, sizeof(init_7302)/2);
564         return gspca_dev->usb_err;
565 }
566
567 static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
568 {
569         struct gspca_dev *gspca_dev =
570                 container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
571         struct sd *sd = (struct sd *)gspca_dev;
572
573         gspca_dev->usb_err = 0;
574
575         if (ctrl->id == V4L2_CID_AUTOGAIN && ctrl->is_new && ctrl->val) {
576                 /* when switching to autogain set defaults to make sure
577                    we are on a valid point of the autogain gain /
578                    exposure knee graph, and give this change time to
579                    take effect before doing autogain. */
580                 gspca_dev->exposure->val    = PAC7302_EXPOSURE_DEFAULT;
581                 gspca_dev->gain->val        = PAC7302_GAIN_DEFAULT;
582                 sd->autogain_ignore_frames  = PAC_AUTOGAIN_IGNORE_FRAMES;
583         }
584
585         if (!gspca_dev->streaming)
586                 return 0;
587
588         switch (ctrl->id) {
589         case V4L2_CID_BRIGHTNESS:
590                 setbrightcont(gspca_dev);
591                 break;
592         case V4L2_CID_SATURATION:
593                 setcolors(gspca_dev);
594                 break;
595         case V4L2_CID_WHITE_BALANCE_TEMPERATURE:
596                 setwhitebalance(gspca_dev);
597                 break;
598         case V4L2_CID_RED_BALANCE:
599                 setredbalance(gspca_dev);
600                 break;
601         case V4L2_CID_BLUE_BALANCE:
602                 setbluebalance(gspca_dev);
603                 break;
604         case V4L2_CID_AUTOGAIN:
605                 if (gspca_dev->exposure->is_new || (ctrl->is_new && ctrl->val))
606                         setexposure(gspca_dev);
607                 if (gspca_dev->gain->is_new || (ctrl->is_new && ctrl->val))
608                         setgain(gspca_dev);
609                 break;
610         case V4L2_CID_HFLIP:
611                 sethvflip(gspca_dev);
612                 break;
613         case V4L2_CID_SHARPNESS:
614                 setsharpness(gspca_dev);
615                 break;
616         default:
617                 return -EINVAL;
618         }
619         return gspca_dev->usb_err;
620 }
621
622 static const struct v4l2_ctrl_ops sd_ctrl_ops = {
623         .s_ctrl = sd_s_ctrl,
624 };
625
626 /* this function is called at probe time */
627 static int sd_init_controls(struct gspca_dev *gspca_dev)
628 {
629         struct sd *sd = (struct sd *) gspca_dev;
630         struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
631
632         gspca_dev->vdev.ctrl_handler = hdl;
633         v4l2_ctrl_handler_init(hdl, 12);
634
635         sd->brightness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
636                                         V4L2_CID_BRIGHTNESS, 0, 32, 1, 16);
637         sd->contrast = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
638                                         V4L2_CID_CONTRAST, 0, 255, 1, 127);
639
640         sd->saturation = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
641                                         V4L2_CID_SATURATION, 0, 255, 1, 127);
642         sd->white_balance = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
643                                         V4L2_CID_WHITE_BALANCE_TEMPERATURE,
644                                         0, 255, 1, 55);
645         sd->red_balance = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
646                                         V4L2_CID_RED_BALANCE, 0, 3, 1, 1);
647         sd->blue_balance = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
648                                         V4L2_CID_BLUE_BALANCE, 0, 3, 1, 1);
649
650         gspca_dev->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
651                                         V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
652         gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
653                                         V4L2_CID_EXPOSURE, 0, 1023, 1,
654                                         PAC7302_EXPOSURE_DEFAULT);
655         gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
656                                         V4L2_CID_GAIN, 0, 62, 1,
657                                         PAC7302_GAIN_DEFAULT);
658
659         sd->hflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
660                 V4L2_CID_HFLIP, 0, 1, 1, 0);
661         sd->vflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
662                 V4L2_CID_VFLIP, 0, 1, 1, 0);
663
664         sd->sharpness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
665                                         V4L2_CID_SHARPNESS, 0, 15, 1, 8);
666
667         if (hdl->error) {
668                 pr_err("Could not initialize controls\n");
669                 return hdl->error;
670         }
671
672         v4l2_ctrl_cluster(2, &sd->brightness);
673         v4l2_ctrl_auto_cluster(3, &gspca_dev->autogain, 0, false);
674         v4l2_ctrl_cluster(2, &sd->hflip);
675         return 0;
676 }
677
678 /* -- start the camera -- */
679 static int sd_start(struct gspca_dev *gspca_dev)
680 {
681         struct sd *sd = (struct sd *) gspca_dev;
682
683         reg_w_var(gspca_dev, start_7302,
684                 page3_7302, sizeof(page3_7302));
685
686         sd->sof_read = 0;
687         sd->autogain_ignore_frames = 0;
688         atomic_set(&sd->avg_lum, 270 + sd->brightness->val);
689
690         /* start stream */
691         reg_w(gspca_dev, 0xff, 0x01);
692         reg_w(gspca_dev, 0x78, 0x01);
693
694         return gspca_dev->usb_err;
695 }
696
697 static void sd_stopN(struct gspca_dev *gspca_dev)
698 {
699
700         /* stop stream */
701         reg_w(gspca_dev, 0xff, 0x01);
702         reg_w(gspca_dev, 0x78, 0x00);
703 }
704
705 /* called on streamoff with alt 0 and on disconnect for pac7302 */
706 static void sd_stop0(struct gspca_dev *gspca_dev)
707 {
708         if (!gspca_dev->present)
709                 return;
710         reg_w(gspca_dev, 0xff, 0x01);
711         reg_w(gspca_dev, 0x78, 0x40);
712 }
713
714 static void do_autogain(struct gspca_dev *gspca_dev)
715 {
716         struct sd *sd = (struct sd *) gspca_dev;
717         int avg_lum = atomic_read(&sd->avg_lum);
718         int desired_lum;
719         const int deadzone = 30;
720
721         if (sd->autogain_ignore_frames < 0)
722                 return;
723
724         if (sd->autogain_ignore_frames > 0) {
725                 sd->autogain_ignore_frames--;
726         } else {
727                 desired_lum = 270 + sd->brightness->val;
728
729                 if (gspca_expo_autogain(gspca_dev, avg_lum, desired_lum,
730                                         deadzone, PAC7302_GAIN_KNEE,
731                                         PAC7302_EXPOSURE_KNEE))
732                         sd->autogain_ignore_frames =
733                                                 PAC_AUTOGAIN_IGNORE_FRAMES;
734         }
735 }
736
737 /* JPEG header */
738 static const u8 jpeg_header[] = {
739         0xff, 0xd8,     /* SOI: Start of Image */
740
741         0xff, 0xc0,     /* SOF0: Start of Frame (Baseline DCT) */
742         0x00, 0x11,     /* length = 17 bytes (including this length field) */
743         0x08,           /* Precision: 8 */
744         0x02, 0x80,     /* height = 640 (image rotated) */
745         0x01, 0xe0,     /* width = 480 */
746         0x03,           /* Number of image components: 3 */
747         0x01, 0x21, 0x00, /* ID=1, Subsampling 1x1, Quantization table: 0 */
748         0x02, 0x11, 0x01, /* ID=2, Subsampling 2x1, Quantization table: 1 */
749         0x03, 0x11, 0x01, /* ID=3, Subsampling 2x1, Quantization table: 1 */
750
751         0xff, 0xda,     /* SOS: Start Of Scan */
752         0x00, 0x0c,     /* length = 12 bytes (including this length field) */
753         0x03,           /* number of components: 3 */
754         0x01, 0x00,     /* selector 1, table 0x00 */
755         0x02, 0x11,     /* selector 2, table 0x11 */
756         0x03, 0x11,     /* selector 3, table 0x11 */
757         0x00, 0x3f,     /* Spectral selection: 0 .. 63 */
758         0x00            /* Successive approximation: 0 */
759 };
760
761 /* this function is run at interrupt level */
762 static void sd_pkt_scan(struct gspca_dev *gspca_dev,
763                         u8 *data,                       /* isoc packet */
764                         int len)                        /* iso packet length */
765 {
766         struct sd *sd = (struct sd *) gspca_dev;
767         u8 *image;
768         u8 *sof;
769
770         sof = pac_find_sof(&sd->sof_read, data, len);
771         if (sof) {
772                 int n, lum_offset, footer_length;
773
774                 /*
775                  * 6 bytes after the FF D9 EOF marker a number of lumination
776                  * bytes are send corresponding to different parts of the
777                  * image, the 14th and 15th byte after the EOF seem to
778                  * correspond to the center of the image.
779                  */
780                 lum_offset = 61 + sizeof pac_sof_marker;
781                 footer_length = 74;
782
783                 /* Finish decoding current frame */
784                 n = (sof - data) - (footer_length + sizeof pac_sof_marker);
785                 if (n < 0) {
786                         gspca_dev->image_len += n;
787                         n = 0;
788                 } else {
789                         gspca_frame_add(gspca_dev, INTER_PACKET, data, n);
790                 }
791
792                 image = gspca_dev->image;
793                 if (image != NULL
794                  && image[gspca_dev->image_len - 2] == 0xff
795                  && image[gspca_dev->image_len - 1] == 0xd9)
796                         gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
797
798                 n = sof - data;
799                 len -= n;
800                 data = sof;
801
802                 /* Get average lumination */
803                 if (gspca_dev->last_packet_type == LAST_PACKET &&
804                                 n >= lum_offset)
805                         atomic_set(&sd->avg_lum, data[-lum_offset] +
806                                                 data[-lum_offset + 1]);
807
808                 /* Start the new frame with the jpeg header */
809                 /* The PAC7302 has the image rotated 90 degrees */
810                 gspca_frame_add(gspca_dev, FIRST_PACKET,
811                                 jpeg_header, sizeof jpeg_header);
812         }
813         gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
814 }
815
816 #ifdef CONFIG_VIDEO_ADV_DEBUG
817 static int sd_dbg_s_register(struct gspca_dev *gspca_dev,
818                         struct v4l2_dbg_register *reg)
819 {
820         u8 index;
821         u8 value;
822
823         /*
824          * reg->reg: bit0..15: reserved for register index (wIndex is 16bit
825          *                     long on the USB bus)
826          */
827         if (reg->match.type == V4L2_CHIP_MATCH_HOST &&
828             reg->match.addr == 0 &&
829             (reg->reg < 0x000000ff) &&
830             (reg->val <= 0x000000ff)
831         ) {
832                 /* Currently writing to page 0 is only supported. */
833                 /* reg_w() only supports 8bit index */
834                 index = reg->reg;
835                 value = reg->val;
836
837                 /*
838                  * Note that there shall be no access to other page
839                  * by any other function between the page switch and
840                  * the actual register write.
841                  */
842                 reg_w(gspca_dev, 0xff, 0x00);           /* page 0 */
843                 reg_w(gspca_dev, index, value);
844
845                 reg_w(gspca_dev, 0xdc, 0x01);
846         }
847         return gspca_dev->usb_err;
848 }
849
850 static int sd_chip_ident(struct gspca_dev *gspca_dev,
851                         struct v4l2_dbg_chip_ident *chip)
852 {
853         int ret = -EINVAL;
854
855         if (chip->match.type == V4L2_CHIP_MATCH_HOST &&
856             chip->match.addr == 0) {
857                 chip->revision = 0;
858                 chip->ident = V4L2_IDENT_UNKNOWN;
859                 ret = 0;
860         }
861         return ret;
862 }
863 #endif
864
865 #if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
866 static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
867                         u8 *data,               /* interrupt packet data */
868                         int len)                /* interrput packet length */
869 {
870         int ret = -EINVAL;
871         u8 data0, data1;
872
873         if (len == 2) {
874                 data0 = data[0];
875                 data1 = data[1];
876                 if ((data0 == 0x00 && data1 == 0x11) ||
877                     (data0 == 0x22 && data1 == 0x33) ||
878                     (data0 == 0x44 && data1 == 0x55) ||
879                     (data0 == 0x66 && data1 == 0x77) ||
880                     (data0 == 0x88 && data1 == 0x99) ||
881                     (data0 == 0xaa && data1 == 0xbb) ||
882                     (data0 == 0xcc && data1 == 0xdd) ||
883                     (data0 == 0xee && data1 == 0xff)) {
884                         input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
885                         input_sync(gspca_dev->input_dev);
886                         input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
887                         input_sync(gspca_dev->input_dev);
888                         ret = 0;
889                 }
890         }
891
892         return ret;
893 }
894 #endif
895
896 /* sub-driver description for pac7302 */
897 static const struct sd_desc sd_desc = {
898         .name = KBUILD_MODNAME,
899         .config = sd_config,
900         .init = sd_init,
901         .init_controls = sd_init_controls,
902         .start = sd_start,
903         .stopN = sd_stopN,
904         .stop0 = sd_stop0,
905         .pkt_scan = sd_pkt_scan,
906         .dq_callback = do_autogain,
907 #ifdef CONFIG_VIDEO_ADV_DEBUG
908         .set_register = sd_dbg_s_register,
909         .get_chip_ident = sd_chip_ident,
910 #endif
911 #if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
912         .int_pkt_scan = sd_int_pkt_scan,
913 #endif
914 };
915
916 /* -- module initialisation -- */
917 static const struct usb_device_id device_table[] = {
918         {USB_DEVICE(0x06f8, 0x3009)},
919         {USB_DEVICE(0x06f8, 0x301b)},
920         {USB_DEVICE(0x093a, 0x2620)},
921         {USB_DEVICE(0x093a, 0x2621)},
922         {USB_DEVICE(0x093a, 0x2622), .driver_info = FL_VFLIP},
923         {USB_DEVICE(0x093a, 0x2624), .driver_info = FL_VFLIP},
924         {USB_DEVICE(0x093a, 0x2625)},
925         {USB_DEVICE(0x093a, 0x2626)},
926         {USB_DEVICE(0x093a, 0x2627), .driver_info = FL_VFLIP},
927         {USB_DEVICE(0x093a, 0x2628)},
928         {USB_DEVICE(0x093a, 0x2629), .driver_info = FL_VFLIP},
929         {USB_DEVICE(0x093a, 0x262a)},
930         {USB_DEVICE(0x093a, 0x262c)},
931         {USB_DEVICE(0x145f, 0x013c)},
932         {USB_DEVICE(0x1ae7, 0x2001)}, /* SpeedLink Snappy Mic SL-6825-SBK */
933         {}
934 };
935 MODULE_DEVICE_TABLE(usb, device_table);
936
937 /* -- device connect -- */
938 static int sd_probe(struct usb_interface *intf,
939                         const struct usb_device_id *id)
940 {
941         return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
942                                 THIS_MODULE);
943 }
944
945 static struct usb_driver sd_driver = {
946         .name = KBUILD_MODNAME,
947         .id_table = device_table,
948         .probe = sd_probe,
949         .disconnect = gspca_disconnect,
950 #ifdef CONFIG_PM
951         .suspend = gspca_suspend,
952         .resume = gspca_resume,
953         .reset_resume = gspca_resume,
954 #endif
955 };
956
957 module_usb_driver(sd_driver);