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
   6   NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx
   7   driver and thus may have bugs that are not present in the original version.
   8   Please send bug reports and support requests to <luc@saillard.org>.
   9   The decompression routines have been implemented by reverse-engineering the
  10   Nemosoft binary pwcx module. Caveat emptor.
  11
  12   This program is free software; you can redistribute it and/or modify
  13   it under the terms of the GNU General Public License as published by
  14   the Free Software Foundation; either version 2 of the License, or
  15   (at your option) any later version.
  16
  17   This program is distributed in the hope that it will be useful,
  18   but WITHOUT ANY WARRANTY; without even the implied warranty of
  19   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20   GNU General Public License for more details.
  21
  22   You should have received a copy of the GNU General Public License
  23   along with this program; if not, write to the Free Software
  24   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  25
  26*/
  27
  28/*
  29   This code forms the interface between the USB layers and the Philips
  30   specific stuff. Some adanved stuff of the driver falls under an
  31   NDA, signed between me and Philips B.V., Eindhoven, the Netherlands, and
  32   is thus not distributed in source form. The binary pwcx.o module
  33   contains the code that falls under the NDA.
  34
  35   In case you're wondering: 'pwc' stands for "Philips WebCam", but
  36   I really didn't want to type 'philips_web_cam' every time (I'm lazy as
  37   any Linux kernel hacker, but I don't like uncomprehensible abbreviations
  38   without explanation).
  39
  40   Oh yes, convention: to disctinguish between all the various pointers to
  41   device-structures, I use these names for the pointer variables:
  42   udev: struct usb_device *
  43   vdev: struct video_device *
  44   pdev: struct pwc_devive *
  45*/
  46
  47/* Contributors:
  48   - Alvarado: adding whitebalance code
  49   - Alistar Moire: QuickCam 3000 Pro device/product ID
  50   - Tony Hoyle: Creative Labs Webcam 5 device/product ID
  51   - Mark Burazin: solving hang in VIDIOCSYNC when camera gets unplugged
  52   - Jk Fang: Sotec Afina Eye ID
  53   - Xavier Roche: QuickCam Pro 4000 ID
  54   - Jens Knudsen: QuickCam Zoom ID
  55   - J. Debert: QuickCam for Notebooks ID
  56   - Pham Thanh Nam: webcam snapshot button as an event input device
  57*/
  58
  59#include <linux/errno.h>
  60#include <linux/init.h>
  61#include <linux/mm.h>
  62#include <linux/module.h>
  63#include <linux/poll.h>
  64#include <linux/slab.h>
  65#ifdef CONFIG_USB_PWC_INPUT_EVDEV
  66#include <linux/usb/input.h>
  67#endif
  68#include <linux/vmalloc.h>
  69#include <asm/io.h>
  70#include <linux/kernel.h>               /* simple_strtol() */
  71
  72#include "pwc.h"
  73#include "pwc-kiara.h"
  74#include "pwc-timon.h"
  75#include "pwc-dec23.h"
  76#include "pwc-dec1.h"
  77#include "pwc-uncompress.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);
 119
 120static struct usb_driver pwc_driver = {
 121        .name =                 "Philips webcam",       /* name */
 122        .id_table =             pwc_device_table,
 123        .probe =                usb_pwc_probe,          /* probe() */
 124        .disconnect =           usb_pwc_disconnect,     /* disconnect() */
 125};
 126
 127#define MAX_DEV_HINTS   20
 128#define MAX_ISOC_ERRORS 20
 129
 130static int default_size = PSZ_QCIF;
 131static int default_fps = 10;
 132static int default_fbufs = 3;   /* Default number of frame buffers */
 133        int pwc_mbufs = 2;      /* Default number of mmap() buffers */
 134#ifdef CONFIG_USB_PWC_DEBUG
 135        int pwc_trace = PWC_DEBUG_LEVEL;
 136#endif
 137static int power_save;
 138static int led_on = 100, led_off; /* defaults to LED that is on while in use */
 139static int pwc_preferred_compression = 1; /* 0..3 = uncompressed..high */
 140static struct {
 141        int type;
 142        char serial_number[30];
 143        int device_node;
 144        struct pwc_device *pdev;
 145} device_hint[MAX_DEV_HINTS];
 146
 147/***/
 148
 149static int pwc_video_open(struct file *file);
 150static int pwc_video_close(struct file *file);
 151static ssize_t pwc_video_read(struct file *file, char __user *buf,
 152                          size_t count, loff_t *ppos);
 153static unsigned int pwc_video_poll(struct file *file, poll_table *wait);
 154static long  pwc_video_ioctl(struct file *file,
 155                            unsigned int ioctlnr, unsigned long arg);
 156static int  pwc_video_mmap(struct file *file, struct vm_area_struct *vma);
 157
 158static const struct v4l2_file_operations pwc_fops = {
 159        .owner =        THIS_MODULE,
 160        .open =         pwc_video_open,
 161        .release =      pwc_video_close,
 162        .read =         pwc_video_read,
 163        .poll =         pwc_video_poll,
 164        .mmap =         pwc_video_mmap,
 165        .unlocked_ioctl = pwc_video_ioctl,
 166};
 167static struct video_device pwc_template = {
 168        .name =         "Philips Webcam",       /* Filled in later */
 169        .release =      video_device_release,
 170        .fops =         &pwc_fops,
 171};
 172
 173/***************************************************************************/
 174
 175/* Okay, this is some magic that I worked out and the reasoning behind it...
 176
 177   The biggest problem with any USB device is of course: "what to do
 178   when the user unplugs the device while it is in use by an application?"
 179   We have several options:
 180   1) Curse them with the 7 plagues when they do (requires divine intervention)
 181   2) Tell them not to (won't work: they'll do it anyway)
 182   3) Oops the kernel (this will have a negative effect on a user's uptime)
 183   4) Do something sensible.
 184
 185   Of course, we go for option 4.
 186
 187   It happens that this device will be linked to two times, once from
 188   usb_device and once from the video_device in their respective 'private'
 189   pointers. This is done when the device is probed() and all initialization
 190   succeeded. The pwc_device struct links back to both structures.
 191
 192   When a device is unplugged while in use it will be removed from the
 193   list of known USB devices; I also de-register it as a V4L device, but
 194   unfortunately I can't free the memory since the struct is still in use
 195   by the file descriptor. This free-ing is then deferend until the first
 196   opportunity. Crude, but it works.
 197
 198   A small 'advantage' is that if a user unplugs the cam and plugs it back
 199   in, it should get assigned the same video device minor, but unfortunately
 200   it's non-trivial to re-link the cam back to the video device... (that
 201   would surely be magic! :))
 202*/
 203
 204/***************************************************************************/
 205/* Private functions */
 206
 207/* Here we want the physical address of the memory.
 208 * This is used when initializing the contents of the area.
 209 */
 210
 211
 212
 213static void *pwc_rvmalloc(unsigned long size)
 214{
 215        void * mem;
 216        unsigned long adr;
 217
 218        mem=vmalloc_32(size);
 219        if (!mem)
 220                return NULL;
 221
 222        memset(mem, 0, size); /* Clear the ram out, no junk to the user */
 223        adr=(unsigned long) mem;
 224        while (size > 0)
 225         {
 226           SetPageReserved(vmalloc_to_page((void *)adr));
 227           adr  += PAGE_SIZE;
 228           size -= PAGE_SIZE;
 229         }
 230        return mem;
 231}
 232
 233static void pwc_rvfree(void * mem, unsigned long size)
 234{
 235        unsigned long adr;
 236
 237        if (!mem)
 238                return;
 239
 240        adr=(unsigned long) mem;
 241        while ((long) size > 0)
 242         {
 243           ClearPageReserved(vmalloc_to_page((void *)adr));
 244           adr  += PAGE_SIZE;
 245           size -= PAGE_SIZE;
 246         }
 247        vfree(mem);
 248}
 249
 250
 251
 252
 253static int pwc_allocate_buffers(struct pwc_device *pdev)
 254{
 255        int i, err;
 256        void *kbuf;
 257
 258        PWC_DEBUG_MEMORY(">> pwc_allocate_buffers(pdev = 0x%p)\n", pdev);
 259
 260        if (pdev == NULL)
 261                return -ENXIO;
 262
 263        /* Allocate Isochronuous pipe buffers */
 264        for (i = 0; i < MAX_ISO_BUFS; i++) {
 265                if (pdev->sbuf[i].data == NULL) {
 266                        kbuf = kzalloc(ISO_BUFFER_SIZE, GFP_KERNEL);
 267                        if (kbuf == NULL) {
 268                                PWC_ERROR("Failed to allocate iso buffer %d.\n", i);
 269                                return -ENOMEM;
 270                        }
 271                        PWC_DEBUG_MEMORY("Allocated iso buffer at %p.\n", kbuf);
 272                        pdev->sbuf[i].data = kbuf;
 273                }
 274        }
 275
 276        /* Allocate frame buffer structure */
 277        if (pdev->fbuf == NULL) {
 278                kbuf = kzalloc(default_fbufs * sizeof(struct pwc_frame_buf), GFP_KERNEL);
 279                if (kbuf == NULL) {
 280                        PWC_ERROR("Failed to allocate frame buffer structure.\n");
 281                        return -ENOMEM;
 282                }
 283                PWC_DEBUG_MEMORY("Allocated frame buffer structure at %p.\n", kbuf);
 284                pdev->fbuf = kbuf;
 285        }
 286
 287        /* create frame buffers, and make circular ring */
 288        for (i = 0; i < default_fbufs; i++) {
 289                if (pdev->fbuf[i].data == NULL) {
 290                        kbuf = vzalloc(PWC_FRAME_SIZE); /* need vmalloc since frame buffer > 128K */
 291                        if (kbuf == NULL) {
 292                                PWC_ERROR("Failed to allocate frame buffer %d.\n", i);
 293                                return -ENOMEM;
 294                        }
 295                        PWC_DEBUG_MEMORY("Allocated frame buffer %d at %p.\n", i, kbuf);
 296                        pdev->fbuf[i].data = kbuf;
 297                }
 298        }
 299
 300        /* Allocate decompressor table space */
 301        if (DEVICE_USE_CODEC1(pdev->type))
 302                err = pwc_dec1_alloc(pdev);
 303        else
 304                err = pwc_dec23_alloc(pdev);
 305
 306        if (err) {
 307                PWC_ERROR("Failed to allocate decompress table.\n");
 308                return err;
 309        }
 310
 311        /* Allocate image buffer; double buffer for mmap() */
 312        kbuf = pwc_rvmalloc(pwc_mbufs * pdev->len_per_image);
 313        if (kbuf == NULL) {
 314                PWC_ERROR("Failed to allocate image buffer(s). needed (%d)\n",
 315                                pwc_mbufs * pdev->len_per_image);
 316                return -ENOMEM;
 317        }
 318        PWC_DEBUG_MEMORY("Allocated image buffer at %p.\n", kbuf);
 319        pdev->image_data = kbuf;
 320        for (i = 0; i < pwc_mbufs; i++) {
 321                pdev->images[i].offset = i * pdev->len_per_image;
 322                pdev->images[i].vma_use_count = 0;
 323        }
 324        for (; i < MAX_IMAGES; i++) {
 325                pdev->images[i].offset = 0;
 326        }
 327
 328        kbuf = NULL;
 329
 330        PWC_DEBUG_MEMORY("<< pwc_allocate_buffers()\n");
 331        return 0;
 332}
 333
 334static void pwc_free_buffers(struct pwc_device *pdev)
 335{
 336        int i;
 337
 338        PWC_DEBUG_MEMORY("Entering free_buffers(%p).\n", pdev);
 339
 340        if (pdev == NULL)
 341                return;
 342        /* Release Iso-pipe buffers */
 343        for (i = 0; i < MAX_ISO_BUFS; i++)
 344                if (pdev->sbuf[i].data != NULL) {
 345                        PWC_DEBUG_MEMORY("Freeing ISO buffer at %p.\n", pdev->sbuf[i].data);
 346                        kfree(pdev->sbuf[i].data);
 347                        pdev->sbuf[i].data = NULL;
 348                }
 349
 350        /* The same for frame buffers */
 351        if (pdev->fbuf != NULL) {
 352                for (i = 0; i < default_fbufs; i++) {
 353                        if (pdev->fbuf[i].data != NULL) {
 354                                PWC_DEBUG_MEMORY("Freeing frame buffer %d at %p.\n", i, pdev->fbuf[i].data);
 355                                vfree(pdev->fbuf[i].data);
 356                                pdev->fbuf[i].data = NULL;
 357                        }
 358                }
 359                kfree(pdev->fbuf);
 360                pdev->fbuf = NULL;
 361        }
 362
 363        /* Intermediate decompression buffer & tables */
 364        if (pdev->decompress_data != NULL) {
 365                PWC_DEBUG_MEMORY("Freeing decompression buffer at %p.\n", pdev->decompress_data);
 366                kfree(pdev->decompress_data);
 367                pdev->decompress_data = NULL;
 368        }
 369
 370        /* Release image buffers */
 371        if (pdev->image_data != NULL) {
 372                PWC_DEBUG_MEMORY("Freeing image buffer at %p.\n", pdev->image_data);
 373                pwc_rvfree(pdev->image_data, pwc_mbufs * pdev->len_per_image);
 374        }
 375        pdev->image_data = NULL;
 376
 377        PWC_DEBUG_MEMORY("Leaving free_buffers().\n");
 378}
 379
 380/* The frame & image buffer mess.
 381
 382   Yes, this is a mess. Well, it used to be simple, but alas...  In this
 383   module, 3 buffers schemes are used to get the data from the USB bus to
 384   the user program. The first scheme involves the ISO buffers (called thus
 385   since they transport ISO data from the USB controller), and not really
 386   interesting. Suffices to say the data from this buffer is quickly
 387   gathered in an interrupt handler (pwc_isoc_handler) and placed into the
 388   frame buffer.
 389
 390   The frame buffer is the second scheme, and is the central element here.
 391   It collects the data from a single frame from the camera (hence, the
 392   name). Frames are delimited by the USB camera with a short USB packet,
 393   so that's easy to detect. The frame buffers form a list that is filled
 394   by the camera+USB controller and drained by the user process through
 395   either read() or mmap().
 396
 397   The image buffer is the third scheme, in which frames are decompressed
 398   and converted into planar format. For mmap() there is more than
 399   one image buffer available.
 400
 401   The frame buffers provide the image buffering. In case the user process
 402   is a bit slow, this introduces lag and some undesired side-effects.
 403   The problem arises when the frame buffer is full. I used to drop the last
 404   frame, which makes the data in the queue stale very quickly. But dropping
 405   the frame at the head of the queue proved to be a litte bit more difficult.
 406   I tried a circular linked scheme, but this introduced more problems than
 407   it solved.
 408
 409   Because filling and draining are completely asynchronous processes, this
 410   requires some fiddling with pointers and mutexes.
 411
 412   Eventually, I came up with a system with 2 lists: an 'empty' frame list
 413   and a 'full' frame list:
 414     * Initially, all frame buffers but one are on the 'empty' list; the one
 415       remaining buffer is our initial fill frame.
 416     * If a frame is needed for filling, we try to take it from the 'empty'
 417       list, unless that list is empty, in which case we take the buffer at
 418       the head of the 'full' list.
 419     * When our fill buffer has been filled, it is appended to the 'full'
 420       list.
 421     * If a frame is needed by read() or mmap(), it is taken from the head of
 422       the 'full' list, handled, and then appended to the 'empty' list. If no
 423       buffer is present on the 'full' list, we wait.
 424   The advantage is that the buffer that is currently being decompressed/
 425   converted, is on neither list, and thus not in our way (any other scheme
 426   I tried had the problem of old data lingering in the queue).
 427
 428   Whatever strategy you choose, it always remains a tradeoff: with more
 429   frame buffers the chances of a missed frame are reduced. On the other
 430   hand, on slower machines it introduces lag because the queue will
 431   always be full.
 432 */
 433
 434/**
 435  \brief Find next frame buffer to fill. Take from empty or full list, whichever comes first.
 436 */
 437static int pwc_next_fill_frame(struct pwc_device *pdev)
 438{
 439        int ret;
 440        unsigned long flags;
 441
 442        ret = 0;
 443        spin_lock_irqsave(&pdev->ptrlock, flags);
 444        if (pdev->fill_frame != NULL) {
 445                /* append to 'full' list */
 446                if (pdev->full_frames == NULL) {
 447                        pdev->full_frames = pdev->fill_frame;
 448                        pdev->full_frames_tail = pdev->full_frames;
 449                }
 450                else {
 451                        pdev->full_frames_tail->next = pdev->fill_frame;
 452                        pdev->full_frames_tail = pdev->fill_frame;
 453                }
 454        }
 455        if (pdev->empty_frames != NULL) {
 456                /* We have empty frames available. That's easy */
 457                pdev->fill_frame = pdev->empty_frames;
 458                pdev->empty_frames = pdev->empty_frames->next;
 459        }
 460        else {
 461                /* Hmm. Take it from the full list */
 462                /* sanity check */
 463                if (pdev->full_frames == NULL) {
 464                        PWC_ERROR("Neither empty or full frames available!\n");
 465                        spin_unlock_irqrestore(&pdev->ptrlock, flags);
 466                        return -EINVAL;
 467                }
 468                pdev->fill_frame = pdev->full_frames;
 469                pdev->full_frames = pdev->full_frames->next;
 470                ret = 1;
 471        }
 472        pdev->fill_frame->next = NULL;
 473        spin_unlock_irqrestore(&pdev->ptrlock, flags);
 474        return ret;
 475}
 476
 477
 478/**
 479  \brief Reset all buffers, pointers and lists, except for the image_used[] buffer.
 480
 481  If the image_used[] buffer is cleared too, mmap()/VIDIOCSYNC will run into trouble.
 482 */
 483static void pwc_reset_buffers(struct pwc_device *pdev)
 484{
 485        int i;
 486        unsigned long flags;
 487
 488        PWC_DEBUG_MEMORY(">> %s __enter__\n", __func__);
 489
 490        spin_lock_irqsave(&pdev->ptrlock, flags);
 491        pdev->full_frames = NULL;
 492        pdev->full_frames_tail = NULL;
 493        for (i = 0; i < default_fbufs; i++) {
 494                pdev->fbuf[i].filled = 0;
 495                if (i > 0)
 496                        pdev->fbuf[i].next = &pdev->fbuf[i - 1];
 497                else
 498                        pdev->fbuf->next = NULL;
 499        }
 500        pdev->empty_frames = &pdev->fbuf[default_fbufs - 1];
 501        pdev->empty_frames_tail = pdev->fbuf;
 502        pdev->read_frame = NULL;
 503        pdev->fill_frame = pdev->empty_frames;
 504        pdev->empty_frames = pdev->empty_frames->next;
 505
 506        pdev->image_read_pos = 0;
 507        pdev->fill_image = 0;
 508        spin_unlock_irqrestore(&pdev->ptrlock, flags);
 509
 510        PWC_DEBUG_MEMORY("<< %s __leaving__\n", __func__);
 511}
 512
 513
 514/**
 515  \brief Do all the handling for getting one frame: get pointer, decompress, advance pointers.
 516 */
 517int pwc_handle_frame(struct pwc_device *pdev)
 518{
 519        int ret = 0;
 520        unsigned long flags;
 521
 522        spin_lock_irqsave(&pdev->ptrlock, flags);
 523        /* First grab our read_frame; this is removed from all lists, so
 524           we can release the lock after this without problems */
 525        if (pdev->read_frame != NULL) {
 526                /* This can't theoretically happen */
 527                PWC_ERROR("Huh? Read frame still in use?\n");
 528                spin_unlock_irqrestore(&pdev->ptrlock, flags);
 529                return ret;
 530        }
 531
 532
 533        if (pdev->full_frames == NULL) {
 534                PWC_ERROR("Woops. No frames ready.\n");
 535        }
 536        else {
 537                pdev->read_frame = pdev->full_frames;
 538                pdev->full_frames = pdev->full_frames->next;
 539                pdev->read_frame->next = NULL;
 540        }
 541
 542        if (pdev->read_frame != NULL) {
 543                /* Decompression is a lengthy process, so it's outside of the lock.
 544                   This gives the isoc_handler the opportunity to fill more frames
 545                   in the mean time.
 546                */
 547                spin_unlock_irqrestore(&pdev->ptrlock, flags);
 548                ret = pwc_decompress(pdev);
 549                spin_lock_irqsave(&pdev->ptrlock, flags);
 550
 551                /* We're done with read_buffer, tack it to the end of the empty buffer list */
 552                if (pdev->empty_frames == NULL) {
 553                        pdev->empty_frames = pdev->read_frame;
 554                        pdev->empty_frames_tail = pdev->empty_frames;
 555                }
 556                else {
 557                        pdev->empty_frames_tail->next = pdev->read_frame;
 558                        pdev->empty_frames_tail = pdev->read_frame;
 559                }
 560                pdev->read_frame = NULL;
 561        }
 562        spin_unlock_irqrestore(&pdev->ptrlock, flags);
 563        return ret;
 564}
 565
 566/**
 567  \brief Advance pointers of image buffer (after each user request)
 568*/
 569void pwc_next_image(struct pwc_device *pdev)
 570{
 571        pdev->image_used[pdev->fill_image] = 0;
 572        pdev->fill_image = (pdev->fill_image + 1) % pwc_mbufs;
 573}
 574
 575/**
 576 * Print debug information when a frame is discarded because all of our buffer
 577 * is full
 578 */
 579static void pwc_frame_dumped(struct pwc_device *pdev)
 580{
 581        pdev->vframes_dumped++;
 582        if (pdev->vframe_count < FRAME_LOWMARK)
 583                return;
 584
 585        if (pdev->vframes_dumped < 20)
 586                PWC_DEBUG_FLOW("Dumping frame %d\n", pdev->vframe_count);
 587        else if (pdev->vframes_dumped == 20)
 588                PWC_DEBUG_FLOW("Dumping frame %d (last message)\n",
 589                                pdev->vframe_count);
 590}
 591
 592static void pwc_snapshot_button(struct pwc_device *pdev, int down)
 593{
 594        if (down) {
 595                PWC_TRACE("Snapshot button pressed.\n");
 596                pdev->snapshot_button_status = 1;
 597        } else {
 598                PWC_TRACE("Snapshot button released.\n");
 599        }
 600
 601#ifdef CONFIG_USB_PWC_INPUT_EVDEV
 602        if (pdev->button_dev) {
 603                input_report_key(pdev->button_dev, KEY_CAMERA, down);
 604                input_sync(pdev->button_dev);
 605        }
 606#endif
 607}
 608
 609static int pwc_rcv_short_packet(struct pwc_device *pdev, const struct pwc_frame_buf *fbuf)
 610{
 611        int awake = 0;
 612
 613        /* The ToUCam Fun CMOS sensor causes the firmware to send 2 or 3 bogus
 614           frames on the USB wire after an exposure change. This conditition is
 615           however detected  in the cam and a bit is set in the header.
 616           */
 617        if (pdev->type == 730) {
 618                unsigned char *ptr = (unsigned char *)fbuf->data;
 619
 620                if (ptr[1] == 1 && ptr[0] & 0x10) {
 621                        PWC_TRACE("Hyundai CMOS sensor bug. Dropping frame.\n");
 622                        pdev->drop_frames += 2;
 623                        pdev->vframes_error++;
 624                }
 625                if ((ptr[0] ^ pdev->vmirror) & 0x01) {
 626                        pwc_snapshot_button(pdev, ptr[0] & 0x01);
 627                }
 628                if ((ptr[0] ^ pdev->vmirror) & 0x02) {
 629                        if (ptr[0] & 0x02)
 630                                PWC_TRACE("Image is mirrored.\n");
 631                        else
 632                                PWC_TRACE("Image is normal.\n");
 633                }
 634                pdev->vmirror = ptr[0] & 0x03;
 635                /* Sometimes the trailer of the 730 is still sent as a 4 byte packet
 636                   after a short frame; this condition is filtered out specifically. A 4 byte
 637                   frame doesn't make sense anyway.
 638                   So we get either this sequence:
 639                   drop_bit set -> 4 byte frame -> short frame -> good frame
 640                   Or this one:
 641                   drop_bit set -> short frame -> good frame
 642                   So we drop either 3 or 2 frames in all!
 643                   */
 644                if (fbuf->filled == 4)
 645                        pdev->drop_frames++;
 646        }
 647        else if (pdev->type == 740 || pdev->type == 720) {
 648                unsigned char *ptr = (unsigned char *)fbuf->data;
 649                if ((ptr[0] ^ pdev->vmirror) & 0x01) {
 650                        pwc_snapshot_button(pdev, ptr[0] & 0x01);
 651                }
 652                pdev->vmirror = ptr[0] & 0x03;
 653        }
 654
 655        /* In case we were instructed to drop the frame, do so silently.
 656           The buffer pointers are not updated either (but the counters are reset below).
 657           */
 658        if (pdev->drop_frames > 0)
 659                pdev->drop_frames--;
 660        else {
 661                /* Check for underflow first */
 662                if (fbuf->filled < pdev->frame_total_size) {
 663                        PWC_DEBUG_FLOW("Frame buffer underflow (%d bytes);"
 664                                       " discarded.\n", fbuf->filled);
 665                        pdev->vframes_error++;
 666                }
 667                else {
 668                        /* Send only once per EOF */
 669                        awake = 1; /* delay wake_ups */
 670
 671                        /* Find our next frame to fill. This will always succeed, since we
 672                         * nick a frame from either empty or full list, but if we had to
 673                         * take it from the full list, it means a frame got dropped.
 674                         */
 675                        if (pwc_next_fill_frame(pdev))
 676                                pwc_frame_dumped(pdev);
 677
 678                }
 679        } /* !drop_frames */
 680        pdev->vframe_count++;
 681        return awake;
 682}
 683
 684/* This gets called for the Isochronous pipe (video). This is done in
 685 * interrupt time, so it has to be fast, not crash, and not stall. Neat.
 686 */
 687static void pwc_isoc_handler(struct urb *urb)
 688{
 689        struct pwc_device *pdev;
 690        int i, fst, flen;
 691        int awake;
 692        struct pwc_frame_buf *fbuf;
 693        unsigned char *fillptr = NULL, *iso_buf = NULL;
 694
 695        awake = 0;
 696        pdev = (struct pwc_device *)urb->context;
 697        if (pdev == NULL) {
 698                PWC_ERROR("isoc_handler() called with NULL device?!\n");
 699                return;
 700        }
 701
 702        if (urb->status == -ENOENT || urb->status == -ECONNRESET) {
 703                PWC_DEBUG_OPEN("URB (%p) unlinked %ssynchronuously.\n", urb, urb->status == -ENOENT ? "" : "a");
 704                return;
 705        }
 706        if (urb->status != -EINPROGRESS && urb->status != 0) {
 707                const char *errmsg;
 708
 709                errmsg = "Unknown";
 710                switch(urb->status) {
 711                        case -ENOSR:            errmsg = "Buffer error (overrun)"; break;
 712                        case -EPIPE:            errmsg = "Stalled (device not responding)"; break;
 713                        case -EOVERFLOW:        errmsg = "Babble (bad cable?)"; break;
 714                        case -EPROTO:           errmsg = "Bit-stuff error (bad cable?)"; break;
 715                        case -EILSEQ:           errmsg = "CRC/Timeout (could be anything)"; break;
 716                        case -ETIME:            errmsg = "Device does not respond"; break;
 717                }
 718                PWC_DEBUG_FLOW("pwc_isoc_handler() called with status %d [%s].\n", urb->status, errmsg);
 719                /* Give up after a number of contiguous errors on the USB bus.
 720                   Appearantly something is wrong so we simulate an unplug event.
 721                 */
 722                if (++pdev->visoc_errors > MAX_ISOC_ERRORS)
 723                {
 724                        PWC_INFO("Too many ISOC errors, bailing out.\n");
 725                        pdev->error_status = EIO;
 726                        awake = 1;
 727                        wake_up_interruptible(&pdev->frameq);
 728                }
 729                goto handler_end; // ugly, but practical
 730        }
 731
 732        fbuf = pdev->fill_frame;
 733        if (fbuf == NULL) {
 734                PWC_ERROR("pwc_isoc_handler without valid fill frame.\n");
 735                awake = 1;
 736                goto handler_end;
 737        }
 738        else {
 739                fillptr = fbuf->data + fbuf->filled;
 740        }
 741
 742        /* Reset ISOC error counter. We did get here, after all. */
 743        pdev->visoc_errors = 0;
 744
 745        /* vsync: 0 = don't copy data
 746                  1 = sync-hunt
 747                  2 = synched
 748         */
 749        /* Compact data */
 750        for (i = 0; i < urb->number_of_packets; i++) {
 751                fst  = urb->iso_frame_desc[i].status;
 752                flen = urb->iso_frame_desc[i].actual_length;
 753                iso_buf = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
 754                if (fst == 0) {
 755                        if (flen > 0) { /* if valid data... */
 756                                if (pdev->vsync > 0) { /* ...and we are not sync-hunting... */
 757                                        pdev->vsync = 2;
 758
 759                                        /* ...copy data to frame buffer, if possible */
 760                                        if (flen + fbuf->filled > pdev->frame_total_size) {
 761                                                PWC_DEBUG_FLOW("Frame buffer overflow (flen = %d, frame_total_size = %d).\n", flen, pdev->frame_total_size);
 762                                                pdev->vsync = 0; /* Hmm, let's wait for an EOF (end-of-frame) */
 763                                                pdev->vframes_error++;
 764                                        }
 765                                        else {
 766                                                memmove(fillptr, iso_buf, flen);
 767                                                fillptr += flen;
 768                                        }
 769                                }
 770                                fbuf->filled += flen;
 771                        } /* ..flen > 0 */
 772
 773                        if (flen < pdev->vlast_packet_size) {
 774                                /* Shorter packet... We probably have the end of an image-frame;
 775                                   wake up read() process and let select()/poll() do something.
 776                                   Decompression is done in user time over there.
 777                                   */
 778                                if (pdev->vsync == 2) {
 779                                        if (pwc_rcv_short_packet(pdev, fbuf)) {
 780                                                awake = 1;
 781                                                fbuf = pdev->fill_frame;
 782                                        }
 783                                }
 784                                fbuf->filled = 0;
 785                                fillptr = fbuf->data;
 786                                pdev->vsync = 1;
 787                        }
 788
 789                        pdev->vlast_packet_size = flen;
 790                } /* ..status == 0 */
 791                else {
 792                        /* This is normally not interesting to the user, unless
 793                         * you are really debugging something, default = 0 */
 794                        static int iso_error;
 795                        iso_error++;
 796                        if (iso_error < 20)
 797                                PWC_DEBUG_FLOW("Iso frame %d of USB has error %d\n", i, fst);
 798                }
 799        }
 800
 801handler_end:
 802        if (awake)
 803                wake_up_interruptible(&pdev->frameq);
 804
 805        urb->dev = pdev->udev;
 806        i = usb_submit_urb(urb, GFP_ATOMIC);
 807        if (i != 0)
 808                PWC_ERROR("Error (%d) re-submitting urb in pwc_isoc_handler.\n", i);
 809}
 810
 811
 812int pwc_isoc_init(struct pwc_device *pdev)
 813{
 814        struct usb_device *udev;
 815        struct urb *urb;
 816        int i, j, ret;
 817
 818        struct usb_interface *intf;
 819        struct usb_host_interface *idesc = NULL;
 820
 821        if (pdev == NULL)
 822                return -EFAULT;
 823        if (pdev->iso_init)
 824                return 0;
 825        pdev->vsync = 0;
 826        udev = pdev->udev;
 827
 828        /* Get the current alternate interface, adjust packet size */
 829        if (!udev->actconfig)
 830                return -EFAULT;
 831        intf = usb_ifnum_to_if(udev, 0);
 832        if (intf)
 833                idesc = usb_altnum_to_altsetting(intf, pdev->valternate);
 834
 835        if (!idesc)
 836                return -EFAULT;
 837
 838        /* Search video endpoint */
 839        pdev->vmax_packet_size = -1;
 840        for (i = 0; i < idesc->desc.bNumEndpoints; i++) {
 841                if ((idesc->endpoint[i].desc.bEndpointAddress & 0xF) == pdev->vendpoint) {
 842                        pdev->vmax_packet_size = le16_to_cpu(idesc->endpoint[i].desc.wMaxPacketSize);
 843                        break;
 844                }
 845        }
 846
 847        if (pdev->vmax_packet_size < 0 || pdev->vmax_packet_size > ISO_MAX_FRAME_SIZE) {
 848                PWC_ERROR("Failed to find packet size for video endpoint in current alternate setting.\n");
 849                return -ENFILE; /* Odd error, that should be noticeable */
 850        }
 851
 852        /* Set alternate interface */
 853        ret = 0;
 854        PWC_DEBUG_OPEN("Setting alternate interface %d\n", pdev->valternate);
 855        ret = usb_set_interface(pdev->udev, 0, pdev->valternate);
 856        if (ret < 0)
 857                return ret;
 858
 859        for (i = 0; i < MAX_ISO_BUFS; i++) {
 860                urb = usb_alloc_urb(ISO_FRAMES_PER_DESC, GFP_KERNEL);
 861                if (urb == NULL) {
 862                        PWC_ERROR("Failed to allocate urb %d\n", i);
 863                        ret = -ENOMEM;
 864                        break;
 865                }
 866                pdev->sbuf[i].urb = urb;
 867                PWC_DEBUG_MEMORY("Allocated URB at 0x%p\n", urb);
 868        }
 869        if (ret) {
 870                /* De-allocate in reverse order */
 871                while (i--) {
 872                        usb_free_urb(pdev->sbuf[i].urb);
 873                        pdev->sbuf[i].urb = NULL;
 874                }
 875                return ret;
 876        }
 877
 878        /* init URB structure */
 879        for (i = 0; i < MAX_ISO_BUFS; i++) {
 880                urb = pdev->sbuf[i].urb;
 881
 882                urb->interval = 1; // devik
 883                urb->dev = udev;
 884                urb->pipe = usb_rcvisocpipe(udev, pdev->vendpoint);
 885                urb->transfer_flags = URB_ISO_ASAP;
 886                urb->transfer_buffer = pdev->sbuf[i].data;
 887                urb->transfer_buffer_length = ISO_BUFFER_SIZE;
 888                urb->complete = pwc_isoc_handler;
 889                urb->context = pdev;
 890                urb->start_frame = 0;
 891                urb->number_of_packets = ISO_FRAMES_PER_DESC;
 892                for (j = 0; j < ISO_FRAMES_PER_DESC; j++) {
 893                        urb->iso_frame_desc[j].offset = j * ISO_MAX_FRAME_SIZE;
 894                        urb->iso_frame_desc[j].length = pdev->vmax_packet_size;
 895                }
 896        }
 897
 898        /* link */
 899        for (i = 0; i < MAX_ISO_BUFS; i++) {
 900                ret = usb_submit_urb(pdev->sbuf[i].urb, GFP_KERNEL);
 901                if (ret) {
 902                        PWC_ERROR("isoc_init() submit_urb %d failed with error %d\n", i, ret);
 903                        pdev->iso_init = 1;
 904                        pwc_isoc_cleanup(pdev);
 905                        return ret;
 906                }
 907                PWC_DEBUG_MEMORY("URB 0x%p submitted.\n", pdev->sbuf[i].urb);
 908        }
 909
 910        /* All is done... */
 911        pdev->iso_init = 1;
 912        PWC_DEBUG_OPEN("<< pwc_isoc_init()\n");
 913        return 0;
 914}
 915
 916static void pwc_iso_stop(struct pwc_device *pdev)
 917{
 918        int i;
 919
 920        /* Unlinking ISOC buffers one by one */
 921        for (i = 0; i < MAX_ISO_BUFS; i++) {
 922                struct urb *urb;
 923
 924                urb = pdev->sbuf[i].urb;
 925                if (urb) {
 926                        PWC_DEBUG_MEMORY("Unlinking URB %p\n", urb);
 927                        usb_kill_urb(urb);
 928                }
 929        }
 930}
 931
 932static void pwc_iso_free(struct pwc_device *pdev)
 933{
 934        int i;
 935
 936        /* Freeing ISOC buffers one by one */
 937        for (i = 0; i < MAX_ISO_BUFS; i++) {
 938                struct urb *urb;
 939
 940                urb = pdev->sbuf[i].urb;
 941                if (urb) {
 942                        PWC_DEBUG_MEMORY("Freeing URB\n");
 943                        usb_free_urb(urb);
 944                        pdev->sbuf[i].urb = NULL;
 945                }
 946        }
 947}
 948
 949void pwc_isoc_cleanup(struct pwc_device *pdev)
 950{
 951        PWC_DEBUG_OPEN(">> pwc_isoc_cleanup()\n");
 952        if (pdev == NULL)
 953                return;
 954        if (pdev->iso_init == 0)
 955                return;
 956
 957        pwc_iso_stop(pdev);
 958        pwc_iso_free(pdev);
 959
 960        /* Stop camera, but only if we are sure the camera is still there (unplug
 961           is signalled by EPIPE)
 962         */
 963        if (pdev->error_status != EPIPE) {
 964                PWC_DEBUG_OPEN("Setting alternate interface 0.\n");
 965                usb_set_interface(pdev->udev, 0, 0);
 966        }
 967
 968        pdev->iso_init = 0;
 969        PWC_DEBUG_OPEN("<< pwc_isoc_cleanup()\n");
 970}
 971
 972/*********
 973 * sysfs
 974 *********/
 975static struct pwc_device *cd_to_pwc(struct device *cd)
 976{
 977        struct video_device *vdev = to_video_device(cd);
 978        return video_get_drvdata(vdev);
 979}
 980
 981static ssize_t show_pan_tilt(struct device *class_dev,
 982                             struct device_attribute *attr, char *buf)
 983{
 984        struct pwc_device *pdev = cd_to_pwc(class_dev);
 985        return sprintf(buf, "%d %d\n", pdev->pan_angle, pdev->tilt_angle);
 986}
 987
 988static ssize_t store_pan_tilt(struct device *class_dev,
 989                              struct device_attribute *attr,
 990                              const char *buf, size_t count)
 991{
 992        struct pwc_device *pdev = cd_to_pwc(class_dev);
 993        int pan, tilt;
 994        int ret = -EINVAL;
 995
 996        if (strncmp(buf, "reset", 5) == 0)
 997                ret = pwc_mpt_reset(pdev, 0x3);
 998
 999        else if (sscanf(buf, "%d %d", &pan, &tilt) > 0)
1000                ret = pwc_mpt_set_angle(pdev, pan, tilt);
1001
1002        if (ret < 0)
1003                return ret;
1004        return strlen(buf);
1005}
1006static DEVICE_ATTR(pan_tilt, S_IRUGO | S_IWUSR, show_pan_tilt,
1007                   store_pan_tilt);
1008
1009static ssize_t show_snapshot_button_status(struct device *class_dev,
1010                                           struct device_attribute *attr, char *buf)
1011{
1012        struct pwc_device *pdev = cd_to_pwc(class_dev);
1013        int status = pdev->snapshot_button_status;
1014        pdev->snapshot_button_status = 0;
1015        return sprintf(buf, "%d\n", status);
1016}
1017
1018static DEVICE_ATTR(button, S_IRUGO | S_IWUSR, show_snapshot_button_status,
1019                   NULL);
1020
1021static int pwc_create_sysfs_files(struct video_device *vdev)
1022{
1023        struct pwc_device *pdev = video_get_drvdata(vdev);
1024        int rc;
1025
1026        rc = device_create_file(&vdev->dev, &dev_attr_button);
1027        if (rc)
1028                goto err;
1029        if (pdev->features & FEATURE_MOTOR_PANTILT) {
1030                rc = device_create_file(&vdev->dev, &dev_attr_pan_tilt);
1031                if (rc)
1032                        goto err_button;
1033        }
1034
1035        return 0;
1036
1037err_button:
1038        device_remove_file(&vdev->dev, &dev_attr_button);
1039err:
1040        PWC_ERROR("Could not create sysfs files.\n");
1041        return rc;
1042}
1043
1044static void pwc_remove_sysfs_files(struct video_device *vdev)
1045{
1046        struct pwc_device *pdev = video_get_drvdata(vdev);
1047
1048        if (pdev->features & FEATURE_MOTOR_PANTILT)
1049                device_remove_file(&vdev->dev, &dev_attr_pan_tilt);
1050        device_remove_file(&vdev->dev, &dev_attr_button);
1051}
1052
1053#ifdef CONFIG_USB_PWC_DEBUG
1054static const char *pwc_sensor_type_to_string(unsigned int sensor_type)
1055{
1056        switch(sensor_type) {
1057                case 0x00:
1058                        return "Hyundai CMOS sensor";
1059                case 0x20:
1060                        return "Sony CCD sensor + TDA8787";
1061                case 0x2E:
1062                        return "Sony CCD sensor + Exas 98L59";
1063                case 0x2F:
1064                        return "Sony CCD sensor + ADI 9804";
1065                case 0x30:
1066                        return "Sharp CCD sensor + TDA8787";
1067                case 0x3E:
1068                        return "Sharp CCD sensor + Exas 98L59";
1069                case 0x3F:
1070                        return "Sharp CCD sensor + ADI 9804";
1071                case 0x40:
1072                        return "UPA 1021 sensor";
1073                case 0x100:
1074                        return "VGA sensor";
1075                case 0x101:
1076                        return "PAL MR sensor";
1077                default:
1078                        return "unknown type of sensor";
1079        }
1080}
1081#endif
1082
1083/***************************************************************************/
1084/* Video4Linux functions */
1085
1086static int pwc_video_open(struct file *file)
1087{
1088        int i, ret;
1089        struct video_device *vdev = video_devdata(file);
1090        struct pwc_device *pdev;
1091
1092        PWC_DEBUG_OPEN(">> video_open called(vdev = 0x%p).\n", vdev);
1093
1094        pdev = video_get_drvdata(vdev);
1095        BUG_ON(!pdev);
1096        if (pdev->vopen) {
1097                PWC_DEBUG_OPEN("I'm busy, someone is using the device.\n");
1098                return -EBUSY;
1099        }
1100
1101        mutex_lock(&pdev->modlock);
1102        pwc_construct(pdev); /* set min/max sizes correct */
1103        if (!pdev->usb_init) {
1104                PWC_DEBUG_OPEN("Doing first time initialization.\n");
1105                pdev->usb_init = 1;
1106
1107                /* Query sensor type */
1108                ret = pwc_get_cmos_sensor(pdev, &i);
1109                if (ret >= 0)
1110                {
1111                        PWC_DEBUG_OPEN("This %s camera is equipped with a %s (%d).\n",
1112                                        pdev->vdev->name,
1113                                        pwc_sensor_type_to_string(i), i);
1114                }
1115        }
1116
1117        /* Turn on camera */
1118        if (power_save) {
1119                i = pwc_camera_power(pdev, 1);
1120                if (i < 0)
1121                        PWC_DEBUG_OPEN("Failed to restore power to the camera! (%d)\n", i);
1122        }
1123        /* Set LED on/off time */
1124        if (pwc_set_leds(pdev, led_on, led_off) < 0)
1125                PWC_DEBUG_OPEN("Failed to set LED on/off time.\n");
1126
1127
1128        /* So far, so good. Allocate memory. */
1129        i = pwc_allocate_buffers(pdev);
1130        if (i < 0) {
1131                PWC_DEBUG_OPEN("Failed to allocate buffers memory.\n");
1132                pwc_free_buffers(pdev);
1133                mutex_unlock(&pdev->modlock);
1134                return i;
1135        }
1136
1137        /* Reset buffers & parameters */
1138        pwc_reset_buffers(pdev);
1139        for (i = 0; i < pwc_mbufs; i++)
1140                pdev->image_used[i] = 0;
1141        pdev->vframe_count = 0;
1142        pdev->vframes_dumped = 0;
1143        pdev->vframes_error = 0;
1144        pdev->visoc_errors = 0;
1145        pdev->error_status = 0;
1146        pwc_construct(pdev); /* set min/max sizes correct */
1147
1148        /* Set some defaults */
1149        pdev->vsnapshot = 0;
1150
1151        /* Set video size, first try the last used video size
1152           (or the default one); if that fails try QCIF/10 or QSIF/10;
1153           it that fails too, give up.
1154         */
1155        i = pwc_set_video_mode(pdev, pwc_image_sizes[pdev->vsize].x, pwc_image_sizes[pdev->vsize].y, pdev->vframes, pdev->vcompression, 0);
1156        if (i)  {
1157                unsigned int default_resolution;
1158                PWC_DEBUG_OPEN("First attempt at set_video_mode failed.\n");
1159                if (pdev->type>= 730)
1160                        default_resolution = PSZ_QSIF;
1161                else
1162                        default_resolution = PSZ_QCIF;
1163
1164                i = pwc_set_video_mode(pdev,
1165                                       pwc_image_sizes[default_resolution].x,
1166                                       pwc_image_sizes[default_resolution].y,
1167                                       10,
1168                                       pdev->vcompression,
1169                                       0);
1170        }
1171        if (i) {
1172                PWC_DEBUG_OPEN("Second attempt at set_video_mode failed.\n");
1173                pwc_free_buffers(pdev);
1174                mutex_unlock(&pdev->modlock);
1175                return i;
1176        }
1177
1178        /* Initialize the webcam to sane value */
1179        pwc_set_brightness(pdev, 0x7fff);
1180        pwc_set_agc(pdev, 1, 0);
1181
1182        pdev->vopen++;
1183        file->private_data = vdev;
1184        mutex_unlock(&pdev->modlock);
1185        PWC_DEBUG_OPEN("<< video_open() returns 0.\n");
1186        return 0;
1187}
1188
1189
1190static void pwc_cleanup(struct pwc_device *pdev)
1191{
1192        pwc_remove_sysfs_files(pdev->vdev);
1193        video_unregister_device(pdev->vdev);
1194
1195#ifdef CONFIG_USB_PWC_INPUT_EVDEV
1196        if (pdev->button_dev)
1197                input_unregister_device(pdev->button_dev);
1198#endif
1199
1200        kfree(pdev);
1201}
1202
1203/* Note that all cleanup is done in the reverse order as in _open */
1204static int pwc_video_close(struct file *file)
1205{
1206        struct video_device *vdev = file->private_data;
1207        struct pwc_device *pdev;
1208        int i, hint;
1209
1210        PWC_DEBUG_OPEN(">> video_close called(vdev = 0x%p).\n", vdev);
1211
1212        pdev = video_get_drvdata(vdev);
1213        mutex_lock(&pdev->modlock);
1214        if (pdev->vopen == 0)
1215                PWC_DEBUG_MODULE("video_close() called on closed device?\n");
1216
1217        /* Dump statistics, but only if a reasonable amount of frames were
1218           processed (to prevent endless log-entries in case of snap-shot
1219           programs)
1220         */
1221        if (pdev->vframe_count > 20)
1222                PWC_DEBUG_MODULE("Closing video device: %d frames received, dumped %d frames, %d frames with errors.\n", pdev->vframe_count, pdev->vframes_dumped, pdev->vframes_error);
1223
1224        if (DEVICE_USE_CODEC1(pdev->type))
1225            pwc_dec1_exit();
1226        else
1227            pwc_dec23_exit();
1228
1229        pwc_isoc_cleanup(pdev);
1230        pwc_free_buffers(pdev);
1231
1232        /* Turn off LEDS and power down camera, but only when not unplugged */
1233        if (!pdev->unplugged) {
1234                /* Turn LEDs off */
1235                if (pwc_set_leds(pdev, 0, 0) < 0)
1236                        PWC_DEBUG_MODULE("Failed to set LED on/off time.\n");
1237                if (power_save) {
1238                        i = pwc_camera_power(pdev, 0);
1239                        if (i < 0)
1240                                PWC_ERROR("Failed to power down camera (%d)\n", i);
1241                }
1242                pdev->vopen--;
1243                PWC_DEBUG_OPEN("<< video_close() vopen=%d\n", pdev->vopen);
1244        } else {
1245                pwc_cleanup(pdev);
1246                /* search device_hint[] table if we occupy a slot, by any chance */
1247                for (hint = 0; hint < MAX_DEV_HINTS; hint++)
1248                        if (device_hint[hint].pdev == pdev)
1249                                device_hint[hint].pdev = NULL;
1250        }
1251        mutex_unlock(&pdev->modlock);
1252
1253        return 0;
1254}
1255
1256/*
1257 *      FIXME: what about two parallel reads ????
1258 *      ANSWER: Not supported. You can't open the device more than once,
1259                despite what the V4L1 interface says. First, I don't see
1260                the need, second there's no mechanism of alerting the
1261                2nd/3rd/... process of events like changing image size.
1262                And I don't see the point of blocking that for the
1263                2nd/3rd/... process.
1264                In multi-threaded environments reading parallel from any
1265                device is tricky anyhow.
1266 */
1267
1268static ssize_t pwc_video_read(struct file *file, char __user *buf,
1269                          size_t count, loff_t *ppos)
1270{
1271        struct video_device *vdev = file->private_data;
1272        struct pwc_device *pdev;
1273        int noblock = file->f_flags & O_NONBLOCK;
1274        DECLARE_WAITQUEUE(wait, current);
1275        int bytes_to_read, rv = 0;
1276        void *image_buffer_addr;
1277
1278        PWC_DEBUG_READ("pwc_video_read(vdev=0x%p, buf=%p, count=%zd) called.\n",
1279                        vdev, buf, count);
1280        if (vdev == NULL)
1281                return -EFAULT;
1282        pdev = video_get_drvdata(vdev);
1283        if (pdev == NULL)
1284                return -EFAULT;
1285
1286        mutex_lock(&pdev->modlock);
1287        if (pdev->error_status) {
1288                rv = -pdev->error_status; /* Something happened, report what. */
1289                goto err_out;
1290        }
1291
1292        /* Start the stream (if not already started) */
1293        rv = pwc_isoc_init(pdev);
1294        if (rv)
1295                goto err_out;
1296
1297        /* In case we're doing partial reads, we don't have to wait for a frame */
1298        if (pdev->image_read_pos == 0) {
1299                /* Do wait queueing according to the (doc)book */
1300                add_wait_queue(&pdev->frameq, &wait);
1301                while (pdev->full_frames == NULL) {
1302                        /* Check for unplugged/etc. here */
1303                        if (pdev->error_status) {
1304                                remove_wait_queue(&pdev->frameq, &wait);
1305                                set_current_state(TASK_RUNNING);
1306                                rv = -pdev->error_status ;
1307                                goto err_out;
1308                        }
1309                        if (noblock) {
1310                                remove_wait_queue(&pdev->frameq, &wait);
1311                                set_current_state(TASK_RUNNING);
1312                                rv = -EWOULDBLOCK;
1313                                goto err_out;
1314                        }
1315                        if (signal_pending(current)) {
1316                                remove_wait_queue(&pdev->frameq, &wait);
1317                                set_current_state(TASK_RUNNING);
1318                                rv = -ERESTARTSYS;
1319                                goto err_out;
1320                        }
1321                        schedule();
1322                        set_current_state(TASK_INTERRUPTIBLE);
1323                }
1324                remove_wait_queue(&pdev->frameq, &wait);
1325                set_current_state(TASK_RUNNING);
1326
1327                /* Decompress and release frame */
1328                if (pwc_handle_frame(pdev)) {
1329                        rv = -EFAULT;
1330                        goto err_out;
1331                }
1332        }
1333
1334        PWC_DEBUG_READ("Copying data to user space.\n");
1335        if (pdev->pixfmt != V4L2_PIX_FMT_YUV420)
1336                bytes_to_read = pdev->frame_size + sizeof(struct pwc_raw_frame);
1337        else
1338                bytes_to_read = pdev->view.size;
1339
1340        /* copy bytes to user space; we allow for partial reads */
1341        if (count + pdev->image_read_pos > bytes_to_read)
1342                count = bytes_to_read - pdev->image_read_pos;
1343        image_buffer_addr = pdev->image_data;
1344        image_buffer_addr += pdev->images[pdev->fill_image].offset;
1345        image_buffer_addr += pdev->image_read_pos;
1346        if (copy_to_user(buf, image_buffer_addr, count)) {
1347                rv = -EFAULT;
1348                goto err_out;
1349        }
1350        pdev->image_read_pos += count;
1351        if (pdev->image_read_pos >= bytes_to_read) { /* All data has been read */
1352                pdev->image_read_pos = 0;
1353                pwc_next_image(pdev);
1354        }
1355        mutex_unlock(&pdev->modlock);
1356        return count;
1357err_out:
1358        mutex_unlock(&pdev->modlock);
1359        return rv;
1360}
1361
1362static unsigned int pwc_video_poll(struct file *file, poll_table *wait)
1363{
1364        struct video_device *vdev = file->private_data;
1365        struct pwc_device *pdev;
1366        int ret;
1367
1368        if (vdev == NULL)
1369                return -EFAULT;
1370        pdev = video_get_drvdata(vdev);
1371        if (pdev == NULL)
1372                return -EFAULT;
1373
1374        /* Start the stream (if not already started) */
1375        mutex_lock(&pdev->modlock);
1376        ret = pwc_isoc_init(pdev);
1377        mutex_unlock(&pdev->modlock);
1378        if (ret)
1379                return ret;
1380
1381        poll_wait(file, &pdev->frameq, wait);
1382        if (pdev->error_status)
1383                return POLLERR;
1384        if (pdev->full_frames != NULL) /* we have frames waiting */
1385                return (POLLIN | POLLRDNORM);
1386
1387        return 0;
1388}
1389
1390static long pwc_video_ioctl(struct file *file,
1391                           unsigned int cmd, unsigned long arg)
1392{
1393        struct video_device *vdev = file->private_data;
1394        struct pwc_device *pdev;
1395        long r = -ENODEV;
1396
1397        if (!vdev)
1398                goto out;
1399        pdev = video_get_drvdata(vdev);
1400
1401        mutex_lock(&pdev->modlock);
1402        if (!pdev->unplugged)
1403                r = video_usercopy(file, cmd, arg, pwc_video_do_ioctl);
1404        mutex_unlock(&pdev->modlock);
1405out:
1406        return r;
1407}
1408
1409static int pwc_video_mmap(struct file *file, struct vm_area_struct *vma)
1410{
1411        struct video_device *vdev = file->private_data;
1412        struct pwc_device *pdev;
1413        unsigned long start;
1414        unsigned long size;
1415        unsigned long page, pos = 0;
1416        int index;
1417
1418        PWC_DEBUG_MEMORY(">> %s\n", __func__);
1419        pdev = video_get_drvdata(vdev);
1420        size = vma->vm_end - vma->vm_start;
1421        start = vma->vm_start;
1422
1423        /* Find the idx buffer for this mapping */
1424        for (index = 0; index < pwc_mbufs; index++) {
1425                pos = pdev->images[index].offset;
1426                if ((pos>>PAGE_SHIFT) == vma->vm_pgoff)
1427                        break;
1428        }
1429        if (index == MAX_IMAGES)
1430                return -EINVAL;
1431        if (index == 0) {
1432                /*
1433                 * Special case for v4l1. In v4l1, we map only one big buffer,
1434                 * but in v4l2 each buffer is mapped
1435                 */
1436                unsigned long total_size;
1437                total_size = pwc_mbufs * pdev->len_per_image;
1438                if (size != pdev->len_per_image && size != total_size) {
1439                        PWC_ERROR("Wrong size (%lu) needed to be len_per_image=%d or total_size=%lu\n",
1440                                   size, pdev->len_per_image, total_size);
1441                        return -EINVAL;
1442                }
1443        } else if (size > pdev->len_per_image)
1444                return -EINVAL;
1445
1446        vma->vm_flags |= VM_IO; /* from 2.6.9-acX */
1447
1448        pos += (unsigned long)pdev->image_data;
1449        while (size > 0) {
1450                page = vmalloc_to_pfn((void *)pos);
1451                if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED))
1452                        return -EAGAIN;
1453                start += PAGE_SIZE;
1454                pos += PAGE_SIZE;
1455                if (size > PAGE_SIZE)
1456                        size -= PAGE_SIZE;
1457                else
1458                        size = 0;
1459        }
1460        return 0;
1461}
1462
1463/***************************************************************************/
1464/* USB functions */
1465
1466/* This function gets called when a new device is plugged in or the usb core
1467 * is loaded.
1468 */
1469
1470static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id *id)
1471{
1472        struct usb_device *udev = interface_to_usbdev(intf);
1473        struct pwc_device *pdev = NULL;
1474        int vendor_id, product_id, type_id;
1475        int hint, rc;
1476        int features = 0;
1477        int video_nr = -1; /* default: use next available device */
1478        char serial_number[30], *name;
1479
1480        vendor_id = le16_to_cpu(udev->descriptor.idVendor);
1481        product_id = le16_to_cpu(udev->descriptor.idProduct);
1482
1483        /* Check if we can handle this device */
1484        PWC_DEBUG_PROBE("probe() called [%04X %04X], if %d\n",
1485                vendor_id, product_id,
1486                intf->altsetting->desc.bInterfaceNumber);
1487
1488        /* the interfaces are probed one by one. We are only interested in the
1489           video interface (0) now.
1490           Interface 1 is the Audio Control, and interface 2 Audio itself.
1491         */
1492        if (intf->altsetting->desc.bInterfaceNumber > 0)
1493                return -ENODEV;
1494
1495        if (vendor_id == 0x0471) {
1496                switch (product_id) {
1497                case 0x0302:
1498                        PWC_INFO("Philips PCA645VC USB webcam detected.\n");
1499                        name = "Philips 645 webcam";
1500                        type_id = 645;
1501                        break;
1502                case 0x0303:
1503                        PWC_INFO("Philips PCA646VC USB webcam detected.\n");
1504                        name = "Philips 646 webcam";
1505                        type_id = 646;
1506                        break;
1507                case 0x0304:
1508                        PWC_INFO("Askey VC010 type 2 USB webcam detected.\n");
1509                        name = "Askey VC010 webcam";
1510                        type_id = 646;
1511                        break;
1512                case 0x0307:
1513                        PWC_INFO("Philips PCVC675K (Vesta) USB webcam detected.\n");
1514                        name = "Philips 675 webcam";
1515                        type_id = 675;
1516                        break;
1517                case 0x0308:
1518                        PWC_INFO("Philips PCVC680K (Vesta Pro) USB webcam detected.\n");
1519                        name = "Philips 680 webcam";
1520                        type_id = 680;
1521                        break;
1522                case 0x030C:
1523                        PWC_INFO("Philips PCVC690K (Vesta Pro Scan) USB webcam detected.\n");
1524                        name = "Philips 690 webcam";
1525                        type_id = 690;
1526                        break;
1527                case 0x0310:
1528                        PWC_INFO("Philips PCVC730K (ToUCam Fun)/PCVC830 (ToUCam II) USB webcam detected.\n");
1529                        name = "Philips 730 webcam";
1530                        type_id = 730;
1531                        break;
1532                case 0x0311:
1533                        PWC_INFO("Philips PCVC740K (ToUCam Pro)/PCVC840 (ToUCam II) USB webcam detected.\n");
1534                        name = "Philips 740 webcam";
1535                        type_id = 740;
1536                        break;
1537                case 0x0312:
1538                        PWC_INFO("Philips PCVC750K (ToUCam Pro Scan) USB webcam detected.\n");
1539                        name = "Philips 750 webcam";
1540                        type_id = 750;
1541                        break;
1542                case 0x0313:
1543                        PWC_INFO("Philips PCVC720K/40 (ToUCam XS) USB webcam detected.\n");
1544                        name = "Philips 720K/40 webcam";
1545                        type_id = 720;
1546                        break;
1547                case 0x0329:
1548                        PWC_INFO("Philips SPC 900NC USB webcam detected.\n");
1549                        name = "Philips SPC 900NC webcam";
1550                        type_id = 740;
1551                        break;
1552                default:
1553                        return -ENODEV;
1554                        break;
1555                }
1556        }
1557        else if (vendor_id == 0x069A) {
1558                switch(product_id) {
1559                case 0x0001:
1560                        PWC_INFO("Askey VC010 type 1 USB webcam detected.\n");
1561                        name = "Askey VC010 webcam";
1562                        type_id = 645;
1563                        break;
1564                default:
1565                        return -ENODEV;
1566                        break;
1567                }
1568        }
1569        else if (vendor_id == 0x046d) {
1570                switch(product_id) {
1571                case 0x08b0:
1572                        PWC_INFO("Logitech QuickCam Pro 3000 USB webcam detected.\n");
1573                        name = "Logitech QuickCam Pro 3000";
1574                        type_id = 740; /* CCD sensor */
1575                        break;
1576                case 0x08b1:
1577                        PWC_INFO("Logitech QuickCam Notebook Pro USB webcam detected.\n");
1578                        name = "Logitech QuickCam Notebook Pro";
1579                        type_id = 740; /* CCD sensor */
1580                        break;
1581                case 0x08b2:
1582                        PWC_INFO("Logitech QuickCam 4000 Pro USB webcam detected.\n");
1583                        name = "Logitech QuickCam Pro 4000";
1584                        type_id = 740; /* CCD sensor */
1585                        break;
1586                case 0x08b3:
1587                        PWC_INFO("Logitech QuickCam Zoom USB webcam detected.\n");
1588                        name = "Logitech QuickCam Zoom";
1589                        type_id = 740; /* CCD sensor */
1590                        break;
1591                case 0x08B4:
1592                        PWC_INFO("Logitech QuickCam Zoom (new model) USB webcam detected.\n");
1593                        name = "Logitech QuickCam Zoom";
1594                        type_id = 740; /* CCD sensor */
1595                        power_save = 1;
1596                        break;
1597                case 0x08b5:
1598                        PWC_INFO("Logitech QuickCam Orbit/Sphere USB webcam detected.\n");
1599                        name = "Logitech QuickCam Orbit";
1600                        type_id = 740; /* CCD sensor */
1601                        features |= FEATURE_MOTOR_PANTILT;
1602                        break;
1603                case 0x08b6:
1604                        PWC_INFO("Logitech/Cisco VT Camera webcam detected.\n");
1605                        name = "Cisco VT Camera";
1606                        type_id = 740; /* CCD sensor */
1607                        break;
1608                case 0x08b7:
1609                        PWC_INFO("Logitech ViewPort AV 100 webcam detected.\n");
1610                        name = "Logitech ViewPort AV 100";
1611                        type_id = 740; /* CCD sensor */
1612                        break;
1613                case 0x08b8: /* Where this released? */
1614                        PWC_INFO("Logitech QuickCam detected (reserved ID).\n");
1615                        name = "Logitech QuickCam (res.)";
1616                        type_id = 730; /* Assuming CMOS */
1617                        break;
1618                default:
1619                        return -ENODEV;
1620                        break;
1621                }
1622        }
1623        else if (vendor_id == 0x055d) {
1624                /* I don't know the difference between the C10 and the C30;
1625                   I suppose the difference is the sensor, but both cameras
1626                   work equally well with a type_id of 675
1627                 */
1628                switch(product_id) {
1629                case 0x9000:
1630                        PWC_INFO("Samsung MPC-C10 USB webcam detected.\n");
1631                        name = "Samsung MPC-C10";
1632                        type_id = 675;
1633                        break;
1634                case 0x9001:
1635                        PWC_INFO("Samsung MPC-C30 USB webcam detected.\n");
1636                        name = "Samsung MPC-C30";
1637                        type_id = 675;
1638                        break;
1639                case 0x9002:
1640                        PWC_INFO("Samsung SNC-35E (v3.0) USB webcam detected.\n");
1641                        name = "Samsung MPC-C30";
1642                        type_id = 740;
1643                        break;
1644                default:
1645                        return -ENODEV;
1646                        break;
1647                }
1648        }
1649        else if (vendor_id == 0x041e) {
1650                switch(product_id) {
1651                case 0x400c:
1652                        PWC_INFO("Creative Labs Webcam 5 detected.\n");
1653                        name = "Creative Labs Webcam 5";
1654                        type_id = 730;
1655                        break;
1656                case 0x4011:
1657                        PWC_INFO("Creative Labs Webcam Pro Ex detected.\n");
1658                        name = "Creative Labs Webcam Pro Ex";
1659                        type_id = 740;
1660                        break;
1661                default:
1662                        return -ENODEV;
1663                        break;
1664                }
1665        }
1666        else if (vendor_id == 0x04cc) {
1667                switch(product_id) {
1668                case 0x8116:
1669                        PWC_INFO("Sotec Afina Eye USB webcam detected.\n");
1670                        name = "Sotec Afina Eye";
1671                        type_id = 730;
1672                        break;
1673                default:
1674                        return -ENODEV;
1675                        break;
1676                }
1677        }
1678        else if (vendor_id == 0x06be) {
1679                switch(product_id) {
1680                case 0x8116:
1681                        /* This is essentially the same cam as the Sotec Afina Eye */
1682                        PWC_INFO("AME Co. Afina Eye USB webcam detected.\n");
1683                        name = "AME Co. Afina Eye";
1684                        type_id = 750;
1685                        break;
1686                default:
1687                        return -ENODEV;
1688                        break;
1689                }
1690
1691        }
1692        else if (vendor_id == 0x0d81) {
1693                switch(product_id) {
1694                case 0x1900:
1695                        PWC_INFO("Visionite VCS-UC300 USB webcam detected.\n");
1696                        name = "Visionite VCS-UC300";
1697                        type_id = 740; /* CCD sensor */
1698                        break;
1699                case 0x1910:
1700                        PWC_INFO("Visionite VCS-UM100 USB webcam detected.\n");
1701                        name = "Visionite VCS-UM100";
1702                        type_id = 730; /* CMOS sensor */
1703                        break;
1704                default:
1705                        return -ENODEV;
1706                        break;
1707                }
1708        }
1709        else
1710                return -ENODEV; /* Not any of the know types; but the list keeps growing. */
1711
1712        memset(serial_number, 0, 30);
1713        usb_string(udev, udev->descriptor.iSerialNumber, serial_number, 29);
1714        PWC_DEBUG_PROBE("Device serial number is %s\n", serial_number);
1715
1716        if (udev->descriptor.bNumConfigurations > 1)
1717                PWC_WARNING("Warning: more than 1 configuration available.\n");
1718
1719        /* Allocate structure, initialize pointers, mutexes, etc. and link it to the usb_device */
1720        pdev = kzalloc(sizeof(struct pwc_device), GFP_KERNEL);
1721        if (pdev == NULL) {
1722                PWC_ERROR("Oops, could not allocate memory for pwc_device.\n");
1723                return -ENOMEM;
1724        }
1725        pdev->type = type_id;
1726        pdev->vsize = default_size;
1727        pdev->vframes = default_fps;
1728        strcpy(pdev->serial, serial_number);
1729        pdev->features = features;
1730        if (vendor_id == 0x046D && product_id == 0x08B5) {
1731                /* Logitech QuickCam Orbit
1732                   The ranges have been determined experimentally; they may differ from cam to cam.
1733                   Also, the exact ranges left-right and up-down are different for my cam
1734                  */
1735                pdev->angle_range.pan_min  = -7000;
1736                pdev->angle_range.pan_max  =  7000;
1737                pdev->angle_range.tilt_min = -3000;
1738                pdev->angle_range.tilt_max =  2500;
1739        }
1740
1741        mutex_init(&pdev->modlock);
1742        spin_lock_init(&pdev->ptrlock);
1743
1744        pdev->udev = udev;
1745        init_waitqueue_head(&pdev->frameq);
1746        pdev->vcompression = pwc_preferred_compression;
1747
1748        /* Allocate video_device structure */
1749        pdev->vdev = video_device_alloc();
1750        if (!pdev->vdev) {
1751                PWC_ERROR("Err, cannot allocate video_device struture. Failing probe.");
1752                rc = -ENOMEM;
1753                goto err_free_mem;
1754        }
1755        memcpy(pdev->vdev, &pwc_template, sizeof(pwc_template));
1756        pdev->vdev->parent = &intf->dev;
1757        strcpy(pdev->vdev->name, name);
1758        video_set_drvdata(pdev->vdev, pdev);
1759
1760        pdev->release = le16_to_cpu(udev->descriptor.bcdDevice);
1761        PWC_DEBUG_PROBE("Release: %04x\n", pdev->release);
1762
1763        /* Now search device_hint[] table for a match, so we can hint a node number. */
1764        for (hint = 0; hint < MAX_DEV_HINTS; hint++) {
1765                if (((device_hint[hint].type == -1) || (device_hint[hint].type == pdev->type)) &&
1766                     (device_hint[hint].pdev == NULL)) {
1767                        /* so far, so good... try serial number */
1768                        if ((device_hint[hint].serial_number[0] == '*') || !strcmp(device_hint[hint].serial_number, serial_number)) {
1769                                /* match! */
1770                                video_nr = device_hint[hint].device_node;
1771                                PWC_DEBUG_PROBE("Found hint, will try to register as /dev/video%d\n", video_nr);
1772                                break;
1773                        }
1774                }
1775        }
1776
1777        pdev->vdev->release = video_device_release;
1778
1779        /* occupy slot */
1780        if (hint < MAX_DEV_HINTS)
1781                device_hint[hint].pdev = pdev;
1782
1783        PWC_DEBUG_PROBE("probe() function returning struct at 0x%p.\n", pdev);
1784        usb_set_intfdata(intf, pdev);
1785
1786        /* Set the leds off */
1787        pwc_set_leds(pdev, 0, 0);
1788        pwc_camera_power(pdev, 0);
1789
1790        rc = video_register_device(pdev->vdev, VFL_TYPE_GRABBER, video_nr);
1791        if (rc < 0) {
1792                PWC_ERROR("Failed to register as video device (%d).\n", rc);
1793                goto err_video_release;
1794        }
1795        rc = pwc_create_sysfs_files(pdev->vdev);
1796        if (rc)
1797                goto err_video_unreg;
1798
1799        PWC_INFO("Registered as %s.\n", video_device_node_name(pdev->vdev));
1800
1801#ifdef CONFIG_USB_PWC_INPUT_EVDEV
1802        /* register webcam snapshot button input device */
1803        pdev->button_dev = input_allocate_device();
1804        if (!pdev->button_dev) {
1805                PWC_ERROR("Err, insufficient memory for webcam snapshot button device.");
1806                rc = -ENOMEM;
1807                pwc_remove_sysfs_files(pdev->vdev);
1808                goto err_video_unreg;
1809        }
1810
1811        usb_make_path(udev, pdev->button_phys, sizeof(pdev->button_phys));
1812        strlcat(pdev->button_phys, "/input0", sizeof(pdev->button_phys));
1813
1814        pdev->button_dev->name = "PWC snapshot button";
1815        pdev->button_dev->phys = pdev->button_phys;
1816        usb_to_input_id(pdev->udev, &pdev->button_dev->id);
1817        pdev->button_dev->dev.parent = &pdev->udev->dev;
1818        pdev->button_dev->evbit[0] = BIT_MASK(EV_KEY);
1819        pdev->button_dev->keybit[BIT_WORD(KEY_CAMERA)] = BIT_MASK(KEY_CAMERA);
1820
1821        rc = input_register_device(pdev->button_dev);
1822        if (rc) {
1823                input_free_device(pdev->button_dev);
1824                pdev->button_dev = NULL;
1825                pwc_remove_sysfs_files(pdev->vdev);
1826                goto err_video_unreg;
1827        }
1828#endif
1829
1830        return 0;
1831
1832err_video_unreg:
1833        if (hint < MAX_DEV_HINTS)
1834                device_hint[hint].pdev = NULL;
1835        video_unregister_device(pdev->vdev);
1836        pdev->vdev = NULL;      /* So we don't try to release it below */
1837err_video_release:
1838        video_device_release(pdev->vdev);
1839err_free_mem:
1840        kfree(pdev);
1841        return rc;
1842}
1843
1844/* The user yanked out the cable... */
1845static void usb_pwc_disconnect(struct usb_interface *intf)
1846{
1847        struct pwc_device *pdev;
1848        int hint;
1849
1850        pdev = usb_get_intfdata (intf);
1851        mutex_lock(&pdev->modlock);
1852        usb_set_intfdata (intf, NULL);
1853        if (pdev == NULL) {
1854                PWC_ERROR("pwc_disconnect() Called without private pointer.\n");
1855                goto disconnect_out;
1856        }
1857        if (pdev->udev == NULL) {
1858                PWC_ERROR("pwc_disconnect() already called for %p\n", pdev);
1859                goto disconnect_out;
1860        }
1861        if (pdev->udev != interface_to_usbdev(intf)) {
1862                PWC_ERROR("pwc_disconnect() Woops: pointer mismatch udev/pdev.\n");
1863                goto disconnect_out;
1864        }
1865
1866        /* We got unplugged; this is signalled by an EPIPE error code */
1867        if (pdev->vopen) {
1868                PWC_INFO("Disconnected while webcam is in use!\n");
1869                pdev->error_status = EPIPE;
1870        }
1871
1872        /* Alert waiting processes */
1873        wake_up_interruptible(&pdev->frameq);
1874        /* Wait until device is closed */
1875        if (pdev->vopen) {
1876                pdev->unplugged = 1;
1877                pwc_iso_stop(pdev);
1878        } else {
1879                /* Device is closed, so we can safely unregister it */
1880                PWC_DEBUG_PROBE("Unregistering video device in disconnect().\n");
1881                pwc_cleanup(pdev);
1882
1883disconnect_out:
1884                /* search device_hint[] table if we occupy a slot, by any chance */
1885                for (hint = 0; hint < MAX_DEV_HINTS; hint++)
1886                        if (device_hint[hint].pdev == pdev)
1887                                device_hint[hint].pdev = NULL;
1888        }
1889
1890        mutex_unlock(&pdev->modlock);
1891}
1892
1893
1894/*
1895 * Initialization code & module stuff
1896 */
1897
1898static char *size;
1899static int fps;
1900static int fbufs;
1901static int mbufs;
1902static int compression = -1;
1903static int leds[2] = { -1, -1 };
1904static unsigned int leds_nargs;
1905static char *dev_hint[MAX_DEV_HINTS];
1906static unsigned int dev_hint_nargs;
1907
1908module_param(size, charp, 0444);
1909module_param(fps, int, 0444);
1910module_param(fbufs, int, 0444);
1911module_param(mbufs, int, 0444);
1912#ifdef CONFIG_USB_PWC_DEBUG
1913module_param_named(trace, pwc_trace, int, 0644);
1914#endif
1915module_param(power_save, int, 0444);
1916module_param(compression, int, 0444);
1917module_param_array(leds, int, &leds_nargs, 0444);
1918module_param_array(dev_hint, charp, &dev_hint_nargs, 0444);
1919
1920MODULE_PARM_DESC(size, "Initial image size. One of sqcif, qsif, qcif, sif, cif, vga");
1921MODULE_PARM_DESC(fps, "Initial frames per second. Varies with model, useful range 5-30");
1922MODULE_PARM_DESC(fbufs, "Number of internal frame buffers to reserve");
1923MODULE_PARM_DESC(mbufs, "Number of external (mmap()ed) image buffers");
1924#ifdef CONFIG_USB_PWC_DEBUG
1925MODULE_PARM_DESC(trace, "For debugging purposes");
1926#endif
1927MODULE_PARM_DESC(power_save, "Turn power save feature in camera on or off");
1928MODULE_PARM_DESC(compression, "Preferred compression quality. Range 0 (uncompressed) to 3 (high compression)");
1929MODULE_PARM_DESC(leds, "LED on,off time in milliseconds");
1930MODULE_PARM_DESC(dev_hint, "Device node hints");
1931
1932MODULE_DESCRIPTION("Philips & OEM USB webcam driver");
1933MODULE_AUTHOR("Luc Saillard <luc@saillard.org>");
1934MODULE_LICENSE("GPL");
1935MODULE_ALIAS("pwcx");
1936MODULE_VERSION( PWC_VERSION );
1937
1938static int __init usb_pwc_init(void)
1939{
1940        int i, sz;
1941        char *sizenames[PSZ_MAX] = { "sqcif", "qsif", "qcif", "sif", "cif", "vga" };
1942
1943        PWC_INFO("Philips webcam module version " PWC_VERSION " loaded.\n");
1944        PWC_INFO("Supports Philips PCA645/646, PCVC675/680/690, PCVC720[40]/730/740/750 & PCVC830/840.\n");
1945        PWC_INFO("Also supports the Askey VC010, various Logitech Quickcams, Samsung MPC-C10 and MPC-C30,\n");
1946        PWC_INFO("the Creative WebCam 5 & Pro Ex, SOTEC Afina Eye and Visionite VCS-UC300 and VCS-UM100.\n");
1947
1948        if (fps) {
1949                if (fps < 4 || fps > 30) {
1950                        PWC_ERROR("Framerate out of bounds (4-30).\n");
1951                        return -EINVAL;
1952                }
1953                default_fps = fps;
1954                PWC_DEBUG_MODULE("Default framerate set to %d.\n", default_fps);
1955        }
1956
1957        if (size) {
1958                /* string; try matching with array */
1959                for (sz = 0; sz < PSZ_MAX; sz++) {
1960                        if (!strcmp(sizenames[sz], size)) { /* Found! */
1961                                default_size = sz;
1962                                break;
1963                        }
1964                }
1965                if (sz == PSZ_MAX) {
1966                        PWC_ERROR("Size not recognized; try size=[sqcif | qsif | qcif | sif | cif | vga].\n");
1967                        return -EINVAL;
1968                }
1969                PWC_DEBUG_MODULE("Default image size set to %s [%dx%d].\n", sizenames[default_size], pwc_image_sizes[default_size].x, pwc_image_sizes[default_size].y);
1970        }
1971        if (mbufs) {
1972                if (mbufs < 1 || mbufs > MAX_IMAGES) {
1973                        PWC_ERROR("Illegal number of mmap() buffers; use a number between 1 and %d.\n", MAX_IMAGES);
1974                        return -EINVAL;
1975                }
1976                pwc_mbufs = mbufs;
1977                PWC_DEBUG_MODULE("Number of image buffers set to %d.\n", pwc_mbufs);
1978        }
1979        if (fbufs) {
1980                if (fbufs < 2 || fbufs > MAX_FRAMES) {
1981                        PWC_ERROR("Illegal number of frame buffers; use a number between 2 and %d.\n", MAX_FRAMES);
1982                        return -EINVAL;
1983                }
1984                default_fbufs = fbufs;
1985                PWC_DEBUG_MODULE("Number of frame buffers set to %d.\n", default_fbufs);
1986        }
1987#ifdef CONFIG_USB_PWC_DEBUG
1988        if (pwc_trace >= 0) {
1989                PWC_DEBUG_MODULE("Trace options: 0x%04x\n", pwc_trace);
1990        }
1991#endif
1992        if (compression >= 0) {
1993                if (compression > 3) {
1994                        PWC_ERROR("Invalid compression setting; use a number between 0 (uncompressed) and 3 (high).\n");
1995                        return -EINVAL;
1996                }
1997                pwc_preferred_compression = compression;
1998                PWC_DEBUG_MODULE("Preferred compression set to %d.\n", pwc_preferred_compression);
1999        }
2000        if (power_save)
2001                PWC_DEBUG_MODULE("Enabling power save on open/close.\n");
2002        if (leds[0] >= 0)
2003                led_on = leds[0];
2004        if (leds[1] >= 0)
2005                led_off = leds[1];
2006
2007        /* Big device node whoopla. Basically, it allows you to assign a
2008           device node (/dev/videoX) to a camera, based on its type
2009           & serial number. The format is [type[.serialnumber]:]node.
2010
2011           Any camera that isn't matched by these rules gets the next
2012           available free device node.
2013         */
2014        for (i = 0; i < MAX_DEV_HINTS; i++) {
2015                char *s, *colon, *dot;
2016
2017                /* This loop also initializes the array */
2018                device_hint[i].pdev = NULL;
2019                s = dev_hint[i];
2020                if (s != NULL && *s != '\0') {
2021                        device_hint[i].type = -1; /* wildcard */
2022                        strcpy(device_hint[i].serial_number, "*");
2023
2024                        /* parse string: chop at ':' & '/' */
2025                        colon = dot = s;
2026                        while (*colon != '\0' && *colon != ':')
2027                                colon++;
2028                        while (*dot != '\0' && *dot != '.')
2029                                dot++;
2030                        /* Few sanity checks */
2031                        if (*dot != '\0' && dot > colon) {
2032                                PWC_ERROR("Malformed camera hint: the colon must be after the dot.\n");
2033                                return -EINVAL;
2034                        }
2035
2036                        if (*colon == '\0') {
2037                                /* No colon */
2038                                if (*dot != '\0') {
2039                                        PWC_ERROR("Malformed camera hint: no colon + device node given.\n");
2040                                        return -EINVAL;
2041                                }
2042                                else {
2043                                        /* No type or serial number specified, just a number. */
2044                                        device_hint[i].device_node =
2045                                                simple_strtol(s, NULL, 10);
2046                                }
2047                        }
2048                        else {
2049                                /* There's a colon, so we have at least a type and a device node */
2050                                device_hint[i].type =
2051                                        simple_strtol(s, NULL, 10);
2052                                device_hint[i].device_node =
2053                                        simple_strtol(colon + 1, NULL, 10);
2054                                if (*dot != '\0') {
2055                                        /* There's a serial number as well */
2056                                        int k;
2057
2058                                        dot++;
2059                                        k = 0;
2060                                        while (*dot != ':' && k < 29) {
2061                                                device_hint[i].serial_number[k++] = *dot;
2062                                                dot++;
2063                                        }
2064                                        device_hint[i].serial_number[k] = '\0';
2065                                }
2066                        }
2067                        PWC_TRACE("device_hint[%d]:\n", i);
2068                        PWC_TRACE("  type    : %d\n", device_hint[i].type);
2069                        PWC_TRACE("  serial# : %s\n", device_hint[i].serial_number);
2070                        PWC_TRACE("  node    : %d\n", device_hint[i].device_node);
2071                }
2072                else
2073                        device_hint[i].type = 0; /* not filled */
2074        } /* ..for MAX_DEV_HINTS */
2075
2076        PWC_DEBUG_PROBE("Registering driver at address 0x%p.\n", &pwc_driver);
2077        return usb_register(&pwc_driver);
2078}
2079
2080static void __exit usb_pwc_exit(void)
2081{
2082        PWC_DEBUG_MODULE("Deregistering driver.\n");
2083        usb_deregister(&pwc_driver);
2084        PWC_INFO("Philips webcam module removed.\n");
2085}
2086
2087module_init(usb_pwc_init);
2088module_exit(usb_pwc_exit);
2089
2090/* vim: set cino= formatoptions=croql cindent shiftwidth=8 tabstop=8: */
2091