Merge branch 'for-linus-4.11' of git://git.kernel.org/pub/scm/linux/kernel/git/mason...
[sfrench/cifs-2.6.git] / drivers / media / usb / gspca / pac7311.c
1 /*
2  *              Pixart PAC7311 library
3  *              Copyright (C) 2005 Thomas Kaiser thomas@kaiser-linux.li
4  *
5  * V4L2 by Jean-Francois Moine <http://moinejf.free.fr>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  */
17
18 /* Some documentation about various registers as determined by trial and error.
19  *
20  * Register page 1:
21  *
22  * Address      Description
23  * 0x08         Unknown compressor related, must always be 8 except when not
24  *              in 640x480 resolution and page 4 reg 2 <= 3 then set it to 9 !
25  * 0x1b         Auto white balance related, bit 0 is AWB enable (inverted)
26  *              bits 345 seem to toggle per color gains on/off (inverted)
27  * 0x78         Global control, bit 6 controls the LED (inverted)
28  * 0x80         Compression balance, interesting settings:
29  *              0x01 Use this to allow the camera to switch to higher compr.
30  *                   on the fly. Needed to stay within bandwidth @ 640x480@30
31  *              0x1c From usb captures under Windows for 640x480
32  *              0x2a Values >= this switch the camera to a lower compression,
33  *                   using the same table for both luminance and chrominance.
34  *                   This gives a sharper picture. Usable only at 640x480@ <
35  *                   15 fps or 320x240 / 160x120. Note currently the driver
36  *                   does not use this as the quality gain is small and the
37  *                   generated JPG-s are only understood by v4l-utils >= 0.8.9
38  *              0x3f From usb captures under Windows for 320x240
39  *              0x69 From usb captures under Windows for 160x120
40  *
41  * Register page 4:
42  *
43  * Address      Description
44  * 0x02         Clock divider 2-63, fps =~ 60 / val. Must be a multiple of 3 on
45  *              the 7302, so one of 3, 6, 9, ..., except when between 6 and 12?
46  * 0x0f         Master gain 1-245, low value = high gain
47  * 0x10         Another gain 0-15, limited influence (1-2x gain I guess)
48  * 0x21         Bitfield: 0-1 unused, 2-3 vflip/hflip, 4-5 unknown, 6-7 unused
49  *              Note setting vflip disabled leads to a much lower image quality,
50  *              so we always vflip, and tell userspace to flip it back
51  * 0x27         Seems to toggle various gains on / off, Setting bit 7 seems to
52  *              completely disable the analog amplification block. Set to 0x68
53  *              for max gain, 0x14 for minimal gain.
54  */
55
56 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
57
58 #define MODULE_NAME "pac7311"
59
60 #include <linux/input.h>
61 #include "gspca.h"
62 /* Include pac common sof detection functions */
63 #include "pac_common.h"
64
65 #define PAC7311_GAIN_DEFAULT     122
66 #define PAC7311_EXPOSURE_DEFAULT   3 /* 20 fps, avoid using high compr. */
67
68 MODULE_AUTHOR("Thomas Kaiser thomas@kaiser-linux.li");
69 MODULE_DESCRIPTION("Pixart PAC7311");
70 MODULE_LICENSE("GPL");
71
72 struct sd {
73         struct gspca_dev gspca_dev;             /* !! must be the first item */
74
75         struct v4l2_ctrl *contrast;
76         struct v4l2_ctrl *hflip;
77
78         u8 sof_read;
79         u8 autogain_ignore_frames;
80
81         atomic_t avg_lum;
82 };
83
84 static const struct v4l2_pix_format vga_mode[] = {
85         {160, 120, V4L2_PIX_FMT_PJPG, V4L2_FIELD_NONE,
86                 .bytesperline = 160,
87                 .sizeimage = 160 * 120 * 3 / 8 + 590,
88                 .colorspace = V4L2_COLORSPACE_JPEG,
89                 .priv = 2},
90         {320, 240, V4L2_PIX_FMT_PJPG, V4L2_FIELD_NONE,
91                 .bytesperline = 320,
92                 .sizeimage = 320 * 240 * 3 / 8 + 590,
93                 .colorspace = V4L2_COLORSPACE_JPEG,
94                 .priv = 1},
95         {640, 480, V4L2_PIX_FMT_PJPG, V4L2_FIELD_NONE,
96                 .bytesperline = 640,
97                 .sizeimage = 640 * 480 * 3 / 8 + 590,
98                 .colorspace = V4L2_COLORSPACE_JPEG,
99                 .priv = 0},
100 };
101
102 #define LOAD_PAGE4              254
103 #define END_OF_SEQUENCE         0
104
105 static const __u8 init_7311[] = {
106         0xff, 0x01,
107         0x78, 0x40,     /* Bit_0=start stream, Bit_6=LED */
108         0x78, 0x40,     /* Bit_0=start stream, Bit_6=LED */
109         0x78, 0x44,     /* Bit_0=start stream, Bit_6=LED */
110         0xff, 0x04,
111         0x27, 0x80,
112         0x28, 0xca,
113         0x29, 0x53,
114         0x2a, 0x0e,
115         0xff, 0x01,
116         0x3e, 0x20,
117 };
118
119 static const __u8 start_7311[] = {
120 /*      index, len, [value]* */
121         0xff, 1,        0x01,           /* page 1 */
122         0x02, 43,       0x48, 0x0a, 0x40, 0x08, 0x00, 0x00, 0x08, 0x00,
123                         0x06, 0xff, 0x11, 0xff, 0x5a, 0x30, 0x90, 0x4c,
124                         0x00, 0x07, 0x00, 0x0a, 0x10, 0x00, 0xa0, 0x10,
125                         0x02, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x01, 0x00,
126                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
127                         0x00, 0x00, 0x00,
128         0x3e, 42,       0x00, 0x00, 0x78, 0x52, 0x4a, 0x52, 0x78, 0x6e,
129                         0x48, 0x46, 0x48, 0x6e, 0x5f, 0x49, 0x42, 0x49,
130                         0x5f, 0x5f, 0x49, 0x42, 0x49, 0x5f, 0x6e, 0x48,
131                         0x46, 0x48, 0x6e, 0x78, 0x52, 0x4a, 0x52, 0x78,
132                         0x00, 0x00, 0x09, 0x1b, 0x34, 0x49, 0x5c, 0x9b,
133                         0xd0, 0xff,
134         0x78, 6,        0x44, 0x00, 0xf2, 0x01, 0x01, 0x80,
135         0x7f, 18,       0x2a, 0x1c, 0x00, 0xc8, 0x02, 0x58, 0x03, 0x84,
136                         0x12, 0x00, 0x1a, 0x04, 0x08, 0x0c, 0x10, 0x14,
137                         0x18, 0x20,
138         0x96, 3,        0x01, 0x08, 0x04,
139         0xa0, 4,        0x44, 0x44, 0x44, 0x04,
140         0xf0, 13,       0x01, 0x00, 0x00, 0x00, 0x22, 0x00, 0x20, 0x00,
141                         0x3f, 0x00, 0x0a, 0x01, 0x00,
142         0xff, 1,        0x04,           /* page 4 */
143         0, LOAD_PAGE4,                  /* load the page 4 */
144         0x11, 1,        0x01,
145         0, END_OF_SEQUENCE              /* end of sequence */
146 };
147
148 #define SKIP            0xaa
149 /* page 4 - the value SKIP says skip the index - see reg_w_page() */
150 static const __u8 page4_7311[] = {
151         SKIP, SKIP, 0x04, 0x54, 0x07, 0x2b, 0x09, 0x0f,
152         0x09, 0x00, SKIP, SKIP, 0x07, 0x00, 0x00, 0x62,
153         0x08, SKIP, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
154         0x00, 0x00, 0x00, 0x03, 0xa0, 0x01, 0xf4, SKIP,
155         SKIP, 0x00, 0x08, SKIP, 0x03, SKIP, 0x00, 0x68,
156         0xca, 0x10, 0x06, 0x78, 0x00, 0x00, 0x00, 0x00,
157         0x23, 0x28, 0x04, 0x11, 0x00, 0x00
158 };
159
160 static void reg_w_buf(struct gspca_dev *gspca_dev,
161                   __u8 index,
162                   const u8 *buffer, int len)
163 {
164         int ret;
165
166         if (gspca_dev->usb_err < 0)
167                 return;
168         memcpy(gspca_dev->usb_buf, buffer, len);
169         ret = usb_control_msg(gspca_dev->dev,
170                         usb_sndctrlpipe(gspca_dev->dev, 0),
171                         0,              /* request */
172                         USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
173                         0,              /* value */
174                         index, gspca_dev->usb_buf, len,
175                         500);
176         if (ret < 0) {
177                 pr_err("reg_w_buf() failed index 0x%02x, error %d\n",
178                        index, ret);
179                 gspca_dev->usb_err = ret;
180         }
181 }
182
183
184 static void reg_w(struct gspca_dev *gspca_dev,
185                   __u8 index,
186                   __u8 value)
187 {
188         int ret;
189
190         if (gspca_dev->usb_err < 0)
191                 return;
192         gspca_dev->usb_buf[0] = value;
193         ret = usb_control_msg(gspca_dev->dev,
194                         usb_sndctrlpipe(gspca_dev->dev, 0),
195                         0,                      /* request */
196                         USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
197                         0, index, gspca_dev->usb_buf, 1,
198                         500);
199         if (ret < 0) {
200                 pr_err("reg_w() failed index 0x%02x, value 0x%02x, error %d\n",
201                        index, value, ret);
202                 gspca_dev->usb_err = ret;
203         }
204 }
205
206 static void reg_w_seq(struct gspca_dev *gspca_dev,
207                 const __u8 *seq, int len)
208 {
209         while (--len >= 0) {
210                 reg_w(gspca_dev, seq[0], seq[1]);
211                 seq += 2;
212         }
213 }
214
215 /* load the beginning of a page */
216 static void reg_w_page(struct gspca_dev *gspca_dev,
217                         const __u8 *page, int len)
218 {
219         int index;
220         int ret = 0;
221
222         if (gspca_dev->usb_err < 0)
223                 return;
224         for (index = 0; index < len; index++) {
225                 if (page[index] == SKIP)                /* skip this index */
226                         continue;
227                 gspca_dev->usb_buf[0] = page[index];
228                 ret = usb_control_msg(gspca_dev->dev,
229                                 usb_sndctrlpipe(gspca_dev->dev, 0),
230                                 0,                      /* request */
231                         USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
232                                 0, index, gspca_dev->usb_buf, 1,
233                                 500);
234                 if (ret < 0) {
235                         pr_err("reg_w_page() failed index 0x%02x, value 0x%02x, error %d\n",
236                                index, page[index], ret);
237                         gspca_dev->usb_err = ret;
238                         break;
239                 }
240         }
241 }
242
243 /* output a variable sequence */
244 static void reg_w_var(struct gspca_dev *gspca_dev,
245                         const __u8 *seq,
246                         const __u8 *page4, unsigned int page4_len)
247 {
248         int index, len;
249
250         for (;;) {
251                 index = *seq++;
252                 len = *seq++;
253                 switch (len) {
254                 case END_OF_SEQUENCE:
255                         return;
256                 case LOAD_PAGE4:
257                         reg_w_page(gspca_dev, page4, page4_len);
258                         break;
259                 default:
260                         if (len > USB_BUF_SZ) {
261                                 PERR("Incorrect variable sequence");
262                                 return;
263                         }
264                         while (len > 0) {
265                                 if (len < 8) {
266                                         reg_w_buf(gspca_dev,
267                                                 index, seq, len);
268                                         seq += len;
269                                         break;
270                                 }
271                                 reg_w_buf(gspca_dev, index, seq, 8);
272                                 seq += 8;
273                                 index += 8;
274                                 len -= 8;
275                         }
276                 }
277         }
278         /* not reached */
279 }
280
281 /* this function is called at probe time for pac7311 */
282 static int sd_config(struct gspca_dev *gspca_dev,
283                         const struct usb_device_id *id)
284 {
285         struct cam *cam = &gspca_dev->cam;
286
287         cam->cam_mode = vga_mode;
288         cam->nmodes = ARRAY_SIZE(vga_mode);
289         cam->input_flags = V4L2_IN_ST_VFLIP;
290
291         return 0;
292 }
293
294 static void setcontrast(struct gspca_dev *gspca_dev, s32 val)
295 {
296         reg_w(gspca_dev, 0xff, 0x04);
297         reg_w(gspca_dev, 0x10, val);
298         /* load registers to sensor (Bit 0, auto clear) */
299         reg_w(gspca_dev, 0x11, 0x01);
300 }
301
302 static void setgain(struct gspca_dev *gspca_dev, s32 val)
303 {
304         reg_w(gspca_dev, 0xff, 0x04);                   /* page 4 */
305         reg_w(gspca_dev, 0x0e, 0x00);
306         reg_w(gspca_dev, 0x0f, gspca_dev->gain->maximum - val + 1);
307
308         /* load registers to sensor (Bit 0, auto clear) */
309         reg_w(gspca_dev, 0x11, 0x01);
310 }
311
312 static void setexposure(struct gspca_dev *gspca_dev, s32 val)
313 {
314         reg_w(gspca_dev, 0xff, 0x04);                   /* page 4 */
315         reg_w(gspca_dev, 0x02, val);
316
317         /* load registers to sensor (Bit 0, auto clear) */
318         reg_w(gspca_dev, 0x11, 0x01);
319
320         /*
321          * Page 1 register 8 must always be 0x08 except when not in
322          *  640x480 mode and page 4 reg 2 <= 3 then it must be 9
323          */
324         reg_w(gspca_dev, 0xff, 0x01);
325         if (gspca_dev->pixfmt.width != 640 && val <= 3)
326                 reg_w(gspca_dev, 0x08, 0x09);
327         else
328                 reg_w(gspca_dev, 0x08, 0x08);
329
330         /*
331          * Page1 register 80 sets the compression balance, normally we
332          * want / use 0x1c, but for 640x480@30fps we must allow the
333          * camera to use higher compression or we may run out of
334          * bandwidth.
335          */
336         if (gspca_dev->pixfmt.width == 640 && val == 2)
337                 reg_w(gspca_dev, 0x80, 0x01);
338         else
339                 reg_w(gspca_dev, 0x80, 0x1c);
340
341         /* load registers to sensor (Bit 0, auto clear) */
342         reg_w(gspca_dev, 0x11, 0x01);
343 }
344
345 static void sethvflip(struct gspca_dev *gspca_dev, s32 hflip, s32 vflip)
346 {
347         __u8 data;
348
349         reg_w(gspca_dev, 0xff, 0x04);                   /* page 4 */
350         data = (hflip ? 0x04 : 0x00) |
351                (vflip ? 0x08 : 0x00);
352         reg_w(gspca_dev, 0x21, data);
353
354         /* load registers to sensor (Bit 0, auto clear) */
355         reg_w(gspca_dev, 0x11, 0x01);
356 }
357
358 /* this function is called at probe and resume time for pac7311 */
359 static int sd_init(struct gspca_dev *gspca_dev)
360 {
361         reg_w_seq(gspca_dev, init_7311, sizeof(init_7311)/2);
362         return gspca_dev->usb_err;
363 }
364
365 static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
366 {
367         struct gspca_dev *gspca_dev =
368                 container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
369         struct sd *sd = (struct sd *)gspca_dev;
370
371         gspca_dev->usb_err = 0;
372
373         if (ctrl->id == V4L2_CID_AUTOGAIN && ctrl->is_new && ctrl->val) {
374                 /* when switching to autogain set defaults to make sure
375                    we are on a valid point of the autogain gain /
376                    exposure knee graph, and give this change time to
377                    take effect before doing autogain. */
378                 gspca_dev->exposure->val    = PAC7311_EXPOSURE_DEFAULT;
379                 gspca_dev->gain->val        = PAC7311_GAIN_DEFAULT;
380                 sd->autogain_ignore_frames  = PAC_AUTOGAIN_IGNORE_FRAMES;
381         }
382
383         if (!gspca_dev->streaming)
384                 return 0;
385
386         switch (ctrl->id) {
387         case V4L2_CID_CONTRAST:
388                 setcontrast(gspca_dev, ctrl->val);
389                 break;
390         case V4L2_CID_AUTOGAIN:
391                 if (gspca_dev->exposure->is_new || (ctrl->is_new && ctrl->val))
392                         setexposure(gspca_dev, gspca_dev->exposure->val);
393                 if (gspca_dev->gain->is_new || (ctrl->is_new && ctrl->val))
394                         setgain(gspca_dev, gspca_dev->gain->val);
395                 break;
396         case V4L2_CID_HFLIP:
397                 sethvflip(gspca_dev, sd->hflip->val, 1);
398                 break;
399         default:
400                 return -EINVAL;
401         }
402         return gspca_dev->usb_err;
403 }
404
405 static const struct v4l2_ctrl_ops sd_ctrl_ops = {
406         .s_ctrl = sd_s_ctrl,
407 };
408
409 /* this function is called at probe time */
410 static int sd_init_controls(struct gspca_dev *gspca_dev)
411 {
412         struct sd *sd = (struct sd *) gspca_dev;
413         struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
414
415         gspca_dev->vdev.ctrl_handler = hdl;
416         v4l2_ctrl_handler_init(hdl, 5);
417
418         sd->contrast = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
419                                         V4L2_CID_CONTRAST, 0, 15, 1, 7);
420         gspca_dev->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
421                                         V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
422         gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
423                                         V4L2_CID_EXPOSURE, 2, 63, 1,
424                                         PAC7311_EXPOSURE_DEFAULT);
425         gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
426                                         V4L2_CID_GAIN, 0, 244, 1,
427                                         PAC7311_GAIN_DEFAULT);
428         sd->hflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
429                 V4L2_CID_HFLIP, 0, 1, 1, 0);
430
431         if (hdl->error) {
432                 pr_err("Could not initialize controls\n");
433                 return hdl->error;
434         }
435
436         v4l2_ctrl_auto_cluster(3, &gspca_dev->autogain, 0, false);
437         return 0;
438 }
439
440 /* -- start the camera -- */
441 static int sd_start(struct gspca_dev *gspca_dev)
442 {
443         struct sd *sd = (struct sd *) gspca_dev;
444
445         sd->sof_read = 0;
446
447         reg_w_var(gspca_dev, start_7311,
448                 page4_7311, sizeof(page4_7311));
449         setcontrast(gspca_dev, v4l2_ctrl_g_ctrl(sd->contrast));
450         setgain(gspca_dev, v4l2_ctrl_g_ctrl(gspca_dev->gain));
451         setexposure(gspca_dev, v4l2_ctrl_g_ctrl(gspca_dev->exposure));
452         sethvflip(gspca_dev, v4l2_ctrl_g_ctrl(sd->hflip), 1);
453
454         /* set correct resolution */
455         switch (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) {
456         case 2:                                 /* 160x120 */
457                 reg_w(gspca_dev, 0xff, 0x01);
458                 reg_w(gspca_dev, 0x17, 0x20);
459                 reg_w(gspca_dev, 0x87, 0x10);
460                 break;
461         case 1:                                 /* 320x240 */
462                 reg_w(gspca_dev, 0xff, 0x01);
463                 reg_w(gspca_dev, 0x17, 0x30);
464                 reg_w(gspca_dev, 0x87, 0x11);
465                 break;
466         case 0:                                 /* 640x480 */
467                 reg_w(gspca_dev, 0xff, 0x01);
468                 reg_w(gspca_dev, 0x17, 0x00);
469                 reg_w(gspca_dev, 0x87, 0x12);
470                 break;
471         }
472
473         sd->sof_read = 0;
474         sd->autogain_ignore_frames = 0;
475         atomic_set(&sd->avg_lum, -1);
476
477         /* start stream */
478         reg_w(gspca_dev, 0xff, 0x01);
479         reg_w(gspca_dev, 0x78, 0x05);
480
481         return gspca_dev->usb_err;
482 }
483
484 static void sd_stopN(struct gspca_dev *gspca_dev)
485 {
486         reg_w(gspca_dev, 0xff, 0x04);
487         reg_w(gspca_dev, 0x27, 0x80);
488         reg_w(gspca_dev, 0x28, 0xca);
489         reg_w(gspca_dev, 0x29, 0x53);
490         reg_w(gspca_dev, 0x2a, 0x0e);
491         reg_w(gspca_dev, 0xff, 0x01);
492         reg_w(gspca_dev, 0x3e, 0x20);
493         reg_w(gspca_dev, 0x78, 0x44); /* Bit_0=start stream, Bit_6=LED */
494         reg_w(gspca_dev, 0x78, 0x44); /* Bit_0=start stream, Bit_6=LED */
495         reg_w(gspca_dev, 0x78, 0x44); /* Bit_0=start stream, Bit_6=LED */
496 }
497
498 static void do_autogain(struct gspca_dev *gspca_dev)
499 {
500         struct sd *sd = (struct sd *) gspca_dev;
501         int avg_lum = atomic_read(&sd->avg_lum);
502         int desired_lum, deadzone;
503
504         if (avg_lum == -1)
505                 return;
506
507         desired_lum = 170;
508         deadzone = 20;
509
510         if (sd->autogain_ignore_frames > 0)
511                 sd->autogain_ignore_frames--;
512         else if (gspca_coarse_grained_expo_autogain(gspca_dev, avg_lum,
513                                                     desired_lum, deadzone))
514                 sd->autogain_ignore_frames = PAC_AUTOGAIN_IGNORE_FRAMES;
515 }
516
517 /* JPEG header, part 1 */
518 static const unsigned char pac_jpeg_header1[] = {
519   0xff, 0xd8,           /* SOI: Start of Image */
520
521   0xff, 0xc0,           /* SOF0: Start of Frame (Baseline DCT) */
522   0x00, 0x11,           /* length = 17 bytes (including this length field) */
523   0x08                  /* Precision: 8 */
524   /* 2 bytes is placed here: number of image lines */
525   /* 2 bytes is placed here: samples per line */
526 };
527
528 /* JPEG header, continued */
529 static const unsigned char pac_jpeg_header2[] = {
530   0x03,                 /* Number of image components: 3 */
531   0x01, 0x21, 0x00,     /* ID=1, Subsampling 1x1, Quantization table: 0 */
532   0x02, 0x11, 0x01,     /* ID=2, Subsampling 2x1, Quantization table: 1 */
533   0x03, 0x11, 0x01,     /* ID=3, Subsampling 2x1, Quantization table: 1 */
534
535   0xff, 0xda,           /* SOS: Start Of Scan */
536   0x00, 0x0c,           /* length = 12 bytes (including this length field) */
537   0x03,                 /* number of components: 3 */
538   0x01, 0x00,           /* selector 1, table 0x00 */
539   0x02, 0x11,           /* selector 2, table 0x11 */
540   0x03, 0x11,           /* selector 3, table 0x11 */
541   0x00, 0x3f,           /* Spectral selection: 0 .. 63 */
542   0x00                  /* Successive approximation: 0 */
543 };
544
545 static void pac_start_frame(struct gspca_dev *gspca_dev,
546                 __u16 lines, __u16 samples_per_line)
547 {
548         unsigned char tmpbuf[4];
549
550         gspca_frame_add(gspca_dev, FIRST_PACKET,
551                 pac_jpeg_header1, sizeof(pac_jpeg_header1));
552
553         tmpbuf[0] = lines >> 8;
554         tmpbuf[1] = lines & 0xff;
555         tmpbuf[2] = samples_per_line >> 8;
556         tmpbuf[3] = samples_per_line & 0xff;
557
558         gspca_frame_add(gspca_dev, INTER_PACKET,
559                 tmpbuf, sizeof(tmpbuf));
560         gspca_frame_add(gspca_dev, INTER_PACKET,
561                 pac_jpeg_header2, sizeof(pac_jpeg_header2));
562 }
563
564 /* this function is run at interrupt level */
565 static void sd_pkt_scan(struct gspca_dev *gspca_dev,
566                         u8 *data,                       /* isoc packet */
567                         int len)                        /* iso packet length */
568 {
569         struct sd *sd = (struct sd *) gspca_dev;
570         u8 *image;
571         unsigned char *sof;
572
573         sof = pac_find_sof(gspca_dev, &sd->sof_read, data, len);
574         if (sof) {
575                 int n, lum_offset, footer_length;
576
577                 /*
578                  * 6 bytes after the FF D9 EOF marker a number of lumination
579                  * bytes are send corresponding to different parts of the
580                  * image, the 14th and 15th byte after the EOF seem to
581                  * correspond to the center of the image.
582                  */
583                 lum_offset = 24 + sizeof pac_sof_marker;
584                 footer_length = 26;
585
586                 /* Finish decoding current frame */
587                 n = (sof - data) - (footer_length + sizeof pac_sof_marker);
588                 if (n < 0) {
589                         gspca_dev->image_len += n;
590                         n = 0;
591                 } else {
592                         gspca_frame_add(gspca_dev, INTER_PACKET, data, n);
593                 }
594                 image = gspca_dev->image;
595                 if (image != NULL
596                  && image[gspca_dev->image_len - 2] == 0xff
597                  && image[gspca_dev->image_len - 1] == 0xd9)
598                         gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
599
600                 n = sof - data;
601                 len -= n;
602                 data = sof;
603
604                 /* Get average lumination */
605                 if (gspca_dev->last_packet_type == LAST_PACKET &&
606                                 n >= lum_offset)
607                         atomic_set(&sd->avg_lum, data[-lum_offset] +
608                                                 data[-lum_offset + 1]);
609                 else
610                         atomic_set(&sd->avg_lum, -1);
611
612                 /* Start the new frame with the jpeg header */
613                 pac_start_frame(gspca_dev,
614                         gspca_dev->pixfmt.height, gspca_dev->pixfmt.width);
615         }
616         gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
617 }
618
619 #if IS_ENABLED(CONFIG_INPUT)
620 static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
621                         u8 *data,               /* interrupt packet data */
622                         int len)                /* interrupt packet length */
623 {
624         int ret = -EINVAL;
625         u8 data0, data1;
626
627         if (len == 2) {
628                 data0 = data[0];
629                 data1 = data[1];
630                 if ((data0 == 0x00 && data1 == 0x11) ||
631                     (data0 == 0x22 && data1 == 0x33) ||
632                     (data0 == 0x44 && data1 == 0x55) ||
633                     (data0 == 0x66 && data1 == 0x77) ||
634                     (data0 == 0x88 && data1 == 0x99) ||
635                     (data0 == 0xaa && data1 == 0xbb) ||
636                     (data0 == 0xcc && data1 == 0xdd) ||
637                     (data0 == 0xee && data1 == 0xff)) {
638                         input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
639                         input_sync(gspca_dev->input_dev);
640                         input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
641                         input_sync(gspca_dev->input_dev);
642                         ret = 0;
643                 }
644         }
645
646         return ret;
647 }
648 #endif
649
650 static const struct sd_desc sd_desc = {
651         .name = MODULE_NAME,
652         .config = sd_config,
653         .init = sd_init,
654         .init_controls = sd_init_controls,
655         .start = sd_start,
656         .stopN = sd_stopN,
657         .pkt_scan = sd_pkt_scan,
658         .dq_callback = do_autogain,
659 #if IS_ENABLED(CONFIG_INPUT)
660         .int_pkt_scan = sd_int_pkt_scan,
661 #endif
662 };
663
664 /* -- module initialisation -- */
665 static const struct usb_device_id device_table[] = {
666         {USB_DEVICE(0x093a, 0x2600)},
667         {USB_DEVICE(0x093a, 0x2601)},
668         {USB_DEVICE(0x093a, 0x2603)},
669         {USB_DEVICE(0x093a, 0x2608)},
670         {USB_DEVICE(0x093a, 0x260e)},
671         {USB_DEVICE(0x093a, 0x260f)},
672         {}
673 };
674 MODULE_DEVICE_TABLE(usb, device_table);
675
676 /* -- device connect -- */
677 static int sd_probe(struct usb_interface *intf,
678                         const struct usb_device_id *id)
679 {
680         return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
681                                 THIS_MODULE);
682 }
683
684 static struct usb_driver sd_driver = {
685         .name = MODULE_NAME,
686         .id_table = device_table,
687         .probe = sd_probe,
688         .disconnect = gspca_disconnect,
689 #ifdef CONFIG_PM
690         .suspend = gspca_suspend,
691         .resume = gspca_resume,
692         .reset_resume = gspca_resume,
693 #endif
694 };
695
696 module_usb_driver(sd_driver);