#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 identifiers
  * published in the device descriptor, either numbers or strings or both.
         * serial number), register function drivers, potentially update
         * power state and consumption, etc
         */
-       status = composite_gadget_bind(cdev);
+       status = composite->bind(cdev);
        if (status < 0)
                goto fail;
 
 int usb_composite_probe(struct usb_composite_driver *driver,
                               int (*bind)(struct usb_composite_dev *cdev))
 {
-       if (!driver || !driver->dev || !bind || composite)
+       if (!driver || !driver->dev || composite)
+               return -EINVAL;
+       if (!bind && !driver->bind)
                return -EINVAL;
 
        if (!driver->name)
        composite_driver.driver.name = driver->name;
        composite_driver.max_speed = driver->max_speed;
        composite = driver;
-       composite_gadget_bind = bind;
+       if (!driver->bind)
+               driver->bind = bind;
 
        return usb_gadget_probe_driver(&composite_driver, composite_bind);
 }
 
  *     not set.
  * @dev: Template descriptor for the device, including default device
  *     identifiers.
- * @strings: tables of strings, keyed by identifiers assigned during bind()
+ * @strings: tables of strings, keyed by identifiers assigned during @bind
  *     and language IDs provided in control requests
  * @max_speed: Highest speed the driver supports.
  * @needs_serial: set to 1 if the gadget needs userspace to provide
  *     a serial number.  If one is not provided, warning will be printed.
- * @unbind: Reverses bind; called as a side effect of unregistering
+ * @bind: (REQUIRED) 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.
+ * @unbind: Reverses @bind; called as a side effect of unregistering
  *     this driver.
  * @disconnect: optional driver disconnect method
  * @suspend: Notifies when the host stops sending USB traffic,
  *     before function notifications
  *
  * Devices default to reporting self powered operation.  Devices which rely
- * on bus powered operation should report this in their @bind() method.
+ * on bus powered operation should report this in their @bind method.
  *
- * Before returning from bind, various fields in the template descriptor
+ * Before returning from @bind, various fields in the template descriptor
  * may be overridden.  These include the idVendor/idProduct/bcdDevice values
  * normally to bind the appropriate host side driver, and the three strings
  * (iManufacturer, iProduct, iSerialNumber) normally used to provide user
        enum usb_device_speed                   max_speed;
        unsigned                needs_serial:1;
 
+       int                     (*bind)(struct usb_composite_dev *cdev);
        int                     (*unbind)(struct usb_composite_dev *);
 
        void                    (*disconnect)(struct usb_composite_dev *);