blob: 9b76cf133d524126277c7127864b36457154f5cb [file] [log] [blame]
David Brazdil0f672f62019-12-10 10:32:29 +00001// SPDX-License-Identifier: GPL-2.0-or-later
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002/* 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
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000014
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
David Brazdil0f672f62019-12-10 10:32:29 +000067#define CREATE_TRACE_POINTS
68#include <trace/events/pwc.h>
69
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000070/* Function prototypes and driver templates */
71
72/* hotplug device table support */
73static 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};
107MODULE_DEVICE_TABLE(usb, pwc_device_table);
108
109static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id *id);
110static void usb_pwc_disconnect(struct usb_interface *intf);
111static void pwc_isoc_cleanup(struct pwc_device *pdev);
112
113static 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
126static int power_save = -1;
127static int leds[2] = { 100, 0 };
128
129/***/
130
131static 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};
140static 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
David Brazdil0f672f62019-12-10 10:32:29 +0000150static 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
167static 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
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000176static 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);
187leave:
188 spin_unlock_irqrestore(&pdev->queued_bufs_lock, flags);
189 return buf;
190}
191
192static 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
208static 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 */
274static 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
David Brazdil0f672f62019-12-10 10:32:29 +0000280 trace_pwc_handler_enter(urb, pdev);
281
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000282 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
David Brazdil0f672f62019-12-10 10:32:29 +0000323 dma_sync_single_for_cpu(&urb->dev->dev,
324 urb->transfer_dma,
325 urb->transfer_buffer_length,
326 DMA_FROM_DEVICE);
327
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000328 /* 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
David Brazdil0f672f62019-12-10 10:32:29 +0000374 dma_sync_single_for_device(&urb->dev->dev,
375 urb->transfer_dma,
376 urb->transfer_buffer_length,
377 DMA_FROM_DEVICE);
378
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000379handler_end:
David Brazdil0f672f62019-12-10 10:32:29 +0000380 trace_pwc_handler_exit(urb, pdev);
381
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000382 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 */
388static 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
404retry:
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;
David Brazdil0f672f62019-12-10 10:32:29 +0000455 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);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000459 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 }
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000464 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
495static 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
508static 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++) {
David Brazdil0f672f62019-12-10 10:32:29 +0000514 struct urb *urb = pdev->urbs[i];
515
516 if (urb) {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000517 PWC_DEBUG_MEMORY("Freeing URB\n");
David Brazdil0f672f62019-12-10 10:32:29 +0000518 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);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000524 pdev->urbs[i] = NULL;
525 }
526 }
527}
528
529/* Both v4l2_lock and vb_queue_lock should be locked when calling this */
530static 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 */
542static 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
560static 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
592static 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
605static 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
626static 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
640static int buffer_prepare(struct vb2_buffer *vb)
641{
642 struct pwc_device *pdev = vb2_get_drv_priv(vb->vb2_queue);
643
David Brazdil0f672f62019-12-10 10:32:29 +0000644 /* Don't allow queueing new buffers after device disconnection */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000645 if (!pdev->udev)
646 return -ENODEV;
647
648 return 0;
649}
650
651static 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
669static 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
678static 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
697static 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
724static 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
742static 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
762static 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;
David Brazdil0f672f62019-12-10 10:32:29 +00001061 strscpy(pdev->vdev.name, name, sizeof(pdev->vdev.name));
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001062 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;
David Brazdil0f672f62019-12-10 10:32:29 +00001116 pdev->vdev.device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING |
1117 V4L2_CAP_READWRITE;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001118
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
1155err_video_unreg:
1156 video_unregister_device(&pdev->vdev);
1157#endif
1158err_unregister_v4l2_dev:
1159 v4l2_device_unregister(&pdev->v4l2_dev);
1160err_free_controls:
1161 v4l2_ctrl_handler_free(&pdev->ctrl_handler);
1162err_free_mem:
1163 kfree(pdev->ctrl_buf);
1164 kfree(pdev);
1165 return rc;
1166}
1167
1168/* The user yanked out the cable... */
1169static 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
1199static unsigned int leds_nargs;
1200
1201#ifdef CONFIG_USB_PWC_DEBUG
1202module_param_named(trace, pwc_trace, int, 0644);
1203#endif
1204module_param(power_save, int, 0644);
1205module_param_array(leds, int, &leds_nargs, 0444);
1206
1207#ifdef CONFIG_USB_PWC_DEBUG
1208MODULE_PARM_DESC(trace, "For debugging purposes");
1209#endif
1210MODULE_PARM_DESC(power_save, "Turn power saving for new cameras on or off");
1211MODULE_PARM_DESC(leds, "LED on,off time in milliseconds");
1212
1213MODULE_DESCRIPTION("Philips & OEM USB webcam driver");
1214MODULE_AUTHOR("Luc Saillard <luc@saillard.org>");
1215MODULE_LICENSE("GPL");
1216MODULE_ALIAS("pwcx");
1217MODULE_VERSION( PWC_VERSION );
1218
1219module_usb_driver(pwc_driver);