return -EOPNOTSUPP;
 }
 
-static int pxa27x_udc_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *));
-static int pxa27x_udc_stop(struct usb_gadget_driver *driver);
+static int pxa27x_udc_start(struct usb_gadget *g,
+               struct usb_gadget_driver *driver);
+static int pxa27x_udc_stop(struct usb_gadget *g,
+               struct usb_gadget_driver *driver);
 
 static const struct usb_gadget_ops pxa_udc_ops = {
        .get_frame      = pxa_udc_get_frame,
        .pullup         = pxa_udc_pullup,
        .vbus_session   = pxa_udc_vbus_session,
        .vbus_draw      = pxa_udc_vbus_draw,
-       .start          = pxa27x_udc_start,
-       .stop           = pxa27x_udc_stop,
+       .udc_start      = pxa27x_udc_start,
+       .udc_stop       = pxa27x_udc_stop,
 };
 
 /**
  *
  * Returns 0 if no error, -EINVAL, -ENODEV, -EBUSY otherwise
  */
-static int pxa27x_udc_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *))
+static int pxa27x_udc_start(struct usb_gadget *g,
+               struct usb_gadget_driver *driver)
 {
-       struct pxa_udc *udc = the_controller;
+       struct pxa_udc *udc = to_pxa(g);
        int retval;
 
-       if (!driver || driver->max_speed < USB_SPEED_FULL || !bind
-                       || !driver->disconnect || !driver->setup)
-               return -EINVAL;
-       if (!udc)
-               return -ENODEV;
-       if (udc->driver)
-               return -EBUSY;
-
        /* first hook up the driver ... */
        udc->driver = driver;
        udc->gadget.dev.driver = &driver->driver;
        retval = device_add(&udc->gadget.dev);
        if (retval) {
                dev_err(udc->dev, "device_add error %d\n", retval);
-               goto add_fail;
+               goto fail;
        }
-       retval = bind(&udc->gadget, driver);
-       if (retval) {
-               dev_err(udc->dev, "bind to driver %s --> error %d\n",
-                       driver->driver.name, retval);
-               goto bind_fail;
-       }
-       dev_dbg(udc->dev, "registered gadget driver '%s'\n",
-               driver->driver.name);
-
        if (!IS_ERR_OR_NULL(udc->transceiver)) {
                retval = otg_set_peripheral(udc->transceiver->otg,
                                                &udc->gadget);
                if (retval) {
                        dev_err(udc->dev, "can't bind to transceiver\n");
-                       goto transceiver_fail;
+                       goto fail;
                }
        }
 
                udc_enable(udc);
        return 0;
 
-transceiver_fail:
-       if (driver->unbind)
-               driver->unbind(&udc->gadget);
-bind_fail:
-       device_del(&udc->gadget.dev);
-add_fail:
+fail:
        udc->driver = NULL;
        udc->gadget.dev.driver = NULL;
        return retval;
 
        for (i = 0; i < NR_USB_ENDPOINTS; i++)
                pxa_ep_disable(&udc->udc_usb_ep[i].usb_ep);
-
-       if (driver)
-               driver->disconnect(&udc->gadget);
 }
 
 /**
  *
  * Returns 0 if no error, -ENODEV, -EINVAL otherwise
  */
-static int pxa27x_udc_stop(struct usb_gadget_driver *driver)
+static int pxa27x_udc_stop(struct usb_gadget *g,
+               struct usb_gadget_driver *driver)
 {
-       struct pxa_udc *udc = the_controller;
-
-       if (!udc)
-               return -ENODEV;
-       if (!driver || driver != udc->driver || !driver->unbind)
-               return -EINVAL;
+       struct pxa_udc *udc = to_pxa(g);
 
        stop_activity(udc, driver);
        udc_disable(udc);
        dplus_pullup(udc, 0);
 
-       driver->unbind(&udc->gadget);
        udc->driver = NULL;
 
        device_del(&udc->gadget.dev);
-       dev_info(udc->dev, "unregistered gadget driver '%s'\n",
-                driver->driver.name);
 
        if (!IS_ERR_OR_NULL(udc->transceiver))
                return otg_set_peripheral(udc->transceiver->otg, NULL);