cpuidle: refactor out cpuidle_enter_state
authorColin Cross <ccross@android.com>
Tue, 8 May 2012 00:57:39 +0000 (17:57 -0700)
committerLen Brown <len.brown@intel.com>
Sat, 2 Jun 2012 04:48:31 +0000 (00:48 -0400)
Split the code to enter a state and update the stats into a helper
function, cpuidle_enter_state, and export it.  This function will
be called by the coupled state code to handle entering the safe
state and the final coupled state.

Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Tested-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Reviewed-by: Kevin Hilman <khilman@ti.com>
Tested-by: Kevin Hilman <khilman@ti.com>
Signed-off-by: Colin Cross <ccross@android.com>
Reviewed-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/cpuidle/cpuidle.c
drivers/cpuidle/cpuidle.h

index 2f0083a51a9aeb5979e145eca98b686f4dd3c196..3e3e3e4d958171c99fefcc87fa8e858ee733f018 100644 (file)
@@ -102,6 +102,34 @@ int cpuidle_play_dead(void)
        return -ENODEV;
 }
 
+/**
+ * cpuidle_enter_state - enter the state and update stats
+ * @dev: cpuidle device for this cpu
+ * @drv: cpuidle driver for this cpu
+ * @next_state: index into drv->states of the state to enter
+ */
+int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv,
+               int next_state)
+{
+       int entered_state;
+
+       entered_state = cpuidle_enter_ops(dev, drv, next_state);
+
+       if (entered_state >= 0) {
+               /* Update cpuidle counters */
+               /* This can be moved to within driver enter routine
+                * but that results in multiple copies of same code.
+                */
+               dev->states_usage[entered_state].time +=
+                               (unsigned long long)dev->last_residency;
+               dev->states_usage[entered_state].usage++;
+       } else {
+               dev->last_residency = 0;
+       }
+
+       return entered_state;
+}
+
 /**
  * cpuidle_idle_call - the main idle loop
  *
@@ -143,23 +171,11 @@ int cpuidle_idle_call(void)
        trace_power_start_rcuidle(POWER_CSTATE, next_state, dev->cpu);
        trace_cpu_idle_rcuidle(next_state, dev->cpu);
 
-       entered_state = cpuidle_enter_ops(dev, drv, next_state);
+       entered_state = cpuidle_enter_state(dev, drv, next_state);
 
        trace_power_end_rcuidle(dev->cpu);
        trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu);
 
-       if (entered_state >= 0) {
-               /* Update cpuidle counters */
-               /* This can be moved to within driver enter routine
-                * but that results in multiple copies of same code.
-                */
-               dev->states_usage[entered_state].time +=
-                               (unsigned long long)dev->last_residency;
-               dev->states_usage[entered_state].usage++;
-       } else {
-               dev->last_residency = 0;
-       }
-
        /* give the governor an opportunity to reflect on the outcome */
        if (cpuidle_curr_governor->reflect)
                cpuidle_curr_governor->reflect(dev, entered_state);
index 7db186685c275a78176217e6a97209eb9ae47949..d8a3ccce8281ec0bd81ca8e45d32bdbb757566e0 100644 (file)
@@ -14,6 +14,8 @@ extern struct list_head cpuidle_detected_devices;
 extern struct mutex cpuidle_lock;
 extern spinlock_t cpuidle_driver_lock;
 extern int cpuidle_disabled(void);
+extern int cpuidle_enter_state(struct cpuidle_device *dev,
+               struct cpuidle_driver *drv, int next_state);
 
 /* idle loop */
 extern void cpuidle_install_idle_handler(void);