1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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>
66#ifdef CONFIG_USB_PWC_INPUT_EVDEV
67#include <linux/usb/input.h>
68#endif
69#include <linux/vmalloc.h>
70#include <asm/io.h>
71#include <linux/kernel.h>
72
73#include "pwc.h"
74#include "pwc-kiara.h"
75#include "pwc-timon.h"
76#include "pwc-dec23.h"
77#include "pwc-dec1.h"
78
79
80
81
82static const struct usb_device_id pwc_device_table [] = {
83 { USB_DEVICE(0x0471, 0x0302) },
84 { USB_DEVICE(0x0471, 0x0303) },
85 { USB_DEVICE(0x0471, 0x0304) },
86 { USB_DEVICE(0x0471, 0x0307) },
87 { USB_DEVICE(0x0471, 0x0308) },
88 { USB_DEVICE(0x0471, 0x030C) },
89 { USB_DEVICE(0x0471, 0x0310) },
90 { USB_DEVICE(0x0471, 0x0311) },
91 { USB_DEVICE(0x0471, 0x0312) },
92 { USB_DEVICE(0x0471, 0x0313) },
93 { USB_DEVICE(0x0471, 0x0329) },
94 { USB_DEVICE(0x069A, 0x0001) },
95 { USB_DEVICE(0x046D, 0x08B0) },
96 { USB_DEVICE(0x046D, 0x08B1) },
97 { USB_DEVICE(0x046D, 0x08B2) },
98 { USB_DEVICE(0x046D, 0x08B3) },
99 { USB_DEVICE(0x046D, 0x08B4) },
100 { USB_DEVICE(0x046D, 0x08B5) },
101 { USB_DEVICE(0x046D, 0x08B6) },
102 { USB_DEVICE(0x046D, 0x08B7) },
103 { USB_DEVICE(0x046D, 0x08B8) },
104 { USB_DEVICE(0x055D, 0x9000) },
105 { USB_DEVICE(0x055D, 0x9001) },
106 { USB_DEVICE(0x055D, 0x9002) },
107 { USB_DEVICE(0x041E, 0x400C) },
108 { USB_DEVICE(0x041E, 0x4011) },
109 { USB_DEVICE(0x04CC, 0x8116) },
110 { USB_DEVICE(0x06BE, 0x8116) },
111 { USB_DEVICE(0x0d81, 0x1910) },
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);
119static void pwc_isoc_cleanup(struct pwc_device *pdev);
120
121static struct usb_driver pwc_driver = {
122 .name = "Philips webcam",
123 .id_table = pwc_device_table,
124 .probe = usb_pwc_probe,
125 .disconnect = usb_pwc_disconnect,
126};
127
128#define MAX_DEV_HINTS 20
129#define MAX_ISOC_ERRORS 20
130
131#ifdef CONFIG_USB_PWC_DEBUG
132 int pwc_trace = PWC_DEBUG_LEVEL;
133#endif
134static int power_save = -1;
135static int leds[2] = { 100, 0 };
136
137
138
139static int pwc_video_close(struct file *file);
140static ssize_t pwc_video_read(struct file *file, char __user *buf,
141 size_t count, loff_t *ppos);
142static unsigned int pwc_video_poll(struct file *file, poll_table *wait);
143static int pwc_video_mmap(struct file *file, struct vm_area_struct *vma);
144
145static const struct v4l2_file_operations pwc_fops = {
146 .owner = THIS_MODULE,
147 .open = v4l2_fh_open,
148 .release = pwc_video_close,
149 .read = pwc_video_read,
150 .poll = pwc_video_poll,
151 .mmap = pwc_video_mmap,
152 .unlocked_ioctl = video_ioctl2,
153};
154static struct video_device pwc_template = {
155 .name = "Philips Webcam",
156 .release = video_device_release_empty,
157 .fops = &pwc_fops,
158 .ioctl_ops = &pwc_ioctl_ops,
159};
160
161
162
163
164struct pwc_frame_buf *pwc_get_next_fill_buf(struct pwc_device *pdev)
165{
166 unsigned long flags = 0;
167 struct pwc_frame_buf *buf = NULL;
168
169 spin_lock_irqsave(&pdev->queued_bufs_lock, flags);
170 if (list_empty(&pdev->queued_bufs))
171 goto leave;
172
173 buf = list_entry(pdev->queued_bufs.next, struct pwc_frame_buf, list);
174 list_del(&buf->list);
175leave:
176 spin_unlock_irqrestore(&pdev->queued_bufs_lock, flags);
177 return buf;
178}
179
180static void pwc_snapshot_button(struct pwc_device *pdev, int down)
181{
182 if (down) {
183 PWC_TRACE("Snapshot button pressed.\n");
184 } else {
185 PWC_TRACE("Snapshot button released.\n");
186 }
187
188#ifdef CONFIG_USB_PWC_INPUT_EVDEV
189 if (pdev->button_dev) {
190 input_report_key(pdev->button_dev, KEY_CAMERA, down);
191 input_sync(pdev->button_dev);
192 }
193#endif
194}
195
196static void pwc_frame_complete(struct pwc_device *pdev)
197{
198 struct pwc_frame_buf *fbuf = pdev->fill_buf;
199
200
201
202
203
204 if (pdev->type == 730) {
205 unsigned char *ptr = (unsigned char *)fbuf->data;
206
207 if (ptr[1] == 1 && ptr[0] & 0x10) {
208 PWC_TRACE("Hyundai CMOS sensor bug. Dropping frame.\n");
209 pdev->drop_frames += 2;
210 }
211 if ((ptr[0] ^ pdev->vmirror) & 0x01) {
212 pwc_snapshot_button(pdev, ptr[0] & 0x01);
213 }
214 if ((ptr[0] ^ pdev->vmirror) & 0x02) {
215 if (ptr[0] & 0x02)
216 PWC_TRACE("Image is mirrored.\n");
217 else
218 PWC_TRACE("Image is normal.\n");
219 }
220 pdev->vmirror = ptr[0] & 0x03;
221
222
223
224
225
226
227
228
229
230 if (fbuf->filled == 4)
231 pdev->drop_frames++;
232 } else if (pdev->type == 740 || pdev->type == 720) {
233 unsigned char *ptr = (unsigned char *)fbuf->data;
234 if ((ptr[0] ^ pdev->vmirror) & 0x01) {
235 pwc_snapshot_button(pdev, ptr[0] & 0x01);
236 }
237 pdev->vmirror = ptr[0] & 0x03;
238 }
239
240
241 if (pdev->drop_frames > 0) {
242 pdev->drop_frames--;
243 } else {
244
245 if (fbuf->filled < pdev->frame_total_size) {
246 PWC_DEBUG_FLOW("Frame buffer underflow (%d bytes);"
247 " discarded.\n", fbuf->filled);
248 } else {
249 fbuf->vb.v4l2_buf.field = V4L2_FIELD_NONE;
250 fbuf->vb.v4l2_buf.sequence = pdev->vframe_count;
251 vb2_buffer_done(&fbuf->vb, VB2_BUF_STATE_DONE);
252 pdev->fill_buf = NULL;
253 pdev->vsync = 0;
254 }
255 }
256 pdev->vframe_count++;
257}
258
259
260
261
262static void pwc_isoc_handler(struct urb *urb)
263{
264 struct pwc_device *pdev = (struct pwc_device *)urb->context;
265 int i, fst, flen;
266 unsigned char *iso_buf = NULL;
267
268 if (urb->status == -ENOENT || urb->status == -ECONNRESET ||
269 urb->status == -ESHUTDOWN) {
270 PWC_DEBUG_OPEN("URB (%p) unlinked %ssynchronuously.\n", urb, urb->status == -ENOENT ? "" : "a");
271 return;
272 }
273
274 if (pdev->fill_buf == NULL)
275 pdev->fill_buf = pwc_get_next_fill_buf(pdev);
276
277 if (urb->status != 0) {
278 const char *errmsg;
279
280 errmsg = "Unknown";
281 switch(urb->status) {
282 case -ENOSR: errmsg = "Buffer error (overrun)"; break;
283 case -EPIPE: errmsg = "Stalled (device not responding)"; break;
284 case -EOVERFLOW: errmsg = "Babble (bad cable?)"; break;
285 case -EPROTO: errmsg = "Bit-stuff error (bad cable?)"; break;
286 case -EILSEQ: errmsg = "CRC/Timeout (could be anything)"; break;
287 case -ETIME: errmsg = "Device does not respond"; break;
288 }
289 PWC_ERROR("pwc_isoc_handler() called with status %d [%s].\n",
290 urb->status, errmsg);
291
292 if (++pdev->visoc_errors > MAX_ISOC_ERRORS)
293 {
294 PWC_ERROR("Too many ISOC errors, bailing out.\n");
295 if (pdev->fill_buf) {
296 vb2_buffer_done(&pdev->fill_buf->vb,
297 VB2_BUF_STATE_ERROR);
298 pdev->fill_buf = NULL;
299 }
300 }
301 pdev->vsync = 0;
302 goto handler_end;
303 }
304
305
306 pdev->visoc_errors = 0;
307
308
309
310
311
312
313 for (i = 0; i < urb->number_of_packets; i++) {
314 fst = urb->iso_frame_desc[i].status;
315 flen = urb->iso_frame_desc[i].actual_length;
316 iso_buf = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
317 if (fst != 0) {
318 PWC_ERROR("Iso frame %d has error %d\n", i, fst);
319 continue;
320 }
321 if (flen > 0 && pdev->vsync) {
322 struct pwc_frame_buf *fbuf = pdev->fill_buf;
323
324 if (pdev->vsync == 1) {
325 do_gettimeofday(&fbuf->vb.v4l2_buf.timestamp);
326 pdev->vsync = 2;
327 }
328
329 if (flen + fbuf->filled > pdev->frame_total_size) {
330 PWC_ERROR("Frame overflow (%d > %d)\n",
331 flen + fbuf->filled,
332 pdev->frame_total_size);
333 pdev->vsync = 0;
334 } else {
335 memcpy(fbuf->data + fbuf->filled, iso_buf,
336 flen);
337 fbuf->filled += flen;
338 }
339 }
340 if (flen < pdev->vlast_packet_size) {
341
342 if (pdev->vsync == 2)
343 pwc_frame_complete(pdev);
344 if (pdev->fill_buf == NULL)
345 pdev->fill_buf = pwc_get_next_fill_buf(pdev);
346 if (pdev->fill_buf) {
347 pdev->fill_buf->filled = 0;
348 pdev->vsync = 1;
349 }
350 }
351 pdev->vlast_packet_size = flen;
352 }
353
354handler_end:
355 i = usb_submit_urb(urb, GFP_ATOMIC);
356 if (i != 0)
357 PWC_ERROR("Error (%d) re-submitting urb in pwc_isoc_handler.\n", i);
358}
359
360static int pwc_isoc_init(struct pwc_device *pdev)
361{
362 struct usb_device *udev;
363 struct urb *urb;
364 int i, j, ret;
365 struct usb_interface *intf;
366 struct usb_host_interface *idesc = NULL;
367 int compression = 0;
368
369 if (pdev->iso_init)
370 return 0;
371
372 pdev->vsync = 0;
373 pdev->vlast_packet_size = 0;
374 pdev->fill_buf = NULL;
375 pdev->vframe_count = 0;
376 pdev->visoc_errors = 0;
377 udev = pdev->udev;
378
379retry:
380
381
382 ret = pwc_set_video_mode(pdev, pdev->width, pdev->height, pdev->pixfmt,
383 pdev->vframes, &compression, 1);
384
385
386 intf = usb_ifnum_to_if(udev, 0);
387 if (intf)
388 idesc = usb_altnum_to_altsetting(intf, pdev->valternate);
389 if (!idesc)
390 return -EIO;
391
392
393 pdev->vmax_packet_size = -1;
394 for (i = 0; i < idesc->desc.bNumEndpoints; i++) {
395 if ((idesc->endpoint[i].desc.bEndpointAddress & 0xF) == pdev->vendpoint) {
396 pdev->vmax_packet_size = le16_to_cpu(idesc->endpoint[i].desc.wMaxPacketSize);
397 break;
398 }
399 }
400
401 if (pdev->vmax_packet_size < 0 || pdev->vmax_packet_size > ISO_MAX_FRAME_SIZE) {
402 PWC_ERROR("Failed to find packet size for video endpoint in current alternate setting.\n");
403 return -ENFILE;
404 }
405
406
407 PWC_DEBUG_OPEN("Setting alternate interface %d\n", pdev->valternate);
408 ret = usb_set_interface(pdev->udev, 0, pdev->valternate);
409 if (ret == -ENOSPC && compression < 3) {
410 compression++;
411 goto retry;
412 }
413 if (ret < 0)
414 return ret;
415
416
417 for (i = 0; i < MAX_ISO_BUFS; i++) {
418 urb = usb_alloc_urb(ISO_FRAMES_PER_DESC, GFP_KERNEL);
419 if (urb == NULL) {
420 PWC_ERROR("Failed to allocate urb %d\n", i);
421 pdev->iso_init = 1;
422 pwc_isoc_cleanup(pdev);
423 return -ENOMEM;
424 }
425 pdev->urbs[i] = urb;
426 PWC_DEBUG_MEMORY("Allocated URB at 0x%p\n", urb);
427
428 urb->interval = 1;
429 urb->dev = udev;
430 urb->pipe = usb_rcvisocpipe(udev, pdev->vendpoint);
431 urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
432 urb->transfer_buffer = usb_alloc_coherent(udev,
433 ISO_BUFFER_SIZE,
434 GFP_KERNEL,
435 &urb->transfer_dma);
436 if (urb->transfer_buffer == NULL) {
437 PWC_ERROR("Failed to allocate urb buffer %d\n", i);
438 pdev->iso_init = 1;
439 pwc_isoc_cleanup(pdev);
440 return -ENOMEM;
441 }
442 urb->transfer_buffer_length = ISO_BUFFER_SIZE;
443 urb->complete = pwc_isoc_handler;
444 urb->context = pdev;
445 urb->start_frame = 0;
446 urb->number_of_packets = ISO_FRAMES_PER_DESC;
447 for (j = 0; j < ISO_FRAMES_PER_DESC; j++) {
448 urb->iso_frame_desc[j].offset = j * ISO_MAX_FRAME_SIZE;
449 urb->iso_frame_desc[j].length = pdev->vmax_packet_size;
450 }
451 }
452
453
454 for (i = 0; i < MAX_ISO_BUFS; i++) {
455 ret = usb_submit_urb(pdev->urbs[i], GFP_KERNEL);
456 if (ret == -ENOSPC && compression < 3) {
457 compression++;
458 pdev->iso_init = 1;
459 pwc_isoc_cleanup(pdev);
460 goto retry;
461 }
462 if (ret) {
463 PWC_ERROR("isoc_init() submit_urb %d failed with error %d\n", i, ret);
464 pdev->iso_init = 1;
465 pwc_isoc_cleanup(pdev);
466 return ret;
467 }
468 PWC_DEBUG_MEMORY("URB 0x%p submitted.\n", pdev->urbs[i]);
469 }
470
471
472 pdev->iso_init = 1;
473 PWC_DEBUG_OPEN("<< pwc_isoc_init()\n");
474 return 0;
475}
476
477static void pwc_iso_stop(struct pwc_device *pdev)
478{
479 int i;
480
481
482 for (i = 0; i < MAX_ISO_BUFS; i++) {
483 if (pdev->urbs[i]) {
484 PWC_DEBUG_MEMORY("Unlinking URB %p\n", pdev->urbs[i]);
485 usb_kill_urb(pdev->urbs[i]);
486 }
487 }
488}
489
490static void pwc_iso_free(struct pwc_device *pdev)
491{
492 int i;
493
494
495 for (i = 0; i < MAX_ISO_BUFS; i++) {
496 if (pdev->urbs[i]) {
497 PWC_DEBUG_MEMORY("Freeing URB\n");
498 if (pdev->urbs[i]->transfer_buffer) {
499 usb_free_coherent(pdev->udev,
500 pdev->urbs[i]->transfer_buffer_length,
501 pdev->urbs[i]->transfer_buffer,
502 pdev->urbs[i]->transfer_dma);
503 }
504 usb_free_urb(pdev->urbs[i]);
505 pdev->urbs[i] = NULL;
506 }
507 }
508}
509
510static void pwc_isoc_cleanup(struct pwc_device *pdev)
511{
512 PWC_DEBUG_OPEN(">> pwc_isoc_cleanup()\n");
513
514 if (pdev->iso_init == 0)
515 return;
516
517 pwc_iso_stop(pdev);
518 pwc_iso_free(pdev);
519 usb_set_interface(pdev->udev, 0, 0);
520
521 pdev->iso_init = 0;
522 PWC_DEBUG_OPEN("<< pwc_isoc_cleanup()\n");
523}
524
525static void pwc_cleanup_queued_bufs(struct pwc_device *pdev)
526{
527 unsigned long flags = 0;
528
529 spin_lock_irqsave(&pdev->queued_bufs_lock, flags);
530 while (!list_empty(&pdev->queued_bufs)) {
531 struct pwc_frame_buf *buf;
532
533 buf = list_entry(pdev->queued_bufs.next, struct pwc_frame_buf,
534 list);
535 list_del(&buf->list);
536 vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
537 }
538 spin_unlock_irqrestore(&pdev->queued_bufs_lock, flags);
539}
540
541#ifdef CONFIG_USB_PWC_DEBUG
542static const char *pwc_sensor_type_to_string(unsigned int sensor_type)
543{
544 switch(sensor_type) {
545 case 0x00:
546 return "Hyundai CMOS sensor";
547 case 0x20:
548 return "Sony CCD sensor + TDA8787";
549 case 0x2E:
550 return "Sony CCD sensor + Exas 98L59";
551 case 0x2F:
552 return "Sony CCD sensor + ADI 9804";
553 case 0x30:
554 return "Sharp CCD sensor + TDA8787";
555 case 0x3E:
556 return "Sharp CCD sensor + Exas 98L59";
557 case 0x3F:
558 return "Sharp CCD sensor + ADI 9804";
559 case 0x40:
560 return "UPA 1021 sensor";
561 case 0x100:
562 return "VGA sensor";
563 case 0x101:
564 return "PAL MR sensor";
565 default:
566 return "unknown type of sensor";
567 }
568}
569#endif
570
571
572
573
574int pwc_test_n_set_capt_file(struct pwc_device *pdev, struct file *file)
575{
576 int r = 0;
577
578 mutex_lock(&pdev->capt_file_lock);
579 if (pdev->capt_file != NULL &&
580 pdev->capt_file != file) {
581 r = -EBUSY;
582 goto leave;
583 }
584 pdev->capt_file = file;
585leave:
586 mutex_unlock(&pdev->capt_file_lock);
587 return r;
588}
589
590static void pwc_video_release(struct v4l2_device *v)
591{
592 struct pwc_device *pdev = container_of(v, struct pwc_device, v4l2_dev);
593
594 v4l2_ctrl_handler_free(&pdev->ctrl_handler);
595 kfree(pdev->ctrl_buf);
596 kfree(pdev);
597}
598
599static int pwc_video_close(struct file *file)
600{
601 struct pwc_device *pdev = video_drvdata(file);
602
603 if (pdev->capt_file == file) {
604 vb2_queue_release(&pdev->vb_queue);
605 pdev->capt_file = NULL;
606 }
607 return v4l2_fh_release(file);
608}
609
610static ssize_t pwc_video_read(struct file *file, char __user *buf,
611 size_t count, loff_t *ppos)
612{
613 struct pwc_device *pdev = video_drvdata(file);
614
615 if (!pdev->udev)
616 return -ENODEV;
617
618 if (pwc_test_n_set_capt_file(pdev, file))
619 return -EBUSY;
620
621 return vb2_read(&pdev->vb_queue, buf, count, ppos,
622 file->f_flags & O_NONBLOCK);
623}
624
625static unsigned int pwc_video_poll(struct file *file, poll_table *wait)
626{
627 struct pwc_device *pdev = video_drvdata(file);
628
629 if (!pdev->udev)
630 return POLL_ERR;
631
632 return vb2_poll(&pdev->vb_queue, file, wait);
633}
634
635static int pwc_video_mmap(struct file *file, struct vm_area_struct *vma)
636{
637 struct pwc_device *pdev = video_drvdata(file);
638
639 if (pdev->capt_file != file)
640 return -EBUSY;
641
642 return vb2_mmap(&pdev->vb_queue, vma);
643}
644
645
646
647
648static int queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt,
649 unsigned int *nbuffers, unsigned int *nplanes,
650 unsigned int sizes[], void *alloc_ctxs[])
651{
652 struct pwc_device *pdev = vb2_get_drv_priv(vq);
653 int size;
654
655 if (*nbuffers < MIN_FRAMES)
656 *nbuffers = MIN_FRAMES;
657 else if (*nbuffers > MAX_FRAMES)
658 *nbuffers = MAX_FRAMES;
659
660 *nplanes = 1;
661
662 size = pwc_get_size(pdev, MAX_WIDTH, MAX_HEIGHT);
663 sizes[0] = PAGE_ALIGN(pwc_image_sizes[size][0] *
664 pwc_image_sizes[size][1] * 3 / 2);
665
666 return 0;
667}
668
669static int buffer_init(struct vb2_buffer *vb)
670{
671 struct pwc_frame_buf *buf = container_of(vb, struct pwc_frame_buf, vb);
672
673
674 buf->data = vzalloc(PWC_FRAME_SIZE);
675 if (buf->data == NULL)
676 return -ENOMEM;
677
678 return 0;
679}
680
681static int buffer_prepare(struct vb2_buffer *vb)
682{
683 struct pwc_device *pdev = vb2_get_drv_priv(vb->vb2_queue);
684
685
686 if (!pdev->udev)
687 return -ENODEV;
688
689 return 0;
690}
691
692static int buffer_finish(struct vb2_buffer *vb)
693{
694 struct pwc_device *pdev = vb2_get_drv_priv(vb->vb2_queue);
695 struct pwc_frame_buf *buf = container_of(vb, struct pwc_frame_buf, vb);
696
697
698
699
700
701
702 return pwc_decompress(pdev, buf);
703}
704
705static void buffer_cleanup(struct vb2_buffer *vb)
706{
707 struct pwc_frame_buf *buf = container_of(vb, struct pwc_frame_buf, vb);
708
709 vfree(buf->data);
710}
711
712static void buffer_queue(struct vb2_buffer *vb)
713{
714 struct pwc_device *pdev = vb2_get_drv_priv(vb->vb2_queue);
715 struct pwc_frame_buf *buf = container_of(vb, struct pwc_frame_buf, vb);
716 unsigned long flags = 0;
717
718 spin_lock_irqsave(&pdev->queued_bufs_lock, flags);
719
720 if (pdev->udev)
721 list_add_tail(&buf->list, &pdev->queued_bufs);
722 else
723 vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
724 spin_unlock_irqrestore(&pdev->queued_bufs_lock, flags);
725}
726
727static int start_streaming(struct vb2_queue *vq, unsigned int count)
728{
729 struct pwc_device *pdev = vb2_get_drv_priv(vq);
730 int r;
731
732 mutex_lock(&pdev->udevlock);
733 if (!pdev->udev) {
734 r = -ENODEV;
735 goto leave;
736 }
737
738
739 pwc_camera_power(pdev, 1);
740 pwc_set_leds(pdev, leds[0], leds[1]);
741
742 r = pwc_isoc_init(pdev);
743 if (r) {
744
745 pwc_set_leds(pdev, 0, 0);
746 pwc_camera_power(pdev, 0);
747
748 pwc_cleanup_queued_bufs(pdev);
749 }
750leave:
751 mutex_unlock(&pdev->udevlock);
752 return r;
753}
754
755static int stop_streaming(struct vb2_queue *vq)
756{
757 struct pwc_device *pdev = vb2_get_drv_priv(vq);
758
759 mutex_lock(&pdev->udevlock);
760 if (pdev->udev) {
761 pwc_set_leds(pdev, 0, 0);
762 pwc_camera_power(pdev, 0);
763 pwc_isoc_cleanup(pdev);
764 }
765 mutex_unlock(&pdev->udevlock);
766
767 pwc_cleanup_queued_bufs(pdev);
768
769 return 0;
770}
771
772static struct vb2_ops pwc_vb_queue_ops = {
773 .queue_setup = queue_setup,
774 .buf_init = buffer_init,
775 .buf_prepare = buffer_prepare,
776 .buf_finish = buffer_finish,
777 .buf_cleanup = buffer_cleanup,
778 .buf_queue = buffer_queue,
779 .start_streaming = start_streaming,
780 .stop_streaming = stop_streaming,
781};
782
783
784
785
786
787
788
789
790static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id *id)
791{
792 struct usb_device *udev = interface_to_usbdev(intf);
793 struct pwc_device *pdev = NULL;
794 int vendor_id, product_id, type_id;
795 int rc;
796 int features = 0;
797 int compression = 0;
798 int my_power_save = power_save;
799 char serial_number[30], *name;
800
801 vendor_id = le16_to_cpu(udev->descriptor.idVendor);
802 product_id = le16_to_cpu(udev->descriptor.idProduct);
803
804
805 PWC_DEBUG_PROBE("probe() called [%04X %04X], if %d\n",
806 vendor_id, product_id,
807 intf->altsetting->desc.bInterfaceNumber);
808
809
810
811
812
813 if (intf->altsetting->desc.bInterfaceNumber > 0)
814 return -ENODEV;
815
816 if (vendor_id == 0x0471) {
817 switch (product_id) {
818 case 0x0302:
819 PWC_INFO("Philips PCA645VC USB webcam detected.\n");
820 name = "Philips 645 webcam";
821 type_id = 645;
822 break;
823 case 0x0303:
824 PWC_INFO("Philips PCA646VC USB webcam detected.\n");
825 name = "Philips 646 webcam";
826 type_id = 646;
827 break;
828 case 0x0304:
829 PWC_INFO("Askey VC010 type 2 USB webcam detected.\n");
830 name = "Askey VC010 webcam";
831 type_id = 646;
832 break;
833 case 0x0307:
834 PWC_INFO("Philips PCVC675K (Vesta) USB webcam detected.\n");
835 name = "Philips 675 webcam";
836 type_id = 675;
837 break;
838 case 0x0308:
839 PWC_INFO("Philips PCVC680K (Vesta Pro) USB webcam detected.\n");
840 name = "Philips 680 webcam";
841 type_id = 680;
842 break;
843 case 0x030C:
844 PWC_INFO("Philips PCVC690K (Vesta Pro Scan) USB webcam detected.\n");
845 name = "Philips 690 webcam";
846 type_id = 690;
847 break;
848 case 0x0310:
849 PWC_INFO("Philips PCVC730K (ToUCam Fun)/PCVC830 (ToUCam II) USB webcam detected.\n");
850 name = "Philips 730 webcam";
851 type_id = 730;
852 break;
853 case 0x0311:
854 PWC_INFO("Philips PCVC740K (ToUCam Pro)/PCVC840 (ToUCam II) USB webcam detected.\n");
855 name = "Philips 740 webcam";
856 type_id = 740;
857 break;
858 case 0x0312:
859 PWC_INFO("Philips PCVC750K (ToUCam Pro Scan) USB webcam detected.\n");
860 name = "Philips 750 webcam";
861 type_id = 750;
862 break;
863 case 0x0313:
864 PWC_INFO("Philips PCVC720K/40 (ToUCam XS) USB webcam detected.\n");
865 name = "Philips 720K/40 webcam";
866 type_id = 720;
867 break;
868 case 0x0329:
869 PWC_INFO("Philips SPC 900NC USB webcam detected.\n");
870 name = "Philips SPC 900NC webcam";
871 type_id = 740;
872 break;
873 default:
874 return -ENODEV;
875 break;
876 }
877 }
878 else if (vendor_id == 0x069A) {
879 switch(product_id) {
880 case 0x0001:
881 PWC_INFO("Askey VC010 type 1 USB webcam detected.\n");
882 name = "Askey VC010 webcam";
883 type_id = 645;
884 break;
885 default:
886 return -ENODEV;
887 break;
888 }
889 }
890 else if (vendor_id == 0x046d) {
891 switch(product_id) {
892 case 0x08b0:
893 PWC_INFO("Logitech QuickCam Pro 3000 USB webcam detected.\n");
894 name = "Logitech QuickCam Pro 3000";
895 type_id = 740;
896 break;
897 case 0x08b1:
898 PWC_INFO("Logitech QuickCam Notebook Pro USB webcam detected.\n");
899 name = "Logitech QuickCam Notebook Pro";
900 type_id = 740;
901 break;
902 case 0x08b2:
903 PWC_INFO("Logitech QuickCam 4000 Pro USB webcam detected.\n");
904 name = "Logitech QuickCam Pro 4000";
905 type_id = 740;
906 if (my_power_save == -1)
907 my_power_save = 1;
908 break;
909 case 0x08b3:
910 PWC_INFO("Logitech QuickCam Zoom USB webcam detected.\n");
911 name = "Logitech QuickCam Zoom";
912 type_id = 740;
913 break;
914 case 0x08B4:
915 PWC_INFO("Logitech QuickCam Zoom (new model) USB webcam detected.\n");
916 name = "Logitech QuickCam Zoom";
917 type_id = 740;
918 if (my_power_save == -1)
919 my_power_save = 1;
920 break;
921 case 0x08b5:
922 PWC_INFO("Logitech QuickCam Orbit/Sphere USB webcam detected.\n");
923 name = "Logitech QuickCam Orbit";
924 type_id = 740;
925 if (my_power_save == -1)
926 my_power_save = 1;
927 features |= FEATURE_MOTOR_PANTILT;
928 break;
929 case 0x08b6:
930 PWC_INFO("Logitech/Cisco VT Camera webcam detected.\n");
931 name = "Cisco VT Camera";
932 type_id = 740;
933 break;
934 case 0x08b7:
935 PWC_INFO("Logitech ViewPort AV 100 webcam detected.\n");
936 name = "Logitech ViewPort AV 100";
937 type_id = 740;
938 break;
939 case 0x08b8:
940 PWC_INFO("Logitech QuickCam detected (reserved ID).\n");
941 name = "Logitech QuickCam (res.)";
942 type_id = 730;
943 break;
944 default:
945 return -ENODEV;
946 break;
947 }
948 }
949 else if (vendor_id == 0x055d) {
950
951
952
953
954 switch(product_id) {
955 case 0x9000:
956 PWC_INFO("Samsung MPC-C10 USB webcam detected.\n");
957 name = "Samsung MPC-C10";
958 type_id = 675;
959 break;
960 case 0x9001:
961 PWC_INFO("Samsung MPC-C30 USB webcam detected.\n");
962 name = "Samsung MPC-C30";
963 type_id = 675;
964 break;
965 case 0x9002:
966 PWC_INFO("Samsung SNC-35E (v3.0) USB webcam detected.\n");
967 name = "Samsung MPC-C30";
968 type_id = 740;
969 break;
970 default:
971 return -ENODEV;
972 break;
973 }
974 }
975 else if (vendor_id == 0x041e) {
976 switch(product_id) {
977 case 0x400c:
978 PWC_INFO("Creative Labs Webcam 5 detected.\n");
979 name = "Creative Labs Webcam 5";
980 type_id = 730;
981 if (my_power_save == -1)
982 my_power_save = 1;
983 break;
984 case 0x4011:
985 PWC_INFO("Creative Labs Webcam Pro Ex detected.\n");
986 name = "Creative Labs Webcam Pro Ex";
987 type_id = 740;
988 break;
989 default:
990 return -ENODEV;
991 break;
992 }
993 }
994 else if (vendor_id == 0x04cc) {
995 switch(product_id) {
996 case 0x8116:
997 PWC_INFO("Sotec Afina Eye USB webcam detected.\n");
998 name = "Sotec Afina Eye";
999 type_id = 730;
1000 break;
1001 default:
1002 return -ENODEV;
1003 break;
1004 }
1005 }
1006 else if (vendor_id == 0x06be) {
1007 switch(product_id) {
1008 case 0x8116:
1009
1010 PWC_INFO("AME Co. Afina Eye USB webcam detected.\n");
1011 name = "AME Co. Afina Eye";
1012 type_id = 750;
1013 break;
1014 default:
1015 return -ENODEV;
1016 break;
1017 }
1018
1019 }
1020 else if (vendor_id == 0x0d81) {
1021 switch(product_id) {
1022 case 0x1900:
1023 PWC_INFO("Visionite VCS-UC300 USB webcam detected.\n");
1024 name = "Visionite VCS-UC300";
1025 type_id = 740;
1026 break;
1027 case 0x1910:
1028 PWC_INFO("Visionite VCS-UM100 USB webcam detected.\n");
1029 name = "Visionite VCS-UM100";
1030 type_id = 730;
1031 break;
1032 default:
1033 return -ENODEV;
1034 break;
1035 }
1036 }
1037 else
1038 return -ENODEV;
1039
1040 if (my_power_save == -1)
1041 my_power_save = 0;
1042
1043 memset(serial_number, 0, 30);
1044 usb_string(udev, udev->descriptor.iSerialNumber, serial_number, 29);
1045 PWC_DEBUG_PROBE("Device serial number is %s\n", serial_number);
1046
1047 if (udev->descriptor.bNumConfigurations > 1)
1048 PWC_WARNING("Warning: more than 1 configuration available.\n");
1049
1050
1051 pdev = kzalloc(sizeof(struct pwc_device), GFP_KERNEL);
1052 if (pdev == NULL) {
1053 PWC_ERROR("Oops, could not allocate memory for pwc_device.\n");
1054 return -ENOMEM;
1055 }
1056 pdev->type = type_id;
1057 pdev->features = features;
1058 pwc_construct(pdev);
1059
1060 mutex_init(&pdev->capt_file_lock);
1061 mutex_init(&pdev->udevlock);
1062 spin_lock_init(&pdev->queued_bufs_lock);
1063 INIT_LIST_HEAD(&pdev->queued_bufs);
1064
1065 pdev->udev = udev;
1066 pdev->power_save = my_power_save;
1067
1068
1069 memset(&pdev->vb_queue, 0, sizeof(pdev->vb_queue));
1070 pdev->vb_queue.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1071 pdev->vb_queue.io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ;
1072 pdev->vb_queue.drv_priv = pdev;
1073 pdev->vb_queue.buf_struct_size = sizeof(struct pwc_frame_buf);
1074 pdev->vb_queue.ops = &pwc_vb_queue_ops;
1075 pdev->vb_queue.mem_ops = &vb2_vmalloc_memops;
1076 vb2_queue_init(&pdev->vb_queue);
1077
1078
1079 memcpy(&pdev->vdev, &pwc_template, sizeof(pwc_template));
1080 strcpy(pdev->vdev.name, name);
1081 set_bit(V4L2_FL_USE_FH_PRIO, &pdev->vdev.flags);
1082 video_set_drvdata(&pdev->vdev, pdev);
1083
1084 pdev->release = le16_to_cpu(udev->descriptor.bcdDevice);
1085 PWC_DEBUG_PROBE("Release: %04x\n", pdev->release);
1086
1087
1088 pdev->ctrl_buf = kmalloc(sizeof(pdev->cmd_buf), GFP_KERNEL);
1089 if (!pdev->ctrl_buf) {
1090 PWC_ERROR("Oops, could not allocate memory for pwc_device.\n");
1091 rc = -ENOMEM;
1092 goto err_free_mem;
1093 }
1094
1095#ifdef CONFIG_USB_PWC_DEBUG
1096
1097 if (pwc_get_cmos_sensor(pdev, &rc) >= 0) {
1098 PWC_DEBUG_OPEN("This %s camera is equipped with a %s (%d).\n",
1099 pdev->vdev.name,
1100 pwc_sensor_type_to_string(rc), rc);
1101 }
1102#endif
1103
1104
1105 pwc_set_leds(pdev, 0, 0);
1106
1107
1108 rc = pwc_set_video_mode(pdev, MAX_WIDTH, MAX_HEIGHT,
1109 V4L2_PIX_FMT_YUV420, 30, &compression, 1);
1110 if (rc)
1111 goto err_free_mem;
1112
1113
1114 rc = pwc_init_controls(pdev);
1115 if (rc) {
1116 PWC_ERROR("Failed to register v4l2 controls (%d).\n", rc);
1117 goto err_free_mem;
1118 }
1119
1120
1121 pwc_camera_power(pdev, 0);
1122
1123
1124 pdev->v4l2_dev.release = pwc_video_release;
1125 rc = v4l2_device_register(&intf->dev, &pdev->v4l2_dev);
1126 if (rc) {
1127 PWC_ERROR("Failed to register v4l2-device (%d).\n", rc);
1128 goto err_free_controls;
1129 }
1130
1131 pdev->v4l2_dev.ctrl_handler = &pdev->ctrl_handler;
1132 pdev->vdev.v4l2_dev = &pdev->v4l2_dev;
1133
1134 rc = video_register_device(&pdev->vdev, VFL_TYPE_GRABBER, -1);
1135 if (rc < 0) {
1136 PWC_ERROR("Failed to register as video device (%d).\n", rc);
1137 goto err_unregister_v4l2_dev;
1138 }
1139 PWC_INFO("Registered as %s.\n", video_device_node_name(&pdev->vdev));
1140
1141#ifdef CONFIG_USB_PWC_INPUT_EVDEV
1142
1143 pdev->button_dev = input_allocate_device();
1144 if (!pdev->button_dev) {
1145 PWC_ERROR("Err, insufficient memory for webcam snapshot button device.");
1146 rc = -ENOMEM;
1147 goto err_video_unreg;
1148 }
1149
1150 usb_make_path(udev, pdev->button_phys, sizeof(pdev->button_phys));
1151 strlcat(pdev->button_phys, "/input0", sizeof(pdev->button_phys));
1152
1153 pdev->button_dev->name = "PWC snapshot button";
1154 pdev->button_dev->phys = pdev->button_phys;
1155 usb_to_input_id(pdev->udev, &pdev->button_dev->id);
1156 pdev->button_dev->dev.parent = &pdev->udev->dev;
1157 pdev->button_dev->evbit[0] = BIT_MASK(EV_KEY);
1158 pdev->button_dev->keybit[BIT_WORD(KEY_CAMERA)] = BIT_MASK(KEY_CAMERA);
1159
1160 rc = input_register_device(pdev->button_dev);
1161 if (rc) {
1162 input_free_device(pdev->button_dev);
1163 pdev->button_dev = NULL;
1164 goto err_video_unreg;
1165 }
1166#endif
1167
1168 return 0;
1169
1170err_video_unreg:
1171 video_unregister_device(&pdev->vdev);
1172err_unregister_v4l2_dev:
1173 v4l2_device_unregister(&pdev->v4l2_dev);
1174err_free_controls:
1175 v4l2_ctrl_handler_free(&pdev->ctrl_handler);
1176err_free_mem:
1177 kfree(pdev->ctrl_buf);
1178 kfree(pdev);
1179 return rc;
1180}
1181
1182
1183static void usb_pwc_disconnect(struct usb_interface *intf)
1184{
1185 struct v4l2_device *v = usb_get_intfdata(intf);
1186 struct pwc_device *pdev = container_of(v, struct pwc_device, v4l2_dev);
1187
1188 mutex_lock(&pdev->udevlock);
1189
1190 pwc_isoc_cleanup(pdev);
1191 pdev->udev = NULL;
1192 mutex_unlock(&pdev->udevlock);
1193
1194 pwc_cleanup_queued_bufs(pdev);
1195
1196 video_unregister_device(&pdev->vdev);
1197 v4l2_device_unregister(&pdev->v4l2_dev);
1198
1199#ifdef CONFIG_USB_PWC_INPUT_EVDEV
1200 if (pdev->button_dev)
1201 input_unregister_device(pdev->button_dev);
1202#endif
1203
1204 v4l2_device_put(&pdev->v4l2_dev);
1205}
1206
1207
1208
1209
1210
1211
1212static unsigned int leds_nargs;
1213
1214#ifdef CONFIG_USB_PWC_DEBUG
1215module_param_named(trace, pwc_trace, int, 0644);
1216#endif
1217module_param(power_save, int, 0644);
1218module_param_array(leds, int, &leds_nargs, 0444);
1219
1220#ifdef CONFIG_USB_PWC_DEBUG
1221MODULE_PARM_DESC(trace, "For debugging purposes");
1222#endif
1223MODULE_PARM_DESC(power_save, "Turn power saving for new cameras on or off");
1224MODULE_PARM_DESC(leds, "LED on,off time in milliseconds");
1225
1226MODULE_DESCRIPTION("Philips & OEM USB webcam driver");
1227MODULE_AUTHOR("Luc Saillard <luc@saillard.org>");
1228MODULE_LICENSE("GPL");
1229MODULE_ALIAS("pwcx");
1230MODULE_VERSION( PWC_VERSION );
1231
1232static int __init usb_pwc_init(void)
1233{
1234 return usb_register(&pwc_driver);
1235}
1236
1237static void __exit usb_pwc_exit(void)
1238{
1239 usb_deregister(&pwc_driver);
1240}
1241
1242module_init(usb_pwc_init);
1243module_exit(usb_pwc_exit);
1244