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