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