dev_dbg(udc->dev, "registered gadget driver '%s'\n",
                driver->driver.name);
 
+       if (udc->transceiver) {
+               retval = otg_set_peripheral(udc->transceiver, &udc->gadget);
+               if (retval) {
+                       dev_err(udc->dev, "can't bind to transceiver\n");
+                       goto transceiver_fail;
+               }
+       }
+
        if (should_enable_udc(udc))
                udc_enable(udc);
        return 0;
 
+transceiver_fail:
+       if (driver->unbind)
+               driver->unbind(&udc->gadget);
 bind_fail:
        device_del(&udc->gadget.dev);
 add_fail:
        udc->driver = NULL;
 
        device_del(&udc->gadget.dev);
-
        dev_info(udc->dev, "unregistered gadget driver '%s'\n",
                 driver->driver.name);
+
+       if (udc->transceiver)
+               return otg_set_peripheral(udc->transceiver, NULL);
        return 0;
 }
 EXPORT_SYMBOL(usb_gadget_unregister_driver);
 
        udc->dev = &pdev->dev;
        udc->mach = pdev->dev.platform_data;
+       udc->transceiver = otg_get_transceiver();
 
        gpio = udc->mach->gpio_pullup;
        if (gpio_is_valid(gpio)) {
        if (gpio_is_valid(gpio))
                gpio_free(gpio);
 
+       otg_put_transceiver(udc->transceiver);
+
+       udc->transceiver = NULL;
        platform_set_drvdata(_dev, NULL);
        the_controller = NULL;
        clk_put(udc->clk);
 
 #include <linux/types.h>
 #include <linux/spinlock.h>
 #include <linux/io.h>
+#include <linux/usb/otg.h>
 
 /*
  * Register definitions
  * @driver: bound gadget (zero, g_ether, g_file_storage, ...)
  * @dev: device
  * @mach: machine info, used to activate specific GPIO
+ * @transceiver: external transceiver to handle vbus sense and D+ pullup
  * @ep0state: control endpoint state machine state
  * @stats: statistics on udc usage
  * @udc_usb_ep: array of usb endpoints offered by the gadget
        struct usb_gadget_driver                *driver;
        struct device                           *dev;
        struct pxa2xx_udc_mach_info             *mach;
+       struct otg_transceiver                  *transceiver;
 
        enum ep0_state                          ep0state;
        struct udc_stats                        stats;