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); 1220