
When s_init() is called, the silicon version hasn't yet been identified. This would lead to incorrect index in the DPLL table.
This patch ensures that silicon is identified as first step in s_init().
When called from s_init(), the globals updated in the function identify_cpu() lie in 'relocated' address space.
So, identify_cpu() is called again in arch_cpu_init().
Signed-off-by: Sanjeev Premi premi@ti.com --- cpu/arm_cortexa8/omap3/board.c | 2 ++ cpu/arm_cortexa8/omap3/sys_info.c | 17 +++++++++++++++-- include/asm-arm/arch-omap3/sys_proto.h | 1 + 3 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/cpu/arm_cortexa8/omap3/board.c b/cpu/arm_cortexa8/omap3/board.c index 2aa69b3..2f27cb9 100644 --- a/cpu/arm_cortexa8/omap3/board.c +++ b/cpu/arm_cortexa8/omap3/board.c @@ -193,6 +193,8 @@ void s_init(void) { int in_sdram = is_running_in_sdram();
+ identify_cpu(); + watchdog_init();
try_unlock_memory(); diff --git a/cpu/arm_cortexa8/omap3/sys_info.c b/cpu/arm_cortexa8/omap3/sys_info.c index 40866ae..449262a 100644 --- a/cpu/arm_cortexa8/omap3/sys_info.c +++ b/cpu/arm_cortexa8/omap3/sys_info.c @@ -44,11 +44,11 @@ static char *rev_s[CPU_3XX_MAX_REV] = { static u8 cpu_revision;
/** - * Perform architecture specific initialization. + * Identify the silicon * * Currently, it identifies the cpu revision. */ -int arch_cpu_init (void) +void identify_cpu (void) { u32 cpuid = 0; struct ctrl_id *id_base; @@ -72,6 +72,19 @@ int arch_cpu_init (void) if(cpu_revision == 0) cpu_revision = CPU_3XX_ES20; } +} + +/** + * Perform architecture specific initialization + */ +int arch_cpu_init (void) +{ + /* + * The identification done in s_init is 'lost' due to + * relocation. The variable contents are not same. + * Function identify_cpu() is called again. + */ + identify_cpu();
return 0; } diff --git a/include/asm-arm/arch-omap3/sys_proto.h b/include/asm-arm/arch-omap3/sys_proto.h index 1c99c45..9ddd272 100644 --- a/include/asm-arm/arch-omap3/sys_proto.h +++ b/include/asm-arm/arch-omap3/sys_proto.h @@ -40,6 +40,7 @@ void enable_gpmc_cs_config(const u32 *gpmc_config, struct gpmc_cs *cs, u32 base, void watchdog_init(void); void set_muxconf_regs(void);
+void identify_cpu(void); u8 get_cpu_rev(void); u32 get_mem_type(void); u32 get_sysboot_value(void);