]> Pileus Git - ~andy/linux/blobdiff - drivers/usb/gadget/composite.c
usb gadget: don't save bind callback in struct usb_composite_driver
[~andy/linux] / drivers / usb / gadget / composite.c
index a3009bf0122960e1d88479a4025e6fbba49f08fb..c531a7e05f1e592e982c48a27467ba3b5864ded7 100644 (file)
@@ -40,6 +40,7 @@
 #define USB_BUFSIZ     1024
 
 static struct usb_composite_driver *composite;
+static int (*composite_gadget_bind)(struct usb_composite_dev *cdev);
 
 /* Some systems will need runtime overrides for the  product identifers
  * published in the device descriptor, either numbers or strings or both.
@@ -1115,7 +1116,7 @@ static int composite_bind(struct usb_gadget *gadget)
         * serial number), register function drivers, potentially update
         * power state and consumption, etc
         */
-       status = composite->bind(cdev);
+       status = composite_gadget_bind(cdev);
        if (status < 0)
                goto fail;
 
@@ -1227,8 +1228,12 @@ static struct usb_gadget_driver composite_driver = {
 };
 
 /**
- * usb_composite_register() - register a composite driver
+ * usb_composite_probe() - register a composite driver
  * @driver: the driver to register
+ * @bind: the callback used to allocate resources that are shared across the
+ *     whole device, such as string IDs, and add its configurations using
+ *     @usb_add_config().  This may fail by returning a negative errno
+ *     value; it should return zero on successful initialization.
  * Context: single threaded during gadget setup
  *
  * This function is used to register drivers using the composite driver
@@ -1241,9 +1246,10 @@ static struct usb_gadget_driver composite_driver = {
  * while it was binding.  That would usually be done in order to wait for
  * some userspace participation.
  */
-int usb_composite_register(struct usb_composite_driver *driver)
+extern int usb_composite_probe(struct usb_composite_driver *driver,
+                              int (*bind)(struct usb_composite_dev *cdev))
 {
-       if (!driver || !driver->dev || !driver->bind || composite)
+       if (!driver || !driver->dev || !bind || composite)
                return -EINVAL;
 
        if (!driver->iProduct)
@@ -1253,6 +1259,7 @@ int usb_composite_register(struct usb_composite_driver *driver)
        composite_driver.function =  (char *) driver->name;
        composite_driver.driver.name = driver->name;
        composite = driver;
+       composite_gadget_bind = bind;
 
        return usb_gadget_probe_driver(&composite_driver, composite_bind);
 }