include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[linux-3.10.git] / drivers / media / video / au0828 / au0828-core.c
index 4cee0b9..ca342e4 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 #include <linux/module.h>
+#include <linux/slab.h>
 #include <linux/videodev2.h>
 #include <media/v4l2-common.h>
 #include <linux/mutex.h>
@@ -36,6 +37,11 @@ int au0828_debug;
 module_param_named(debug, au0828_debug, int, 0644);
 MODULE_PARM_DESC(debug, "enable debug messages");
 
+static unsigned int disable_usb_speed_check;
+module_param(disable_usb_speed_check, int, 0444);
+MODULE_PARM_DESC(disable_usb_speed_check,
+                "override min bandwidth requirement of 480M bps");
+
 #define _AU0828_BULKPIPE 0x03
 #define _BULKPIPESIZE 0xffff
 
@@ -181,6 +187,18 @@ static int au0828_usb_probe(struct usb_interface *interface,
                le16_to_cpu(usbdev->descriptor.idProduct),
                ifnum);
 
+       /*
+        * Make sure we have 480 Mbps of bandwidth, otherwise things like
+        * video stream wouldn't likely work, since 12 Mbps is generally
+        * not enough even for most Digital TV streams.
+        */
+       if (usbdev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) {
+               printk(KERN_ERR "au0828: Device initialization failed.\n");
+               printk(KERN_ERR "au0828: Device must be connected to a "
+                      "high-speed USB 2.0 port.\n");
+               return -ENODEV;
+       }
+
        dev = kzalloc(sizeof(*dev), GFP_KERNEL);
        if (dev == NULL) {
                printk(KERN_ERR "%s() Unable to allocate memory\n", __func__);
@@ -192,8 +210,6 @@ static int au0828_usb_probe(struct usb_interface *interface,
        dev->usbdev = usbdev;
        dev->boardnr = id->driver_info;
 
-       usb_set_intfdata(interface, dev);
-
        /* Create the v4l2_device */
        retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
        if (retval) {
@@ -222,6 +238,10 @@ static int au0828_usb_probe(struct usb_interface *interface,
        /* Digital TV */
        au0828_dvb_register(dev);
 
+       /* Store the pointer to the au0828_dev so it can be accessed in
+          au0828_usb_disconnect */
+       usb_set_intfdata(interface, dev);
+
        printk(KERN_INFO "Registered device AU0828 [%s]\n",
                dev->board.name == NULL ? "Unset" : dev->board.name);