OSDN Git Service

ARM: OMAP3: PM: call pre/post transition per powerdomain
authorKevin Hilman <khilman@ti.com>
Fri, 11 May 2012 22:47:17 +0000 (15:47 -0700)
committerKevin Hilman <khilman@ti.com>
Mon, 25 Jun 2012 18:24:23 +0000 (11:24 -0700)
We only need to call the pre/post transtion methods when we know the
power state is changing.  First, split up the pre/post transition
calls to be per-powerdomain, and then make them conditional on whether
the power domain is actually changing states.

Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Tested-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Tested-by: Grazvydas Ignotas <notasas@gmail.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
arch/arm/mach-omap2/pm34xx.c

index 0bbbc8c..dec2d55 100644 (file)
@@ -273,16 +273,21 @@ void omap_sram_idle(void)
        per_next_state = pwrdm_read_next_pwrst(per_pwrdm);
        core_next_state = pwrdm_read_next_pwrst(core_pwrdm);
 
-       pwrdm_pre_transition(NULL);
+       if (mpu_next_state < PWRDM_POWER_ON) {
+               pwrdm_pre_transition(mpu_pwrdm);
+               pwrdm_pre_transition(neon_pwrdm);
+       }
 
        /* PER */
        if (per_next_state < PWRDM_POWER_ON) {
+               pwrdm_pre_transition(per_pwrdm);
                per_going_off = (per_next_state == PWRDM_POWER_OFF) ? 1 : 0;
                omap2_gpio_prepare_for_idle(per_going_off);
        }
 
        /* CORE */
        if (core_next_state < PWRDM_POWER_ON) {
+               pwrdm_pre_transition(core_pwrdm);
                if (core_next_state == PWRDM_POWER_OFF) {
                        omap3_core_save_context();
                        omap3_cm_save_context();
@@ -335,14 +340,20 @@ void omap_sram_idle(void)
                        omap2_prm_clear_mod_reg_bits(OMAP3430_AUTO_OFF_MASK,
                                               OMAP3430_GR_MOD,
                                               OMAP3_PRM_VOLTCTRL_OFFSET);
+               pwrdm_post_transition(core_pwrdm);
        }
        omap3_intc_resume_idle();
 
-       pwrdm_post_transition(NULL);
-
        /* PER */
-       if (per_next_state < PWRDM_POWER_ON)
+       if (per_next_state < PWRDM_POWER_ON) {
                omap2_gpio_resume_after_idle();
+               pwrdm_post_transition(per_pwrdm);
+       }
+
+       if (mpu_next_state < PWRDM_POWER_ON) {
+               pwrdm_post_transition(mpu_pwrdm);
+               pwrdm_post_transition(neon_pwrdm);
+       }
 
        clkdm_allow_idle(mpu_pwrdm->pwrdm_clkdms[0]);
 }