@@ -55,6 +55,7 @@
#define OMAP343X_CONTROL_REG_VALUE_OFFSET 0xc8
#define RTA_ERRATUM_i608 (1 << 0)
+#define SDRC_WAKEUP_ERRATUM_i583 (1 << 1)
static u16 pm34xx_errata;
#define IS_PM34XX_ERRATUM(id) (pm34xx_errata & (id))
@@ -399,6 +400,17 @@ void omap_sram_idle(void)
}
/* CORE */
+ /*
+ * Erratum i583: implementation for ES rev < Es1.2 on 3630
+ * We cannot enable OFF mode in a stable form for previous
+ * revisions, transition instead to RET
+ */
+ if (IS_PM34XX_ERRATUM(SDRC_WAKEUP_ERRATUM_i583) &&
+ (core_next_state == PWRDM_POWER_OFF)) {
+ pwrdm_set_next_pwrst(core_pwrdm, PWRDM_POWER_RET);
+ core_next_state = PWRDM_POWER_RET;
+ }
+
if (core_next_state < PWRDM_POWER_ON) {
omap_uart_prepare_idle(0);
omap_uart_prepare_idle(1);
@@ -991,6 +1003,8 @@ static void pm_errata_configure(void)
/* Enable the l2 cache toggling in sleep logic */
if (cpu_is_omap3630())
enable_omap3630_toggle_l2_on_restore();
+ if (cpu_is_omap3630() && (omap_rev() < OMAP3630_REV_ES1_2))
+ pm34xx_errata |= SDRC_WAKEUP_ERRATUM_i583;
}
}