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