#include <linux/clk.h>
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
+#include <linux/usb/otg.h>
 #include <linux/prefetch.h>
 
 #include <mach/regs-s3c2443-clock.h>
        struct usb_gadget_driver *driver;
        struct device *dev;
        struct s3c24xx_hsudc_platdata *pd;
+       struct otg_transceiver *transceiver;
        spinlock_t lock;
        void __iomem *regs;
        struct resource *mem_rsrc;
                return ret;
        }
 
+       /* connect to bus through transceiver */
+       if (hsudc->transceiver) {
+               ret = otg_set_peripheral(hsudc->transceiver, &hsudc->gadget);
+               if (ret) {
+                       dev_err(hsudc->dev, "%s: can't bind to transceiver\n",
+                                       hsudc->gadget.name);
+                       driver->unbind(&hsudc->gadget);
+
+                       device_del(&hsudc->gadget.dev);
+
+                       hsudc->driver = NULL;
+                       hsudc->gadget.dev.driver = NULL;
+                       return ret;
+               }
+       }
+
        enable_irq(hsudc->irq);
        dev_info(hsudc->dev, "bound driver %s\n", driver->driver.name);
 
        s3c_hsudc_stop_activity(hsudc, driver);
        spin_unlock_irqrestore(&hsudc->lock, flags);
 
+       if (hsudc->transceiver)
+               (void) otg_set_peripheral(hsudc->transceiver, NULL);
+
        driver->unbind(&hsudc->gadget);
        device_del(&hsudc->gadget.dev);
        disable_irq(hsudc->irq);
        hsudc->dev = dev;
        hsudc->pd = pdev->dev.platform_data;
 
+       hsudc->transceiver = otg_get_transceiver();
+
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
                dev_err(dev, "unable to obtain driver resource data\n");