[U-Boot] [PATCH 20/28] SPEAr1300: Workaround the UHC problem (issue #101435)
Vipin KUMAR
vipin.kumar at st.com
Wed Jul 14 07:09:56 CEST 2010
From: Armando Visconti <armando.visconti at st.com>
Signed-off-by: Armando Visconti <armando.visconti at st.com>
---
arch/arm/cpu/arm_cortexa8/spear13xx/cpu.c | 33 +++++++++++++++++++++++++++++
include/configs/spear13xx_evb.h | 3 ++
2 files changed, 36 insertions(+), 0 deletions(-)
diff --git a/arch/arm/cpu/arm_cortexa8/spear13xx/cpu.c b/arch/arm/cpu/arm_cortexa8/spear13xx/cpu.c
index ab197b3..4720b60 100644
--- a/arch/arm/cpu/arm_cortexa8/spear13xx/cpu.c
+++ b/arch/arm/cpu/arm_cortexa8/spear13xx/cpu.c
@@ -83,6 +83,39 @@ int arch_cpu_init(void)
writel(perip1_clk_enb, &misc_p->perip1_clk_enb);
writel(perip2_clk_enb, &misc_p->perip2_clk_enb);
+#ifdef CONFIG_SPEAR1300_ISSUE_101435
+ {
+ u32 tmp_var;
+
+ /*
+ * WRKD the UHC problem (issue #101435)
+ *
+ * Bit2 in MISC sys_sw_res reg is used to
+ * discriminate whether we are coming from a power-on
+ * reset or not.
+ */
+ tmp_var = readl(&misc_p->sys_sw_res);
+ if ((tmp_var & 0x4) == 0) {
+ /* Enable UHC1 and UHC2 clocks) */
+ tmp_var = readl(&misc_p->perip1_clk_enb);
+ writel(tmp_var | 0x600, &misc_p->perip1_clk_enb);
+
+ /* Wait few cycles */
+ for (tmp_var = 0; tmp_var < 0x10000; tmp_var++)
+ ;
+
+ /* Reset the system */
+ writel(0x1, &misc_p->sys_sw_res);
+ while (1)
+ ;
+ } else {
+ /* Clear the RESET condition. */
+ writel(0x2, &misc_p->sys_sw_res);
+ }
+
+ }
+#endif
+
return 0;
}
#endif
diff --git a/include/configs/spear13xx_evb.h b/include/configs/spear13xx_evb.h
index eeb46c0..21cc131 100644
--- a/include/configs/spear13xx_evb.h
+++ b/include/configs/spear13xx_evb.h
@@ -39,6 +39,9 @@
#define CONFIG_ENV_IS_IN_FLASH 1
#endif
+/* Solve issue #101435 - UHC blocks the BUSMATRIX */
+#define CONFIG_SPEAR1300_ISSUE_101435 1
+
/* Ethernet configuration */
#define CONFIG_MII
#define CONFIG_DESIGNWARE_ETH
--
1.6.0.2
More information about the U-Boot
mailing list