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