When 'enable_off_mode' is 0, and (mpu_state < PWRDM_POWER_RET)
the local variables mpu_state and core_state are modified; but
the usage count for the original state selected by the governor
are updated.

This patch updates the 'last_state' in the cpuidle driver to ensure
that statistics for the correct state are updated.

Signed-off-by: Sanjeev Premi <[email protected]>
---
 arch/arm/mach-omap2/cpuidle34xx.c |   25 +++++++++++++++++--------
 1 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/arch/arm/mach-omap2/cpuidle34xx.c 
b/arch/arm/mach-omap2/cpuidle34xx.c
index 62fbb2e..5838838 100644
--- a/arch/arm/mach-omap2/cpuidle34xx.c
+++ b/arch/arm/mach-omap2/cpuidle34xx.c
@@ -76,23 +76,32 @@ static int omap3_enter_idle(struct cpuidle_device *dev,
 {
        struct omap3_processor_cx *cx = cpuidle_get_statedata(state);
        struct timespec ts_preidle, ts_postidle, ts_idle;
-       u32 mpu_state = cx->mpu_state, core_state = cx->core_state;
+       u32 mpu_state, core_state;
 
        current_cx_state = *cx;
 
        /* Used to keep track of the total time in idle */
        getnstimeofday(&ts_preidle);
 
-       local_irq_disable();
-       local_fiq_disable();
-
+       /*
+        * Adjust the idle state (if required).
+        * Also, ensure that usage statistics of correct state are updated.
+        */
        if (!enable_off_mode) {
-               if (mpu_state < PWRDM_POWER_RET)
-                       mpu_state = PWRDM_POWER_RET;
-               if (core_state < PWRDM_POWER_RET)
-                       core_state = PWRDM_POWER_RET;
+               if (cx->type > OMAP3_STATE_C4) {
+                       state = &(dev->states[OMAP3_STATE_C4 - 1]);
+                       dev->last_state = state ;
+
+                       cx = cpuidle_get_statedata(state);
+               }
        }
 
+       mpu_state = cx->mpu_state;
+       core_state = cx->core_state;
+
+       local_irq_disable();
+       local_fiq_disable();
+
        pwrdm_set_next_pwrst(mpu_pd, mpu_state);
        pwrdm_set_next_pwrst(core_pd, core_state);
 
-- 
1.5.6

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to