Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / drivers / media / usb / pwc / pwc-if.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* Linux driver for Philips webcam
3    USB and Video4Linux interface part.
4    (C) 1999-2004 Nemosoft Unv.
5    (C) 2004-2006 Luc Saillard (luc@saillard.org)
6    (C) 2011 Hans de Goede <hdegoede@redhat.com>
7
8    NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx
9    driver and thus may have bugs that are not present in the original version.
10    Please send bug reports and support requests to <luc@saillard.org>.
11    The decompression routines have been implemented by reverse-engineering the
12    Nemosoft binary pwcx module. Caveat emptor.
13
14
15 */
16
17 /*
18    This code forms the interface between the USB layers and the Philips
19    specific stuff. Some adanved stuff of the driver falls under an
20    NDA, signed between me and Philips B.V., Eindhoven, the Netherlands, and
21    is thus not distributed in source form. The binary pwcx.o module
22    contains the code that falls under the NDA.
23
24    In case you're wondering: 'pwc' stands for "Philips WebCam", but
25    I really didn't want to type 'philips_web_cam' every time (I'm lazy as
26    any Linux kernel hacker, but I don't like uncomprehensible abbreviations
27    without explanation).
28
29    Oh yes, convention: to disctinguish between all the various pointers to
30    device-structures, I use these names for the pointer variables:
31    udev: struct usb_device *
32    vdev: struct video_device (member of pwc_dev)
33    pdev: struct pwc_devive *
34 */
35
36 /* Contributors:
37    - Alvarado: adding whitebalance code
38    - Alistar Moire: QuickCam 3000 Pro device/product ID
39    - Tony Hoyle: Creative Labs Webcam 5 device/product ID
40    - Mark Burazin: solving hang in VIDIOCSYNC when camera gets unplugged
41    - Jk Fang: Sotec Afina Eye ID
42    - Xavier Roche: QuickCam Pro 4000 ID
43    - Jens Knudsen: QuickCam Zoom ID
44    - J. Debert: QuickCam for Notebooks ID
45    - Pham Thanh Nam: webcam snapshot button as an event input device
46 */
47
48 #include <linux/errno.h>
49 #include <linux/init.h>
50 #include <linux/mm.h>
51 #include <linux/module.h>
52 #include <linux/poll.h>
53 #include <linux/slab.h>
54 #ifdef CONFIG_USB_PWC_INPUT_EVDEV
55 #include <linux/usb/input.h>
56 #endif
57 #include <linux/vmalloc.h>
58 #include <asm/io.h>
59 #include <linux/kernel.h>               /* simple_strtol() */
60
61 #include "pwc.h"
62 #include "pwc-kiara.h"
63 #include "pwc-timon.h"
64 #include "pwc-dec23.h"
65 #include "pwc-dec1.h"
66
67 #define CREATE_TRACE_POINTS
68 #include <trace/events/pwc.h>
69
70 /* Function prototypes and driver templates */
71
72 /* hotplug device table support */
73 static const struct usb_device_id pwc_device_table [] = {
74         { USB_DEVICE(0x0471, 0x0302) }, /* Philips models */
75         { USB_DEVICE(0x0471, 0x0303) },
76         { USB_DEVICE(0x0471, 0x0304) },
77         { USB_DEVICE(0x0471, 0x0307) },
78         { USB_DEVICE(0x0471, 0x0308) },
79         { USB_DEVICE(0x0471, 0x030C) },
80         { USB_DEVICE(0x0471, 0x0310) },
81         { USB_DEVICE(0x0471, 0x0311) }, /* Philips ToUcam PRO II */
82         { USB_DEVICE(0x0471, 0x0312) },
83         { USB_DEVICE(0x0471, 0x0313) }, /* the 'new' 720K */
84         { USB_DEVICE(0x0471, 0x0329) }, /* Philips SPC 900NC PC Camera */
85         { USB_DEVICE(0x0471, 0x032C) }, /* Philips SPC 880NC PC Camera */
86         { USB_DEVICE(0x069A, 0x0001) }, /* Askey */
87         { USB_DEVICE(0x046D, 0x08B0) }, /* Logitech QuickCam Pro 3000 */
88         { USB_DEVICE(0x046D, 0x08B1) }, /* Logitech QuickCam Notebook Pro */
89         { USB_DEVICE(0x046D, 0x08B2) }, /* Logitech QuickCam Pro 4000 */
90         { USB_DEVICE(0x046D, 0x08B3) }, /* Logitech QuickCam Zoom (old model) */
91         { USB_DEVICE(0x046D, 0x08B4) }, /* Logitech QuickCam Zoom (new model) */
92         { USB_DEVICE(0x046D, 0x08B5) }, /* Logitech QuickCam Orbit/Sphere */
93         { USB_DEVICE(0x046D, 0x08B6) }, /* Cisco VT Camera */
94         { USB_DEVICE(0x046D, 0x08B7) }, /* Logitech ViewPort AV 100 */
95         { USB_DEVICE(0x046D, 0x08B8) }, /* Logitech (reserved) */
96         { USB_DEVICE(0x055D, 0x9000) }, /* Samsung MPC-C10 */
97         { USB_DEVICE(0x055D, 0x9001) }, /* Samsung MPC-C30 */
98         { USB_DEVICE(0x055D, 0x9002) }, /* Samsung SNC-35E (Ver3.0) */
99         { USB_DEVICE(0x041E, 0x400C) }, /* Creative Webcam 5 */
100         { USB_DEVICE(0x041E, 0x4011) }, /* Creative Webcam Pro Ex */
101         { USB_DEVICE(0x04CC, 0x8116) }, /* Afina Eye */
102         { USB_DEVICE(0x06BE, 0x8116) }, /* new Afina Eye */
103         { USB_DEVICE(0x0d81, 0x1910) }, /* Visionite */
104         { USB_DEVICE(0x0d81, 0x1900) },
105         { }
106 };
107 MODULE_DEVICE_TABLE(usb, pwc_device_table);
108
109 static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id *id);
110 static void usb_pwc_disconnect(struct usb_interface *intf);
111 static void pwc_isoc_cleanup(struct pwc_device *pdev);
112
113 static struct usb_driver pwc_driver = {
114         .name =                 "Philips webcam",       /* name */
115         .id_table =             pwc_device_table,
116         .probe =                usb_pwc_probe,          /* probe() */
117         .disconnect =           usb_pwc_disconnect,     /* disconnect() */
118 };
119
120 #define MAX_DEV_HINTS   20
121 #define MAX_ISOC_ERRORS 20
122
123 #ifdef CONFIG_USB_PWC_DEBUG
124         int pwc_trace = PWC_DEBUG_LEVEL;
125 #endif
126 static int power_save = -1;
127 static int leds[2] = { 100, 0 };
128
129 /***/
130
131 static const struct v4l2_file_operations pwc_fops = {
132         .owner =        THIS_MODULE,
133         .open =         v4l2_fh_open,
134         .release =      vb2_fop_release,
135         .read =         vb2_fop_read,
136         .poll =         vb2_fop_poll,
137         .mmap =         vb2_fop_mmap,
138         .unlocked_ioctl = video_ioctl2,
139 };
140 static const struct video_device pwc_template = {
141         .name =         "Philips Webcam",       /* Filled in later */
142         .release =      video_device_release_empty,
143         .fops =         &pwc_fops,
144         .ioctl_ops =    &pwc_ioctl_ops,
145 };
146
147 /***************************************************************************/
148 /* Private functions */
149
150 static void *pwc_alloc_urb_buffer(struct device *dev,
151                                   size_t size, dma_addr_t *dma_handle)
152 {
153         void *buffer = kmalloc(size, GFP_KERNEL);
154
155         if (!buffer)
156                 return NULL;
157
158         *dma_handle = dma_map_single(dev, buffer, size, DMA_FROM_DEVICE);
159         if (dma_mapping_error(dev, *dma_handle)) {
160                 kfree(buffer);
161                 return NULL;
162         }
163
164         return buffer;
165 }
166
167 static void pwc_free_urb_buffer(struct device *dev,
168                                 size_t size,
169                                 void *buffer,
170                                 dma_addr_t dma_handle)
171 {
172         dma_unmap_single(dev, dma_handle, size, DMA_FROM_DEVICE);
173         kfree(buffer);
174 }
175
176 static struct pwc_frame_buf *pwc_get_next_fill_buf(struct pwc_device *pdev)
177 {
178         unsigned long flags = 0;
179         struct pwc_frame_buf *buf = NULL;
180
181         spin_lock_irqsave(&pdev->queued_bufs_lock, flags);
182         if (list_empty(&pdev->queued_bufs))
183                 goto leave;
184
185         buf = list_entry(pdev->queued_bufs.next, struct pwc_frame_buf, list);
186         list_del(&buf->list);
187 leave:
188         spin_unlock_irqrestore(&pdev->queued_bufs_lock, flags);
189         return buf;
190 }
191
192 static void pwc_snapshot_button(struct pwc_device *pdev, int down)
193 {
194         if (down) {
195                 PWC_TRACE("Snapshot button pressed.\n");
196         } else {
197                 PWC_TRACE("Snapshot button released.\n");
198         }
199
200 #ifdef CONFIG_USB_PWC_INPUT_EVDEV
201         if (pdev->button_dev) {
202                 input_report_key(pdev->button_dev, KEY_CAMERA, down);
203                 input_sync(pdev->button_dev);
204         }
205 #endif
206 }
207
208 static void pwc_frame_complete(struct pwc_device *pdev)
209 {
210         struct pwc_frame_buf *fbuf = pdev->fill_buf;
211
212         /* The ToUCam Fun CMOS sensor causes the firmware to send 2 or 3 bogus
213            frames on the USB wire after an exposure change. This conditition is
214            however detected  in the cam and a bit is set in the header.
215            */
216         if (pdev->type == 730) {
217                 unsigned char *ptr = (unsigned char *)fbuf->data;
218
219                 if (ptr[1] == 1 && ptr[0] & 0x10) {
220                         PWC_TRACE("Hyundai CMOS sensor bug. Dropping frame.\n");
221                         pdev->drop_frames += 2;
222                 }
223                 if ((ptr[0] ^ pdev->vmirror) & 0x01) {
224                         pwc_snapshot_button(pdev, ptr[0] & 0x01);
225                 }
226                 if ((ptr[0] ^ pdev->vmirror) & 0x02) {
227                         if (ptr[0] & 0x02)
228                                 PWC_TRACE("Image is mirrored.\n");
229                         else
230                                 PWC_TRACE("Image is normal.\n");
231                 }
232                 pdev->vmirror = ptr[0] & 0x03;
233                 /* Sometimes the trailer of the 730 is still sent as a 4 byte packet
234                    after a short frame; this condition is filtered out specifically. A 4 byte
235                    frame doesn't make sense anyway.
236                    So we get either this sequence:
237                    drop_bit set -> 4 byte frame -> short frame -> good frame
238                    Or this one:
239                    drop_bit set -> short frame -> good frame
240                    So we drop either 3 or 2 frames in all!
241                    */
242                 if (fbuf->filled == 4)
243                         pdev->drop_frames++;
244         } else if (pdev->type == 740 || pdev->type == 720) {
245                 unsigned char *ptr = (unsigned char *)fbuf->data;
246                 if ((ptr[0] ^ pdev->vmirror) & 0x01) {
247                         pwc_snapshot_button(pdev, ptr[0] & 0x01);
248                 }
249                 pdev->vmirror = ptr[0] & 0x03;
250         }
251
252         /* In case we were instructed to drop the frame, do so silently. */
253         if (pdev->drop_frames > 0) {
254                 pdev->drop_frames--;
255         } else {
256                 /* Check for underflow first */
257                 if (fbuf->filled < pdev->frame_total_size) {
258                         PWC_DEBUG_FLOW("Frame buffer underflow (%d bytes); discarded.\n",
259                                        fbuf->filled);
260                 } else {
261                         fbuf->vb.field = V4L2_FIELD_NONE;
262                         fbuf->vb.sequence = pdev->vframe_count;
263                         vb2_buffer_done(&fbuf->vb.vb2_buf, VB2_BUF_STATE_DONE);
264                         pdev->fill_buf = NULL;
265                         pdev->vsync = 0;
266                 }
267         } /* !drop_frames */
268         pdev->vframe_count++;
269 }
270
271 /* This gets called for the Isochronous pipe (video). This is done in
272  * interrupt time, so it has to be fast, not crash, and not stall. Neat.
273  */
274 static void pwc_isoc_handler(struct urb *urb)
275 {
276         struct pwc_device *pdev = (struct pwc_device *)urb->context;
277         int i, fst, flen;
278         unsigned char *iso_buf = NULL;
279
280         trace_pwc_handler_enter(urb, pdev);
281
282         if (urb->status == -ENOENT || urb->status == -ECONNRESET ||
283             urb->status == -ESHUTDOWN) {
284                 PWC_DEBUG_OPEN("URB (%p) unlinked %ssynchronously.\n",
285                                urb, urb->status == -ENOENT ? "" : "a");
286                 return;
287         }
288
289         if (pdev->fill_buf == NULL)
290                 pdev->fill_buf = pwc_get_next_fill_buf(pdev);
291
292         if (urb->status != 0) {
293                 const char *errmsg;
294
295                 errmsg = "Unknown";
296                 switch(urb->status) {
297                         case -ENOSR:            errmsg = "Buffer error (overrun)"; break;
298                         case -EPIPE:            errmsg = "Stalled (device not responding)"; break;
299                         case -EOVERFLOW:        errmsg = "Babble (bad cable?)"; break;
300                         case -EPROTO:           errmsg = "Bit-stuff error (bad cable?)"; break;
301                         case -EILSEQ:           errmsg = "CRC/Timeout (could be anything)"; break;
302                         case -ETIME:            errmsg = "Device does not respond"; break;
303                 }
304                 PWC_ERROR("pwc_isoc_handler() called with status %d [%s].\n",
305                           urb->status, errmsg);
306                 /* Give up after a number of contiguous errors */
307                 if (++pdev->visoc_errors > MAX_ISOC_ERRORS)
308                 {
309                         PWC_ERROR("Too many ISOC errors, bailing out.\n");
310                         if (pdev->fill_buf) {
311                                 vb2_buffer_done(&pdev->fill_buf->vb.vb2_buf,
312                                                 VB2_BUF_STATE_ERROR);
313                                 pdev->fill_buf = NULL;
314                         }
315                 }
316                 pdev->vsync = 0; /* Drop the current frame */
317                 goto handler_end;
318         }
319
320         /* Reset ISOC error counter. We did get here, after all. */
321         pdev->visoc_errors = 0;
322
323         dma_sync_single_for_cpu(&urb->dev->dev,
324                                 urb->transfer_dma,
325                                 urb->transfer_buffer_length,
326                                 DMA_FROM_DEVICE);
327
328         /* vsync: 0 = don't copy data
329                   1 = sync-hunt
330                   2 = synched
331          */
332         /* Compact data */
333         for (i = 0; i < urb->number_of_packets; i++) {
334                 fst  = urb->iso_frame_desc[i].status;
335                 flen = urb->iso_frame_desc[i].actual_length;
336                 iso_buf = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
337                 if (fst != 0) {
338                         PWC_ERROR("Iso frame %d has error %d\n", i, fst);
339                         continue;
340                 }
341                 if (flen > 0 && pdev->vsync) {
342                         struct pwc_frame_buf *fbuf = pdev->fill_buf;
343
344                         if (pdev->vsync == 1) {
345                                 fbuf->vb.vb2_buf.timestamp = ktime_get_ns();
346                                 pdev->vsync = 2;
347                         }
348
349                         if (flen + fbuf->filled > pdev->frame_total_size) {
350                                 PWC_ERROR("Frame overflow (%d > %d)\n",
351                                           flen + fbuf->filled,
352                                           pdev->frame_total_size);
353                                 pdev->vsync = 0; /* Let's wait for an EOF */
354                         } else {
355                                 memcpy(fbuf->data + fbuf->filled, iso_buf,
356                                        flen);
357                                 fbuf->filled += flen;
358                         }
359                 }
360                 if (flen < pdev->vlast_packet_size) {
361                         /* Shorter packet... end of frame */
362                         if (pdev->vsync == 2)
363                                 pwc_frame_complete(pdev);
364                         if (pdev->fill_buf == NULL)
365                                 pdev->fill_buf = pwc_get_next_fill_buf(pdev);
366                         if (pdev->fill_buf) {
367                                 pdev->fill_buf->filled = 0;
368                                 pdev->vsync = 1;
369                         }
370                 }
371                 pdev->vlast_packet_size = flen;
372         }
373
374         dma_sync_single_for_device(&urb->dev->dev,
375                                    urb->transfer_dma,
376                                    urb->transfer_buffer_length,
377                                    DMA_FROM_DEVICE);
378
379 handler_end:
380         trace_pwc_handler_exit(urb, pdev);
381
382         i = usb_submit_urb(urb, GFP_ATOMIC);
383         if (i != 0)
384                 PWC_ERROR("Error (%d) re-submitting urb in pwc_isoc_handler.\n", i);
385 }
386
387 /* Both v4l2_lock and vb_queue_lock should be locked when calling this */
388 static int pwc_isoc_init(struct pwc_device *pdev)
389 {
390         struct usb_device *udev;
391         struct urb *urb;
392         int i, j, ret;
393         struct usb_interface *intf;
394         struct usb_host_interface *idesc = NULL;
395         int compression = 0; /* 0..3 = uncompressed..high */
396
397         pdev->vsync = 0;
398         pdev->vlast_packet_size = 0;
399         pdev->fill_buf = NULL;
400         pdev->vframe_count = 0;
401         pdev->visoc_errors = 0;
402         udev = pdev->udev;
403
404 retry:
405         /* We first try with low compression and then retry with a higher
406            compression setting if there is not enough bandwidth. */
407         ret = pwc_set_video_mode(pdev, pdev->width, pdev->height, pdev->pixfmt,
408                                  pdev->vframes, &compression, 1);
409
410         /* Get the current alternate interface, adjust packet size */
411         intf = usb_ifnum_to_if(udev, 0);
412         if (intf)
413                 idesc = usb_altnum_to_altsetting(intf, pdev->valternate);
414         if (!idesc)
415                 return -EIO;
416
417         /* Search video endpoint */
418         pdev->vmax_packet_size = -1;
419         for (i = 0; i < idesc->desc.bNumEndpoints; i++) {
420                 if ((idesc->endpoint[i].desc.bEndpointAddress & 0xF) == pdev->vendpoint) {
421                         pdev->vmax_packet_size = le16_to_cpu(idesc->endpoint[i].desc.wMaxPacketSize);
422                         break;
423                 }
424         }
425
426         if (pdev->vmax_packet_size < 0 || pdev->vmax_packet_size > ISO_MAX_FRAME_SIZE) {
427                 PWC_ERROR("Failed to find packet size for video endpoint in current alternate setting.\n");
428                 return -ENFILE; /* Odd error, that should be noticeable */
429         }
430
431         /* Set alternate interface */
432         PWC_DEBUG_OPEN("Setting alternate interface %d\n", pdev->valternate);
433         ret = usb_set_interface(pdev->udev, 0, pdev->valternate);
434         if (ret == -ENOSPC && compression < 3) {
435                 compression++;
436                 goto retry;
437         }
438         if (ret < 0)
439                 return ret;
440
441         /* Allocate and init Isochronuous urbs */
442         for (i = 0; i < MAX_ISO_BUFS; i++) {
443                 urb = usb_alloc_urb(ISO_FRAMES_PER_DESC, GFP_KERNEL);
444                 if (urb == NULL) {
445                         pwc_isoc_cleanup(pdev);
446                         return -ENOMEM;
447                 }
448                 pdev->urbs[i] = urb;
449                 PWC_DEBUG_MEMORY("Allocated URB at 0x%p\n", urb);
450
451                 urb->interval = 1; // devik
452                 urb->dev = udev;
453                 urb->pipe = usb_rcvisocpipe(udev, pdev->vendpoint);
454                 urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
455                 urb->transfer_buffer_length = ISO_BUFFER_SIZE;
456                 urb->transfer_buffer = pwc_alloc_urb_buffer(&udev->dev,
457                                                             urb->transfer_buffer_length,
458                                                             &urb->transfer_dma);
459                 if (urb->transfer_buffer == NULL) {
460                         PWC_ERROR("Failed to allocate urb buffer %d\n", i);
461                         pwc_isoc_cleanup(pdev);
462                         return -ENOMEM;
463                 }
464                 urb->complete = pwc_isoc_handler;
465                 urb->context = pdev;
466                 urb->start_frame = 0;
467                 urb->number_of_packets = ISO_FRAMES_PER_DESC;
468                 for (j = 0; j < ISO_FRAMES_PER_DESC; j++) {
469                         urb->iso_frame_desc[j].offset = j * ISO_MAX_FRAME_SIZE;
470                         urb->iso_frame_desc[j].length = pdev->vmax_packet_size;
471                 }
472         }
473
474         /* link */
475         for (i = 0; i < MAX_ISO_BUFS; i++) {
476                 ret = usb_submit_urb(pdev->urbs[i], GFP_KERNEL);
477                 if (ret == -ENOSPC && compression < 3) {
478                         compression++;
479                         pwc_isoc_cleanup(pdev);
480                         goto retry;
481                 }
482                 if (ret) {
483                         PWC_ERROR("isoc_init() submit_urb %d failed with error %d\n", i, ret);
484                         pwc_isoc_cleanup(pdev);
485                         return ret;
486                 }
487                 PWC_DEBUG_MEMORY("URB 0x%p submitted.\n", pdev->urbs[i]);
488         }
489
490         /* All is done... */
491         PWC_DEBUG_OPEN("<< pwc_isoc_init()\n");
492         return 0;
493 }
494
495 static void pwc_iso_stop(struct pwc_device *pdev)
496 {
497         int i;
498
499         /* Unlinking ISOC buffers one by one */
500         for (i = 0; i < MAX_ISO_BUFS; i++) {
501                 if (pdev->urbs[i]) {
502                         PWC_DEBUG_MEMORY("Unlinking URB %p\n", pdev->urbs[i]);
503                         usb_kill_urb(pdev->urbs[i]);
504                 }
505         }
506 }
507
508 static void pwc_iso_free(struct pwc_device *pdev)
509 {
510         int i;
511
512         /* Freeing ISOC buffers one by one */
513         for (i = 0; i < MAX_ISO_BUFS; i++) {
514                 struct urb *urb = pdev->urbs[i];
515
516                 if (urb) {
517                         PWC_DEBUG_MEMORY("Freeing URB\n");
518                         if (urb->transfer_buffer)
519                                 pwc_free_urb_buffer(&urb->dev->dev,
520                                                     urb->transfer_buffer_length,
521                                                     urb->transfer_buffer,
522                                                     urb->transfer_dma);
523                         usb_free_urb(urb);
524                         pdev->urbs[i] = NULL;
525                 }
526         }
527 }
528
529 /* Both v4l2_lock and vb_queue_lock should be locked when calling this */
530 static void pwc_isoc_cleanup(struct pwc_device *pdev)
531 {
532         PWC_DEBUG_OPEN(">> pwc_isoc_cleanup()\n");
533
534         pwc_iso_stop(pdev);
535         pwc_iso_free(pdev);
536         usb_set_interface(pdev->udev, 0, 0);
537
538         PWC_DEBUG_OPEN("<< pwc_isoc_cleanup()\n");
539 }
540
541 /* Must be called with vb_queue_lock hold */
542 static void pwc_cleanup_queued_bufs(struct pwc_device *pdev,
543                                     enum vb2_buffer_state state)
544 {
545         unsigned long flags = 0;
546
547         spin_lock_irqsave(&pdev->queued_bufs_lock, flags);
548         while (!list_empty(&pdev->queued_bufs)) {
549                 struct pwc_frame_buf *buf;
550
551                 buf = list_entry(pdev->queued_bufs.next, struct pwc_frame_buf,
552                                  list);
553                 list_del(&buf->list);
554                 vb2_buffer_done(&buf->vb.vb2_buf, state);
555         }
556         spin_unlock_irqrestore(&pdev->queued_bufs_lock, flags);
557 }
558
559 #ifdef CONFIG_USB_PWC_DEBUG
560 static const char *pwc_sensor_type_to_string(unsigned int sensor_type)
561 {
562         switch(sensor_type) {
563                 case 0x00:
564                         return "Hyundai CMOS sensor";
565                 case 0x20:
566                         return "Sony CCD sensor + TDA8787";
567                 case 0x2E:
568                         return "Sony CCD sensor + Exas 98L59";
569                 case 0x2F:
570                         return "Sony CCD sensor + ADI 9804";
571                 case 0x30:
572                         return "Sharp CCD sensor + TDA8787";
573                 case 0x3E:
574                         return "Sharp CCD sensor + Exas 98L59";
575                 case 0x3F:
576                         return "Sharp CCD sensor + ADI 9804";
577                 case 0x40:
578                         return "UPA 1021 sensor";
579                 case 0x100:
580                         return "VGA sensor";
581                 case 0x101:
582                         return "PAL MR sensor";
583                 default:
584                         return "unknown type of sensor";
585         }
586 }
587 #endif
588
589 /***************************************************************************/
590 /* Video4Linux functions */
591
592 static void pwc_video_release(struct v4l2_device *v)
593 {
594         struct pwc_device *pdev = container_of(v, struct pwc_device, v4l2_dev);
595
596         v4l2_ctrl_handler_free(&pdev->ctrl_handler);
597         v4l2_device_unregister(&pdev->v4l2_dev);
598         kfree(pdev->ctrl_buf);
599         kfree(pdev);
600 }
601
602 /***************************************************************************/
603 /* Videobuf2 operations */
604
605 static int queue_setup(struct vb2_queue *vq,
606                                 unsigned int *nbuffers, unsigned int *nplanes,
607                                 unsigned int sizes[], struct device *alloc_devs[])
608 {
609         struct pwc_device *pdev = vb2_get_drv_priv(vq);
610         int size;
611
612         if (*nbuffers < MIN_FRAMES)
613                 *nbuffers = MIN_FRAMES;
614         else if (*nbuffers > MAX_FRAMES)
615                 *nbuffers = MAX_FRAMES;
616
617         *nplanes = 1;
618
619         size = pwc_get_size(pdev, MAX_WIDTH, MAX_HEIGHT);
620         sizes[0] = PAGE_ALIGN(pwc_image_sizes[size][0] *
621                               pwc_image_sizes[size][1] * 3 / 2);
622
623         return 0;
624 }
625
626 static int buffer_init(struct vb2_buffer *vb)
627 {
628         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
629         struct pwc_frame_buf *buf =
630                 container_of(vbuf, struct pwc_frame_buf, vb);
631
632         /* need vmalloc since frame buffer > 128K */
633         buf->data = vzalloc(PWC_FRAME_SIZE);
634         if (buf->data == NULL)
635                 return -ENOMEM;
636
637         return 0;
638 }
639
640 static int buffer_prepare(struct vb2_buffer *vb)
641 {
642         struct pwc_device *pdev = vb2_get_drv_priv(vb->vb2_queue);
643
644         /* Don't allow queueing new buffers after device disconnection */
645         if (!pdev->udev)
646                 return -ENODEV;
647
648         return 0;
649 }
650
651 static void buffer_finish(struct vb2_buffer *vb)
652 {
653         struct pwc_device *pdev = vb2_get_drv_priv(vb->vb2_queue);
654         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
655         struct pwc_frame_buf *buf =
656                 container_of(vbuf, struct pwc_frame_buf, vb);
657
658         if (vb->state == VB2_BUF_STATE_DONE) {
659                 /*
660                  * Application has called dqbuf and is getting back a buffer
661                  * we've filled, take the pwc data we've stored in buf->data
662                  * and decompress it into a usable format, storing the result
663                  * in the vb2_buffer.
664                  */
665                 pwc_decompress(pdev, buf);
666         }
667 }
668
669 static void buffer_cleanup(struct vb2_buffer *vb)
670 {
671         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
672         struct pwc_frame_buf *buf =
673                 container_of(vbuf, struct pwc_frame_buf, vb);
674
675         vfree(buf->data);
676 }
677
678 static void buffer_queue(struct vb2_buffer *vb)
679 {
680         struct pwc_device *pdev = vb2_get_drv_priv(vb->vb2_queue);
681         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
682         struct pwc_frame_buf *buf =
683                 container_of(vbuf, struct pwc_frame_buf, vb);
684         unsigned long flags = 0;
685
686         /* Check the device has not disconnected between prep and queuing */
687         if (!pdev->udev) {
688                 vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
689                 return;
690         }
691
692         spin_lock_irqsave(&pdev->queued_bufs_lock, flags);
693         list_add_tail(&buf->list, &pdev->queued_bufs);
694         spin_unlock_irqrestore(&pdev->queued_bufs_lock, flags);
695 }
696
697 static int start_streaming(struct vb2_queue *vq, unsigned int count)
698 {
699         struct pwc_device *pdev = vb2_get_drv_priv(vq);
700         int r;
701
702         if (!pdev->udev)
703                 return -ENODEV;
704
705         if (mutex_lock_interruptible(&pdev->v4l2_lock))
706                 return -ERESTARTSYS;
707         /* Turn on camera and set LEDS on */
708         pwc_camera_power(pdev, 1);
709         pwc_set_leds(pdev, leds[0], leds[1]);
710
711         r = pwc_isoc_init(pdev);
712         if (r) {
713                 /* If we failed turn camera and LEDS back off */
714                 pwc_set_leds(pdev, 0, 0);
715                 pwc_camera_power(pdev, 0);
716                 /* And cleanup any queued bufs!! */
717                 pwc_cleanup_queued_bufs(pdev, VB2_BUF_STATE_QUEUED);
718         }
719         mutex_unlock(&pdev->v4l2_lock);
720
721         return r;
722 }
723
724 static void stop_streaming(struct vb2_queue *vq)
725 {
726         struct pwc_device *pdev = vb2_get_drv_priv(vq);
727
728         mutex_lock(&pdev->v4l2_lock);
729         if (pdev->udev) {
730                 pwc_set_leds(pdev, 0, 0);
731                 pwc_camera_power(pdev, 0);
732                 pwc_isoc_cleanup(pdev);
733         }
734
735         pwc_cleanup_queued_bufs(pdev, VB2_BUF_STATE_ERROR);
736         if (pdev->fill_buf)
737                 vb2_buffer_done(&pdev->fill_buf->vb.vb2_buf,
738                                 VB2_BUF_STATE_ERROR);
739         mutex_unlock(&pdev->v4l2_lock);
740 }
741
742 static const struct vb2_ops pwc_vb_queue_ops = {
743         .queue_setup            = queue_setup,
744         .buf_init               = buffer_init,
745         .buf_prepare            = buffer_prepare,
746         .buf_finish             = buffer_finish,
747         .buf_cleanup            = buffer_cleanup,
748         .buf_queue              = buffer_queue,
749         .start_streaming        = start_streaming,
750         .stop_streaming         = stop_streaming,
751         .wait_prepare           = vb2_ops_wait_prepare,
752         .wait_finish            = vb2_ops_wait_finish,
753 };
754
755 /***************************************************************************/
756 /* USB functions */
757
758 /* This function gets called when a new device is plugged in or the usb core
759  * is loaded.
760  */
761
762 static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id *id)
763 {
764         struct usb_device *udev = interface_to_usbdev(intf);
765         struct pwc_device *pdev = NULL;
766         int vendor_id, product_id, type_id;
767         int rc;
768         int features = 0;
769         int compression = 0;
770         int my_power_save = power_save;
771         char serial_number[30], *name;
772
773         vendor_id = le16_to_cpu(udev->descriptor.idVendor);
774         product_id = le16_to_cpu(udev->descriptor.idProduct);
775
776         /* Check if we can handle this device */
777         PWC_DEBUG_PROBE("probe() called [%04X %04X], if %d\n",
778                 vendor_id, product_id,
779                 intf->altsetting->desc.bInterfaceNumber);
780
781         /* the interfaces are probed one by one. We are only interested in the
782            video interface (0) now.
783            Interface 1 is the Audio Control, and interface 2 Audio itself.
784          */
785         if (intf->altsetting->desc.bInterfaceNumber > 0)
786                 return -ENODEV;
787
788         if (vendor_id == 0x0471) {
789                 switch (product_id) {
790                 case 0x0302:
791                         PWC_INFO("Philips PCA645VC USB webcam detected.\n");
792                         name = "Philips 645 webcam";
793                         type_id = 645;
794                         break;
795                 case 0x0303:
796                         PWC_INFO("Philips PCA646VC USB webcam detected.\n");
797                         name = "Philips 646 webcam";
798                         type_id = 646;
799                         break;
800                 case 0x0304:
801                         PWC_INFO("Askey VC010 type 2 USB webcam detected.\n");
802                         name = "Askey VC010 webcam";
803                         type_id = 646;
804                         break;
805                 case 0x0307:
806                         PWC_INFO("Philips PCVC675K (Vesta) USB webcam detected.\n");
807                         name = "Philips 675 webcam";
808                         type_id = 675;
809                         break;
810                 case 0x0308:
811                         PWC_INFO("Philips PCVC680K (Vesta Pro) USB webcam detected.\n");
812                         name = "Philips 680 webcam";
813                         type_id = 680;
814                         break;
815                 case 0x030C:
816                         PWC_INFO("Philips PCVC690K (Vesta Pro Scan) USB webcam detected.\n");
817                         name = "Philips 690 webcam";
818                         type_id = 690;
819                         break;
820                 case 0x0310:
821                         PWC_INFO("Philips PCVC730K (ToUCam Fun)/PCVC830 (ToUCam II) USB webcam detected.\n");
822                         name = "Philips 730 webcam";
823                         type_id = 730;
824                         break;
825                 case 0x0311:
826                         PWC_INFO("Philips PCVC740K (ToUCam Pro)/PCVC840 (ToUCam II) USB webcam detected.\n");
827                         name = "Philips 740 webcam";
828                         type_id = 740;
829                         break;
830                 case 0x0312:
831                         PWC_INFO("Philips PCVC750K (ToUCam Pro Scan) USB webcam detected.\n");
832                         name = "Philips 750 webcam";
833                         type_id = 750;
834                         break;
835                 case 0x0313:
836                         PWC_INFO("Philips PCVC720K/40 (ToUCam XS) USB webcam detected.\n");
837                         name = "Philips 720K/40 webcam";
838                         type_id = 720;
839                         break;
840                 case 0x0329:
841                         PWC_INFO("Philips SPC 900NC USB webcam detected.\n");
842                         name = "Philips SPC 900NC webcam";
843                         type_id = 740;
844                         break;
845                 case 0x032C:
846                         PWC_INFO("Philips SPC 880NC USB webcam detected.\n");
847                         name = "Philips SPC 880NC webcam";
848                         type_id = 740;
849                         break;
850                 default:
851                         return -ENODEV;
852                         break;
853                 }
854         }
855         else if (vendor_id == 0x069A) {
856                 switch(product_id) {
857                 case 0x0001:
858                         PWC_INFO("Askey VC010 type 1 USB webcam detected.\n");
859                         name = "Askey VC010 webcam";
860                         type_id = 645;
861                         break;
862                 default:
863                         return -ENODEV;
864                         break;
865                 }
866         }
867         else if (vendor_id == 0x046d) {
868                 switch(product_id) {
869                 case 0x08b0:
870                         PWC_INFO("Logitech QuickCam Pro 3000 USB webcam detected.\n");
871                         name = "Logitech QuickCam Pro 3000";
872                         type_id = 740; /* CCD sensor */
873                         break;
874                 case 0x08b1:
875                         PWC_INFO("Logitech QuickCam Notebook Pro USB webcam detected.\n");
876                         name = "Logitech QuickCam Notebook Pro";
877                         type_id = 740; /* CCD sensor */
878                         break;
879                 case 0x08b2:
880                         PWC_INFO("Logitech QuickCam 4000 Pro USB webcam detected.\n");
881                         name = "Logitech QuickCam Pro 4000";
882                         type_id = 740; /* CCD sensor */
883                         if (my_power_save == -1)
884                                 my_power_save = 1;
885                         break;
886                 case 0x08b3:
887                         PWC_INFO("Logitech QuickCam Zoom USB webcam detected.\n");
888                         name = "Logitech QuickCam Zoom";
889                         type_id = 740; /* CCD sensor */
890                         break;
891                 case 0x08B4:
892                         PWC_INFO("Logitech QuickCam Zoom (new model) USB webcam detected.\n");
893                         name = "Logitech QuickCam Zoom";
894                         type_id = 740; /* CCD sensor */
895                         if (my_power_save == -1)
896                                 my_power_save = 1;
897                         break;
898                 case 0x08b5:
899                         PWC_INFO("Logitech QuickCam Orbit/Sphere USB webcam detected.\n");
900                         name = "Logitech QuickCam Orbit";
901                         type_id = 740; /* CCD sensor */
902                         if (my_power_save == -1)
903                                 my_power_save = 1;
904                         features |= FEATURE_MOTOR_PANTILT;
905                         break;
906                 case 0x08b6:
907                         PWC_INFO("Logitech/Cisco VT Camera webcam detected.\n");
908                         name = "Cisco VT Camera";
909                         type_id = 740; /* CCD sensor */
910                         break;
911                 case 0x08b7:
912                         PWC_INFO("Logitech ViewPort AV 100 webcam detected.\n");
913                         name = "Logitech ViewPort AV 100";
914                         type_id = 740; /* CCD sensor */
915                         break;
916                 case 0x08b8: /* Where this released? */
917                         PWC_INFO("Logitech QuickCam detected (reserved ID).\n");
918                         name = "Logitech QuickCam (res.)";
919                         type_id = 730; /* Assuming CMOS */
920                         break;
921                 default:
922                         return -ENODEV;
923                         break;
924                 }
925         }
926         else if (vendor_id == 0x055d) {
927                 /* I don't know the difference between the C10 and the C30;
928                    I suppose the difference is the sensor, but both cameras
929                    work equally well with a type_id of 675
930                  */
931                 switch(product_id) {
932                 case 0x9000:
933                         PWC_INFO("Samsung MPC-C10 USB webcam detected.\n");
934                         name = "Samsung MPC-C10";
935                         type_id = 675;
936                         break;
937                 case 0x9001:
938                         PWC_INFO("Samsung MPC-C30 USB webcam detected.\n");
939                         name = "Samsung MPC-C30";
940                         type_id = 675;
941                         break;
942                 case 0x9002:
943                         PWC_INFO("Samsung SNC-35E (v3.0) USB webcam detected.\n");
944                         name = "Samsung MPC-C30";
945                         type_id = 740;
946                         break;
947                 default:
948                         return -ENODEV;
949                         break;
950                 }
951         }
952         else if (vendor_id == 0x041e) {
953                 switch(product_id) {
954                 case 0x400c:
955                         PWC_INFO("Creative Labs Webcam 5 detected.\n");
956                         name = "Creative Labs Webcam 5";
957                         type_id = 730;
958                         if (my_power_save == -1)
959                                 my_power_save = 1;
960                         break;
961                 case 0x4011:
962                         PWC_INFO("Creative Labs Webcam Pro Ex detected.\n");
963                         name = "Creative Labs Webcam Pro Ex";
964                         type_id = 740;
965                         break;
966                 default:
967                         return -ENODEV;
968                         break;
969                 }
970         }
971         else if (vendor_id == 0x04cc) {
972                 switch(product_id) {
973                 case 0x8116:
974                         PWC_INFO("Sotec Afina Eye USB webcam detected.\n");
975                         name = "Sotec Afina Eye";
976                         type_id = 730;
977                         break;
978                 default:
979                         return -ENODEV;
980                         break;
981                 }
982         }
983         else if (vendor_id == 0x06be) {
984                 switch(product_id) {
985                 case 0x8116:
986                         /* This is essentially the same cam as the Sotec Afina Eye */
987                         PWC_INFO("AME Co. Afina Eye USB webcam detected.\n");
988                         name = "AME Co. Afina Eye";
989                         type_id = 750;
990                         break;
991                 default:
992                         return -ENODEV;
993                         break;
994                 }
995
996         }
997         else if (vendor_id == 0x0d81) {
998                 switch(product_id) {
999                 case 0x1900:
1000                         PWC_INFO("Visionite VCS-UC300 USB webcam detected.\n");
1001                         name = "Visionite VCS-UC300";
1002                         type_id = 740; /* CCD sensor */
1003                         break;
1004                 case 0x1910:
1005                         PWC_INFO("Visionite VCS-UM100 USB webcam detected.\n");
1006                         name = "Visionite VCS-UM100";
1007                         type_id = 730; /* CMOS sensor */
1008                         break;
1009                 default:
1010                         return -ENODEV;
1011                         break;
1012                 }
1013         }
1014         else
1015                 return -ENODEV; /* Not any of the know types; but the list keeps growing. */
1016
1017         if (my_power_save == -1)
1018                 my_power_save = 0;
1019
1020         memset(serial_number, 0, 30);
1021         usb_string(udev, udev->descriptor.iSerialNumber, serial_number, 29);
1022         PWC_DEBUG_PROBE("Device serial number is %s\n", serial_number);
1023
1024         if (udev->descriptor.bNumConfigurations > 1)
1025                 PWC_WARNING("Warning: more than 1 configuration available.\n");
1026
1027         /* Allocate structure, initialize pointers, mutexes, etc. and link it to the usb_device */
1028         pdev = kzalloc(sizeof(struct pwc_device), GFP_KERNEL);
1029         if (pdev == NULL) {
1030                 PWC_ERROR("Oops, could not allocate memory for pwc_device.\n");
1031                 return -ENOMEM;
1032         }
1033         pdev->type = type_id;
1034         pdev->features = features;
1035         pwc_construct(pdev); /* set min/max sizes correct */
1036
1037         mutex_init(&pdev->v4l2_lock);
1038         mutex_init(&pdev->vb_queue_lock);
1039         spin_lock_init(&pdev->queued_bufs_lock);
1040         INIT_LIST_HEAD(&pdev->queued_bufs);
1041
1042         pdev->udev = udev;
1043         pdev->power_save = my_power_save;
1044
1045         /* Init videobuf2 queue structure */
1046         pdev->vb_queue.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1047         pdev->vb_queue.io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ;
1048         pdev->vb_queue.drv_priv = pdev;
1049         pdev->vb_queue.buf_struct_size = sizeof(struct pwc_frame_buf);
1050         pdev->vb_queue.ops = &pwc_vb_queue_ops;
1051         pdev->vb_queue.mem_ops = &vb2_vmalloc_memops;
1052         pdev->vb_queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1053         rc = vb2_queue_init(&pdev->vb_queue);
1054         if (rc < 0) {
1055                 PWC_ERROR("Oops, could not initialize vb2 queue.\n");
1056                 goto err_free_mem;
1057         }
1058
1059         /* Init video_device structure */
1060         pdev->vdev = pwc_template;
1061         strscpy(pdev->vdev.name, name, sizeof(pdev->vdev.name));
1062         pdev->vdev.queue = &pdev->vb_queue;
1063         pdev->vdev.queue->lock = &pdev->vb_queue_lock;
1064         video_set_drvdata(&pdev->vdev, pdev);
1065
1066         pdev->release = le16_to_cpu(udev->descriptor.bcdDevice);
1067         PWC_DEBUG_PROBE("Release: %04x\n", pdev->release);
1068
1069         /* Allocate USB command buffers */
1070         pdev->ctrl_buf = kmalloc(sizeof(pdev->cmd_buf), GFP_KERNEL);
1071         if (!pdev->ctrl_buf) {
1072                 PWC_ERROR("Oops, could not allocate memory for pwc_device.\n");
1073                 rc = -ENOMEM;
1074                 goto err_free_mem;
1075         }
1076
1077 #ifdef CONFIG_USB_PWC_DEBUG
1078         /* Query sensor type */
1079         if (pwc_get_cmos_sensor(pdev, &rc) >= 0) {
1080                 PWC_DEBUG_OPEN("This %s camera is equipped with a %s (%d).\n",
1081                                 pdev->vdev.name,
1082                                 pwc_sensor_type_to_string(rc), rc);
1083         }
1084 #endif
1085
1086         /* Set the leds off */
1087         pwc_set_leds(pdev, 0, 0);
1088
1089         /* Setup initial videomode */
1090         rc = pwc_set_video_mode(pdev, MAX_WIDTH, MAX_HEIGHT,
1091                                 V4L2_PIX_FMT_YUV420, 30, &compression, 1);
1092         if (rc)
1093                 goto err_free_mem;
1094
1095         /* Register controls (and read default values from camera */
1096         rc = pwc_init_controls(pdev);
1097         if (rc) {
1098                 PWC_ERROR("Failed to register v4l2 controls (%d).\n", rc);
1099                 goto err_free_mem;
1100         }
1101
1102         /* And powerdown the camera until streaming starts */
1103         pwc_camera_power(pdev, 0);
1104
1105         /* Register the v4l2_device structure */
1106         pdev->v4l2_dev.release = pwc_video_release;
1107         rc = v4l2_device_register(&intf->dev, &pdev->v4l2_dev);
1108         if (rc) {
1109                 PWC_ERROR("Failed to register v4l2-device (%d).\n", rc);
1110                 goto err_free_controls;
1111         }
1112
1113         pdev->v4l2_dev.ctrl_handler = &pdev->ctrl_handler;
1114         pdev->vdev.v4l2_dev = &pdev->v4l2_dev;
1115         pdev->vdev.lock = &pdev->v4l2_lock;
1116         pdev->vdev.device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING |
1117                                  V4L2_CAP_READWRITE;
1118
1119         rc = video_register_device(&pdev->vdev, VFL_TYPE_GRABBER, -1);
1120         if (rc < 0) {
1121                 PWC_ERROR("Failed to register as video device (%d).\n", rc);
1122                 goto err_unregister_v4l2_dev;
1123         }
1124         PWC_INFO("Registered as %s.\n", video_device_node_name(&pdev->vdev));
1125
1126 #ifdef CONFIG_USB_PWC_INPUT_EVDEV
1127         /* register webcam snapshot button input device */
1128         pdev->button_dev = input_allocate_device();
1129         if (!pdev->button_dev) {
1130                 rc = -ENOMEM;
1131                 goto err_video_unreg;
1132         }
1133
1134         usb_make_path(udev, pdev->button_phys, sizeof(pdev->button_phys));
1135         strlcat(pdev->button_phys, "/input0", sizeof(pdev->button_phys));
1136
1137         pdev->button_dev->name = "PWC snapshot button";
1138         pdev->button_dev->phys = pdev->button_phys;
1139         usb_to_input_id(pdev->udev, &pdev->button_dev->id);
1140         pdev->button_dev->dev.parent = &pdev->udev->dev;
1141         pdev->button_dev->evbit[0] = BIT_MASK(EV_KEY);
1142         pdev->button_dev->keybit[BIT_WORD(KEY_CAMERA)] = BIT_MASK(KEY_CAMERA);
1143
1144         rc = input_register_device(pdev->button_dev);
1145         if (rc) {
1146                 input_free_device(pdev->button_dev);
1147                 pdev->button_dev = NULL;
1148                 goto err_video_unreg;
1149         }
1150 #endif
1151
1152         return 0;
1153
1154 #ifdef CONFIG_USB_PWC_INPUT_EVDEV
1155 err_video_unreg:
1156         video_unregister_device(&pdev->vdev);
1157 #endif
1158 err_unregister_v4l2_dev:
1159         v4l2_device_unregister(&pdev->v4l2_dev);
1160 err_free_controls:
1161         v4l2_ctrl_handler_free(&pdev->ctrl_handler);
1162 err_free_mem:
1163         kfree(pdev->ctrl_buf);
1164         kfree(pdev);
1165         return rc;
1166 }
1167
1168 /* The user yanked out the cable... */
1169 static void usb_pwc_disconnect(struct usb_interface *intf)
1170 {
1171         struct v4l2_device *v = usb_get_intfdata(intf);
1172         struct pwc_device *pdev = container_of(v, struct pwc_device, v4l2_dev);
1173
1174         mutex_lock(&pdev->vb_queue_lock);
1175         mutex_lock(&pdev->v4l2_lock);
1176         /* No need to keep the urbs around after disconnection */
1177         if (pdev->vb_queue.streaming)
1178                 pwc_isoc_cleanup(pdev);
1179         pdev->udev = NULL;
1180
1181         v4l2_device_disconnect(&pdev->v4l2_dev);
1182         video_unregister_device(&pdev->vdev);
1183         mutex_unlock(&pdev->v4l2_lock);
1184         mutex_unlock(&pdev->vb_queue_lock);
1185
1186 #ifdef CONFIG_USB_PWC_INPUT_EVDEV
1187         if (pdev->button_dev)
1188                 input_unregister_device(pdev->button_dev);
1189 #endif
1190
1191         v4l2_device_put(&pdev->v4l2_dev);
1192 }
1193
1194
1195 /*
1196  * Initialization code & module stuff
1197  */
1198
1199 static unsigned int leds_nargs;
1200
1201 #ifdef CONFIG_USB_PWC_DEBUG
1202 module_param_named(trace, pwc_trace, int, 0644);
1203 #endif
1204 module_param(power_save, int, 0644);
1205 module_param_array(leds, int, &leds_nargs, 0444);
1206
1207 #ifdef CONFIG_USB_PWC_DEBUG
1208 MODULE_PARM_DESC(trace, "For debugging purposes");
1209 #endif
1210 MODULE_PARM_DESC(power_save, "Turn power saving for new cameras on or off");
1211 MODULE_PARM_DESC(leds, "LED on,off time in milliseconds");
1212
1213 MODULE_DESCRIPTION("Philips & OEM USB webcam driver");
1214 MODULE_AUTHOR("Luc Saillard <luc@saillard.org>");
1215 MODULE_LICENSE("GPL");
1216 MODULE_ALIAS("pwcx");
1217 MODULE_VERSION( PWC_VERSION );
1218
1219 module_usb_driver(pwc_driver);