OMAP3: PM: Prevent PER from going OFF when CORE is going INA
authorTero Kristo <tero.kristo@nokia.com>
Mon, 1 Dec 2008 11:17:29 +0000 (13:17 +0200)
committerKevin Hilman <khilman@deeprootsystems.com>
Wed, 11 Nov 2009 22:42:28 +0000 (14:42 -0800)
OMAP3 can't generate wakeups in this state, thus it is not permitted.

Signed-off-by: Tero Kristo <tero.kristo@nokia.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
arch/arm/mach-omap2/pm34xx.c

index d8a6e10..55567bf 100644 (file)
@@ -308,6 +308,7 @@ static void omap_sram_idle(void)
        int core_next_state = PWRDM_POWER_ON;
        int core_prev_state, per_prev_state;
        u32 sdrc_pwr = 0;
+       int per_state_modified = 0;
 
        if (!_omap_sram_idle)
                return;
@@ -340,15 +341,21 @@ static void omap_sram_idle(void)
 
        /* PER */
        per_next_state = pwrdm_read_next_pwrst(per_pwrdm);
+       core_next_state = pwrdm_read_next_pwrst(core_pwrdm);
        if (per_next_state < PWRDM_POWER_ON) {
-               omap2_gpio_prepare_for_retention();
                omap_uart_prepare_idle(2);
-               if (per_next_state == PWRDM_POWER_OFF)
-                       omap3_per_save_context();
+               omap2_gpio_prepare_for_retention();
+               if (per_next_state == PWRDM_POWER_OFF) {
+                       if (core_next_state == PWRDM_POWER_ON) {
+                               per_next_state = PWRDM_POWER_RET;
+                               pwrdm_set_next_pwrst(per_pwrdm, per_next_state);
+                               per_state_modified = 1;
+                       } else
+                               omap3_per_save_context();
+               }
        }
 
        /* CORE */
-       core_next_state = pwrdm_read_next_pwrst(core_pwrdm);
        if (core_next_state < PWRDM_POWER_ON) {
                omap_uart_prepare_idle(0);
                omap_uart_prepare_idle(1);
@@ -413,10 +420,12 @@ static void omap_sram_idle(void)
        /* PER */
        if (per_next_state < PWRDM_POWER_ON) {
                per_prev_state = pwrdm_read_prev_pwrst(per_pwrdm);
-               omap_uart_resume_idle(2);
                if (per_prev_state == PWRDM_POWER_OFF)
                        omap3_per_restore_context();
                omap2_gpio_resume_after_retention();
+               omap_uart_resume_idle(2);
+               if (per_state_modified)
+                       pwrdm_set_next_pwrst(per_pwrdm, PWRDM_POWER_OFF);
        }
 
        /* Disable IO-PAD wakeup */