0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048 #include <linux/errno.h>
0049 #include <linux/init.h>
0050 #include <linux/mm.h>
0051 #include <linux/module.h>
0052 #include <linux/poll.h>
0053 #include <linux/slab.h>
0054 #ifdef CONFIG_USB_PWC_INPUT_EVDEV
0055 #include <linux/usb/input.h>
0056 #endif
0057 #include <linux/vmalloc.h>
0058 #include <asm/io.h>
0059 #include <linux/kernel.h> /* simple_strtol() */
0060
0061 #include "pwc.h"
0062 #include "pwc-kiara.h"
0063 #include "pwc-timon.h"
0064 #include "pwc-dec23.h"
0065 #include "pwc-dec1.h"
0066
0067 #define CREATE_TRACE_POINTS
0068 #include <trace/events/pwc.h>
0069
0070
0071
0072
0073 static const struct usb_device_id pwc_device_table [] = {
0074 { USB_DEVICE(0x041E, 0x400C) },
0075 { USB_DEVICE(0x041E, 0x4011) },
0076
0077 { USB_DEVICE(0x046D, 0x08B0) },
0078 { USB_DEVICE(0x046D, 0x08B1) },
0079 { USB_DEVICE(0x046D, 0x08B2) },
0080 { USB_DEVICE(0x046D, 0x08B3) },
0081 { USB_DEVICE(0x046D, 0x08B4) },
0082 { USB_DEVICE(0x046D, 0x08B5) },
0083 { USB_DEVICE(0x046D, 0x08B6) },
0084 { USB_DEVICE(0x046D, 0x08B7) },
0085 { USB_DEVICE(0x046D, 0x08B8) },
0086
0087 { USB_DEVICE(0x0471, 0x0302) },
0088 { USB_DEVICE(0x0471, 0x0303) },
0089 { USB_DEVICE(0x0471, 0x0304) },
0090 { USB_DEVICE(0x0471, 0x0307) },
0091 { USB_DEVICE(0x0471, 0x0308) },
0092 { USB_DEVICE(0x0471, 0x030C) },
0093 { USB_DEVICE(0x0471, 0x0310) },
0094 { USB_DEVICE(0x0471, 0x0311) },
0095 { USB_DEVICE(0x0471, 0x0312) },
0096 { USB_DEVICE(0x0471, 0x0313) },
0097 { USB_DEVICE(0x0471, 0x0329) },
0098 { USB_DEVICE(0x0471, 0x032C) },
0099
0100 { USB_DEVICE(0x04CC, 0x8116) },
0101
0102 { USB_DEVICE(0x055D, 0x9000) },
0103 { USB_DEVICE(0x055D, 0x9001) },
0104 { USB_DEVICE(0x055D, 0x9002) },
0105
0106 { USB_DEVICE(0x069A, 0x0001) },
0107
0108 { USB_DEVICE(0x06BE, 0x8116) },
0109
0110 { USB_DEVICE(0x0d81, 0x1900) },
0111 { USB_DEVICE(0x0d81, 0x1910) },
0112
0113 { }
0114 };
0115 MODULE_DEVICE_TABLE(usb, pwc_device_table);
0116
0117 static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id *id);
0118 static void usb_pwc_disconnect(struct usb_interface *intf);
0119 static void pwc_isoc_cleanup(struct pwc_device *pdev);
0120
0121 static struct usb_driver pwc_driver = {
0122 .name = "Philips webcam",
0123 .id_table = pwc_device_table,
0124 .probe = usb_pwc_probe,
0125 .disconnect = usb_pwc_disconnect,
0126 };
0127
0128 #define MAX_DEV_HINTS 20
0129 #define MAX_ISOC_ERRORS 20
0130
0131 #ifdef CONFIG_USB_PWC_DEBUG
0132 int pwc_trace = PWC_DEBUG_LEVEL;
0133 #endif
0134 static int power_save = -1;
0135 static int leds[2] = { 100, 0 };
0136
0137
0138
0139 static const struct v4l2_file_operations pwc_fops = {
0140 .owner = THIS_MODULE,
0141 .open = v4l2_fh_open,
0142 .release = vb2_fop_release,
0143 .read = vb2_fop_read,
0144 .poll = vb2_fop_poll,
0145 .mmap = vb2_fop_mmap,
0146 .unlocked_ioctl = video_ioctl2,
0147 };
0148 static const struct video_device pwc_template = {
0149 .name = "Philips Webcam",
0150 .release = video_device_release_empty,
0151 .fops = &pwc_fops,
0152 .ioctl_ops = &pwc_ioctl_ops,
0153 };
0154
0155
0156
0157
0158 static void *pwc_alloc_urb_buffer(struct usb_device *dev,
0159 size_t size, dma_addr_t *dma_handle)
0160 {
0161 struct device *dmadev = dev->bus->sysdev;
0162 void *buffer = kmalloc(size, GFP_KERNEL);
0163
0164 if (!buffer)
0165 return NULL;
0166
0167 *dma_handle = dma_map_single(dmadev, buffer, size, DMA_FROM_DEVICE);
0168 if (dma_mapping_error(dmadev, *dma_handle)) {
0169 kfree(buffer);
0170 return NULL;
0171 }
0172
0173 return buffer;
0174 }
0175
0176 static void pwc_free_urb_buffer(struct usb_device *dev,
0177 size_t size,
0178 void *buffer,
0179 dma_addr_t dma_handle)
0180 {
0181 struct device *dmadev = dev->bus->sysdev;
0182
0183 dma_unmap_single(dmadev, dma_handle, size, DMA_FROM_DEVICE);
0184 kfree(buffer);
0185 }
0186
0187 static struct pwc_frame_buf *pwc_get_next_fill_buf(struct pwc_device *pdev)
0188 {
0189 unsigned long flags = 0;
0190 struct pwc_frame_buf *buf = NULL;
0191
0192 spin_lock_irqsave(&pdev->queued_bufs_lock, flags);
0193 if (list_empty(&pdev->queued_bufs))
0194 goto leave;
0195
0196 buf = list_entry(pdev->queued_bufs.next, struct pwc_frame_buf, list);
0197 list_del(&buf->list);
0198 leave:
0199 spin_unlock_irqrestore(&pdev->queued_bufs_lock, flags);
0200 return buf;
0201 }
0202
0203 static void pwc_snapshot_button(struct pwc_device *pdev, int down)
0204 {
0205 if (down) {
0206 PWC_TRACE("Snapshot button pressed.\n");
0207 } else {
0208 PWC_TRACE("Snapshot button released.\n");
0209 }
0210
0211 #ifdef CONFIG_USB_PWC_INPUT_EVDEV
0212 if (pdev->button_dev) {
0213 input_report_key(pdev->button_dev, KEY_CAMERA, down);
0214 input_sync(pdev->button_dev);
0215 }
0216 #endif
0217 }
0218
0219 static void pwc_frame_complete(struct pwc_device *pdev)
0220 {
0221 struct pwc_frame_buf *fbuf = pdev->fill_buf;
0222
0223
0224
0225
0226
0227 if (pdev->type == 730) {
0228 unsigned char *ptr = (unsigned char *)fbuf->data;
0229
0230 if (ptr[1] == 1 && ptr[0] & 0x10) {
0231 PWC_TRACE("Hyundai CMOS sensor bug. Dropping frame.\n");
0232 pdev->drop_frames += 2;
0233 }
0234 if ((ptr[0] ^ pdev->vmirror) & 0x01) {
0235 pwc_snapshot_button(pdev, ptr[0] & 0x01);
0236 }
0237 if ((ptr[0] ^ pdev->vmirror) & 0x02) {
0238 if (ptr[0] & 0x02)
0239 PWC_TRACE("Image is mirrored.\n");
0240 else
0241 PWC_TRACE("Image is normal.\n");
0242 }
0243 pdev->vmirror = ptr[0] & 0x03;
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253 if (fbuf->filled == 4)
0254 pdev->drop_frames++;
0255 } else if (pdev->type == 740 || pdev->type == 720) {
0256 unsigned char *ptr = (unsigned char *)fbuf->data;
0257 if ((ptr[0] ^ pdev->vmirror) & 0x01) {
0258 pwc_snapshot_button(pdev, ptr[0] & 0x01);
0259 }
0260 pdev->vmirror = ptr[0] & 0x03;
0261 }
0262
0263
0264 if (pdev->drop_frames > 0) {
0265 pdev->drop_frames--;
0266 } else {
0267
0268 if (fbuf->filled < pdev->frame_total_size) {
0269 PWC_DEBUG_FLOW("Frame buffer underflow (%d bytes); discarded.\n",
0270 fbuf->filled);
0271 } else {
0272 fbuf->vb.field = V4L2_FIELD_NONE;
0273 fbuf->vb.sequence = pdev->vframe_count;
0274 vb2_buffer_done(&fbuf->vb.vb2_buf, VB2_BUF_STATE_DONE);
0275 pdev->fill_buf = NULL;
0276 pdev->vsync = 0;
0277 }
0278 }
0279 pdev->vframe_count++;
0280 }
0281
0282
0283
0284
0285 static void pwc_isoc_handler(struct urb *urb)
0286 {
0287 struct pwc_device *pdev = (struct pwc_device *)urb->context;
0288 struct device *dmadev = urb->dev->bus->sysdev;
0289 int i, fst, flen;
0290 unsigned char *iso_buf = NULL;
0291
0292 trace_pwc_handler_enter(urb, pdev);
0293
0294 if (urb->status == -ENOENT || urb->status == -ECONNRESET ||
0295 urb->status == -ESHUTDOWN) {
0296 PWC_DEBUG_OPEN("URB (%p) unlinked %ssynchronously.\n",
0297 urb, urb->status == -ENOENT ? "" : "a");
0298 return;
0299 }
0300
0301 if (pdev->fill_buf == NULL)
0302 pdev->fill_buf = pwc_get_next_fill_buf(pdev);
0303
0304 if (urb->status != 0) {
0305 const char *errmsg;
0306
0307 errmsg = "Unknown";
0308 switch(urb->status) {
0309 case -ENOSR: errmsg = "Buffer error (overrun)"; break;
0310 case -EPIPE: errmsg = "Stalled (device not responding)"; break;
0311 case -EOVERFLOW: errmsg = "Babble (bad cable?)"; break;
0312 case -EPROTO: errmsg = "Bit-stuff error (bad cable?)"; break;
0313 case -EILSEQ: errmsg = "CRC/Timeout (could be anything)"; break;
0314 case -ETIME: errmsg = "Device does not respond"; break;
0315 }
0316 PWC_ERROR("pwc_isoc_handler() called with status %d [%s].\n",
0317 urb->status, errmsg);
0318
0319 if (++pdev->visoc_errors > MAX_ISOC_ERRORS)
0320 {
0321 PWC_ERROR("Too many ISOC errors, bailing out.\n");
0322 if (pdev->fill_buf) {
0323 vb2_buffer_done(&pdev->fill_buf->vb.vb2_buf,
0324 VB2_BUF_STATE_ERROR);
0325 pdev->fill_buf = NULL;
0326 }
0327 }
0328 pdev->vsync = 0;
0329 goto handler_end;
0330 }
0331
0332
0333 pdev->visoc_errors = 0;
0334
0335 dma_sync_single_for_cpu(dmadev,
0336 urb->transfer_dma,
0337 urb->transfer_buffer_length,
0338 DMA_FROM_DEVICE);
0339
0340
0341
0342
0343
0344
0345 for (i = 0; i < urb->number_of_packets; i++) {
0346 fst = urb->iso_frame_desc[i].status;
0347 flen = urb->iso_frame_desc[i].actual_length;
0348 iso_buf = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
0349 if (fst != 0) {
0350 PWC_ERROR("Iso frame %d has error %d\n", i, fst);
0351 continue;
0352 }
0353 if (flen > 0 && pdev->vsync) {
0354 struct pwc_frame_buf *fbuf = pdev->fill_buf;
0355
0356 if (pdev->vsync == 1) {
0357 fbuf->vb.vb2_buf.timestamp = ktime_get_ns();
0358 pdev->vsync = 2;
0359 }
0360
0361 if (flen + fbuf->filled > pdev->frame_total_size) {
0362 PWC_ERROR("Frame overflow (%d > %d)\n",
0363 flen + fbuf->filled,
0364 pdev->frame_total_size);
0365 pdev->vsync = 0;
0366 } else {
0367 memcpy(fbuf->data + fbuf->filled, iso_buf,
0368 flen);
0369 fbuf->filled += flen;
0370 }
0371 }
0372 if (flen < pdev->vlast_packet_size) {
0373
0374 if (pdev->vsync == 2)
0375 pwc_frame_complete(pdev);
0376 if (pdev->fill_buf == NULL)
0377 pdev->fill_buf = pwc_get_next_fill_buf(pdev);
0378 if (pdev->fill_buf) {
0379 pdev->fill_buf->filled = 0;
0380 pdev->vsync = 1;
0381 }
0382 }
0383 pdev->vlast_packet_size = flen;
0384 }
0385
0386 dma_sync_single_for_device(dmadev,
0387 urb->transfer_dma,
0388 urb->transfer_buffer_length,
0389 DMA_FROM_DEVICE);
0390
0391 handler_end:
0392 trace_pwc_handler_exit(urb, pdev);
0393
0394 i = usb_submit_urb(urb, GFP_ATOMIC);
0395 if (i != 0)
0396 PWC_ERROR("Error (%d) re-submitting urb in pwc_isoc_handler.\n", i);
0397 }
0398
0399
0400 static int pwc_isoc_init(struct pwc_device *pdev)
0401 {
0402 struct usb_device *udev;
0403 struct urb *urb;
0404 int i, j, ret;
0405 struct usb_interface *intf;
0406 struct usb_host_interface *idesc = NULL;
0407 int compression = 0;
0408
0409 pdev->vsync = 0;
0410 pdev->vlast_packet_size = 0;
0411 pdev->fill_buf = NULL;
0412 pdev->vframe_count = 0;
0413 pdev->visoc_errors = 0;
0414 udev = pdev->udev;
0415
0416 retry:
0417
0418
0419 ret = pwc_set_video_mode(pdev, pdev->width, pdev->height, pdev->pixfmt,
0420 pdev->vframes, &compression, 1);
0421
0422
0423 intf = usb_ifnum_to_if(udev, 0);
0424 if (intf)
0425 idesc = usb_altnum_to_altsetting(intf, pdev->valternate);
0426 if (!idesc)
0427 return -EIO;
0428
0429
0430 pdev->vmax_packet_size = -1;
0431 for (i = 0; i < idesc->desc.bNumEndpoints; i++) {
0432 if ((idesc->endpoint[i].desc.bEndpointAddress & 0xF) == pdev->vendpoint) {
0433 pdev->vmax_packet_size = le16_to_cpu(idesc->endpoint[i].desc.wMaxPacketSize);
0434 break;
0435 }
0436 }
0437
0438 if (pdev->vmax_packet_size < 0 || pdev->vmax_packet_size > ISO_MAX_FRAME_SIZE) {
0439 PWC_ERROR("Failed to find packet size for video endpoint in current alternate setting.\n");
0440 return -ENFILE;
0441 }
0442
0443
0444 PWC_DEBUG_OPEN("Setting alternate interface %d\n", pdev->valternate);
0445 ret = usb_set_interface(pdev->udev, 0, pdev->valternate);
0446 if (ret == -ENOSPC && compression < 3) {
0447 compression++;
0448 goto retry;
0449 }
0450 if (ret < 0)
0451 return ret;
0452
0453
0454 for (i = 0; i < MAX_ISO_BUFS; i++) {
0455 urb = usb_alloc_urb(ISO_FRAMES_PER_DESC, GFP_KERNEL);
0456 if (urb == NULL) {
0457 pwc_isoc_cleanup(pdev);
0458 return -ENOMEM;
0459 }
0460 pdev->urbs[i] = urb;
0461 PWC_DEBUG_MEMORY("Allocated URB at 0x%p\n", urb);
0462
0463 urb->interval = 1;
0464 urb->dev = udev;
0465 urb->pipe = usb_rcvisocpipe(udev, pdev->vendpoint);
0466 urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
0467 urb->transfer_buffer_length = ISO_BUFFER_SIZE;
0468 urb->transfer_buffer = pwc_alloc_urb_buffer(udev,
0469 urb->transfer_buffer_length,
0470 &urb->transfer_dma);
0471 if (urb->transfer_buffer == NULL) {
0472 PWC_ERROR("Failed to allocate urb buffer %d\n", i);
0473 pwc_isoc_cleanup(pdev);
0474 return -ENOMEM;
0475 }
0476 urb->complete = pwc_isoc_handler;
0477 urb->context = pdev;
0478 urb->start_frame = 0;
0479 urb->number_of_packets = ISO_FRAMES_PER_DESC;
0480 for (j = 0; j < ISO_FRAMES_PER_DESC; j++) {
0481 urb->iso_frame_desc[j].offset = j * ISO_MAX_FRAME_SIZE;
0482 urb->iso_frame_desc[j].length = pdev->vmax_packet_size;
0483 }
0484 }
0485
0486
0487 for (i = 0; i < MAX_ISO_BUFS; i++) {
0488 ret = usb_submit_urb(pdev->urbs[i], GFP_KERNEL);
0489 if (ret == -ENOSPC && compression < 3) {
0490 compression++;
0491 pwc_isoc_cleanup(pdev);
0492 goto retry;
0493 }
0494 if (ret) {
0495 PWC_ERROR("isoc_init() submit_urb %d failed with error %d\n", i, ret);
0496 pwc_isoc_cleanup(pdev);
0497 return ret;
0498 }
0499 PWC_DEBUG_MEMORY("URB 0x%p submitted.\n", pdev->urbs[i]);
0500 }
0501
0502
0503 PWC_DEBUG_OPEN("<< pwc_isoc_init()\n");
0504 return 0;
0505 }
0506
0507 static void pwc_iso_stop(struct pwc_device *pdev)
0508 {
0509 int i;
0510
0511
0512 for (i = 0; i < MAX_ISO_BUFS; i++) {
0513 if (pdev->urbs[i]) {
0514 PWC_DEBUG_MEMORY("Unlinking URB %p\n", pdev->urbs[i]);
0515 usb_kill_urb(pdev->urbs[i]);
0516 }
0517 }
0518 }
0519
0520 static void pwc_iso_free(struct pwc_device *pdev)
0521 {
0522 int i;
0523
0524
0525 for (i = 0; i < MAX_ISO_BUFS; i++) {
0526 struct urb *urb = pdev->urbs[i];
0527
0528 if (urb) {
0529 PWC_DEBUG_MEMORY("Freeing URB\n");
0530 if (urb->transfer_buffer)
0531 pwc_free_urb_buffer(urb->dev,
0532 urb->transfer_buffer_length,
0533 urb->transfer_buffer,
0534 urb->transfer_dma);
0535 usb_free_urb(urb);
0536 pdev->urbs[i] = NULL;
0537 }
0538 }
0539 }
0540
0541
0542 static void pwc_isoc_cleanup(struct pwc_device *pdev)
0543 {
0544 PWC_DEBUG_OPEN(">> pwc_isoc_cleanup()\n");
0545
0546 pwc_iso_stop(pdev);
0547 pwc_iso_free(pdev);
0548 usb_set_interface(pdev->udev, 0, 0);
0549
0550 PWC_DEBUG_OPEN("<< pwc_isoc_cleanup()\n");
0551 }
0552
0553
0554 static void pwc_cleanup_queued_bufs(struct pwc_device *pdev,
0555 enum vb2_buffer_state state)
0556 {
0557 unsigned long flags = 0;
0558
0559 spin_lock_irqsave(&pdev->queued_bufs_lock, flags);
0560 while (!list_empty(&pdev->queued_bufs)) {
0561 struct pwc_frame_buf *buf;
0562
0563 buf = list_entry(pdev->queued_bufs.next, struct pwc_frame_buf,
0564 list);
0565 list_del(&buf->list);
0566 vb2_buffer_done(&buf->vb.vb2_buf, state);
0567 }
0568 spin_unlock_irqrestore(&pdev->queued_bufs_lock, flags);
0569 }
0570
0571 #ifdef CONFIG_USB_PWC_DEBUG
0572 static const char *pwc_sensor_type_to_string(unsigned int sensor_type)
0573 {
0574 switch(sensor_type) {
0575 case 0x00:
0576 return "Hyundai CMOS sensor";
0577 case 0x20:
0578 return "Sony CCD sensor + TDA8787";
0579 case 0x2E:
0580 return "Sony CCD sensor + Exas 98L59";
0581 case 0x2F:
0582 return "Sony CCD sensor + ADI 9804";
0583 case 0x30:
0584 return "Sharp CCD sensor + TDA8787";
0585 case 0x3E:
0586 return "Sharp CCD sensor + Exas 98L59";
0587 case 0x3F:
0588 return "Sharp CCD sensor + ADI 9804";
0589 case 0x40:
0590 return "UPA 1021 sensor";
0591 case 0x100:
0592 return "VGA sensor";
0593 case 0x101:
0594 return "PAL MR sensor";
0595 default:
0596 return "unknown type of sensor";
0597 }
0598 }
0599 #endif
0600
0601
0602
0603
0604 static void pwc_video_release(struct v4l2_device *v)
0605 {
0606 struct pwc_device *pdev = container_of(v, struct pwc_device, v4l2_dev);
0607
0608 v4l2_ctrl_handler_free(&pdev->ctrl_handler);
0609 v4l2_device_unregister(&pdev->v4l2_dev);
0610 kfree(pdev->ctrl_buf);
0611 kfree(pdev);
0612 }
0613
0614
0615
0616
0617 static int queue_setup(struct vb2_queue *vq,
0618 unsigned int *nbuffers, unsigned int *nplanes,
0619 unsigned int sizes[], struct device *alloc_devs[])
0620 {
0621 struct pwc_device *pdev = vb2_get_drv_priv(vq);
0622 int size;
0623
0624 if (*nbuffers < MIN_FRAMES)
0625 *nbuffers = MIN_FRAMES;
0626 else if (*nbuffers > MAX_FRAMES)
0627 *nbuffers = MAX_FRAMES;
0628
0629 *nplanes = 1;
0630
0631 size = pwc_get_size(pdev, MAX_WIDTH, MAX_HEIGHT);
0632 sizes[0] = PAGE_ALIGN(pwc_image_sizes[size][0] *
0633 pwc_image_sizes[size][1] * 3 / 2);
0634
0635 return 0;
0636 }
0637
0638 static int buffer_init(struct vb2_buffer *vb)
0639 {
0640 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
0641 struct pwc_frame_buf *buf =
0642 container_of(vbuf, struct pwc_frame_buf, vb);
0643
0644
0645 buf->data = vzalloc(PWC_FRAME_SIZE);
0646 if (buf->data == NULL)
0647 return -ENOMEM;
0648
0649 return 0;
0650 }
0651
0652 static int buffer_prepare(struct vb2_buffer *vb)
0653 {
0654 struct pwc_device *pdev = vb2_get_drv_priv(vb->vb2_queue);
0655
0656
0657 if (!pdev->udev)
0658 return -ENODEV;
0659
0660 return 0;
0661 }
0662
0663 static void buffer_finish(struct vb2_buffer *vb)
0664 {
0665 struct pwc_device *pdev = vb2_get_drv_priv(vb->vb2_queue);
0666 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
0667 struct pwc_frame_buf *buf =
0668 container_of(vbuf, struct pwc_frame_buf, vb);
0669
0670 if (vb->state == VB2_BUF_STATE_DONE) {
0671
0672
0673
0674
0675
0676
0677 pwc_decompress(pdev, buf);
0678 }
0679 }
0680
0681 static void buffer_cleanup(struct vb2_buffer *vb)
0682 {
0683 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
0684 struct pwc_frame_buf *buf =
0685 container_of(vbuf, struct pwc_frame_buf, vb);
0686
0687 vfree(buf->data);
0688 }
0689
0690 static void buffer_queue(struct vb2_buffer *vb)
0691 {
0692 struct pwc_device *pdev = vb2_get_drv_priv(vb->vb2_queue);
0693 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
0694 struct pwc_frame_buf *buf =
0695 container_of(vbuf, struct pwc_frame_buf, vb);
0696 unsigned long flags = 0;
0697
0698
0699 if (!pdev->udev) {
0700 vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
0701 return;
0702 }
0703
0704 spin_lock_irqsave(&pdev->queued_bufs_lock, flags);
0705 list_add_tail(&buf->list, &pdev->queued_bufs);
0706 spin_unlock_irqrestore(&pdev->queued_bufs_lock, flags);
0707 }
0708
0709 static int start_streaming(struct vb2_queue *vq, unsigned int count)
0710 {
0711 struct pwc_device *pdev = vb2_get_drv_priv(vq);
0712 int r;
0713
0714 if (!pdev->udev)
0715 return -ENODEV;
0716
0717 if (mutex_lock_interruptible(&pdev->v4l2_lock))
0718 return -ERESTARTSYS;
0719
0720 pwc_camera_power(pdev, 1);
0721 pwc_set_leds(pdev, leds[0], leds[1]);
0722
0723 r = pwc_isoc_init(pdev);
0724 if (r) {
0725
0726 pwc_set_leds(pdev, 0, 0);
0727 pwc_camera_power(pdev, 0);
0728
0729 pwc_cleanup_queued_bufs(pdev, VB2_BUF_STATE_QUEUED);
0730 }
0731 mutex_unlock(&pdev->v4l2_lock);
0732
0733 return r;
0734 }
0735
0736 static void stop_streaming(struct vb2_queue *vq)
0737 {
0738 struct pwc_device *pdev = vb2_get_drv_priv(vq);
0739
0740 mutex_lock(&pdev->v4l2_lock);
0741 if (pdev->udev) {
0742 pwc_set_leds(pdev, 0, 0);
0743 pwc_camera_power(pdev, 0);
0744 pwc_isoc_cleanup(pdev);
0745 }
0746
0747 pwc_cleanup_queued_bufs(pdev, VB2_BUF_STATE_ERROR);
0748 if (pdev->fill_buf)
0749 vb2_buffer_done(&pdev->fill_buf->vb.vb2_buf,
0750 VB2_BUF_STATE_ERROR);
0751 mutex_unlock(&pdev->v4l2_lock);
0752 }
0753
0754 static const struct vb2_ops pwc_vb_queue_ops = {
0755 .queue_setup = queue_setup,
0756 .buf_init = buffer_init,
0757 .buf_prepare = buffer_prepare,
0758 .buf_finish = buffer_finish,
0759 .buf_cleanup = buffer_cleanup,
0760 .buf_queue = buffer_queue,
0761 .start_streaming = start_streaming,
0762 .stop_streaming = stop_streaming,
0763 .wait_prepare = vb2_ops_wait_prepare,
0764 .wait_finish = vb2_ops_wait_finish,
0765 };
0766
0767
0768
0769
0770
0771
0772
0773
0774 static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id *id)
0775 {
0776 struct usb_device *udev = interface_to_usbdev(intf);
0777 struct pwc_device *pdev = NULL;
0778 int vendor_id, product_id, type_id;
0779 int rc;
0780 int features = 0;
0781 int compression = 0;
0782 int my_power_save = power_save;
0783 char serial_number[30], *name;
0784
0785 vendor_id = le16_to_cpu(udev->descriptor.idVendor);
0786 product_id = le16_to_cpu(udev->descriptor.idProduct);
0787
0788
0789 PWC_DEBUG_PROBE("probe() called [%04X %04X], if %d\n",
0790 vendor_id, product_id,
0791 intf->altsetting->desc.bInterfaceNumber);
0792
0793
0794
0795
0796
0797 if (intf->altsetting->desc.bInterfaceNumber > 0)
0798 return -ENODEV;
0799
0800 if (vendor_id == 0x0471) {
0801 switch (product_id) {
0802 case 0x0302:
0803 PWC_INFO("Philips PCA645VC USB webcam detected.\n");
0804 name = "Philips 645 webcam";
0805 type_id = 645;
0806 break;
0807 case 0x0303:
0808 PWC_INFO("Philips PCA646VC USB webcam detected.\n");
0809 name = "Philips 646 webcam";
0810 type_id = 646;
0811 break;
0812 case 0x0304:
0813 PWC_INFO("Askey VC010 type 2 USB webcam detected.\n");
0814 name = "Askey VC010 webcam";
0815 type_id = 646;
0816 break;
0817 case 0x0307:
0818 PWC_INFO("Philips PCVC675K (Vesta) USB webcam detected.\n");
0819 name = "Philips 675 webcam";
0820 type_id = 675;
0821 break;
0822 case 0x0308:
0823 PWC_INFO("Philips PCVC680K (Vesta Pro) USB webcam detected.\n");
0824 name = "Philips 680 webcam";
0825 type_id = 680;
0826 break;
0827 case 0x030C:
0828 PWC_INFO("Philips PCVC690K (Vesta Pro Scan) USB webcam detected.\n");
0829 name = "Philips 690 webcam";
0830 type_id = 690;
0831 break;
0832 case 0x0310:
0833 PWC_INFO("Philips PCVC730K (ToUCam Fun)/PCVC830 (ToUCam II) USB webcam detected.\n");
0834 name = "Philips 730 webcam";
0835 type_id = 730;
0836 break;
0837 case 0x0311:
0838 PWC_INFO("Philips PCVC740K (ToUCam Pro)/PCVC840 (ToUCam II) USB webcam detected.\n");
0839 name = "Philips 740 webcam";
0840 type_id = 740;
0841 break;
0842 case 0x0312:
0843 PWC_INFO("Philips PCVC750K (ToUCam Pro Scan) USB webcam detected.\n");
0844 name = "Philips 750 webcam";
0845 type_id = 750;
0846 break;
0847 case 0x0313:
0848 PWC_INFO("Philips PCVC720K/40 (ToUCam XS) USB webcam detected.\n");
0849 name = "Philips 720K/40 webcam";
0850 type_id = 720;
0851 break;
0852 case 0x0329:
0853 PWC_INFO("Philips SPC 900NC USB webcam detected.\n");
0854 name = "Philips SPC 900NC webcam";
0855 type_id = 740;
0856 break;
0857 case 0x032C:
0858 PWC_INFO("Philips SPC 880NC USB webcam detected.\n");
0859 name = "Philips SPC 880NC webcam";
0860 type_id = 740;
0861 break;
0862 default:
0863 return -ENODEV;
0864 }
0865 }
0866 else if (vendor_id == 0x069A) {
0867 switch(product_id) {
0868 case 0x0001:
0869 PWC_INFO("Askey VC010 type 1 USB webcam detected.\n");
0870 name = "Askey VC010 webcam";
0871 type_id = 645;
0872 break;
0873 default:
0874 return -ENODEV;
0875 }
0876 }
0877 else if (vendor_id == 0x046d) {
0878 switch(product_id) {
0879 case 0x08b0:
0880 PWC_INFO("Logitech QuickCam Pro 3000 USB webcam detected.\n");
0881 name = "Logitech QuickCam Pro 3000";
0882 type_id = 740;
0883 break;
0884 case 0x08b1:
0885 PWC_INFO("Logitech QuickCam Notebook Pro USB webcam detected.\n");
0886 name = "Logitech QuickCam Notebook Pro";
0887 type_id = 740;
0888 break;
0889 case 0x08b2:
0890 PWC_INFO("Logitech QuickCam 4000 Pro USB webcam detected.\n");
0891 name = "Logitech QuickCam Pro 4000";
0892 type_id = 740;
0893 if (my_power_save == -1)
0894 my_power_save = 1;
0895 break;
0896 case 0x08b3:
0897 PWC_INFO("Logitech QuickCam Zoom USB webcam detected.\n");
0898 name = "Logitech QuickCam Zoom";
0899 type_id = 740;
0900 break;
0901 case 0x08B4:
0902 PWC_INFO("Logitech QuickCam Zoom (new model) USB webcam detected.\n");
0903 name = "Logitech QuickCam Zoom";
0904 type_id = 740;
0905 if (my_power_save == -1)
0906 my_power_save = 1;
0907 break;
0908 case 0x08b5:
0909 PWC_INFO("Logitech QuickCam Orbit/Sphere USB webcam detected.\n");
0910 name = "Logitech QuickCam Orbit";
0911 type_id = 740;
0912 if (my_power_save == -1)
0913 my_power_save = 1;
0914 features |= FEATURE_MOTOR_PANTILT;
0915 break;
0916 case 0x08b6:
0917 PWC_INFO("Logitech/Cisco VT Camera webcam detected.\n");
0918 name = "Cisco VT Camera";
0919 type_id = 740;
0920 break;
0921 case 0x08b7:
0922 PWC_INFO("Logitech ViewPort AV 100 webcam detected.\n");
0923 name = "Logitech ViewPort AV 100";
0924 type_id = 740;
0925 break;
0926 case 0x08b8:
0927 PWC_INFO("Logitech QuickCam detected (reserved ID).\n");
0928 name = "Logitech QuickCam (res.)";
0929 type_id = 730;
0930 break;
0931 default:
0932 return -ENODEV;
0933 }
0934 }
0935 else if (vendor_id == 0x055d) {
0936
0937
0938
0939
0940 switch(product_id) {
0941 case 0x9000:
0942 PWC_INFO("Samsung MPC-C10 USB webcam detected.\n");
0943 name = "Samsung MPC-C10";
0944 type_id = 675;
0945 break;
0946 case 0x9001:
0947 PWC_INFO("Samsung MPC-C30 USB webcam detected.\n");
0948 name = "Samsung MPC-C30";
0949 type_id = 675;
0950 break;
0951 case 0x9002:
0952 PWC_INFO("Samsung SNC-35E (v3.0) USB webcam detected.\n");
0953 name = "Samsung MPC-C30";
0954 type_id = 740;
0955 break;
0956 default:
0957 return -ENODEV;
0958 }
0959 }
0960 else if (vendor_id == 0x041e) {
0961 switch(product_id) {
0962 case 0x400c:
0963 PWC_INFO("Creative Labs Webcam 5 detected.\n");
0964 name = "Creative Labs Webcam 5";
0965 type_id = 730;
0966 if (my_power_save == -1)
0967 my_power_save = 1;
0968 break;
0969 case 0x4011:
0970 PWC_INFO("Creative Labs Webcam Pro Ex detected.\n");
0971 name = "Creative Labs Webcam Pro Ex";
0972 type_id = 740;
0973 break;
0974 default:
0975 return -ENODEV;
0976 }
0977 }
0978 else if (vendor_id == 0x04cc) {
0979 switch(product_id) {
0980 case 0x8116:
0981 PWC_INFO("Sotec Afina Eye USB webcam detected.\n");
0982 name = "Sotec Afina Eye";
0983 type_id = 730;
0984 break;
0985 default:
0986 return -ENODEV;
0987 }
0988 }
0989 else if (vendor_id == 0x06be) {
0990 switch(product_id) {
0991 case 0x8116:
0992
0993 PWC_INFO("AME Co. Afina Eye USB webcam detected.\n");
0994 name = "AME Co. Afina Eye";
0995 type_id = 750;
0996 break;
0997 default:
0998 return -ENODEV;
0999 }
1000
1001 }
1002 else if (vendor_id == 0x0d81) {
1003 switch(product_id) {
1004 case 0x1900:
1005 PWC_INFO("Visionite VCS-UC300 USB webcam detected.\n");
1006 name = "Visionite VCS-UC300";
1007 type_id = 740;
1008 break;
1009 case 0x1910:
1010 PWC_INFO("Visionite VCS-UM100 USB webcam detected.\n");
1011 name = "Visionite VCS-UM100";
1012 type_id = 730;
1013 break;
1014 default:
1015 return -ENODEV;
1016 }
1017 }
1018 else
1019 return -ENODEV;
1020
1021 if (my_power_save == -1)
1022 my_power_save = 0;
1023
1024 memset(serial_number, 0, 30);
1025 usb_string(udev, udev->descriptor.iSerialNumber, serial_number, 29);
1026 PWC_DEBUG_PROBE("Device serial number is %s\n", serial_number);
1027
1028 if (udev->descriptor.bNumConfigurations > 1)
1029 PWC_WARNING("Warning: more than 1 configuration available.\n");
1030
1031
1032 pdev = kzalloc(sizeof(struct pwc_device), GFP_KERNEL);
1033 if (pdev == NULL) {
1034 PWC_ERROR("Oops, could not allocate memory for pwc_device.\n");
1035 return -ENOMEM;
1036 }
1037 pdev->type = type_id;
1038 pdev->features = features;
1039 pwc_construct(pdev);
1040
1041 mutex_init(&pdev->v4l2_lock);
1042 mutex_init(&pdev->vb_queue_lock);
1043 spin_lock_init(&pdev->queued_bufs_lock);
1044 INIT_LIST_HEAD(&pdev->queued_bufs);
1045
1046 pdev->udev = udev;
1047 pdev->power_save = my_power_save;
1048
1049
1050 pdev->vb_queue.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1051 pdev->vb_queue.io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ;
1052 pdev->vb_queue.drv_priv = pdev;
1053 pdev->vb_queue.buf_struct_size = sizeof(struct pwc_frame_buf);
1054 pdev->vb_queue.ops = &pwc_vb_queue_ops;
1055 pdev->vb_queue.mem_ops = &vb2_vmalloc_memops;
1056 pdev->vb_queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1057 rc = vb2_queue_init(&pdev->vb_queue);
1058 if (rc < 0) {
1059 PWC_ERROR("Oops, could not initialize vb2 queue.\n");
1060 goto err_free_mem;
1061 }
1062
1063
1064 pdev->vdev = pwc_template;
1065 strscpy(pdev->vdev.name, name, sizeof(pdev->vdev.name));
1066 pdev->vdev.queue = &pdev->vb_queue;
1067 pdev->vdev.queue->lock = &pdev->vb_queue_lock;
1068 video_set_drvdata(&pdev->vdev, pdev);
1069
1070 pdev->release = le16_to_cpu(udev->descriptor.bcdDevice);
1071 PWC_DEBUG_PROBE("Release: %04x\n", pdev->release);
1072
1073
1074 pdev->ctrl_buf = kmalloc(sizeof(pdev->cmd_buf), GFP_KERNEL);
1075 if (!pdev->ctrl_buf) {
1076 PWC_ERROR("Oops, could not allocate memory for pwc_device.\n");
1077 rc = -ENOMEM;
1078 goto err_free_mem;
1079 }
1080
1081 #ifdef CONFIG_USB_PWC_DEBUG
1082
1083 if (pwc_get_cmos_sensor(pdev, &rc) >= 0) {
1084 PWC_DEBUG_OPEN("This %s camera is equipped with a %s (%d).\n",
1085 pdev->vdev.name,
1086 pwc_sensor_type_to_string(rc), rc);
1087 }
1088 #endif
1089
1090
1091 pwc_set_leds(pdev, 0, 0);
1092
1093
1094 rc = pwc_set_video_mode(pdev, MAX_WIDTH, MAX_HEIGHT,
1095 V4L2_PIX_FMT_YUV420, 30, &compression, 1);
1096 if (rc)
1097 goto err_free_mem;
1098
1099
1100 rc = pwc_init_controls(pdev);
1101 if (rc) {
1102 PWC_ERROR("Failed to register v4l2 controls (%d).\n", rc);
1103 goto err_free_mem;
1104 }
1105
1106
1107 pwc_camera_power(pdev, 0);
1108
1109
1110 pdev->v4l2_dev.release = pwc_video_release;
1111 rc = v4l2_device_register(&intf->dev, &pdev->v4l2_dev);
1112 if (rc) {
1113 PWC_ERROR("Failed to register v4l2-device (%d).\n", rc);
1114 goto err_free_controls;
1115 }
1116
1117 pdev->v4l2_dev.ctrl_handler = &pdev->ctrl_handler;
1118 pdev->vdev.v4l2_dev = &pdev->v4l2_dev;
1119 pdev->vdev.lock = &pdev->v4l2_lock;
1120 pdev->vdev.device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING |
1121 V4L2_CAP_READWRITE;
1122
1123 rc = video_register_device(&pdev->vdev, VFL_TYPE_VIDEO, -1);
1124 if (rc < 0) {
1125 PWC_ERROR("Failed to register as video device (%d).\n", rc);
1126 goto err_unregister_v4l2_dev;
1127 }
1128 PWC_INFO("Registered as %s.\n", video_device_node_name(&pdev->vdev));
1129
1130 #ifdef CONFIG_USB_PWC_INPUT_EVDEV
1131
1132 pdev->button_dev = input_allocate_device();
1133 if (!pdev->button_dev) {
1134 rc = -ENOMEM;
1135 goto err_video_unreg;
1136 }
1137
1138 usb_make_path(udev, pdev->button_phys, sizeof(pdev->button_phys));
1139 strlcat(pdev->button_phys, "/input0", sizeof(pdev->button_phys));
1140
1141 pdev->button_dev->name = "PWC snapshot button";
1142 pdev->button_dev->phys = pdev->button_phys;
1143 usb_to_input_id(pdev->udev, &pdev->button_dev->id);
1144 pdev->button_dev->dev.parent = &pdev->udev->dev;
1145 pdev->button_dev->evbit[0] = BIT_MASK(EV_KEY);
1146 pdev->button_dev->keybit[BIT_WORD(KEY_CAMERA)] = BIT_MASK(KEY_CAMERA);
1147
1148 rc = input_register_device(pdev->button_dev);
1149 if (rc) {
1150 input_free_device(pdev->button_dev);
1151 pdev->button_dev = NULL;
1152 goto err_video_unreg;
1153 }
1154 #endif
1155
1156 return 0;
1157
1158 #ifdef CONFIG_USB_PWC_INPUT_EVDEV
1159 err_video_unreg:
1160 video_unregister_device(&pdev->vdev);
1161 #endif
1162 err_unregister_v4l2_dev:
1163 v4l2_device_unregister(&pdev->v4l2_dev);
1164 err_free_controls:
1165 v4l2_ctrl_handler_free(&pdev->ctrl_handler);
1166 err_free_mem:
1167 kfree(pdev->ctrl_buf);
1168 kfree(pdev);
1169 return rc;
1170 }
1171
1172
1173 static void usb_pwc_disconnect(struct usb_interface *intf)
1174 {
1175 struct v4l2_device *v = usb_get_intfdata(intf);
1176 struct pwc_device *pdev = container_of(v, struct pwc_device, v4l2_dev);
1177
1178 mutex_lock(&pdev->vb_queue_lock);
1179 mutex_lock(&pdev->v4l2_lock);
1180
1181 if (pdev->vb_queue.streaming)
1182 pwc_isoc_cleanup(pdev);
1183 pdev->udev = NULL;
1184
1185 v4l2_device_disconnect(&pdev->v4l2_dev);
1186 video_unregister_device(&pdev->vdev);
1187 mutex_unlock(&pdev->v4l2_lock);
1188 mutex_unlock(&pdev->vb_queue_lock);
1189
1190 #ifdef CONFIG_USB_PWC_INPUT_EVDEV
1191 if (pdev->button_dev)
1192 input_unregister_device(pdev->button_dev);
1193 #endif
1194
1195 v4l2_device_put(&pdev->v4l2_dev);
1196 }
1197
1198
1199
1200
1201
1202
1203 static unsigned int leds_nargs;
1204
1205 #ifdef CONFIG_USB_PWC_DEBUG
1206 module_param_named(trace, pwc_trace, int, 0644);
1207 #endif
1208 module_param(power_save, int, 0644);
1209 module_param_array(leds, int, &leds_nargs, 0444);
1210
1211 #ifdef CONFIG_USB_PWC_DEBUG
1212 MODULE_PARM_DESC(trace, "For debugging purposes");
1213 #endif
1214 MODULE_PARM_DESC(power_save, "Turn power saving for new cameras on or off");
1215 MODULE_PARM_DESC(leds, "LED on,off time in milliseconds");
1216
1217 MODULE_DESCRIPTION("Philips & OEM USB webcam driver");
1218 MODULE_AUTHOR("Luc Saillard <luc@saillard.org>");
1219 MODULE_LICENSE("GPL");
1220 MODULE_ALIAS("pwcx");
1221 MODULE_VERSION( PWC_VERSION );
1222
1223 module_usb_driver(pwc_driver);