diff options
Diffstat (limited to 'drivers/usb/cdns3')
| -rw-r--r-- | drivers/usb/cdns3/cdns3-ti.c | 15 | ||||
| -rw-r--r-- | drivers/usb/cdns3/cdnsp-pci.c | 2 | ||||
| -rw-r--r-- | drivers/usb/cdns3/core.h | 1 | ||||
| -rw-r--r-- | drivers/usb/cdns3/drd.c | 10 | ||||
| -rw-r--r-- | drivers/usb/cdns3/drd.h | 3 | 
5 files changed, 28 insertions, 3 deletions
| diff --git a/drivers/usb/cdns3/cdns3-ti.c b/drivers/usb/cdns3/cdns3-ti.c index 5945c4b1e11f..cfabc12ee0e3 100644 --- a/drivers/usb/cdns3/cdns3-ti.c +++ b/drivers/usb/cdns3/cdns3-ti.c @@ -16,6 +16,7 @@  #include <linux/of_platform.h>  #include <linux/pm_runtime.h>  #include <linux/property.h> +#include "core.h"  /* USB Wrapper register offsets */  #define USBSS_PID		0x0 @@ -85,6 +86,18 @@ static inline void cdns_ti_writel(struct cdns_ti *data, u32 offset, u32 value)  	writel(value, data->usbss + offset);  } +static struct cdns3_platform_data cdns_ti_pdata = { +	.quirks = CDNS3_DRD_SUSPEND_RESIDENCY_ENABLE,   /* Errata i2409 */ +}; + +static const struct of_dev_auxdata cdns_ti_auxdata[] = { +	{ +		.compatible = "cdns,usb3", +		.platform_data = &cdns_ti_pdata, +	}, +	{}, +}; +  static int cdns_ti_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev; @@ -176,7 +189,7 @@ static int cdns_ti_probe(struct platform_device *pdev)  	reg |= USBSS_W1_PWRUP_RST;  	cdns_ti_writel(data, USBSS_W1, reg); -	error = of_platform_populate(node, NULL, NULL, dev); +	error = of_platform_populate(node, NULL, cdns_ti_auxdata, dev);  	if (error) {  		dev_err(dev, "failed to create children: %d\n", error);  		goto err; diff --git a/drivers/usb/cdns3/cdnsp-pci.c b/drivers/usb/cdns3/cdnsp-pci.c index 0725668ffea4..225540fc81ba 100644 --- a/drivers/usb/cdns3/cdnsp-pci.c +++ b/drivers/usb/cdns3/cdnsp-pci.c @@ -231,7 +231,7 @@ static const struct pci_device_id cdnsp_pci_ids[] = {  static struct pci_driver cdnsp_pci_driver = {  	.name = "cdnsp-pci", -	.id_table = &cdnsp_pci_ids[0], +	.id_table = cdnsp_pci_ids,  	.probe = cdnsp_pci_probe,  	.remove = cdnsp_pci_remove,  	.driver = { diff --git a/drivers/usb/cdns3/core.h b/drivers/usb/cdns3/core.h index 81a9c9d6be08..57d47348dc19 100644 --- a/drivers/usb/cdns3/core.h +++ b/drivers/usb/cdns3/core.h @@ -44,6 +44,7 @@ struct cdns3_platform_data {  			bool suspend, bool wakeup);  	unsigned long quirks;  #define CDNS3_DEFAULT_PM_RUNTIME_ALLOW	BIT(0) +#define CDNS3_DRD_SUSPEND_RESIDENCY_ENABLE	BIT(1)  };  /** diff --git a/drivers/usb/cdns3/drd.c b/drivers/usb/cdns3/drd.c index 8b936a2e93a0..84fb38a5723a 100644 --- a/drivers/usb/cdns3/drd.c +++ b/drivers/usb/cdns3/drd.c @@ -389,7 +389,7 @@ static irqreturn_t cdns_drd_irq(int irq, void *data)  int cdns_drd_init(struct cdns *cdns)  {  	void __iomem *regs; -	u32 state; +	u32 state, reg;  	int ret;  	regs = devm_ioremap_resource(cdns->dev, &cdns->otg_res); @@ -433,6 +433,14 @@ int cdns_drd_init(struct cdns *cdns)  			cdns->otg_irq_regs = (struct cdns_otg_irq_regs __iomem *)  					      &cdns->otg_v1_regs->ien;  			writel(1, &cdns->otg_v1_regs->simulate); + +			if (cdns->pdata && +			    (cdns->pdata->quirks & CDNS3_DRD_SUSPEND_RESIDENCY_ENABLE)) { +				reg = readl(&cdns->otg_v1_regs->susp_ctrl); +				reg |= SUSP_CTRL_SUSPEND_RESIDENCY_ENABLE; +				writel(reg, &cdns->otg_v1_regs->susp_ctrl); +			} +  			cdns->version  = CDNS3_CONTROLLER_V1;  		} else {  			dev_err(cdns->dev, "not supported DID=0x%08x\n", state); diff --git a/drivers/usb/cdns3/drd.h b/drivers/usb/cdns3/drd.h index d72370c321d3..1e2aee14d629 100644 --- a/drivers/usb/cdns3/drd.h +++ b/drivers/usb/cdns3/drd.h @@ -193,6 +193,9 @@ struct cdns_otg_irq_regs {  /* OTGREFCLK - bitmasks */  #define OTGREFCLK_STB_CLK_SWITCH_EN	BIT(31) +/* SUPS_CTRL - bitmasks */ +#define SUSP_CTRL_SUSPEND_RESIDENCY_ENABLE	BIT(17) +  /* OVERRIDE - bitmasks */  #define OVERRIDE_IDPULLUP		BIT(0)  /* Only for CDNS3_CONTROLLER_V0 version */ |