#include <linux/io.h>
 #include <linux/of.h>
 
+#include <linux/usb/otg.h>
+#include <linux/usb/nop-usb-xceiv.h>
+
 #include "core.h"
 
 /*
        spinlock_t              lock;
 
        struct platform_device  *dwc3;
+       struct platform_device  *usb2_phy;
+       struct platform_device  *usb3_phy;
        struct device           *dev;
 
        int                     irq;
        writel(value, base + offset);
 }
 
+static int __devinit dwc3_omap_register_phys(struct dwc3_omap *omap)
+{
+       struct nop_usb_xceiv_platform_data pdata;
+       struct platform_device  *pdev;
+       int                     ret;
+
+       memset(&pdata, 0x00, sizeof(pdata));
+
+       pdev = platform_device_alloc("nop_usb_xceiv", 0);
+       if (!pdev)
+               return -ENOMEM;
+
+       omap->usb2_phy = pdev;
+       pdata.type = USB_PHY_TYPE_USB2;
+
+       ret = platform_device_add_data(omap->usb2_phy, &pdata, sizeof(pdata));
+       if (ret)
+               goto err1;
+
+       pdev = platform_device_alloc("nop_usb_xceiv", 1);
+       if (!pdev) {
+               ret = -ENOMEM;
+               goto err1;
+       }
+
+       omap->usb3_phy = pdev;
+       pdata.type = USB_PHY_TYPE_USB3;
+
+       ret = platform_device_add_data(omap->usb3_phy, &pdata, sizeof(pdata));
+       if (ret)
+               goto err2;
+
+       ret = platform_device_add(omap->usb2_phy);
+       if (ret)
+               goto err2;
+
+       ret = platform_device_add(omap->usb3_phy);
+       if (ret)
+               goto err3;
+
+       return 0;
+
+err3:
+       platform_device_del(omap->usb2_phy);
+
+err2:
+       platform_device_put(omap->usb3_phy);
+
+err1:
+       platform_device_put(omap->usb2_phy);
+
+       return ret;
+}
 
 static irqreturn_t dwc3_omap_interrupt(int irq, void *_omap)
 {
                return -ENOMEM;
        }
 
+       ret = dwc3_omap_register_phys(omap);
+       if (ret) {
+               dev_err(dev, "couldn't register PHYs\n");
+               return ret;
+       }
+
        devid = dwc3_get_device_id();
        if (devid < 0)
                return -ENODEV;
        struct dwc3_omap        *omap = platform_get_drvdata(pdev);
 
        platform_device_unregister(omap->dwc3);
+       platform_device_unregister(omap->usb2_phy);
+       platform_device_unregister(omap->usb3_phy);
 
        dwc3_put_device_id(omap->dwc3->id);