[media] pwc: convert to core-assisted locking
[deliverable/linux.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) {
101b25b5 290 kbuf = vzalloc(PWC_FRAME_SIZE); /* need vmalloc since frame buffer > 128K */
1da177e4 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;
1da177e4
LT
297 }
298 }
d56410e0 299
1da177e4 300 /* Allocate decompressor table space */
2b455db6
LS
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 }
d56410e0 310
1da177e4 311 /* Allocate image buffer; double buffer for mmap() */
2b455db6 312 kbuf = pwc_rvmalloc(pwc_mbufs * pdev->len_per_image);
1da177e4 313 if (kbuf == NULL) {
2b455db6
LS
314 PWC_ERROR("Failed to allocate image buffer(s). needed (%d)\n",
315 pwc_mbufs * pdev->len_per_image);
1da177e4
LT
316 return -ENOMEM;
317 }
2b455db6 318 PWC_DEBUG_MEMORY("Allocated image buffer at %p.\n", kbuf);
1da177e4 319 pdev->image_data = kbuf;
2b455db6
LS
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 }
1da177e4
LT
327
328 kbuf = NULL;
d56410e0 329
2b455db6 330 PWC_DEBUG_MEMORY("<< pwc_allocate_buffers()\n");
1da177e4
LT
331 return 0;
332}
333
334static void pwc_free_buffers(struct pwc_device *pdev)
335{
336 int i;
337
2b455db6 338 PWC_DEBUG_MEMORY("Entering free_buffers(%p).\n", pdev);
1da177e4
LT
339
340 if (pdev == NULL)
341 return;
1da177e4
LT
342 /* Release Iso-pipe buffers */
343 for (i = 0; i < MAX_ISO_BUFS; i++)
344 if (pdev->sbuf[i].data != NULL) {
2b455db6 345 PWC_DEBUG_MEMORY("Freeing ISO buffer at %p.\n", pdev->sbuf[i].data);
1da177e4
LT
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) {
2b455db6 354 PWC_DEBUG_MEMORY("Freeing frame buffer %d at %p.\n", i, pdev->fbuf[i].data);
1da177e4
LT
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) {
2b455db6 365 PWC_DEBUG_MEMORY("Freeing decompression buffer at %p.\n", pdev->decompress_data);
1da177e4
LT
366 kfree(pdev->decompress_data);
367 pdev->decompress_data = NULL;
368 }
1da177e4
LT
369
370 /* Release image buffers */
371 if (pdev->image_data != NULL) {
2b455db6
LS
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);
1da177e4
LT
374 }
375 pdev->image_data = NULL;
d56410e0 376
2b455db6 377 PWC_DEBUG_MEMORY("Leaving free_buffers().\n");
1da177e4
LT
378}
379
d56410e0 380/* The frame & image buffer mess.
1da177e4
LT
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
d56410e0 386 interesting. Suffices to say the data from this buffer is quickly
1da177e4
LT
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.
d56410e0
MCC
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
1da177e4
LT
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 */
2b455db6 437static int pwc_next_fill_frame(struct pwc_device *pdev)
1da177e4
LT
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 */
1da177e4
LT
462 /* sanity check */
463 if (pdev->full_frames == NULL) {
2b455db6 464 PWC_ERROR("Neither empty or full frames available!\n");
1da177e4
LT
465 spin_unlock_irqrestore(&pdev->ptrlock, flags);
466 return -EINVAL;
467 }
1da177e4
LT
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;
1da177e4
LT
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
645635b0 488 PWC_DEBUG_MEMORY(">> %s __enter__\n", __func__);
2b455db6 489
1da177e4
LT
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);
2b455db6 509
645635b0 510 PWC_DEBUG_MEMORY("<< %s __leaving__\n", __func__);
1da177e4
LT
511}
512
513
514/**
515 \brief Do all the handling for getting one frame: get pointer, decompress, advance pointers.
516 */
2b455db6 517int pwc_handle_frame(struct pwc_device *pdev)
1da177e4
LT
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 */
2b455db6
LS
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");
1da177e4
LT
535 }
536 else {
2b455db6
LS
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) {
efad798b 543 /* Decompression is a lengthy process, so it's outside of the lock.
2b455db6
LS
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;
1da177e4
LT
555 }
556 else {
2b455db6
LS
557 pdev->empty_frames_tail->next = pdev->read_frame;
558 pdev->empty_frames_tail = pdev->read_frame;
1da177e4 559 }
2b455db6 560 pdev->read_frame = NULL;
1da177e4
LT
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*/
2b455db6 569void pwc_next_image(struct pwc_device *pdev)
1da177e4
LT
570{
571 pdev->image_used[pdev->fill_image] = 0;
2b455db6 572 pdev->fill_image = (pdev->fill_image + 1) % pwc_mbufs;
1da177e4
LT
573}
574
2b455db6
LS
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
e32a7ecc
NPT
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) {
bcd3e4b3 603 input_report_key(pdev->button_dev, KEY_CAMERA, down);
e32a7ecc
NPT
604 input_sync(pdev->button_dev);
605 }
606#endif
607}
608
2b455db6
LS
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) {
e32a7ecc 626 pwc_snapshot_button(pdev, ptr[0] & 0x01);
2b455db6
LS
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) {
e32a7ecc 650 pwc_snapshot_button(pdev, ptr[0] & 0x01);
2b455db6
LS
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}
1da177e4
LT
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 */
7d12e780 687static void pwc_isoc_handler(struct urb *urb)
1da177e4
LT
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) {
2b455db6 698 PWC_ERROR("isoc_handler() called with NULL device?!\n");
1da177e4
LT
699 return;
700 }
2b455db6 701
1da177e4 702 if (urb->status == -ENOENT || urb->status == -ECONNRESET) {
2b455db6 703 PWC_DEBUG_OPEN("URB (%p) unlinked %ssynchronuously.\n", urb, urb->status == -ENOENT ? "" : "a");
1da177e4
LT
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;
38e2bfc9 716 case -ETIME: errmsg = "Device does not respond"; break;
1da177e4 717 }
2b455db6 718 PWC_DEBUG_FLOW("pwc_isoc_handler() called with status %d [%s].\n", urb->status, errmsg);
d56410e0 719 /* Give up after a number of contiguous errors on the USB bus.
1da177e4
LT
720 Appearantly something is wrong so we simulate an unplug event.
721 */
722 if (++pdev->visoc_errors > MAX_ISOC_ERRORS)
723 {
2b455db6 724 PWC_INFO("Too many ISOC errors, bailing out.\n");
1da177e4
LT
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) {
2b455db6 734 PWC_ERROR("pwc_isoc_handler without valid fill frame.\n");
1da177e4
LT
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
d56410e0
MCC
746 1 = sync-hunt
747 2 = synched
1da177e4
LT
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) {
2b455db6 761 PWC_DEBUG_FLOW("Frame buffer overflow (flen = %d, frame_total_size = %d).\n", flen, pdev->frame_total_size);
1da177e4
LT
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) {
d56410e0 774 /* Shorter packet... We probably have the end of an image-frame;
1da177e4
LT
775 wake up read() process and let select()/poll() do something.
776 Decompression is done in user time over there.
2b455db6 777 */
1da177e4 778 if (pdev->vsync == 2) {
2b455db6
LS
779 if (pwc_rcv_short_packet(pdev, fbuf)) {
780 awake = 1;
781 fbuf = pdev->fill_frame;
1da177e4 782 }
1da177e4
LT
783 }
784 fbuf->filled = 0;
785 fillptr = fbuf->data;
786 pdev->vsync = 1;
2b455db6
LS
787 }
788
1da177e4
LT
789 pdev->vlast_packet_size = flen;
790 } /* ..status == 0 */
1da177e4 791 else {
2b455db6 792 /* This is normally not interesting to the user, unless
ff699e6b
DSL
793 * you are really debugging something, default = 0 */
794 static int iso_error;
1da177e4
LT
795 iso_error++;
796 if (iso_error < 20)
2b455db6 797 PWC_DEBUG_FLOW("Iso frame %d of USB has error %d\n", i, fst);
1da177e4 798 }
1da177e4
LT
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)
2b455db6 808 PWC_ERROR("Error (%d) re-submitting urb in pwc_isoc_handler.\n", i);
1da177e4
LT
809}
810
811
2b455db6 812int pwc_isoc_init(struct pwc_device *pdev)
1da177e4
LT
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;
1da177e4
LT
831 intf = usb_ifnum_to_if(udev, 0);
832 if (intf)
833 idesc = usb_altnum_to_altsetting(intf, pdev->valternate);
d56410e0 834
1da177e4
LT
835 if (!idesc)
836 return -EFAULT;
837
838 /* Search video endpoint */
839 pdev->vmax_packet_size = -1;
2b455db6 840 for (i = 0; i < idesc->desc.bNumEndpoints; i++) {
1da177e4
LT
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 }
2b455db6 845 }
d56410e0 846
1da177e4 847 if (pdev->vmax_packet_size < 0 || pdev->vmax_packet_size > ISO_MAX_FRAME_SIZE) {
2b455db6 848 PWC_ERROR("Failed to find packet size for video endpoint in current alternate setting.\n");
093cf723 849 return -ENFILE; /* Odd error, that should be noticeable */
1da177e4
LT
850 }
851
852 /* Set alternate interface */
853 ret = 0;
2b455db6 854 PWC_DEBUG_OPEN("Setting alternate interface %d\n", pdev->valternate);
1da177e4
LT
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) {
2b455db6 862 PWC_ERROR("Failed to allocate urb %d\n", i);
1da177e4
LT
863 ret = -ENOMEM;
864 break;
865 }
866 pdev->sbuf[i].urb = urb;
2b455db6 867 PWC_DEBUG_MEMORY("Allocated URB at 0x%p\n", urb);
1da177e4
LT
868 }
869 if (ret) {
870 /* De-allocate in reverse order */
444f4f91 871 while (i--) {
90b2625a 872 usb_free_urb(pdev->sbuf[i].urb);
1da177e4 873 pdev->sbuf[i].urb = NULL;
1da177e4
LT
874 }
875 return ret;
876 }
877
d56410e0 878 /* init URB structure */
1da177e4
LT
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;
d56410e0 884 urb->pipe = usb_rcvisocpipe(udev, pdev->vendpoint);
1da177e4 885 urb->transfer_flags = URB_ISO_ASAP;
d56410e0
MCC
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;
1da177e4
LT
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);
622d9f5d 901 if (ret) {
2b455db6 902 PWC_ERROR("isoc_init() submit_urb %d failed with error %d\n", i, ret);
622d9f5d
HG
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);
1da177e4
LT
908 }
909
910 /* All is done... */
911 pdev->iso_init = 1;
2b455db6 912 PWC_DEBUG_OPEN("<< pwc_isoc_init()\n");
1da177e4
LT
913 return 0;
914}
915
0b67f5c5 916static void pwc_iso_stop(struct pwc_device *pdev)
1da177e4
LT
917{
918 int i;
919
1da177e4
LT
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;
5fa1247a 925 if (urb) {
0b67f5c5
ON
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;
5fa1247a 941 if (urb) {
2b455db6 942 PWC_DEBUG_MEMORY("Freeing URB\n");
1da177e4
LT
943 usb_free_urb(urb);
944 pdev->sbuf[i].urb = NULL;
945 }
946 }
0b67f5c5
ON
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);
1da177e4
LT
959
960 /* Stop camera, but only if we are sure the camera is still there (unplug
d56410e0 961 is signalled by EPIPE)
1da177e4 962 */
c7d18867 963 if (pdev->error_status != EPIPE) {
2b455db6 964 PWC_DEBUG_OPEN("Setting alternate interface 0.\n");
1da177e4
LT
965 usb_set_interface(pdev->udev, 0, 0);
966 }
967
968 pdev->iso_init = 0;
2b455db6 969 PWC_DEBUG_OPEN("<< pwc_isoc_cleanup()\n");
1da177e4
LT
970}
971
2b455db6
LS
972/*********
973 * sysfs
974 *********/
54bd5b66 975static struct pwc_device *cd_to_pwc(struct device *cd)
2b455db6
LS
976{
977 struct video_device *vdev = to_video_device(cd);
978 return video_get_drvdata(vdev);
979}
980
54bd5b66
KS
981static ssize_t show_pan_tilt(struct device *class_dev,
982 struct device_attribute *attr, char *buf)
2b455db6
LS
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
54bd5b66
KS
988static ssize_t store_pan_tilt(struct device *class_dev,
989 struct device_attribute *attr,
990 const char *buf, size_t count)
2b455db6
LS
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}
54bd5b66
KS
1006static DEVICE_ATTR(pan_tilt, S_IRUGO | S_IWUSR, show_pan_tilt,
1007 store_pan_tilt);
2b455db6 1008
54bd5b66
KS
1009static ssize_t show_snapshot_button_status(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 int status = pdev->snapshot_button_status;
1014 pdev->snapshot_button_status = 0;
1015 return sprintf(buf, "%d\n", status);
1016}
1017
54bd5b66
KS
1018static DEVICE_ATTR(button, S_IRUGO | S_IWUSR, show_snapshot_button_status,
1019 NULL);
2b455db6 1020
c12e3be0 1021static int pwc_create_sysfs_files(struct video_device *vdev)
2b455db6
LS
1022{
1023 struct pwc_device *pdev = video_get_drvdata(vdev);
c12e3be0
JG
1024 int rc;
1025
f894dfd7 1026 rc = device_create_file(&vdev->dev, &dev_attr_button);
c12e3be0
JG
1027 if (rc)
1028 goto err;
1029 if (pdev->features & FEATURE_MOTOR_PANTILT) {
f894dfd7 1030 rc = device_create_file(&vdev->dev, &dev_attr_pan_tilt);
89dec01b
DT
1031 if (rc)
1032 goto err_button;
c12e3be0
JG
1033 }
1034
1035 return 0;
1036
1037err_button:
f894dfd7 1038 device_remove_file(&vdev->dev, &dev_attr_button);
c12e3be0 1039err:
f894dfd7 1040 PWC_ERROR("Could not create sysfs files.\n");
c12e3be0 1041 return rc;
2b455db6
LS
1042}
1043
1044static void pwc_remove_sysfs_files(struct video_device *vdev)
1045{
1046 struct pwc_device *pdev = video_get_drvdata(vdev);
89dec01b 1047
2b455db6 1048 if (pdev->features & FEATURE_MOTOR_PANTILT)
f894dfd7
HV
1049 device_remove_file(&vdev->dev, &dev_attr_pan_tilt);
1050 device_remove_file(&vdev->dev, &dev_attr_button);
2b455db6
LS
1051}
1052
05ad3907 1053#ifdef CONFIG_USB_PWC_DEBUG
2b455db6
LS
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:
657de3cd 1078 return "unknown type of sensor";
2b455db6
LS
1079 }
1080}
1081#endif
1da177e4
LT
1082
1083/***************************************************************************/
1084/* Video4Linux functions */
1085
bec43661 1086static int pwc_video_open(struct file *file)
1da177e4 1087{
2b455db6 1088 int i, ret;
1da177e4
LT
1089 struct video_device *vdev = video_devdata(file);
1090 struct pwc_device *pdev;
1091
2b455db6 1092 PWC_DEBUG_OPEN(">> video_open called(vdev = 0x%p).\n", vdev);
d56410e0 1093
601e9444 1094 pdev = video_get_drvdata(vdev);
5d9a276a 1095 BUG_ON(!pdev);
2b455db6
LS
1096 if (pdev->vopen) {
1097 PWC_DEBUG_OPEN("I'm busy, someone is using the device.\n");
1da177e4 1098 return -EBUSY;
2b455db6 1099 }
d56410e0 1100
5c8e2403 1101 pwc_construct(pdev); /* set min/max sizes correct */
1da177e4 1102 if (!pdev->usb_init) {
2b455db6 1103 PWC_DEBUG_OPEN("Doing first time initialization.\n");
1da177e4 1104 pdev->usb_init = 1;
d56410e0 1105
2b455db6
LS
1106 /* Query sensor type */
1107 ret = pwc_get_cmos_sensor(pdev, &i);
1108 if (ret >= 0)
1da177e4 1109 {
2b455db6
LS
1110 PWC_DEBUG_OPEN("This %s camera is equipped with a %s (%d).\n",
1111 pdev->vdev->name,
1112 pwc_sensor_type_to_string(i), i);
1da177e4
LT
1113 }
1114 }
1115
1116 /* Turn on camera */
1117 if (power_save) {
1118 i = pwc_camera_power(pdev, 1);
1119 if (i < 0)
2b455db6 1120 PWC_DEBUG_OPEN("Failed to restore power to the camera! (%d)\n", i);
1da177e4
LT
1121 }
1122 /* Set LED on/off time */
1123 if (pwc_set_leds(pdev, led_on, led_off) < 0)
2b455db6 1124 PWC_DEBUG_OPEN("Failed to set LED on/off time.\n");
d56410e0 1125
1da177e4
LT
1126
1127 /* So far, so good. Allocate memory. */
1128 i = pwc_allocate_buffers(pdev);
1129 if (i < 0) {
2b455db6
LS
1130 PWC_DEBUG_OPEN("Failed to allocate buffers memory.\n");
1131 pwc_free_buffers(pdev);
1da177e4
LT
1132 return i;
1133 }
d56410e0 1134
1da177e4
LT
1135 /* Reset buffers & parameters */
1136 pwc_reset_buffers(pdev);
2b455db6 1137 for (i = 0; i < pwc_mbufs; i++)
1da177e4
LT
1138 pdev->image_used[i] = 0;
1139 pdev->vframe_count = 0;
1140 pdev->vframes_dumped = 0;
1141 pdev->vframes_error = 0;
1142 pdev->visoc_errors = 0;
1143 pdev->error_status = 0;
1da177e4
LT
1144 pwc_construct(pdev); /* set min/max sizes correct */
1145
1146 /* Set some defaults */
1147 pdev->vsnapshot = 0;
1148
3751e288 1149 /* Set video size, first try the last used video size
1da177e4
LT
1150 (or the default one); if that fails try QCIF/10 or QSIF/10;
1151 it that fails too, give up.
1152 */
1153 i = pwc_set_video_mode(pdev, pwc_image_sizes[pdev->vsize].x, pwc_image_sizes[pdev->vsize].y, pdev->vframes, pdev->vcompression, 0);
1154 if (i) {
2b455db6
LS
1155 unsigned int default_resolution;
1156 PWC_DEBUG_OPEN("First attempt at set_video_mode failed.\n");
1157 if (pdev->type>= 730)
1158 default_resolution = PSZ_QSIF;
1da177e4 1159 else
2b455db6
LS
1160 default_resolution = PSZ_QCIF;
1161
1162 i = pwc_set_video_mode(pdev,
1163 pwc_image_sizes[default_resolution].x,
1164 pwc_image_sizes[default_resolution].y,
1165 10,
1166 pdev->vcompression,
1167 0);
1da177e4
LT
1168 }
1169 if (i) {
2b455db6
LS
1170 PWC_DEBUG_OPEN("Second attempt at set_video_mode failed.\n");
1171 pwc_free_buffers(pdev);
1da177e4
LT
1172 return i;
1173 }
d56410e0 1174
2b455db6
LS
1175 /* Initialize the webcam to sane value */
1176 pwc_set_brightness(pdev, 0x7fff);
1177 pwc_set_agc(pdev, 1, 0);
1178
1da177e4
LT
1179 pdev->vopen++;
1180 file->private_data = vdev;
2b455db6 1181 PWC_DEBUG_OPEN("<< video_open() returns 0.\n");
1da177e4
LT
1182 return 0;
1183}
1184
85237f20
ON
1185
1186static void pwc_cleanup(struct pwc_device *pdev)
1187{
1188 pwc_remove_sysfs_files(pdev->vdev);
1189 video_unregister_device(pdev->vdev);
e32a7ecc
NPT
1190
1191#ifdef CONFIG_USB_PWC_INPUT_EVDEV
89dec01b 1192 if (pdev->button_dev)
e32a7ecc 1193 input_unregister_device(pdev->button_dev);
e32a7ecc 1194#endif
89dec01b
DT
1195
1196 kfree(pdev);
85237f20
ON
1197}
1198
1da177e4 1199/* Note that all cleanup is done in the reverse order as in _open */
bec43661 1200static int pwc_video_close(struct file *file)
1da177e4
LT
1201{
1202 struct video_device *vdev = file->private_data;
1203 struct pwc_device *pdev;
85237f20 1204 int i, hint;
1da177e4 1205
2b455db6 1206 PWC_DEBUG_OPEN(">> video_close called(vdev = 0x%p).\n", vdev);
1da177e4 1207
601e9444 1208 pdev = video_get_drvdata(vdev);
1da177e4 1209 if (pdev->vopen == 0)
2b455db6 1210 PWC_DEBUG_MODULE("video_close() called on closed device?\n");
1da177e4
LT
1211
1212 /* Dump statistics, but only if a reasonable amount of frames were
1213 processed (to prevent endless log-entries in case of snap-shot
1214 programs)
1215 */
1216 if (pdev->vframe_count > 20)
2b455db6 1217 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 1218
2b455db6
LS
1219 if (DEVICE_USE_CODEC1(pdev->type))
1220 pwc_dec1_exit();
1221 else
1222 pwc_dec23_exit();
1da177e4
LT
1223
1224 pwc_isoc_cleanup(pdev);
1225 pwc_free_buffers(pdev);
1226
1227 /* Turn off LEDS and power down camera, but only when not unplugged */
85237f20 1228 if (!pdev->unplugged) {
1da177e4
LT
1229 /* Turn LEDs off */
1230 if (pwc_set_leds(pdev, 0, 0) < 0)
2b455db6 1231 PWC_DEBUG_MODULE("Failed to set LED on/off time.\n");
1da177e4
LT
1232 if (power_save) {
1233 i = pwc_camera_power(pdev, 0);
1234 if (i < 0)
2b455db6 1235 PWC_ERROR("Failed to power down camera (%d)\n", i);
1da177e4 1236 }
85237f20 1237 pdev->vopen--;
7b9fbc3e 1238 PWC_DEBUG_OPEN("<< video_close() vopen=%d\n", pdev->vopen);
85237f20
ON
1239 } else {
1240 pwc_cleanup(pdev);
85237f20
ON
1241 /* search device_hint[] table if we occupy a slot, by any chance */
1242 for (hint = 0; hint < MAX_DEV_HINTS; hint++)
1243 if (device_hint[hint].pdev == pdev)
1244 device_hint[hint].pdev = NULL;
1da177e4 1245 }
85237f20 1246
1da177e4
LT
1247 return 0;
1248}
1249
1250/*
1251 * FIXME: what about two parallel reads ????
1252 * ANSWER: Not supported. You can't open the device more than once,
d56410e0
MCC
1253 despite what the V4L1 interface says. First, I don't see
1254 the need, second there's no mechanism of alerting the
1255 2nd/3rd/... process of events like changing image size.
1256 And I don't see the point of blocking that for the
1257 2nd/3rd/... process.
1258 In multi-threaded environments reading parallel from any
1259 device is tricky anyhow.
1da177e4
LT
1260 */
1261
2b455db6 1262static ssize_t pwc_video_read(struct file *file, char __user *buf,
1da177e4
LT
1263 size_t count, loff_t *ppos)
1264{
1265 struct video_device *vdev = file->private_data;
1266 struct pwc_device *pdev;
1267 int noblock = file->f_flags & O_NONBLOCK;
1268 DECLARE_WAITQUEUE(wait, current);
0b67f5c5 1269 int bytes_to_read, rv = 0;
2b455db6 1270 void *image_buffer_addr;
1da177e4 1271
2b455db6
LS
1272 PWC_DEBUG_READ("pwc_video_read(vdev=0x%p, buf=%p, count=%zd) called.\n",
1273 vdev, buf, count);
1da177e4
LT
1274 if (vdev == NULL)
1275 return -EFAULT;
601e9444 1276 pdev = video_get_drvdata(vdev);
1da177e4
LT
1277 if (pdev == NULL)
1278 return -EFAULT;
0b67f5c5 1279
0b67f5c5
ON
1280 if (pdev->error_status) {
1281 rv = -pdev->error_status; /* Something happened, report what. */
1282 goto err_out;
1283 }
1da177e4 1284
3751e288
HG
1285 /* Start the stream (if not already started) */
1286 rv = pwc_isoc_init(pdev);
1287 if (rv)
1288 goto err_out;
1289
1da177e4
LT
1290 /* In case we're doing partial reads, we don't have to wait for a frame */
1291 if (pdev->image_read_pos == 0) {
1292 /* Do wait queueing according to the (doc)book */
1293 add_wait_queue(&pdev->frameq, &wait);
1294 while (pdev->full_frames == NULL) {
1295 /* Check for unplugged/etc. here */
1296 if (pdev->error_status) {
1297 remove_wait_queue(&pdev->frameq, &wait);
1298 set_current_state(TASK_RUNNING);
0b67f5c5
ON
1299 rv = -pdev->error_status ;
1300 goto err_out;
1da177e4 1301 }
d56410e0
MCC
1302 if (noblock) {
1303 remove_wait_queue(&pdev->frameq, &wait);
1304 set_current_state(TASK_RUNNING);
0b67f5c5
ON
1305 rv = -EWOULDBLOCK;
1306 goto err_out;
d56410e0
MCC
1307 }
1308 if (signal_pending(current)) {
1309 remove_wait_queue(&pdev->frameq, &wait);
1310 set_current_state(TASK_RUNNING);
0b67f5c5
ON
1311 rv = -ERESTARTSYS;
1312 goto err_out;
d56410e0 1313 }
b577f962 1314 mutex_unlock(&pdev->modlock);
d56410e0
MCC
1315 schedule();
1316 set_current_state(TASK_INTERRUPTIBLE);
b577f962 1317 mutex_lock(&pdev->modlock);
1da177e4
LT
1318 }
1319 remove_wait_queue(&pdev->frameq, &wait);
1320 set_current_state(TASK_RUNNING);
d56410e0 1321
1da177e4 1322 /* Decompress and release frame */
0b67f5c5
ON
1323 if (pwc_handle_frame(pdev)) {
1324 rv = -EFAULT;
1325 goto err_out;
1326 }
1da177e4
LT
1327 }
1328
2b455db6 1329 PWC_DEBUG_READ("Copying data to user space.\n");
479567ce 1330 if (pdev->pixfmt != V4L2_PIX_FMT_YUV420)
2b455db6 1331 bytes_to_read = pdev->frame_size + sizeof(struct pwc_raw_frame);
1da177e4 1332 else
d56410e0 1333 bytes_to_read = pdev->view.size;
1da177e4
LT
1334
1335 /* copy bytes to user space; we allow for partial reads */
1336 if (count + pdev->image_read_pos > bytes_to_read)
1337 count = bytes_to_read - pdev->image_read_pos;
2b455db6
LS
1338 image_buffer_addr = pdev->image_data;
1339 image_buffer_addr += pdev->images[pdev->fill_image].offset;
1340 image_buffer_addr += pdev->image_read_pos;
0b67f5c5
ON
1341 if (copy_to_user(buf, image_buffer_addr, count)) {
1342 rv = -EFAULT;
1343 goto err_out;
1344 }
1da177e4
LT
1345 pdev->image_read_pos += count;
1346 if (pdev->image_read_pos >= bytes_to_read) { /* All data has been read */
1347 pdev->image_read_pos = 0;
1348 pwc_next_image(pdev);
1349 }
1350 return count;
0b67f5c5 1351err_out:
0b67f5c5 1352 return rv;
1da177e4
LT
1353}
1354
1355static unsigned int pwc_video_poll(struct file *file, poll_table *wait)
1356{
1357 struct video_device *vdev = file->private_data;
1358 struct pwc_device *pdev;
3751e288 1359 int ret;
1da177e4
LT
1360
1361 if (vdev == NULL)
1362 return -EFAULT;
601e9444 1363 pdev = video_get_drvdata(vdev);
1da177e4
LT
1364 if (pdev == NULL)
1365 return -EFAULT;
1366
3751e288 1367 /* Start the stream (if not already started) */
3751e288 1368 ret = pwc_isoc_init(pdev);
3751e288
HG
1369 if (ret)
1370 return ret;
1371
1da177e4
LT
1372 poll_wait(file, &pdev->frameq, wait);
1373 if (pdev->error_status)
1374 return POLLERR;
1375 if (pdev->full_frames != NULL) /* we have frames waiting */
1376 return (POLLIN | POLLRDNORM);
1377
1378 return 0;
1379}
1380
069b7479 1381static long pwc_video_ioctl(struct file *file,
1da177e4
LT
1382 unsigned int cmd, unsigned long arg)
1383{
0b67f5c5
ON
1384 struct video_device *vdev = file->private_data;
1385 struct pwc_device *pdev;
069b7479 1386 long r = -ENODEV;
0b67f5c5
ON
1387
1388 if (!vdev)
1389 goto out;
601e9444 1390 pdev = video_get_drvdata(vdev);
0b67f5c5 1391
0b67f5c5 1392 if (!pdev->unplugged)
f473bf76 1393 r = video_usercopy(file, cmd, arg, pwc_video_do_ioctl);
0b67f5c5
ON
1394out:
1395 return r;
1da177e4
LT
1396}
1397
1da177e4
LT
1398static int pwc_video_mmap(struct file *file, struct vm_area_struct *vma)
1399{
1400 struct video_device *vdev = file->private_data;
1401 struct pwc_device *pdev;
2b455db6
LS
1402 unsigned long start;
1403 unsigned long size;
1404 unsigned long page, pos = 0;
1405 int index;
d56410e0 1406
645635b0 1407 PWC_DEBUG_MEMORY(">> %s\n", __func__);
601e9444 1408 pdev = video_get_drvdata(vdev);
2b455db6
LS
1409 size = vma->vm_end - vma->vm_start;
1410 start = vma->vm_start;
d56410e0 1411
2b455db6
LS
1412 /* Find the idx buffer for this mapping */
1413 for (index = 0; index < pwc_mbufs; index++) {
1414 pos = pdev->images[index].offset;
1415 if ((pos>>PAGE_SHIFT) == vma->vm_pgoff)
1416 break;
1417 }
1418 if (index == MAX_IMAGES)
1419 return -EINVAL;
1420 if (index == 0) {
1421 /*
1422 * Special case for v4l1. In v4l1, we map only one big buffer,
1423 * but in v4l2 each buffer is mapped
1424 */
1425 unsigned long total_size;
1426 total_size = pwc_mbufs * pdev->len_per_image;
1427 if (size != pdev->len_per_image && size != total_size) {
1428 PWC_ERROR("Wrong size (%lu) needed to be len_per_image=%d or total_size=%lu\n",
1429 size, pdev->len_per_image, total_size);
1430 return -EINVAL;
1431 }
1432 } else if (size > pdev->len_per_image)
1433 return -EINVAL;
1434
1435 vma->vm_flags |= VM_IO; /* from 2.6.9-acX */
1da177e4 1436
2b455db6 1437 pos += (unsigned long)pdev->image_data;
1da177e4
LT
1438 while (size > 0) {
1439 page = vmalloc_to_pfn((void *)pos);
1440 if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED))
1441 return -EAGAIN;
1da177e4
LT
1442 start += PAGE_SIZE;
1443 pos += PAGE_SIZE;
1444 if (size > PAGE_SIZE)
1445 size -= PAGE_SIZE;
1446 else
1447 size = 0;
1448 }
1da177e4
LT
1449 return 0;
1450}
1451
1452/***************************************************************************/
1453/* USB functions */
1454
1455/* This function gets called when a new device is plugged in or the usb core
1456 * is loaded.
1457 */
1458
1459static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id *id)
1460{
1461 struct usb_device *udev = interface_to_usbdev(intf);
1462 struct pwc_device *pdev = NULL;
1463 int vendor_id, product_id, type_id;
89dec01b 1464 int hint, rc;
1da177e4
LT
1465 int features = 0;
1466 int video_nr = -1; /* default: use next available device */
1467 char serial_number[30], *name;
1468
2b455db6
LS
1469 vendor_id = le16_to_cpu(udev->descriptor.idVendor);
1470 product_id = le16_to_cpu(udev->descriptor.idProduct);
1471
1da177e4 1472 /* Check if we can handle this device */
2b455db6
LS
1473 PWC_DEBUG_PROBE("probe() called [%04X %04X], if %d\n",
1474 vendor_id, product_id,
1da177e4
LT
1475 intf->altsetting->desc.bInterfaceNumber);
1476
1477 /* the interfaces are probed one by one. We are only interested in the
1478 video interface (0) now.
1479 Interface 1 is the Audio Control, and interface 2 Audio itself.
1480 */
1481 if (intf->altsetting->desc.bInterfaceNumber > 0)
1482 return -ENODEV;
1483
1da177e4
LT
1484 if (vendor_id == 0x0471) {
1485 switch (product_id) {
1486 case 0x0302:
2b455db6 1487 PWC_INFO("Philips PCA645VC USB webcam detected.\n");
1da177e4
LT
1488 name = "Philips 645 webcam";
1489 type_id = 645;
1490 break;
1491 case 0x0303:
2b455db6 1492 PWC_INFO("Philips PCA646VC USB webcam detected.\n");
1da177e4
LT
1493 name = "Philips 646 webcam";
1494 type_id = 646;
1495 break;
1496 case 0x0304:
2b455db6 1497 PWC_INFO("Askey VC010 type 2 USB webcam detected.\n");
1da177e4
LT
1498 name = "Askey VC010 webcam";
1499 type_id = 646;
1500 break;
1501 case 0x0307:
2b455db6 1502 PWC_INFO("Philips PCVC675K (Vesta) USB webcam detected.\n");
1da177e4
LT
1503 name = "Philips 675 webcam";
1504 type_id = 675;
1505 break;
1506 case 0x0308:
2b455db6 1507 PWC_INFO("Philips PCVC680K (Vesta Pro) USB webcam detected.\n");
1da177e4
LT
1508 name = "Philips 680 webcam";
1509 type_id = 680;
1510 break;
1511 case 0x030C:
2b455db6 1512 PWC_INFO("Philips PCVC690K (Vesta Pro Scan) USB webcam detected.\n");
1da177e4
LT
1513 name = "Philips 690 webcam";
1514 type_id = 690;
1515 break;
1516 case 0x0310:
2b455db6 1517 PWC_INFO("Philips PCVC730K (ToUCam Fun)/PCVC830 (ToUCam II) USB webcam detected.\n");
1da177e4
LT
1518 name = "Philips 730 webcam";
1519 type_id = 730;
1520 break;
1521 case 0x0311:
2b455db6 1522 PWC_INFO("Philips PCVC740K (ToUCam Pro)/PCVC840 (ToUCam II) USB webcam detected.\n");
1da177e4
LT
1523 name = "Philips 740 webcam";
1524 type_id = 740;
1525 break;
1526 case 0x0312:
2b455db6 1527 PWC_INFO("Philips PCVC750K (ToUCam Pro Scan) USB webcam detected.\n");
1da177e4
LT
1528 name = "Philips 750 webcam";
1529 type_id = 750;
1530 break;
1531 case 0x0313:
2b455db6 1532 PWC_INFO("Philips PCVC720K/40 (ToUCam XS) USB webcam detected.\n");
1da177e4
LT
1533 name = "Philips 720K/40 webcam";
1534 type_id = 720;
1535 break;
2b455db6
LS
1536 case 0x0329:
1537 PWC_INFO("Philips SPC 900NC USB webcam detected.\n");
1538 name = "Philips SPC 900NC webcam";
9ee6d78c 1539 type_id = 740;
2b455db6 1540 break;
1da177e4
LT
1541 default:
1542 return -ENODEV;
1543 break;
1544 }
1545 }
1546 else if (vendor_id == 0x069A) {
1547 switch(product_id) {
1548 case 0x0001:
2b455db6 1549 PWC_INFO("Askey VC010 type 1 USB webcam detected.\n");
1da177e4
LT
1550 name = "Askey VC010 webcam";
1551 type_id = 645;
1552 break;
1553 default:
1554 return -ENODEV;
1555 break;
1556 }
1557 }
1558 else if (vendor_id == 0x046d) {
1559 switch(product_id) {
1560 case 0x08b0:
2b455db6 1561 PWC_INFO("Logitech QuickCam Pro 3000 USB webcam detected.\n");
1da177e4
LT
1562 name = "Logitech QuickCam Pro 3000";
1563 type_id = 740; /* CCD sensor */
1564 break;
1565 case 0x08b1:
2b455db6 1566 PWC_INFO("Logitech QuickCam Notebook Pro USB webcam detected.\n");
1da177e4
LT
1567 name = "Logitech QuickCam Notebook Pro";
1568 type_id = 740; /* CCD sensor */
1569 break;
1570 case 0x08b2:
2b455db6 1571 PWC_INFO("Logitech QuickCam 4000 Pro USB webcam detected.\n");
1da177e4
LT
1572 name = "Logitech QuickCam Pro 4000";
1573 type_id = 740; /* CCD sensor */
1574 break;
1575 case 0x08b3:
2b455db6 1576 PWC_INFO("Logitech QuickCam Zoom USB webcam detected.\n");
1da177e4
LT
1577 name = "Logitech QuickCam Zoom";
1578 type_id = 740; /* CCD sensor */
1579 break;
1580 case 0x08B4:
2b455db6 1581 PWC_INFO("Logitech QuickCam Zoom (new model) USB webcam detected.\n");
1da177e4
LT
1582 name = "Logitech QuickCam Zoom";
1583 type_id = 740; /* CCD sensor */
2b455db6 1584 power_save = 1;
1da177e4
LT
1585 break;
1586 case 0x08b5:
2b455db6 1587 PWC_INFO("Logitech QuickCam Orbit/Sphere USB webcam detected.\n");
1da177e4
LT
1588 name = "Logitech QuickCam Orbit";
1589 type_id = 740; /* CCD sensor */
1590 features |= FEATURE_MOTOR_PANTILT;
1591 break;
1592 case 0x08b6:
a63e157f
JT
1593 PWC_INFO("Logitech/Cisco VT Camera webcam detected.\n");
1594 name = "Cisco VT Camera";
1595 type_id = 740; /* CCD sensor */
1596 break;
1da177e4 1597 case 0x08b7:
6b1ce3c1
MCC
1598 PWC_INFO("Logitech ViewPort AV 100 webcam detected.\n");
1599 name = "Logitech ViewPort AV 100";
1600 type_id = 740; /* CCD sensor */
1601 break;
1602 case 0x08b8: /* Where this released? */
2b455db6 1603 PWC_INFO("Logitech QuickCam detected (reserved ID).\n");
1da177e4
LT
1604 name = "Logitech QuickCam (res.)";
1605 type_id = 730; /* Assuming CMOS */
1606 break;
d56410e0 1607 default:
1da177e4 1608 return -ENODEV;
d56410e0
MCC
1609 break;
1610 }
1611 }
1da177e4
LT
1612 else if (vendor_id == 0x055d) {
1613 /* I don't know the difference between the C10 and the C30;
1614 I suppose the difference is the sensor, but both cameras
1615 work equally well with a type_id of 675
1616 */
1617 switch(product_id) {
1618 case 0x9000:
2b455db6 1619 PWC_INFO("Samsung MPC-C10 USB webcam detected.\n");
1da177e4
LT
1620 name = "Samsung MPC-C10";
1621 type_id = 675;
1622 break;
1623 case 0x9001:
2b455db6 1624 PWC_INFO("Samsung MPC-C30 USB webcam detected.\n");
1da177e4
LT
1625 name = "Samsung MPC-C30";
1626 type_id = 675;
1627 break;
2b455db6
LS
1628 case 0x9002:
1629 PWC_INFO("Samsung SNC-35E (v3.0) USB webcam detected.\n");
1630 name = "Samsung MPC-C30";
1631 type_id = 740;
1632 break;
1da177e4
LT
1633 default:
1634 return -ENODEV;
1635 break;
1636 }
1637 }
1638 else if (vendor_id == 0x041e) {
1639 switch(product_id) {
1640 case 0x400c:
2b455db6 1641 PWC_INFO("Creative Labs Webcam 5 detected.\n");
1da177e4
LT
1642 name = "Creative Labs Webcam 5";
1643 type_id = 730;
1644 break;
1645 case 0x4011:
2b455db6 1646 PWC_INFO("Creative Labs Webcam Pro Ex detected.\n");
1da177e4
LT
1647 name = "Creative Labs Webcam Pro Ex";
1648 type_id = 740;
1649 break;
1650 default:
1651 return -ENODEV;
1652 break;
1653 }
1654 }
1655 else if (vendor_id == 0x04cc) {
1656 switch(product_id) {
1657 case 0x8116:
2b455db6 1658 PWC_INFO("Sotec Afina Eye USB webcam detected.\n");
1da177e4
LT
1659 name = "Sotec Afina Eye";
1660 type_id = 730;
1661 break;
1662 default:
1663 return -ENODEV;
1664 break;
1665 }
1666 }
1667 else if (vendor_id == 0x06be) {
1668 switch(product_id) {
1669 case 0x8116:
1670 /* This is essentially the same cam as the Sotec Afina Eye */
2b455db6 1671 PWC_INFO("AME Co. Afina Eye USB webcam detected.\n");
1da177e4
LT
1672 name = "AME Co. Afina Eye";
1673 type_id = 750;
1674 break;
1675 default:
1676 return -ENODEV;
1677 break;
1678 }
d56410e0 1679
1da177e4
LT
1680 }
1681 else if (vendor_id == 0x0d81) {
1682 switch(product_id) {
1683 case 0x1900:
2b455db6 1684 PWC_INFO("Visionite VCS-UC300 USB webcam detected.\n");
1da177e4
LT
1685 name = "Visionite VCS-UC300";
1686 type_id = 740; /* CCD sensor */
1687 break;
1688 case 0x1910:
2b455db6 1689 PWC_INFO("Visionite VCS-UM100 USB webcam detected.\n");
1da177e4
LT
1690 name = "Visionite VCS-UM100";
1691 type_id = 730; /* CMOS sensor */
1692 break;
1693 default:
1694 return -ENODEV;
1695 break;
1696 }
1697 }
d56410e0 1698 else
1da177e4
LT
1699 return -ENODEV; /* Not any of the know types; but the list keeps growing. */
1700
1701 memset(serial_number, 0, 30);
1702 usb_string(udev, udev->descriptor.iSerialNumber, serial_number, 29);
2b455db6 1703 PWC_DEBUG_PROBE("Device serial number is %s\n", serial_number);
1da177e4
LT
1704
1705 if (udev->descriptor.bNumConfigurations > 1)
2b455db6 1706 PWC_WARNING("Warning: more than 1 configuration available.\n");
1da177e4
LT
1707
1708 /* Allocate structure, initialize pointers, mutexes, etc. and link it to the usb_device */
80b6ca48 1709 pdev = kzalloc(sizeof(struct pwc_device), GFP_KERNEL);
1da177e4 1710 if (pdev == NULL) {
2b455db6 1711 PWC_ERROR("Oops, could not allocate memory for pwc_device.\n");
1da177e4
LT
1712 return -ENOMEM;
1713 }
1da177e4
LT
1714 pdev->type = type_id;
1715 pdev->vsize = default_size;
1716 pdev->vframes = default_fps;
1717 strcpy(pdev->serial, serial_number);
1718 pdev->features = features;
89dec01b 1719 if (vendor_id == 0x046D && product_id == 0x08B5) {
1da177e4 1720 /* Logitech QuickCam Orbit
d56410e0
MCC
1721 The ranges have been determined experimentally; they may differ from cam to cam.
1722 Also, the exact ranges left-right and up-down are different for my cam
1723 */
1da177e4
LT
1724 pdev->angle_range.pan_min = -7000;
1725 pdev->angle_range.pan_max = 7000;
1726 pdev->angle_range.tilt_min = -3000;
1727 pdev->angle_range.tilt_max = 2500;
1728 }
1729
b9378fdb 1730 mutex_init(&pdev->modlock);
1da177e4
LT
1731 spin_lock_init(&pdev->ptrlock);
1732
1733 pdev->udev = udev;
1734 init_waitqueue_head(&pdev->frameq);
1735 pdev->vcompression = pwc_preferred_compression;
1736
1737 /* Allocate video_device structure */
1738 pdev->vdev = video_device_alloc();
5fa1247a 1739 if (!pdev->vdev) {
2b455db6 1740 PWC_ERROR("Err, cannot allocate video_device struture. Failing probe.");
89dec01b
DT
1741 rc = -ENOMEM;
1742 goto err_free_mem;
1da177e4
LT
1743 }
1744 memcpy(pdev->vdev, &pwc_template, sizeof(pwc_template));
52a85e17 1745 pdev->vdev->parent = &intf->dev;
b577f962 1746 pdev->vdev->lock = &pdev->modlock;
1da177e4 1747 strcpy(pdev->vdev->name, name);
1da177e4
LT
1748 video_set_drvdata(pdev->vdev, pdev);
1749
1750 pdev->release = le16_to_cpu(udev->descriptor.bcdDevice);
2b455db6 1751 PWC_DEBUG_PROBE("Release: %04x\n", pdev->release);
1da177e4
LT
1752
1753 /* Now search device_hint[] table for a match, so we can hint a node number. */
1754 for (hint = 0; hint < MAX_DEV_HINTS; hint++) {
1755 if (((device_hint[hint].type == -1) || (device_hint[hint].type == pdev->type)) &&
1756 (device_hint[hint].pdev == NULL)) {
1757 /* so far, so good... try serial number */
1758 if ((device_hint[hint].serial_number[0] == '*') || !strcmp(device_hint[hint].serial_number, serial_number)) {
657de3cd
TP
1759 /* match! */
1760 video_nr = device_hint[hint].device_node;
1761 PWC_DEBUG_PROBE("Found hint, will try to register as /dev/video%d\n", video_nr);
1762 break;
1da177e4
LT
1763 }
1764 }
1765 }
1766
1767 pdev->vdev->release = video_device_release;
89dec01b 1768
1da177e4 1769 /* occupy slot */
d56410e0 1770 if (hint < MAX_DEV_HINTS)
1da177e4
LT
1771 device_hint[hint].pdev = pdev;
1772
2b455db6 1773 PWC_DEBUG_PROBE("probe() function returning struct at 0x%p.\n", pdev);
89dec01b 1774 usb_set_intfdata(intf, pdev);
2b455db6
LS
1775
1776 /* Set the leds off */
1777 pwc_set_leds(pdev, 0, 0);
1778 pwc_camera_power(pdev, 0);
1779
479567ce
HV
1780 rc = video_register_device(pdev->vdev, VFL_TYPE_GRABBER, video_nr);
1781 if (rc < 0) {
1782 PWC_ERROR("Failed to register as video device (%d).\n", rc);
1783 goto err_video_release;
1784 }
1785 rc = pwc_create_sysfs_files(pdev->vdev);
1786 if (rc)
1787 goto err_video_unreg;
1788
1789 PWC_INFO("Registered as %s.\n", video_device_node_name(pdev->vdev));
1790
e32a7ecc
NPT
1791#ifdef CONFIG_USB_PWC_INPUT_EVDEV
1792 /* register webcam snapshot button input device */
1793 pdev->button_dev = input_allocate_device();
1794 if (!pdev->button_dev) {
1795 PWC_ERROR("Err, insufficient memory for webcam snapshot button device.");
89dec01b
DT
1796 rc = -ENOMEM;
1797 pwc_remove_sysfs_files(pdev->vdev);
1798 goto err_video_unreg;
e32a7ecc
NPT
1799 }
1800
89dec01b
DT
1801 usb_make_path(udev, pdev->button_phys, sizeof(pdev->button_phys));
1802 strlcat(pdev->button_phys, "/input0", sizeof(pdev->button_phys));
1803
e32a7ecc 1804 pdev->button_dev->name = "PWC snapshot button";
89dec01b 1805 pdev->button_dev->phys = pdev->button_phys;
e32a7ecc
NPT
1806 usb_to_input_id(pdev->udev, &pdev->button_dev->id);
1807 pdev->button_dev->dev.parent = &pdev->udev->dev;
1808 pdev->button_dev->evbit[0] = BIT_MASK(EV_KEY);
bcd3e4b3 1809 pdev->button_dev->keybit[BIT_WORD(KEY_CAMERA)] = BIT_MASK(KEY_CAMERA);
e32a7ecc
NPT
1810
1811 rc = input_register_device(pdev->button_dev);
1812 if (rc) {
1813 input_free_device(pdev->button_dev);
e32a7ecc 1814 pdev->button_dev = NULL;
89dec01b
DT
1815 pwc_remove_sysfs_files(pdev->vdev);
1816 goto err_video_unreg;
e32a7ecc
NPT
1817 }
1818#endif
1819
1da177e4 1820 return 0;
c12e3be0 1821
89dec01b 1822err_video_unreg:
c12e3be0
JG
1823 if (hint < MAX_DEV_HINTS)
1824 device_hint[hint].pdev = NULL;
1825 video_unregister_device(pdev->vdev);
89dec01b
DT
1826 pdev->vdev = NULL; /* So we don't try to release it below */
1827err_video_release:
1828 video_device_release(pdev->vdev);
1829err_free_mem:
1830 kfree(pdev);
c12e3be0 1831 return rc;
1da177e4
LT
1832}
1833
89dec01b 1834/* The user yanked out the cable... */
1da177e4
LT
1835static void usb_pwc_disconnect(struct usb_interface *intf)
1836{
1837 struct pwc_device *pdev;
1838 int hint;
1839
1da177e4 1840 pdev = usb_get_intfdata (intf);
7074f407 1841 mutex_lock(&pdev->modlock);
1da177e4
LT
1842 usb_set_intfdata (intf, NULL);
1843 if (pdev == NULL) {
2b455db6 1844 PWC_ERROR("pwc_disconnect() Called without private pointer.\n");
1da177e4
LT
1845 goto disconnect_out;
1846 }
1847 if (pdev->udev == NULL) {
2b455db6 1848 PWC_ERROR("pwc_disconnect() already called for %p\n", pdev);
1da177e4
LT
1849 goto disconnect_out;
1850 }
1851 if (pdev->udev != interface_to_usbdev(intf)) {
2b455db6 1852 PWC_ERROR("pwc_disconnect() Woops: pointer mismatch udev/pdev.\n");
1da177e4
LT
1853 goto disconnect_out;
1854 }
d56410e0 1855
1da177e4
LT
1856 /* We got unplugged; this is signalled by an EPIPE error code */
1857 if (pdev->vopen) {
2b455db6 1858 PWC_INFO("Disconnected while webcam is in use!\n");
1da177e4
LT
1859 pdev->error_status = EPIPE;
1860 }
1861
1862 /* Alert waiting processes */
1863 wake_up_interruptible(&pdev->frameq);
1864 /* Wait until device is closed */
89dec01b 1865 if (pdev->vopen) {
85237f20 1866 pdev->unplugged = 1;
0b67f5c5 1867 pwc_iso_stop(pdev);
85237f20
ON
1868 } else {
1869 /* Device is closed, so we can safely unregister it */
1870 PWC_DEBUG_PROBE("Unregistering video device in disconnect().\n");
1871 pwc_cleanup(pdev);
1da177e4
LT
1872
1873disconnect_out:
85237f20
ON
1874 /* search device_hint[] table if we occupy a slot, by any chance */
1875 for (hint = 0; hint < MAX_DEV_HINTS; hint++)
1876 if (device_hint[hint].pdev == pdev)
1877 device_hint[hint].pdev = NULL;
1878 }
1da177e4 1879
7074f407 1880 mutex_unlock(&pdev->modlock);
1da177e4
LT
1881}
1882
1da177e4 1883
d56410e0
MCC
1884/*
1885 * Initialization code & module stuff
1da177e4
LT
1886 */
1887
2b455db6
LS
1888static char *size;
1889static int fps;
1890static int fbufs;
1891static int mbufs;
1da177e4
LT
1892static int compression = -1;
1893static int leds[2] = { -1, -1 };
64a6f950 1894static unsigned int leds_nargs;
2b455db6 1895static char *dev_hint[MAX_DEV_HINTS];
64a6f950 1896static unsigned int dev_hint_nargs;
2b455db6
LS
1897
1898module_param(size, charp, 0444);
1899module_param(fps, int, 0444);
1900module_param(fbufs, int, 0444);
1901module_param(mbufs, int, 0444);
05ad3907 1902#ifdef CONFIG_USB_PWC_DEBUG
2b455db6
LS
1903module_param_named(trace, pwc_trace, int, 0644);
1904#endif
1905module_param(power_save, int, 0444);
1906module_param(compression, int, 0444);
1907module_param_array(leds, int, &leds_nargs, 0444);
1908module_param_array(dev_hint, charp, &dev_hint_nargs, 0444);
1da177e4 1909
1da177e4 1910MODULE_PARM_DESC(size, "Initial image size. One of sqcif, qsif, qcif, sif, cif, vga");
1da177e4 1911MODULE_PARM_DESC(fps, "Initial frames per second. Varies with model, useful range 5-30");
1da177e4 1912MODULE_PARM_DESC(fbufs, "Number of internal frame buffers to reserve");
1da177e4 1913MODULE_PARM_DESC(mbufs, "Number of external (mmap()ed) image buffers");
4315c414 1914#ifdef CONFIG_USB_PWC_DEBUG
1da177e4 1915MODULE_PARM_DESC(trace, "For debugging purposes");
4315c414 1916#endif
1da177e4 1917MODULE_PARM_DESC(power_save, "Turn power save feature in camera on or off");
1da177e4 1918MODULE_PARM_DESC(compression, "Preferred compression quality. Range 0 (uncompressed) to 3 (high compression)");
1da177e4 1919MODULE_PARM_DESC(leds, "LED on,off time in milliseconds");
1da177e4
LT
1920MODULE_PARM_DESC(dev_hint, "Device node hints");
1921
1922MODULE_DESCRIPTION("Philips & OEM USB webcam driver");
1923MODULE_AUTHOR("Luc Saillard <luc@saillard.org>");
1924MODULE_LICENSE("GPL");
2b455db6
LS
1925MODULE_ALIAS("pwcx");
1926MODULE_VERSION( PWC_VERSION );
1da177e4
LT
1927
1928static int __init usb_pwc_init(void)
1929{
1930 int i, sz;
1931 char *sizenames[PSZ_MAX] = { "sqcif", "qsif", "qcif", "sif", "cif", "vga" };
1932
2b455db6
LS
1933 PWC_INFO("Philips webcam module version " PWC_VERSION " loaded.\n");
1934 PWC_INFO("Supports Philips PCA645/646, PCVC675/680/690, PCVC720[40]/730/740/750 & PCVC830/840.\n");
1935 PWC_INFO("Also supports the Askey VC010, various Logitech Quickcams, Samsung MPC-C10 and MPC-C30,\n");
1936 PWC_INFO("the Creative WebCam 5 & Pro Ex, SOTEC Afina Eye and Visionite VCS-UC300 and VCS-UM100.\n");
1da177e4
LT
1937
1938 if (fps) {
1939 if (fps < 4 || fps > 30) {
2b455db6 1940 PWC_ERROR("Framerate out of bounds (4-30).\n");
1da177e4
LT
1941 return -EINVAL;
1942 }
1943 default_fps = fps;
2b455db6 1944 PWC_DEBUG_MODULE("Default framerate set to %d.\n", default_fps);
1da177e4
LT
1945 }
1946
2b455db6 1947 if (size) {
1da177e4
LT
1948 /* string; try matching with array */
1949 for (sz = 0; sz < PSZ_MAX; sz++) {
1950 if (!strcmp(sizenames[sz], size)) { /* Found! */
1951 default_size = sz;
1952 break;
1953 }
1954 }
1955 if (sz == PSZ_MAX) {
2b455db6 1956 PWC_ERROR("Size not recognized; try size=[sqcif | qsif | qcif | sif | cif | vga].\n");
1da177e4
LT
1957 return -EINVAL;
1958 }
2b455db6 1959 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
1960 }
1961 if (mbufs) {
1962 if (mbufs < 1 || mbufs > MAX_IMAGES) {
2b455db6 1963 PWC_ERROR("Illegal number of mmap() buffers; use a number between 1 and %d.\n", MAX_IMAGES);
1da177e4
LT
1964 return -EINVAL;
1965 }
2b455db6
LS
1966 pwc_mbufs = mbufs;
1967 PWC_DEBUG_MODULE("Number of image buffers set to %d.\n", pwc_mbufs);
1da177e4
LT
1968 }
1969 if (fbufs) {
1970 if (fbufs < 2 || fbufs > MAX_FRAMES) {
2b455db6 1971 PWC_ERROR("Illegal number of frame buffers; use a number between 2 and %d.\n", MAX_FRAMES);
1da177e4
LT
1972 return -EINVAL;
1973 }
1974 default_fbufs = fbufs;
2b455db6 1975 PWC_DEBUG_MODULE("Number of frame buffers set to %d.\n", default_fbufs);
1da177e4 1976 }
05ad3907 1977#ifdef CONFIG_USB_PWC_DEBUG
2b455db6
LS
1978 if (pwc_trace >= 0) {
1979 PWC_DEBUG_MODULE("Trace options: 0x%04x\n", pwc_trace);
1da177e4 1980 }
2b455db6 1981#endif
1da177e4
LT
1982 if (compression >= 0) {
1983 if (compression > 3) {
2b455db6 1984 PWC_ERROR("Invalid compression setting; use a number between 0 (uncompressed) and 3 (high).\n");
1da177e4
LT
1985 return -EINVAL;
1986 }
1987 pwc_preferred_compression = compression;
2b455db6 1988 PWC_DEBUG_MODULE("Preferred compression set to %d.\n", pwc_preferred_compression);
1da177e4
LT
1989 }
1990 if (power_save)
2b455db6 1991 PWC_DEBUG_MODULE("Enabling power save on open/close.\n");
1da177e4
LT
1992 if (leds[0] >= 0)
1993 led_on = leds[0];
1994 if (leds[1] >= 0)
1995 led_off = leds[1];
1996
093cf723 1997 /* Big device node whoopla. Basically, it allows you to assign a
1da177e4
LT
1998 device node (/dev/videoX) to a camera, based on its type
1999 & serial number. The format is [type[.serialnumber]:]node.
2000
2001 Any camera that isn't matched by these rules gets the next
2002 available free device node.
2003 */
2004 for (i = 0; i < MAX_DEV_HINTS; i++) {
2005 char *s, *colon, *dot;
2006
2007 /* This loop also initializes the array */
2008 device_hint[i].pdev = NULL;
2009 s = dev_hint[i];
2010 if (s != NULL && *s != '\0') {
2011 device_hint[i].type = -1; /* wildcard */
2012 strcpy(device_hint[i].serial_number, "*");
2013
2014 /* parse string: chop at ':' & '/' */
2015 colon = dot = s;
2016 while (*colon != '\0' && *colon != ':')
2017 colon++;
2018 while (*dot != '\0' && *dot != '.')
2019 dot++;
2020 /* Few sanity checks */
2021 if (*dot != '\0' && dot > colon) {
2b455db6 2022 PWC_ERROR("Malformed camera hint: the colon must be after the dot.\n");
1da177e4
LT
2023 return -EINVAL;
2024 }
2025
2026 if (*colon == '\0') {
2027 /* No colon */
2028 if (*dot != '\0') {
2b455db6 2029 PWC_ERROR("Malformed camera hint: no colon + device node given.\n");
1da177e4
LT
2030 return -EINVAL;
2031 }
2032 else {
2033 /* No type or serial number specified, just a number. */
2d8d7762
AS
2034 device_hint[i].device_node =
2035 simple_strtol(s, NULL, 10);
1da177e4
LT
2036 }
2037 }
2038 else {
2039 /* There's a colon, so we have at least a type and a device node */
2d8d7762
AS
2040 device_hint[i].type =
2041 simple_strtol(s, NULL, 10);
2042 device_hint[i].device_node =
2043 simple_strtol(colon + 1, NULL, 10);
1da177e4
LT
2044 if (*dot != '\0') {
2045 /* There's a serial number as well */
2046 int k;
d56410e0 2047
1da177e4
LT
2048 dot++;
2049 k = 0;
2050 while (*dot != ':' && k < 29) {
2051 device_hint[i].serial_number[k++] = *dot;
2052 dot++;
2053 }
2054 device_hint[i].serial_number[k] = '\0';
2055 }
2056 }
2b455db6
LS
2057 PWC_TRACE("device_hint[%d]:\n", i);
2058 PWC_TRACE(" type : %d\n", device_hint[i].type);
2059 PWC_TRACE(" serial# : %s\n", device_hint[i].serial_number);
2060 PWC_TRACE(" node : %d\n", device_hint[i].device_node);
1da177e4
LT
2061 }
2062 else
2063 device_hint[i].type = 0; /* not filled */
2064 } /* ..for MAX_DEV_HINTS */
2065
2b455db6 2066 PWC_DEBUG_PROBE("Registering driver at address 0x%p.\n", &pwc_driver);
1da177e4
LT
2067 return usb_register(&pwc_driver);
2068}
2069
2070static void __exit usb_pwc_exit(void)
2071{
2b455db6 2072 PWC_DEBUG_MODULE("Deregistering driver.\n");
1da177e4 2073 usb_deregister(&pwc_driver);
2b455db6 2074 PWC_INFO("Philips webcam module removed.\n");
1da177e4
LT
2075}
2076
2077module_init(usb_pwc_init);
2078module_exit(usb_pwc_exit);
2079
2b455db6 2080/* vim: set cino= formatoptions=croql cindent shiftwidth=8 tabstop=8: */
This page took 0.835019 seconds and 5 git commands to generate.