diff options
Diffstat (limited to 'drivers/usb/dwc3/dwc3-omap.c')
| -rw-r--r-- | drivers/usb/dwc3/dwc3-omap.c | 66 | 
1 files changed, 66 insertions, 0 deletions
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c index 479dc047da3..ee57a10d90d 100644 --- a/drivers/usb/dwc3/dwc3-omap.c +++ b/drivers/usb/dwc3/dwc3-omap.c @@ -48,6 +48,9 @@  #include <linux/io.h>  #include <linux/of.h> +#include <linux/usb/otg.h> +#include <linux/usb/nop-usb-xceiv.h> +  #include "core.h"  /* @@ -131,6 +134,8 @@ struct dwc3_omap {  	spinlock_t		lock;  	struct platform_device	*dwc3; +	struct platform_device	*usb2_phy; +	struct platform_device	*usb3_phy;  	struct device		*dev;  	int			irq; @@ -152,6 +157,59 @@ static inline void dwc3_omap_writel(void __iomem *base, u32 offset, u32 value)  	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)  { @@ -251,6 +309,12 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev)  		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; @@ -371,6 +435,8 @@ static int __devexit dwc3_omap_remove(struct platform_device *pdev)  	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);  |