summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorRajesh Bhagat <rajesh.bhagat@freescale.com>2015-11-20 07:15:31 (GMT)
committerXie Xiaobo <xiaobo.xie@nxp.com>2017-09-25 07:25:36 (GMT)
commit794efac79838052fbd138e843a92394cd945e5fb (patch)
treec7aac1810ef215afafb8814ef3d098e4c53ea5d9 /drivers
parentdb554709e228c5d8ee2f91463c9aef0534c0485b (diff)
downloadlinux-794efac79838052fbd138e843a92394cd945e5fb.tar.xz
usb: dwc3 : Add support for USB snooping
Add support for USB3 snooping by asserting bits in register DWC3_GSBUSCFG0 for data and descriptor Signed-off-by: Nikhil Badola <nikhil.badola@freescale.com> Signed-off-by: Rajesh Bhagat <rajesh.bhagat@freescale.com> Signed-off-by: yinbo.zhu <yinbo.zhu@nxp.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/dwc3/core.c11
-rw-r--r--drivers/usb/dwc3/core.h1
-rw-r--r--drivers/usb/dwc3/host.c6
3 files changed, 17 insertions, 1 deletions
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index c6a8444..8e2e7a7 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -58,6 +58,7 @@ static int dwc3_get_dr_mode(struct dwc3 *dwc)
enum usb_dr_mode mode;
struct device *dev = dwc->dev;
unsigned int hw_mode;
+ struct device_node *node = dev->of_node;
if (dwc->dr_mode == USB_DR_MODE_UNKNOWN)
dwc->dr_mode = USB_DR_MODE_OTG;
@@ -94,6 +95,13 @@ static int dwc3_get_dr_mode(struct dwc3 *dwc)
dwc3_writel(dwc->regs, DWC3_GSBUSCFG1,
dwc3_readl(dwc->regs, DWC3_GSBUSCFG1) | 0xf00);
+ /* Enable Snooping */
+ if (node && of_dma_is_coherent(node)) {
+ dwc3_writel(dwc->regs, DWC3_GSBUSCFG0,
+ dwc3_readl(dwc->regs, DWC3_GSBUSCFG0) | 0x22220000);
+ dev_dbg(dev, "enabled snooping for usb\n");
+ }
+
if (IS_ENABLED(CONFIG_USB_DWC3_HOST))
mode = USB_DR_MODE_HOST;
else if (IS_ENABLED(CONFIG_USB_DWC3_GADGET))
@@ -1099,6 +1107,8 @@ static void dwc3_get_properties(struct dwc3 *dwc)
static int dwc3_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
+ struct dwc3_platform_data *pdata = dev_get_platdata(dev);
+ struct device_node *node = dev->of_node;
struct resource *res;
struct dwc3 *dwc;
u8 lpm_nyet_threshold;
@@ -1108,7 +1118,6 @@ static int dwc3_probe(struct platform_device *pdev)
int ret;
void __iomem *regs;
- struct device_node *node = dev->of_node;
void *mem;
mem = devm_kzalloc(dev, sizeof(*dwc) + DWC3_ALIGN_MASK, GFP_KERNEL);
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index dced3b8..9151eef 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -26,6 +26,7 @@
#include <linux/dma-mapping.h>
#include <linux/mm.h>
#include <linux/debugfs.h>
+#include <linux/of_address.h>
#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
diff --git a/drivers/usb/dwc3/host.c b/drivers/usb/dwc3/host.c
index 1505384..f1b9827 100644
--- a/drivers/usb/dwc3/host.c
+++ b/drivers/usb/dwc3/host.c
@@ -84,6 +84,12 @@ int dwc3_host_init(struct dwc3 *dwc)
xhci->dev.dma_mask = dwc->dev->dma_mask;
xhci->dev.dma_parms = dwc->dev->dma_parms;
+ /* set DMA operations */
+ if (dwc->dev->of_node && of_dma_is_coherent(dwc->dev->of_node)) {
+ xhci->dev.archdata.dma_ops = dwc->dev->archdata.dma_ops;
+ dev_dbg(dwc->dev, "set dma_ops for usb\n");
+ }
+
dwc->xhci = xhci;
ret = platform_device_add_resources(xhci, dwc->xhci_resources,