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