diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/usb/dwc3/core.c | 57 | ||||
| -rw-r--r-- | drivers/usb/dwc3/core.h | 11 | ||||
| -rw-r--r-- | drivers/usb/dwc3/dwc3-omap.c | 2 | ||||
| -rw-r--r-- | drivers/usb/dwc3/dwc3-pci.c | 4 | 
4 files changed, 46 insertions, 28 deletions
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 1f67606fd4f..df151992e49 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -325,15 +325,17 @@ static void dwc3_core_exit(struct dwc3 *dwc)  static int __devinit dwc3_probe(struct platform_device *pdev)  { -	const struct platform_device_id *id = platform_get_device_id(pdev);  	struct resource		*res;  	struct dwc3		*dwc; -	void __iomem		*regs; -	unsigned int		features = id->driver_data; +  	int			ret = -ENOMEM;  	int			irq; + +	void __iomem		*regs;  	void			*mem; +	u8			mode; +  	mem = kzalloc(sizeof(*dwc) + DWC3_ALIGN_MASK, GFP_KERNEL);  	if (!mem) {  		dev_err(&pdev->dev, "not enough memory\n"); @@ -396,13 +398,22 @@ static int __devinit dwc3_probe(struct platform_device *pdev)  		goto err3;  	} -	if (features & DWC3_HAS_PERIPHERAL) { +	mode = DWC3_MODE(dwc->hwparams.hwparams0); + +	switch (mode) { +	case DWC3_MODE_DRD: +	case DWC3_MODE_DEVICE:  		ret = dwc3_gadget_init(dwc);  		if (ret) { -			dev_err(&pdev->dev, "failed to initialized gadget\n"); +			dev_err(&pdev->dev, "failed to initialize gadget\n");  			goto err4;  		} +		break; +	default: +		dev_err(&pdev->dev, "Unsupported mode of operation %d\n", mode); +		goto err4;  	} +	dwc->mode = mode;  	ret = dwc3_debugfs_init(dwc);  	if (ret) { @@ -415,8 +426,15 @@ static int __devinit dwc3_probe(struct platform_device *pdev)  	return 0;  err5: -	if (features & DWC3_HAS_PERIPHERAL) +	switch (mode) { +	case DWC3_MODE_DRD: +	case DWC3_MODE_DEVICE:  		dwc3_gadget_exit(dwc); +		break; +	default: +		/* do nothing */ +		break; +	}  err4:  	dwc3_core_exit(dwc); @@ -436,10 +454,8 @@ err0:  static int __devexit dwc3_remove(struct platform_device *pdev)  { -	const struct platform_device_id *id = platform_get_device_id(pdev);  	struct dwc3	*dwc = platform_get_drvdata(pdev);  	struct resource	*res; -	unsigned int	features = id->driver_data;  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -448,8 +464,15 @@ static int __devexit dwc3_remove(struct platform_device *pdev)  	dwc3_debugfs_exit(dwc); -	if (features & DWC3_HAS_PERIPHERAL) +	switch (dwc->mode) { +	case DWC3_MODE_DRD: +	case DWC3_MODE_DEVICE:  		dwc3_gadget_exit(dwc); +		break; +	default: +		/* do nothing */ +		break; +	}  	dwc3_core_exit(dwc);  	release_mem_region(res->start, resource_size(res)); @@ -459,28 +482,12 @@ static int __devexit dwc3_remove(struct platform_device *pdev)  	return 0;  } -static const struct platform_device_id dwc3_id_table[] __devinitconst = { -	{ -		.name	= "dwc3-omap", -		.driver_data = (DWC3_HAS_PERIPHERAL -			| DWC3_HAS_XHCI -			| DWC3_HAS_OTG), -	}, -	{ -		.name	= "dwc3-pci", -		.driver_data = DWC3_HAS_PERIPHERAL, -	}, -	{  },	/* Terminating Entry */ -}; -MODULE_DEVICE_TABLE(platform, dwc3_id_table); -  static struct platform_driver dwc3_driver = {  	.probe		= dwc3_probe,  	.remove		= __devexit_p(dwc3_remove),  	.driver		= {  		.name	= "dwc3",  	}, -	.id_table	= dwc3_id_table,  };  MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>"); diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 4b6c673ed60..a3ef8f34bf7 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -536,6 +536,15 @@ struct dwc3_hwparams {  	u32	hwparams8;  }; +/* HWPARAMS0 */ +#define DWC3_MODE(n)		((n) & 0x7) + +#define DWC3_MODE_DEVICE	0 +#define DWC3_MODE_HOST		1 +#define DWC3_MODE_DRD		2 +#define DWC3_MODE_HUB		3 + +/* HWPARAMS1 */  #define DWC3_NUM_INT(n)	(((n) & (0x3f << 15)) >> 15)  /** @@ -560,6 +569,7 @@ struct dwc3_hwparams {   * @num_event_buffers: calculated number of event buffers   * @maximum_speed: maximum speed requested (mainly for testing purposes)   * @revision: revision register contents + * @mode: mode of operation   * @is_selfpowered: true when we are selfpowered   * @three_stage_setup: set if we perform a three phase setup   * @ep0_status_pending: ep0 status response without a req is pending @@ -602,6 +612,7 @@ struct dwc3 {  	u32			num_event_buffers;  	u32			maximum_speed;  	u32			revision; +	u32			mode;  #define DWC3_REVISION_173A	0x5533173a  #define DWC3_REVISION_175A	0x5533175a diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c index 062552b5fc8..7bcf6775a1a 100644 --- a/drivers/usb/dwc3/dwc3-omap.c +++ b/drivers/usb/dwc3/dwc3-omap.c @@ -236,7 +236,7 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev)  		goto err1;  	} -	dwc3 = platform_device_alloc("dwc3-omap", -1); +	dwc3 = platform_device_alloc("dwc3", -1);  	if (!dwc3) {  		dev_err(&pdev->dev, "couldn't allocate dwc3 device\n");  		goto err2; diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c index f77c0004268..193f1bd90d5 100644 --- a/drivers/usb/dwc3/dwc3-pci.c +++ b/drivers/usb/dwc3/dwc3-pci.c @@ -118,7 +118,7 @@ static int __devinit dwc3_pci_probe(struct pci_dev *pci,  	if (devid < 0)  		goto err2; -	dwc3 = platform_device_alloc("dwc3-pci", devid); +	dwc3 = platform_device_alloc("dwc3", devid);  	if (!dwc3) {  		dev_err(&pci->dev, "couldn't allocate dwc3 device\n");  		goto err3; @@ -196,7 +196,7 @@ static DEFINE_PCI_DEVICE_TABLE(dwc3_pci_id_table) = {  MODULE_DEVICE_TABLE(pci, dwc3_pci_id_table);  static struct pci_driver dwc3_pci_driver = { -	.name		= "pci-dwc3", +	.name		= "dwc3-pci",  	.id_table	= dwc3_pci_id_table,  	.probe		= dwc3_pci_probe,  	.remove		= __devexit_p(dwc3_pci_remove),  |