[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