]> git.sur5r.net Git - u-boot/commitdiff
tegra: usb: Fix device enumeration problem of USB1
authorJim Lin <jilin@nvidia.com>
Sun, 24 Jun 2012 20:40:57 +0000 (20:40 +0000)
committerAlbert ARIBAUD (U-Boot) <uboot@lilith.(none)>
Mon, 9 Jul 2012 20:44:34 +0000 (22:44 +0200)
A known hardware issue of USB1 port where bit 1 (connect status
change) of PORTSC register will be set after issuing Port Reset
(like "usb reset" in u-boot command line).
This will be treated as an error and stops later device enumeration.

Therefore we clear that bit after Port Reset in order to proceed
later device enumeration.

Signed-off-by: Jim Lin <jilin@nvidia.com>
Acked-by: Stephen Warren <swarren@wwwdotorg.org>
Signed-off-by: Tom Warren <twarren@nvidia.com>
arch/arm/include/asm/arch-tegra2/tegra2.h
drivers/usb/host/ehci-tegra.c

index 3c8d8a84b5556de409413c54d237583193d04f4d..13d68c017cf27f97529f68f28c4872d5b3c1255e 100644 (file)
@@ -45,6 +45,7 @@
 #define NV_PA_CSITE_BASE       0x70040000
 #define TEGRA_USB1_BASE                0xC5000000
 #define TEGRA_USB3_BASE                0xC5008000
+#define TEGRA_USB_ADDR_MASK    0xFFFFC000
 
 #define TEGRA2_SDRC_CS0                NV_PA_SDRAM_BASE
 #define LOW_LEVEL_SRAM_STACK   0x4000FFFC
index a7e105b9921ec600284932493e349663cd8d3016..4646b29508f01dae8c9340231b1518b944e85762 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009 NVIDIA Corporation
+ * Copyright (c) 2009-2012 NVIDIA Corporation
  *
  * See file CREDITS for list of people who contributed to this
  * project.
 #include <asm/errno.h>
 #include <asm/arch/usb.h>
 
+/*
+ * A known hardware issue where Connect Status Change bit of PORTSC register
+ * of USB1 controller will be set after Port Reset.
+ * We have to clear it in order for later device enumeration to proceed.
+ * This ehci_powerup_fixup overrides the weak function ehci_powerup_fixup
+ * in "ehci-hcd.c".
+ */
+void ehci_powerup_fixup(uint32_t *status_reg, uint32_t *reg)
+{
+       mdelay(50);
+       if (((u32) status_reg & TEGRA_USB_ADDR_MASK) != TEGRA_USB1_BASE)
+               return;
+       /* For EHCI_PS_CSC to be cleared in ehci_hcd.c */
+       if (ehci_readl(status_reg) & EHCI_PS_CSC)
+               *reg |= EHCI_PS_CSC;
+}
 
 /*
  * Create the appropriate control structures to manage