include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[safe/jmp/linux-2.6] / drivers / media / video / uvc / uvc_driver.c
index 391cccc..86ff8c1 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/kernel.h>
 #include <linux/list.h>
 #include <linux/module.h>
+#include <linux/slab.h>
 #include <linux/usb.h>
 #include <linux/videodev2.h>
 #include <linux/vmalloc.h>
@@ -43,8 +44,9 @@
 #define DRIVER_VERSION         "v0.1.0"
 #endif
 
+unsigned int uvc_clock_param = CLOCK_MONOTONIC;
 unsigned int uvc_no_drop_param;
-static unsigned int uvc_quirks_param;
+static unsigned int uvc_quirks_param = -1;
 unsigned int uvc_trace_param;
 unsigned int uvc_timeout_param = UVC_CTRL_STREAMING_TIMEOUT;
 
@@ -59,6 +61,11 @@ static struct uvc_format_desc uvc_fmts[] = {
                .fcc            = V4L2_PIX_FMT_YUYV,
        },
        {
+               .name           = "YUV 4:2:2 (YUYV)",
+               .guid           = UVC_GUID_FORMAT_YUY2_ISIGHT,
+               .fcc            = V4L2_PIX_FMT_YUYV,
+       },
+       {
                .name           = "YUV 4:2:0 (NV12)",
                .guid           = UVC_GUID_FORMAT_NV12,
                .fcc            = V4L2_PIX_FMT_NV12,
@@ -309,11 +316,10 @@ static int uvc_parse_format(struct uvc_device *dev,
                                sizeof format->name);
                        format->fcc = fmtdesc->fcc;
                } else {
-                       uvc_printk(KERN_INFO, "Unknown video format "
-                               UVC_GUID_FORMAT "\n",
-                               UVC_GUID_ARGS(&buffer[5]));
-                       snprintf(format->name, sizeof format->name,
-                               UVC_GUID_FORMAT, UVC_GUID_ARGS(&buffer[5]));
+                       uvc_printk(KERN_INFO, "Unknown video format %pUl\n",
+                               &buffer[5]);
+                       snprintf(format->name, sizeof(format->name), "%pUl\n",
+                               &buffer[5]);
                        format->fcc = 0;
                }
 
@@ -1750,7 +1756,8 @@ static int uvc_probe(struct usb_interface *intf,
        dev->udev = usb_get_dev(udev);
        dev->intf = usb_get_intf(intf);
        dev->intfnum = intf->cur_altsetting->desc.bInterfaceNumber;
-       dev->quirks = id->driver_info | uvc_quirks_param;
+       dev->quirks = (uvc_quirks_param == -1)
+                   ? id->driver_info : uvc_quirks_param;
 
        if (udev->product != NULL)
                strlcpy(dev->name, udev->product, sizeof dev->name);
@@ -1773,9 +1780,9 @@ static int uvc_probe(struct usb_interface *intf,
                le16_to_cpu(udev->descriptor.idVendor),
                le16_to_cpu(udev->descriptor.idProduct));
 
-       if (uvc_quirks_param != 0) {
-               uvc_printk(KERN_INFO, "Forcing device quirks 0x%x by module "
-                       "parameter for testing purpose.\n", uvc_quirks_param);
+       if (dev->quirks != id->driver_info) {
+               uvc_printk(KERN_INFO, "Forcing device quirks to 0x%x by module "
+                       "parameter for testing purpose.\n", dev->quirks);
                uvc_printk(KERN_INFO, "Please report required quirks to the "
                        "linux-uvc-devel mailing list.\n");
        }
@@ -1892,6 +1899,45 @@ static int uvc_reset_resume(struct usb_interface *intf)
 }
 
 /* ------------------------------------------------------------------------
+ * Module parameters
+ */
+
+static int uvc_clock_param_get(char *buffer, struct kernel_param *kp)
+{
+       if (uvc_clock_param == CLOCK_MONOTONIC)
+               return sprintf(buffer, "CLOCK_MONOTONIC");
+       else
+               return sprintf(buffer, "CLOCK_REALTIME");
+}
+
+static int uvc_clock_param_set(const char *val, struct kernel_param *kp)
+{
+       if (strncasecmp(val, "clock_", strlen("clock_")) == 0)
+               val += strlen("clock_");
+
+       if (strcasecmp(val, "monotonic") == 0)
+               uvc_clock_param = CLOCK_MONOTONIC;
+       else if (strcasecmp(val, "realtime") == 0)
+               uvc_clock_param = CLOCK_REALTIME;
+       else
+               return -EINVAL;
+
+       return 0;
+}
+
+module_param_call(clock, uvc_clock_param_set, uvc_clock_param_get,
+                 &uvc_clock_param, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(clock, "Video buffers timestamp clock");
+module_param_named(nodrop, uvc_no_drop_param, uint, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(nodrop, "Don't drop incomplete frames");
+module_param_named(quirks, uvc_quirks_param, uint, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(quirks, "Forced device quirks");
+module_param_named(trace, uvc_trace_param, uint, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(trace, "Trace level bitmask");
+module_param_named(timeout, uvc_timeout_param, uint, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(timeout, "Streaming control requests timeout");
+
+/* ------------------------------------------------------------------------
  * Driver initialization and cleanup
  */
 
@@ -2197,15 +2243,6 @@ static void __exit uvc_cleanup(void)
 module_init(uvc_init);
 module_exit(uvc_cleanup);
 
-module_param_named(nodrop, uvc_no_drop_param, uint, S_IRUGO|S_IWUSR);
-MODULE_PARM_DESC(nodrop, "Don't drop incomplete frames");
-module_param_named(quirks, uvc_quirks_param, uint, S_IRUGO|S_IWUSR);
-MODULE_PARM_DESC(quirks, "Forced device quirks");
-module_param_named(trace, uvc_trace_param, uint, S_IRUGO|S_IWUSR);
-MODULE_PARM_DESC(trace, "Trace level bitmask");
-module_param_named(timeout, uvc_timeout_param, uint, S_IRUGO|S_IWUSR);
-MODULE_PARM_DESC(timeout, "Streaming control requests timeout");
-
 MODULE_AUTHOR(DRIVER_AUTHOR);
 MODULE_DESCRIPTION(DRIVER_DESC);
 MODULE_LICENSE("GPL");