Nishant, On Tue, Nov 30, 2010 at 01:49, Nishanth Menon <nm@xxxxxx> wrote: > Erratum id: i608 > RTA (Retention Till Access) feature is not supported and leads to device > stability issues when enabled. This impacts modules with embedded memories > on OMAP3630 > > Workaround is to disable RTA on boot and coming out of core off. > For disabling rta coming out of off mode, we do this by overriding the > restore pointer for 3630 to allow us restore handler as the first point of > entry before caches are touched and is common for GP and HS devices. > to disable earlier than this could be possible by modifying the ppa for HS > devices, but not for GP devices. > > Signed-off-by: Ambresh K <ambresh@xxxxxx> not in Cc? > Signed-off-by: Nishanth Menon <nm@xxxxxx> > --- > v2: fixed missing b restore for 3430 es3.1 code. > introduced erratum handling logic here splitting it out of uart errata > typo fixes for erratum > v1: http://marc.info/?l=linux-omap&m=129013172825240&w=2 > > arch/arm/mach-omap2/control.c | 5 ++++- > arch/arm/mach-omap2/control.h | 5 +++++ > arch/arm/mach-omap2/pm34xx.c | 23 +++++++++++++++++++++++ > arch/arm/mach-omap2/sleep34xx.S | 26 ++++++++++++++++++++++++++ > 4 files changed, 58 insertions(+), 1 deletions(-) > > diff --git a/arch/arm/mach-omap2/control.c b/arch/arm/mach-omap2/control.c > index 1fa3294..728f268 100644 > --- a/arch/arm/mach-omap2/control.c > +++ b/arch/arm/mach-omap2/control.c > @@ -241,7 +241,10 @@ void omap3_save_scratchpad_contents(void) > > /* Populate the Scratchpad contents */ > scratchpad_contents.boot_config_ptr = 0x0; > - if (omap_rev() != OMAP3430_REV_ES3_0 && > + if (cpu_is_omap3630()) > + scratchpad_contents.public_restore_ptr = > + virt_to_phys(get_omap3630_restore_pointer()); > + else if (omap_rev() != OMAP3430_REV_ES3_0 && > omap_rev() != OMAP3430_REV_ES3_1) > scratchpad_contents.public_restore_ptr = > virt_to_phys(get_restore_pointer()); > diff --git a/arch/arm/mach-omap2/control.h b/arch/arm/mach-omap2/control.h > index b6c6b7c..d7911c5 100644 > --- a/arch/arm/mach-omap2/control.h > +++ b/arch/arm/mach-omap2/control.h > @@ -204,6 +204,10 @@ > #define OMAP343X_CONTROL_WKUP_DEBOBS3 (OMAP343X_CONTROL_GENERAL_WKUP + 0x014) > #define OMAP343X_CONTROL_WKUP_DEBOBS4 (OMAP343X_CONTROL_GENERAL_WKUP + 0x018) > > +/* 36xx-only RTA - Retention till Accesss control registers and bits */ > +#define OMAP36XX_CONTROL_MEM_RTA_CTRL 0x40C > +#define OMAP36XX_RTA_DISABLE 0x0 > + > /* 34xx D2D idle-related pins, handled by PM core */ > #define OMAP3_PADCONF_SAD2D_MSTANDBY 0x250 > #define OMAP3_PADCONF_SAD2D_IDLEACK 0x254 > @@ -347,6 +351,7 @@ extern void omap3_save_scratchpad_contents(void); > extern void omap3_clear_scratchpad_contents(void); > extern u32 *get_restore_pointer(void); > extern u32 *get_es3_restore_pointer(void); > +extern u32 *get_omap3630_restore_pointer(void); > extern u32 omap3_arm_context[128]; > extern void omap3_control_save_context(void); > extern void omap3_control_restore_context(void); > diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c > index 75c0cd1..bd426cc 100644 > --- a/arch/arm/mach-omap2/pm34xx.c > +++ b/arch/arm/mach-omap2/pm34xx.c > @@ -54,6 +54,10 @@ > #define OMAP343X_TABLE_VALUE_OFFSET 0xc0 > #define OMAP343X_CONTROL_REG_VALUE_OFFSET 0xc8 > > +#define RTA_ERRATUM_i608 (1 << 0) > +static u16 pm34xx_errata; > +#define IS_PM34XX_ERRATUM(id) (pm34xx_errata & (id)) > + > struct power_state { > struct powerdomain *pwrdm; > u32 next_state; > @@ -979,6 +983,14 @@ void omap_push_sram_idle(void) > save_secure_ram_context_sz); > } > > +static void pm_errata_configure(void) > +{ > + if (cpu_is_omap34xx()) { > + if (cpu_is_omap3630()) Is it required to have both the cpu_is checks*? Why? > + pm34xx_errata |= RTA_ERRATUM_i608; > + } > +} > + <<snip>> -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html