[linux-yocto] [PATCH 09/87] drivers/usb/host/ehci-ci13612.c: fix a burst size issue

Paul Butler butler.paul at gmail.com
Mon May 27 09:55:40 PDT 2013


Fix an issue that we found with the burst size on the AXI bus.

Signed-off-by: Paul Butler <paul.butler at windriver.com>
---
 drivers/usb/host/ehci-ci13612.c | 37 +++++++++++++++++++++++++++----------
 drivers/usb/host/ehci-ci13612.h |  3 +++
 2 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/drivers/usb/host/ehci-ci13612.c b/drivers/usb/host/ehci-ci13612.c
index 151376c..8b7102f 100644
--- a/drivers/usb/host/ehci-ci13612.c
+++ b/drivers/usb/host/ehci-ci13612.c
@@ -30,15 +30,32 @@
 static void ci13612_usb_setup(struct usb_hcd *hcd)
 {
 	int USB_TXFIFOTHRES, VUSB_HS_TX_BURST;
+	u32 deviceMode;
+	struct ehci_hcd *ehci = hcd_to_ehci(hcd);
 
 	/* Fix a HW erratum where the USB core may overrun its transmit FIFO. */
-	/* Fix a HW erratum where the USB core may incorrectly fill its transmit FIFO. */
+	/* Fix a HW erratum where the USB core may incorrectly fill its
+	 * transmit FIFO.
+	 */
 	VUSB_HS_TX_BURST = inl(USB_HWTXBUF) & 0x0f;
 	USB_TXFIFOTHRES = (inl(USB_TXFILLTUNING) & 0x3f0000) >> 16;
 
-	printk(KERN_INFO "ehci-ci13612 (ci13612_usb_setup): "
-			 "VUSB_HS_TX_BURST = 0x%x, USB_TXFIFOTHRES = 0x%x\n",
-			 VUSB_HS_TX_BURST, USB_TXFIFOTHRES);
+	/* Fix related to an issue that we found with the burst size on
+	 * the AXI bus check if device or host mode
+	 */
+	deviceMode = ehci_readl(ehci, hcd->regs + 0x1A8);
+
+	if ((deviceMode & 0x3) == 0x2) {
+		/* device mode */
+		writel(0x0, hcd->regs + 0x90);
+	} else if ((deviceMode & 0x3) == 0x3) {
+		/* host mode */
+		writel(0x6, hcd->regs + 0x90);
+	}
+
+	printk(KERN_INFO
+	       "ehci-ci13612 (ci13612_usb_setup): VUSB_HS_TX_BURST = 0x%x, USB_TXFIFOTHRES = 0x%x\n",
+		VUSB_HS_TX_BURST, USB_TXFIFOTHRES);
 
 	return;
 }
@@ -97,8 +114,8 @@ static int ehci_run_fix(struct usb_hcd *hcd)
 	port_status = ehci_readl(ehci, &ehci->regs->port_status[0]);
 	printk(KERN_INFO "ehci_run: port_status = 0x%x\n", port_status);
 	if (port_status & 0x100) {
-		printk(KERN_ERR "USB port is in reset status, not able to "
-				"change host controller status to run\n");
+		printk(KERN_ERR
+		       "USB port is in reset status, not able to change host controller status to run\n");
 		return -EFAULT;
 	}
 
@@ -187,13 +204,13 @@ static int ci13612_ehci_probe(struct platform_device *pdev)
 	}
 
 	/* FIXME: This reported error since we don't have a second register
-         *  area defined in our dtb. Should we add it or stay backwards compatible ?
-         */
+	 * area defined in our dtb. Should we add it or stay backwards
+	 * compatible ?
+	 */
 	gpreg_base = of_iomap(np, 1);
 	if (!gpreg_base) {
 		dev_warn(&pdev->dev, "of_iomap error can't map region 1\n");
-	}
-	else {
+	} else {
 		/* Setup GPREG for USB to enable the 6-bit address line */
 		writel(0x0, gpreg_base + 0x8);
 
diff --git a/drivers/usb/host/ehci-ci13612.h b/drivers/usb/host/ehci-ci13612.h
index bbba3f4..9d296ce 100644
--- a/drivers/usb/host/ehci-ci13612.h
+++ b/drivers/usb/host/ehci-ci13612.h
@@ -4,6 +4,9 @@
 #define ci13612_PHY_ADDR	0x0020004A0000ULL
 #define ci13162_PHY_ADDR_SIZE	0x20000
 
+#define GPREG_PHY_ADDR		0x00200040C000ULL
+#define GPREG_PHY_ADDR_SIZE	0x1000
+
 /*
  * Host interface registers
  */
-- 
1.8.3




More information about the linux-yocto mailing list