OMAP3: PM: decouple PER and CORE context save and restore
authorKevin Hilman <khilman@deeprootsystems.com>
Wed, 5 Nov 2008 04:50:52 +0000 (20:50 -0800)
committerKevin Hilman <khilman@deeprootsystems.com>
Wed, 11 Nov 2009 22:42:28 +0000 (14:42 -0800)
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
arch/arm/mach-omap2/pm34xx.c

index ff818aa..d8a6e10 100644 (file)
@@ -338,19 +338,20 @@ static void omap_sram_idle(void)
        if (pwrdm_read_pwrst(neon_pwrdm) == PWRDM_POWER_ON)
                set_pwrdm_state(neon_pwrdm, mpu_next_state);
 
-       /* CORE & PER */
+       /* PER */
+       per_next_state = pwrdm_read_next_pwrst(per_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();
+       }
+
+       /* CORE */
        core_next_state = pwrdm_read_next_pwrst(core_pwrdm);
        if (core_next_state < PWRDM_POWER_ON) {
-               omap2_gpio_prepare_for_retention();
                omap_uart_prepare_idle(0);
                omap_uart_prepare_idle(1);
-               /* PER changes only with core */
-               per_next_state = pwrdm_read_next_pwrst(per_pwrdm);
-               if (per_next_state < PWRDM_POWER_ON) {
-                       omap_uart_prepare_idle(2);
-                       if (per_next_state == PWRDM_POWER_OFF)
-                               omap3_per_save_context();
-               }
                if (core_next_state == PWRDM_POWER_OFF) {
                        omap3_core_save_context();
                        omap3_prcm_save_context();
@@ -392,14 +393,8 @@ static void omap_sram_idle(void)
        if (pwrdm_read_prev_pwrst(mpu_pwrdm) == PWRDM_POWER_OFF)
                restore_table_entry();
 
+       /* CORE */
        if (core_next_state < PWRDM_POWER_ON) {
-               if (per_next_state < PWRDM_POWER_ON)
-                       omap_uart_resume_idle(2);
-               omap_uart_resume_idle(1);
-               omap_uart_resume_idle(0);
-
-               /* Disable IO-PAD wakeup */
-               prm_clear_mod_reg_bits(OMAP3430_EN_IO, WKUP_MOD, PM_WKEN);
                core_prev_state = pwrdm_read_prev_pwrst(core_pwrdm);
                if (core_prev_state == PWRDM_POWER_OFF) {
                        omap3_core_restore_context();
@@ -407,15 +402,27 @@ static void omap_sram_idle(void)
                        omap3_sram_restore_context();
                        omap2_sms_restore_context();
                }
-               if (per_next_state < PWRDM_POWER_ON) {
-                       per_prev_state =
-                               pwrdm_read_prev_pwrst(per_pwrdm);
-                       if (per_prev_state == PWRDM_POWER_OFF)
-                               omap3_per_restore_context();
-               }
+               omap_uart_resume_idle(0);
+               omap_uart_resume_idle(1);
+               if (core_next_state == PWRDM_POWER_OFF)
+                       prm_clear_mod_reg_bits(OMAP3430_AUTO_OFF,
+                                              OMAP3430_GR_MOD,
+                                              OMAP3_PRM_VOLTCTRL_OFFSET);
+       }
+
+       /* 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();
        }
 
+       /* Disable IO-PAD wakeup */
+       if (core_next_state < PWRDM_POWER_ON)
+               prm_clear_mod_reg_bits(OMAP3430_EN_IO, WKUP_MOD, PM_WKEN);
+
        pwrdm_post_transition();
 
 }