[PATCH] USB: ehci-mxc: i.MX35: add workaround for ENGcm11601

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



i.MX35 has an issue that when USB DMA (SINGLE) transfers
are interrupted, the usb core can hang.

This patch implements the workaround described in ENGcm11601
by setting the AHB to use INCR transfers instead of SINGLE
transfers.

Signed-off-by: Bas Vermeulen <bas.vermeulen@xxxxxxxxxxxx>
CC: Sasha Hauer <kernel@xxxxxxxxxxxxxx>
CC: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>
---
 drivers/usb/host/ehci-mxc.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c
index c7a9b31..1a00492 100644
--- a/drivers/usb/host/ehci-mxc.c
+++ b/drivers/usb/host/ehci-mxc.c
@@ -36,6 +36,7 @@
 static const char hcd_name[] = "ehci-mxc";
 
 #define ULPI_VIEWPORT_OFFSET	0x170
+#define SBUSCFG_OFFSET		0x090
 
 struct ehci_mxc_priv {
 	struct clk *usbclk, *ahbclk, *phyclk;
@@ -43,8 +44,24 @@ struct ehci_mxc_priv {
 
 static struct hc_driver __read_mostly ehci_mxc_hc_driver;
 
+static int ehci_mxc_reset(struct usb_hcd *hcd)
+{
+	int retval;
+
+	retval = ehci_setup(hcd);
+	if (retval)
+		return retval;
+
+	/* workaround for ENGcm11601 */
+	if (of_machine_is_compatible("fsl,imx35"))
+		writel(0, hcd->regs + SBUSCFG_OFFSET);
+
+	return 0;
+}
+
 static const struct ehci_driver_overrides ehci_mxc_overrides __initconst = {
 	.extra_priv_size =	sizeof(struct ehci_mxc_priv),
+	.reset =		ehci_mxc_reset,
 };
 
 static int ehci_mxc_drv_probe(struct platform_device *pdev)
-- 
1.9.1


-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux