}
 
 /* Called by gadget driver to register itself */
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct udc              *dev = udc;
        int                     retval;
        u32 tmp;
 
-       if (!driver || !driver->bind || !driver->setup
+       if (!driver || !bind || !driver->setup
                        || driver->speed != USB_SPEED_HIGH)
                return -EINVAL;
        if (!dev)
        dev->driver = driver;
        dev->gadget.dev.driver = &driver->driver;
 
-       retval = driver->bind(&dev->gadget);
+       retval = bind(&dev->gadget);
 
        /* Some gadget drivers use both ep0 directions.
         * NOTE: to gadget driver, ep0 is just one endpoint...
 
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 /* shutdown requests and disconnect from gadget */
 static void
 
                schedule_work(&udc->vbus_timer_work);
 }
 
-int usb_gadget_register_driver (struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct at91_udc *udc = &controller;
        int             retval;
 
        if (!driver
                        || driver->speed < USB_SPEED_FULL
-                       || !driver->bind
+                       || !bind
                        || !driver->setup) {
                DBG("bad parameter.\n");
                return -EINVAL;
        udc->enabled = 1;
        udc->selfpowered = 1;
 
-       retval = driver->bind(&udc->gadget);
+       retval = bind(&udc->gadget);
        if (retval) {
-               DBG("driver->bind() returned %d\n", retval);
+               DBG("bind() returned %d\n", retval);
                udc->driver = NULL;
                udc->gadget.dev.driver = NULL;
                dev_set_drvdata(&udc->gadget.dev, NULL);
        DBG("bound to %s\n", driver->driver.name);
        return 0;
 }
-EXPORT_SYMBOL (usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
 {
 
        return IRQ_HANDLED;
 }
 
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct usba_udc *udc = &the_udc;
        unsigned long flags;
        clk_enable(udc->pclk);
        clk_enable(udc->hclk);
 
-       ret = driver->bind(&udc->gadget);
+       ret = bind(&udc->gadget);
        if (ret) {
                DBG(DBG_ERR, "Could not bind to driver %s: error %d\n",
                        driver->driver.name, ret);
        udc->gadget.dev.driver = NULL;
        return ret;
 }
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
 {
 
 static const struct usb_gadget_ops usb_gadget_ops;
 
 /**
- * usb_gadget_register_driver: register a gadget driver
+ * usb_gadget_probe_driver: register a gadget driver
+ * @driver: the driver being registered
+ * @bind: the driver's bind callback
  *
- * Check usb_gadget_register_driver() at "usb_gadget.h" for details
- * Interrupts are enabled here
+ * Check usb_gadget_probe_driver() at <linux/usb/gadget.h> for details.
+ * Interrupts are enabled here.
  */
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct ci13xxx *udc = _udc;
        unsigned long i, k, flags;
        trace("%p", driver);
 
        if (driver             == NULL ||
-           driver->bind       == NULL ||
+           bind               == NULL ||
            driver->unbind     == NULL ||
            driver->setup      == NULL ||
            driver->disconnect == NULL ||
        udc->gadget.dev.driver = &driver->driver;
 
        spin_unlock_irqrestore(udc->lock, flags);
-       retval = driver->bind(&udc->gadget);                /* MAY SLEEP */
+       retval = bind(&udc->gadget);                /* MAY SLEEP */
        spin_lock_irqsave(udc->lock, flags);
 
        if (retval) {
                usb_gadget_unregister_driver(driver);
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 /**
  * usb_gadget_unregister_driver: unregister a gadget driver
        trace("%p", driver);
 
        if (driver             == NULL ||
-           driver->bind       == NULL ||
            driver->unbind     == NULL ||
            driver->setup      == NULL ||
            driver->disconnect == NULL ||
 
 static struct usb_gadget_driver composite_driver = {
        .speed          = USB_SPEED_HIGH,
 
-       .bind           = composite_bind,
        .unbind         = composite_unbind,
 
        .setup          = composite_setup,
        composite_driver.driver.name = driver->name;
        composite = driver;
 
-       return usb_gadget_register_driver(&composite_driver);
+       return usb_gadget_probe_driver(&composite_driver, composite_bind);
 }
 
 /**
 
 static struct usb_gadget_driver dbgp_driver = {
        .function = "dbgp",
        .speed = USB_SPEED_HIGH,
-       .bind = dbgp_bind,
        .unbind = dbgp_unbind,
        .setup = dbgp_setup,
        .disconnect = dbgp_disconnect,
 
 static int __init dbgp_init(void)
 {
-       return usb_gadget_register_driver(&dbgp_driver);
+       return usb_gadget_probe_driver(&dbgp_driver, dbgp_bind);
 }
 
 static void __exit dbgp_exit(void)
 
  */
 
 int
-usb_gadget_register_driver (struct usb_gadget_driver *driver)
+usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct dummy    *dum = the_controller;
        int             retval, i;
                return -EINVAL;
        if (dum->driver)
                return -EBUSY;
-       if (!driver->bind || !driver->setup
-                       || driver->speed == USB_SPEED_UNKNOWN)
+       if (!bind || !driver->setup || driver->speed == USB_SPEED_UNKNOWN)
                return -EINVAL;
 
        /*
        dum->gadget.dev.driver = &driver->driver;
        dev_dbg (udc_dev(dum), "binding gadget driver '%s'\n",
                        driver->driver.name);
-       retval = driver->bind(&dum->gadget);
+       retval = bind(&dum->gadget);
        if (retval) {
                dum->driver = NULL;
                dum->gadget.dev.driver = NULL;
        usb_hcd_poll_rh_status (dummy_to_hcd (dum));
        return 0;
 }
-EXPORT_SYMBOL (usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 int
 usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
 
        .speed          = USB_SPEED_FULL,
 #endif
        .function       = (char *) fsg_string_product,
-       .bind           = fsg_bind,
        .unbind         = fsg_unbind,
        .disconnect     = fsg_disconnect,
        .setup          = fsg_setup,
        if ((rc = fsg_alloc()) != 0)
                return rc;
        fsg = the_fsg;
-       if ((rc = usb_gadget_register_driver(&fsg_driver)) != 0)
+       if ((rc = usb_gadget_probe_driver(&fsg_driver, fsg_bind)) != 0)
                kref_put(&fsg->ref, fsg_release);
        return rc;
 }
 
 }
 
 /*-------------------------------------------------------------------------
-       Gadget driver register and unregister.
+       Gadget driver probe and unregister.
  --------------------------------------------------------------------------*/
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        int retval;
        unsigned long flags = 0;
 
        if (!driver || (driver->speed != USB_SPEED_FULL
                        && driver->speed != USB_SPEED_HIGH)
-                       || !driver->bind || !driver->disconnect
-                       || !driver->setup)
+                       || !bind || !driver->disconnect || !driver->setup)
                return -EINVAL;
 
        if (udc_controller->driver)
        udc_controller->gadget.speed = (enum usb_device_speed)(driver->speed);
        spin_unlock_irqrestore(&udc_controller->lock, flags);
 
-       retval = driver->bind(&udc_controller->gadget);
+       retval = bind(&udc_controller->gadget);
        if (retval) {
                dev_err(udc_controller->dev, "bind to %s --> %d",
                                driver->driver.name, retval);
                udc_controller->gadget.name, driver->driver.name);
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
 {
 
  * Hook to gadget drivers
  * Called by initialization code of gadget drivers
 *----------------------------------------------------------------*/
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        int retval = -ENODEV;
        unsigned long flags = 0;
 
        if (!driver || (driver->speed != USB_SPEED_FULL
                                && driver->speed != USB_SPEED_HIGH)
-                       || !driver->bind || !driver->disconnect
-                       || !driver->setup)
+                       || !bind || !driver->disconnect || !driver->setup)
                return -EINVAL;
 
        if (udc_controller->driver)
        spin_unlock_irqrestore(&udc_controller->lock, flags);
 
        /* bind udc driver to gadget driver */
-       retval = driver->bind(&udc_controller->gadget);
+       retval = bind(&udc_controller->gadget);
        if (retval) {
                VDBG("bind to %s --> %d", driver->driver.name, retval);
                udc_controller->gadget.dev.driver = NULL;
                       retval);
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 /* Disconnect from gadget driver */
 int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
 
 static struct usb_gadget_driver gmidi_driver = {
        .speed          = USB_SPEED_FULL,
        .function       = (char *)longname,
-       .bind           = gmidi_bind,
        .unbind         = gmidi_unbind,
 
        .setup          = gmidi_setup,
 
 static int __init gmidi_init(void)
 {
-       return usb_gadget_register_driver(&gmidi_driver);
+       return usb_gadget_probe_driver(&gmidi_driver, gmidi_bind);
 }
 module_init(gmidi_init);
 
 
  * disconnect is reported.  then a host may connect again, or
  * the driver might get unbound.
  */
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct goku_udc *dev = the_controller;
        int                     retval;
 
        if (!driver
                        || driver->speed < USB_SPEED_FULL
-                       || !driver->bind
+                       || !bind
                        || !driver->disconnect
                        || !driver->setup)
                return -EINVAL;
        driver->driver.bus = NULL;
        dev->driver = driver;
        dev->gadget.dev.driver = &driver->driver;
-       retval = driver->bind(&dev->gadget);
+       retval = bind(&dev->gadget);
        if (retval) {
                DBG(dev, "bind to driver %s --> error %d\n",
                                driver->driver.name, retval);
        DBG(dev, "registered gadget driver '%s'\n", driver->driver.name);
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 static void
 stop_activity(struct goku_udc *dev, struct usb_gadget_driver *driver)
 
  * USB gadged driver functions
  *******************************************************************************
  */
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct imx_udc_struct *imx_usb = &controller;
        int retval;
 
        if (!driver
                || driver->speed < USB_SPEED_FULL
-               || !driver->bind
+               || !bind
                || !driver->disconnect
                || !driver->setup)
                        return -EINVAL;
        retval = device_add(&imx_usb->gadget.dev);
        if (retval)
                goto fail;
-       retval = driver->bind(&imx_usb->gadget);
+       retval = bind(&imx_usb->gadget);
        if (retval) {
                D_ERR(imx_usb->dev, "<%s> bind to driver %s --> error %d\n",
                        __func__, driver->driver.name, retval);
        imx_usb->gadget.dev.driver = NULL;
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
 {
 
        .speed          = USB_SPEED_FULL,
 #endif
        .function       = (char *) driver_desc,
-       .bind           = gadgetfs_bind,
        .unbind         = gadgetfs_unbind,
        .setup          = gadgetfs_setup,
        .disconnect     = gadgetfs_disconnect,
 
 static struct usb_gadget_driver probe_driver = {
        .speed          = USB_SPEED_HIGH,
-       .bind           = gadgetfs_probe,
        .unbind         = gadgetfs_nop,
        .setup          = (void *)gadgetfs_nop,
        .disconnect     = gadgetfs_nop,
 
        /* triggers gadgetfs_bind(); then we can enumerate. */
        spin_unlock_irq (&dev->lock);
-       value = usb_gadget_register_driver (&gadgetfs_driver);
+       value = usb_gadget_probe_driver(&gadgetfs_driver, gadgetfs_bind);
        if (value != 0) {
                kfree (dev->buf);
                dev->buf = NULL;
                return -ESRCH;
 
        /* fake probe to determine $CHIP */
-       (void) usb_gadget_register_driver (&probe_driver);
+       (void) usb_gadget_probe_driver(&probe_driver, gadgetfs_probe);
        if (!CHIP)
                return -ENODEV;
 
 
  * the driver might get unbound.
  */
 
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct langwell_udc     *dev = the_controller;
        unsigned long           flags;
 
        spin_unlock_irqrestore(&dev->lock, flags);
 
-       retval = driver->bind(&dev->gadget);
+       retval = bind(&dev->gadget);
        if (retval) {
                dev_dbg(&dev->pdev->dev, "bind to driver %s --> %d\n",
                                driver->driver.name, retval);
        dev_dbg(&dev->pdev->dev, "<--- %s()\n", __func__);
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 
 /* unregister gadget driver */
 
        dev_dbg(&dev->pdev->dev, "---> %s()\n", __func__);
 
-       if (unlikely(!driver || !driver->bind || !driver->unbind))
+       if (unlikely(!driver || !driver->unbind))
                return -EINVAL;
 
        /* exit PHY low power suspend */
 
 /*
   Register entry point for the peripheral controller driver.
 */
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct lh7a40x_udc *dev = the_controller;
        int retval;
 
        if (!driver
                        || driver->speed != USB_SPEED_FULL
-                       || !driver->bind
+                       || !bind
                        || !driver->disconnect
                        || !driver->setup)
                return -EINVAL;
        dev->gadget.dev.driver = &driver->driver;
 
        device_add(&dev->gadget.dev);
-       retval = driver->bind(&dev->gadget);
+       retval = bind(&dev->gadget);
        if (retval) {
                printk(KERN_WARNING "%s: bind to driver %s --> error %d\n",
                       dev->gadget.name, driver->driver.name, retval);
 
        return 0;
 }
-
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 /*
   Unregister entry point for the peripheral controller driver.
 
 /*-------------------------------------------------------------------------*/
 static struct m66592 *the_controller;
 
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct m66592 *m66592 = the_controller;
        int retval;
 
        if (!driver
                        || driver->speed != USB_SPEED_HIGH
-                       || !driver->bind
+                       || !bind
                        || !driver->setup)
                return -EINVAL;
        if (!m66592)
                goto error;
        }
 
-       retval = driver->bind (&m66592->gadget);
+       retval = bind(&m66592->gadget);
        if (retval) {
                pr_err("bind to driver error (%d)\n", retval);
                device_del(&m66592->gadget.dev);
 
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
 {
 
  * disconnect is reported.  then a host may connect again, or
  * the driver might get unbound.
  */
-int usb_gadget_register_driver (struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct net2280          *dev = the_controller;
        int                     retval;
         */
        if (!driver
                        || driver->speed != USB_SPEED_HIGH
-                       || !driver->bind
-                       || !driver->setup)
+                       || !bind || !driver->setup)
                return -EINVAL;
        if (!dev)
                return -ENODEV;
        driver->driver.bus = NULL;
        dev->driver = driver;
        dev->gadget.dev.driver = &driver->driver;
-       retval = driver->bind (&dev->gadget);
+       retval = bind(&dev->gadget);
        if (retval) {
                DEBUG (dev, "bind to driver %s --> %d\n",
                                driver->driver.name, retval);
        dev->driver = NULL;
        return retval;
 }
-EXPORT_SYMBOL (usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 static void
 stop_activity (struct net2280 *dev, struct usb_gadget_driver *driver)
 
                );
 }
 
-int usb_gadget_register_driver (struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        int             status = -ENODEV;
        struct omap_ep  *ep;
        if (!driver
                        // FIXME if otg, check:  driver->is_otg
                        || driver->speed < USB_SPEED_FULL
-                       || !driver->bind
-                       || !driver->setup)
+                       || !bind || !driver->setup)
                return -EINVAL;
 
        spin_lock_irqsave(&udc->lock, flags);
        if (udc->dc_clk != NULL)
                omap_udc_enable_clock(1);
 
-       status = driver->bind (&udc->gadget);
+       status = bind(&udc->gadget);
        if (status) {
                DBG("bind to %s --> %d\n", driver->driver.name, status);
                udc->gadget.dev.driver = NULL;
                omap_udc_enable_clock(0);
        return status;
 }
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
 {
 
        .speed          = DEVSPEED,
 
        .function       = (char *) driver_desc,
-       .bind           = printer_bind,
        .unbind         = printer_unbind,
 
        .setup          = printer_setup,
                return status;
        }
 
-       status = usb_gadget_register_driver(&printer_driver);
+       status = usb_gadget_probe_driver(&printer_driver, printer_bind);
        if (status) {
                class_destroy(usb_gadget_class);
                unregister_chrdev_region(g_printer_devno, 1);
-               DBG(dev, "usb_gadget_register_driver %x\n", status);
+               DBG(dev, "usb_gadget_probe_driver %x\n", status);
        }
 
        return status;
 
  * disconnect is reported.  then a host may connect again, or
  * the driver might get unbound.
  */
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct pxa25x_udc       *dev = the_controller;
        int                     retval;
 
        if (!driver
                        || driver->speed < USB_SPEED_FULL
-                       || !driver->bind
+                       || !bind
                        || !driver->disconnect
                        || !driver->setup)
                return -EINVAL;
                dev->gadget.dev.driver = NULL;
                return retval;
        }
-       retval = driver->bind(&dev->gadget);
+       retval = bind(&dev->gadget);
        if (retval) {
                DMSG("bind to driver %s --> error %d\n",
                                driver->driver.name, retval);
 bind_fail:
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 static void
 stop_activity(struct pxa25x_udc *dev, struct usb_gadget_driver *driver)
 
 }
 
 /**
- * usb_gadget_register_driver - Register gadget driver
+ * usb_gadget_probe_driver - Register gadget driver
  * @driver: gadget driver
+ * @bind: bind function
  *
  * When a driver is successfully registered, it will receive control requests
  * including set_configuration(), which enables non-control requests.  Then
  *
  * Returns 0 if no error, -EINVAL, -ENODEV, -EBUSY otherwise
  */
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct pxa_udc *udc = the_controller;
        int retval;
 
-       if (!driver || driver->speed < USB_SPEED_FULL || !driver->bind
+       if (!driver || driver->speed < USB_SPEED_FULL || !bind
                        || !driver->disconnect || !driver->setup)
                return -EINVAL;
        if (!udc)
                dev_err(udc->dev, "device_add error %d\n", retval);
                goto add_fail;
        }
-       retval = driver->bind(&udc->gadget);
+       retval = bind(&udc->gadget);
        if (retval) {
                dev_err(udc->dev, "bind to driver %s --> error %d\n",
                        driver->driver.name, retval);
        udc->gadget.dev.driver = NULL;
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 
 /**
 
 /*-------------------------------------------------------------------------*/
 static struct r8a66597 *the_controller;
 
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct r8a66597 *r8a66597 = the_controller;
        int retval;
 
        if (!driver
                        || driver->speed != USB_SPEED_HIGH
-                       || !driver->bind
+                       || !bind
                        || !driver->setup)
                return -EINVAL;
        if (!r8a66597)
                goto error;
        }
 
-       retval = driver->bind(&r8a66597->gadget);
+       retval = bind(&r8a66597->gadget);
        if (retval) {
                printk(KERN_ERR "bind to driver error (%d)\n", retval);
                device_del(&r8a66597->gadget.dev);
 
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
 {
 
        return 0;
 }
 
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct s3c_hsotg *hsotg = our_hsotg;
        int ret;
                dev_err(hsotg->dev, "%s: bad speed\n", __func__);
        }
 
-       if (!driver->bind || !driver->setup) {
+       if (!bind || !driver->setup) {
                dev_err(hsotg->dev, "%s: missing entry points\n", __func__);
                return -EINVAL;
        }
                goto err;
        }
 
-       ret = driver->bind(&hsotg->gadget);
+       ret = bind(&hsotg->gadget);
        if (ret) {
                dev_err(hsotg->dev, "failed bind %s\n", driver->driver.name);
 
        hsotg->gadget.dev.driver = NULL;
        return ret;
 }
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
 {
 
 }
 
 /*
- *     usb_gadget_register_driver
+ *     usb_gadget_probe_driver
  */
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct s3c2410_udc *udc = the_controller;
        int             retval;
 
-       dprintk(DEBUG_NORMAL, "usb_gadget_register_driver() '%s'\n",
-               driver->driver.name);
+       dprintk(DEBUG_NORMAL, "%s() '%s'\n", __func__, driver->driver.name);
 
        /* Sanity checks */
        if (!udc)
        if (udc->driver)
                return -EBUSY;
 
-       if (!driver->bind || !driver->setup
-                       || driver->speed < USB_SPEED_FULL) {
+       if (!bind || !driver->setup || driver->speed < USB_SPEED_FULL) {
                printk(KERN_ERR "Invalid driver: bind %p setup %p speed %d\n",
-                       driver->bind, driver->setup, driver->speed);
+                       bind, driver->setup, driver->speed);
                return -EINVAL;
        }
 #if defined(MODULE)
        dprintk(DEBUG_NORMAL, "binding gadget driver '%s'\n",
                driver->driver.name);
 
-       if ((retval = driver->bind (&udc->gadget)) != 0) {
+       if ((retval = bind(&udc->gadget)) != 0) {
                device_del(&udc->gadget.dev);
                goto register_error;
        }
        udc->gadget.dev.driver = NULL;
        return retval;
 }
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 /*
  *     usb_gadget_unregister_driver
 }
 
 EXPORT_SYMBOL(usb_gadget_unregister_driver);
-EXPORT_SYMBOL(usb_gadget_register_driver);
 
 module_init(udc_init);
 module_exit(udc_exit);
 
  * -ENOMEM no memeory to perform the operation
  *
  * @param driver the gadget driver
+ * @param bind the driver's bind function
  * @return <0 if error, 0 if everything is fine
  */
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        int retval;
        unsigned long flags;
 
        if (!driver
                        || driver->speed != USB_SPEED_HIGH
-                       || !driver->bind
-                       || !driver->setup)
+                       || !bind || !driver->setup)
                return -EINVAL;
 
        /* driver must be initialized to support peripheral mode */
        spin_unlock_irqrestore(&musb->lock, flags);
 
        if (retval == 0) {
-               retval = driver->bind(&musb->g);
+               retval = bind(&musb->g);
                if (retval != 0) {
                        DBG(3, "bind to driver %s failed --> %d\n",
                                        driver->driver.name, retval);
 
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 static void stop_activity(struct musb *musb, struct usb_gadget_driver *driver)
 {
 
  * struct usb_gadget_driver - driver for usb 'slave' devices
  * @function: String describing the gadget's function
  * @speed: Highest speed the driver handles.
- * @bind: Invoked when the driver is bound to a gadget, usually
- *     after registering the driver.
- *     At that point, ep0 is fully initialized, and ep_list holds
- *     the currently-available endpoints.
- *     Called in a context that permits sleeping.
  * @setup: Invoked for ep0 control requests that aren't handled by
  *     the hardware level driver. Most calls must be handled by
  *     the gadget driver, including descriptor and configuration
 struct usb_gadget_driver {
        char                    *function;
        enum usb_device_speed   speed;
-       int                     (*bind)(struct usb_gadget *);
        void                    (*unbind)(struct usb_gadget *);
        int                     (*setup)(struct usb_gadget *,
                                        const struct usb_ctrlrequest *);
  */
 
 /**
- * usb_gadget_register_driver - register a gadget driver
- * @driver:the driver being registered
+ * usb_gadget_probe_driver - probe a gadget driver
+ * @driver: the driver being registered
+ * @bind: the driver's bind callback
  * Context: can sleep
  *
  * Call this in your gadget driver's module initialization function,
  * to tell the underlying usb controller driver about your driver.
- * The driver's bind() function will be called to bind it to a
- * gadget before this registration call returns.  It's expected that
- * the bind() functions will be in init sections.
+ * The @bind() function will be called to bind it to a gadget before this
+ * registration call returns.  It's expected that the @bind() function will
+ * be in init sections.
  */
-int usb_gadget_register_driver(struct usb_gadget_driver *driver);
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
 
 /**
  * usb_gadget_unregister_driver - unregister a gadget driver