aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/uvc/uvc_driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/uvc/uvc_driver.c')
-rw-r--r--drivers/media/video/uvc/uvc_driver.c55
1 files changed, 25 insertions, 30 deletions
diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c
index 89d8bd10a852..b12873265cc5 100644
--- a/drivers/media/video/uvc/uvc_driver.c
+++ b/drivers/media/video/uvc/uvc_driver.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * uvc_driver.c -- USB Video Class driver 2 * uvc_driver.c -- USB Video Class driver
3 * 3 *
4 * Copyright (C) 2005-2008 4 * Copyright (C) 2005-2009
5 * Laurent Pinchart (laurent.pinchart@skynet.be) 5 * Laurent Pinchart (laurent.pinchart@skynet.be)
6 * 6 *
7 * This program is free software; you can redistribute it and/or modify 7 * This program is free software; you can redistribute it and/or modify
@@ -24,7 +24,6 @@
24 */ 24 */
25 25
26#include <linux/kernel.h> 26#include <linux/kernel.h>
27#include <linux/version.h>
28#include <linux/list.h> 27#include <linux/list.h>
29#include <linux/module.h> 28#include <linux/module.h>
30#include <linux/usb.h> 29#include <linux/usb.h>
@@ -49,7 +48,7 @@ static unsigned int uvc_quirks_param;
49unsigned int uvc_trace_param; 48unsigned int uvc_trace_param;
50 49
51/* ------------------------------------------------------------------------ 50/* ------------------------------------------------------------------------
52 * Control, formats, ... 51 * Video formats
53 */ 52 */
54 53
55static struct uvc_format_desc uvc_fmts[] = { 54static struct uvc_format_desc uvc_fmts[] = {
@@ -474,7 +473,7 @@ static int uvc_parse_format(struct uvc_device *dev,
474 473
475 /* Several UVC chipsets screw up dwMaxVideoFrameBufferSize 474 /* Several UVC chipsets screw up dwMaxVideoFrameBufferSize
476 * completely. Observed behaviours range from setting the 475 * completely. Observed behaviours range from setting the
477 * value to 1.1x the actual frame size of hardwiring the 476 * value to 1.1x the actual frame size to hardwiring the
478 * 16 low bits to 0. This results in a higher than necessary 477 * 16 low bits to 0. This results in a higher than necessary
479 * memory usage as well as a wrong image size information. For 478 * memory usage as well as a wrong image size information. For
480 * uncompressed formats this can be fixed by computing the 479 * uncompressed formats this can be fixed by computing the
@@ -487,7 +486,7 @@ static int uvc_parse_format(struct uvc_device *dev,
487 /* Some bogus devices report dwMinFrameInterval equal to 486 /* Some bogus devices report dwMinFrameInterval equal to
488 * dwMaxFrameInterval and have dwFrameIntervalStep set to 487 * dwMaxFrameInterval and have dwFrameIntervalStep set to
489 * zero. Setting all null intervals to 1 fixes the problem and 488 * zero. Setting all null intervals to 1 fixes the problem and
490 * some other divisions by zero which could happen. 489 * some other divisions by zero that could happen.
491 */ 490 */
492 for (i = 0; i < n; ++i) { 491 for (i = 0; i < n; ++i) {
493 interval = get_unaligned_le32(&buffer[26+4*i]); 492 interval = get_unaligned_le32(&buffer[26+4*i]);
@@ -1200,13 +1199,13 @@ static void uvc_unregister_video(struct uvc_device *dev)
1200 * Scan the UVC descriptors to locate a chain starting at an Output Terminal 1199 * Scan the UVC descriptors to locate a chain starting at an Output Terminal
1201 * and containing the following units: 1200 * and containing the following units:
1202 * 1201 *
1203 * - a USB Streaming Output Terminal 1202 * - one Output Terminal (USB Streaming or Display)
1204 * - zero or one Processing Unit 1203 * - zero or one Processing Unit
1205 * - zero, one or mode single-input Selector Units 1204 * - zero, one or mode single-input Selector Units
1206 * - zero or one multiple-input Selector Units, provided all inputs are 1205 * - zero or one multiple-input Selector Units, provided all inputs are
1207 * connected to input terminals 1206 * connected to input terminals
1208 * - zero, one or mode single-input Extension Units 1207 * - zero, one or mode single-input Extension Units
1209 * - one Camera Input Terminal, or one or more External terminals. 1208 * - one or more Input Terminals (Camera, External or USB Streaming)
1210 * 1209 *
1211 * A side forward scan is made on each detected entity to check for additional 1210 * A side forward scan is made on each detected entity to check for additional
1212 * extension units. 1211 * extension units.
@@ -1531,10 +1530,6 @@ static int uvc_register_video(struct uvc_device *dev)
1531 1530
1532 /* Set the driver data before calling video_register_device, otherwise 1531 /* Set the driver data before calling video_register_device, otherwise
1533 * uvc_v4l2_open might race us. 1532 * uvc_v4l2_open might race us.
1534 *
1535 * FIXME: usb_set_intfdata hasn't been called so far. Is that a
1536 * problem ? Does any function which could be called here get
1537 * a pointer to the usb_interface ?
1538 */ 1533 */
1539 dev->video.vdev = vdev; 1534 dev->video.vdev = vdev;
1540 video_set_drvdata(vdev, &dev->video); 1535 video_set_drvdata(vdev, &dev->video);
@@ -1569,7 +1564,7 @@ void uvc_delete(struct kref *kref)
1569 struct uvc_device *dev = container_of(kref, struct uvc_device, kref); 1564 struct uvc_device *dev = container_of(kref, struct uvc_device, kref);
1570 struct list_head *p, *n; 1565 struct list_head *p, *n;
1571 1566
1572 /* Unregister the video device */ 1567 /* Unregister the video device. */
1573 uvc_unregister_video(dev); 1568 uvc_unregister_video(dev);
1574 usb_put_intf(dev->intf); 1569 usb_put_intf(dev->intf);
1575 usb_put_dev(dev->udev); 1570 usb_put_dev(dev->udev);
@@ -1612,7 +1607,7 @@ static int uvc_probe(struct usb_interface *intf,
1612 uvc_trace(UVC_TRACE_PROBE, "Probing generic UVC device %s\n", 1607 uvc_trace(UVC_TRACE_PROBE, "Probing generic UVC device %s\n",
1613 udev->devpath); 1608 udev->devpath);
1614 1609
1615 /* Allocate memory for the device and initialize it */ 1610 /* Allocate memory for the device and initialize it. */
1616 if ((dev = kzalloc(sizeof *dev, GFP_KERNEL)) == NULL) 1611 if ((dev = kzalloc(sizeof *dev, GFP_KERNEL)) == NULL)
1617 return -ENOMEM; 1612 return -ENOMEM;
1618 1613
@@ -1633,14 +1628,14 @@ static int uvc_probe(struct usb_interface *intf,
1633 le16_to_cpu(udev->descriptor.idVendor), 1628 le16_to_cpu(udev->descriptor.idVendor),
1634 le16_to_cpu(udev->descriptor.idProduct)); 1629 le16_to_cpu(udev->descriptor.idProduct));
1635 1630
1636 /* Parse the Video Class control descriptor */ 1631 /* Parse the Video Class control descriptor. */
1637 if (uvc_parse_control(dev) < 0) { 1632 if (uvc_parse_control(dev) < 0) {
1638 uvc_trace(UVC_TRACE_PROBE, "Unable to parse UVC " 1633 uvc_trace(UVC_TRACE_PROBE, "Unable to parse UVC "
1639 "descriptors.\n"); 1634 "descriptors.\n");
1640 goto error; 1635 goto error;
1641 } 1636 }
1642 1637
1643 uvc_printk(KERN_INFO, "Found UVC %u.%02u device %s (%04x:%04x)\n", 1638 uvc_printk(KERN_INFO, "Found UVC %u.%02x device %s (%04x:%04x)\n",
1644 dev->uvc_version >> 8, dev->uvc_version & 0xff, 1639 dev->uvc_version >> 8, dev->uvc_version & 0xff,
1645 udev->product ? udev->product : "<unnamed>", 1640 udev->product ? udev->product : "<unnamed>",
1646 le16_to_cpu(udev->descriptor.idVendor), 1641 le16_to_cpu(udev->descriptor.idVendor),
@@ -1653,18 +1648,18 @@ static int uvc_probe(struct usb_interface *intf,
1653 "linux-uvc-devel mailing list.\n"); 1648 "linux-uvc-devel mailing list.\n");
1654 } 1649 }
1655 1650
1656 /* Initialize controls */ 1651 /* Initialize controls. */
1657 if (uvc_ctrl_init_device(dev) < 0) 1652 if (uvc_ctrl_init_device(dev) < 0)
1658 goto error; 1653 goto error;
1659 1654
1660 /* Register the video devices */ 1655 /* Register the video devices. */
1661 if (uvc_register_video(dev) < 0) 1656 if (uvc_register_video(dev) < 0)
1662 goto error; 1657 goto error;
1663 1658
1664 /* Save our data pointer in the interface data */ 1659 /* Save our data pointer in the interface data. */
1665 usb_set_intfdata(intf, dev); 1660 usb_set_intfdata(intf, dev);
1666 1661
1667 /* Initialize the interrupt URB */ 1662 /* Initialize the interrupt URB. */
1668 if ((ret = uvc_status_init(dev)) < 0) { 1663 if ((ret = uvc_status_init(dev)) < 0) {
1669 uvc_printk(KERN_INFO, "Unable to initialize the status " 1664 uvc_printk(KERN_INFO, "Unable to initialize the status "
1670 "endpoint (%d), status interrupt will not be " 1665 "endpoint (%d), status interrupt will not be "
@@ -1839,24 +1834,24 @@ static struct usb_device_id uvc_ids[] = {
1839 .bInterfaceSubClass = 1, 1834 .bInterfaceSubClass = 1,
1840 .bInterfaceProtocol = 0 }, 1835 .bInterfaceProtocol = 0 },
1841 /* Apple Built-In iSight */ 1836 /* Apple Built-In iSight */
1842 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 1837 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
1843 | USB_DEVICE_ID_MATCH_INT_INFO, 1838 | USB_DEVICE_ID_MATCH_INT_INFO,
1844 .idVendor = 0x05ac, 1839 .idVendor = 0x05ac,
1845 .idProduct = 0x8501, 1840 .idProduct = 0x8501,
1846 .bInterfaceClass = USB_CLASS_VIDEO, 1841 .bInterfaceClass = USB_CLASS_VIDEO,
1847 .bInterfaceSubClass = 1, 1842 .bInterfaceSubClass = 1,
1848 .bInterfaceProtocol = 0, 1843 .bInterfaceProtocol = 0,
1849 .driver_info = UVC_QUIRK_PROBE_MINMAX 1844 .driver_info = UVC_QUIRK_PROBE_MINMAX
1850 | UVC_QUIRK_BUILTIN_ISIGHT }, 1845 | UVC_QUIRK_BUILTIN_ISIGHT },
1851 /* Genesys Logic USB 2.0 PC Camera */ 1846 /* Genesys Logic USB 2.0 PC Camera */
1852 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 1847 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
1853 | USB_DEVICE_ID_MATCH_INT_INFO, 1848 | USB_DEVICE_ID_MATCH_INT_INFO,
1854 .idVendor = 0x05e3, 1849 .idVendor = 0x05e3,
1855 .idProduct = 0x0505, 1850 .idProduct = 0x0505,
1856 .bInterfaceClass = USB_CLASS_VIDEO, 1851 .bInterfaceClass = USB_CLASS_VIDEO,
1857 .bInterfaceSubClass = 1, 1852 .bInterfaceSubClass = 1,
1858 .bInterfaceProtocol = 0, 1853 .bInterfaceProtocol = 0,
1859 .driver_info = UVC_QUIRK_STREAM_NO_FID }, 1854 .driver_info = UVC_QUIRK_STREAM_NO_FID },
1860 /* MT6227 */ 1855 /* MT6227 */
1861 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 1856 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
1862 | USB_DEVICE_ID_MATCH_INT_INFO, 1857 | USB_DEVICE_ID_MATCH_INT_INFO,