OMAP4: PM: Use the low-power state change feature on OMAP4
authorRajendra Nayak <rnayak@ti.com>
Wed, 22 Dec 2010 05:37:27 +0000 (22:37 -0700)
committerPaul Walmsley <paul@pwsan.com>
Wed, 22 Dec 2010 05:37:27 +0000 (22:37 -0700)
For pwrdm's which support LOWPOWERSTATECHANGE, do not try waking
up the domain to put it back to deeper sleep state.

Signed-off-by: Rajendra Nayak <rnayak@ti.com>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Acked-by: Benoit Cousson <b-cousson@ti.com>
Cc: Kevin Hilman <khilman@deeprootsystems.com>
Acked-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Paul Walmsley <paul@pwsan.com>
arch/arm/mach-omap2/pm.c

index 227a211921c3f3f648975f2b603d40b2b01b31d0..a2b826cdfbf68da632920bfd7d12660ae413e6ad 100644 (file)
@@ -89,6 +89,10 @@ static void omap2_init_processor_devices(void)
        }
 }
 
+/* Types of sleep_switch used in omap_set_pwrdm_state */
+#define FORCEWAKEUP_SWITCH     0
+#define LOWPOWERSTATE_SWITCH   1
+
 /*
  * This sets pwrdm state (other than mpu & core. Currently only ON &
  * RET are supported. Function is assuming that clkdm doesn't have
@@ -114,9 +118,14 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
                return ret;
 
        if (pwrdm_read_pwrst(pwrdm) < PWRDM_POWER_ON) {
-               omap2_clkdm_wakeup(pwrdm->pwrdm_clkdms[0]);
-               sleep_switch = 1;
-               pwrdm_wait_transition(pwrdm);
+               if ((pwrdm_read_pwrst(pwrdm) > state) &&
+                       (pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE)) {
+                       sleep_switch = LOWPOWERSTATE_SWITCH;
+               } else {
+                       omap2_clkdm_wakeup(pwrdm->pwrdm_clkdms[0]);
+                       pwrdm_wait_transition(pwrdm);
+                       sleep_switch = FORCEWAKEUP_SWITCH;
+               }
        }
 
        ret = pwrdm_set_next_pwrst(pwrdm, state);
@@ -126,12 +135,19 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
                goto err;
        }
 
-       if (sleep_switch) {
+       switch (sleep_switch) {
+       case FORCEWAKEUP_SWITCH:
                omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);
-               pwrdm_wait_transition(pwrdm);
-               pwrdm_state_switch(pwrdm);
+               break;
+       case LOWPOWERSTATE_SWITCH:
+               pwrdm_set_lowpwrstchange(pwrdm);
+               break;
+       default:
+               return ret;
        }
 
+       pwrdm_wait_transition(pwrdm);
+       pwrdm_state_switch(pwrdm);
 err:
        return ret;
 }