aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpuidle
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/cpuidle')
-rw-r--r--drivers/cpuidle/driver.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/cpuidle/driver.c b/drivers/cpuidle/driver.c
index 424bc8105387..87db3877fead 100644
--- a/drivers/cpuidle/driver.c
+++ b/drivers/cpuidle/driver.c
@@ -18,9 +18,10 @@ static struct cpuidle_driver *cpuidle_curr_driver;
18DEFINE_SPINLOCK(cpuidle_driver_lock); 18DEFINE_SPINLOCK(cpuidle_driver_lock);
19int cpuidle_driver_refcount; 19int cpuidle_driver_refcount;
20 20
21static void __cpuidle_register_driver(struct cpuidle_driver *drv) 21static void set_power_states(struct cpuidle_driver *drv)
22{ 22{
23 int i; 23 int i;
24
24 /* 25 /*
25 * cpuidle driver should set the drv->power_specified bit 26 * cpuidle driver should set the drv->power_specified bit
26 * before registering if the driver provides 27 * before registering if the driver provides
@@ -35,10 +36,8 @@ static void __cpuidle_register_driver(struct cpuidle_driver *drv)
35 * an power value of -1. So we use -2, -3, etc, for other 36 * an power value of -1. So we use -2, -3, etc, for other
36 * c-states. 37 * c-states.
37 */ 38 */
38 if (!drv->power_specified) { 39 for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++)
39 for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++) 40 drv->states[i].power_usage = -1 - i;
40 drv->states[i].power_usage = -1 - i;
41 }
42} 41}
43 42
44/** 43/**
@@ -58,8 +57,12 @@ int cpuidle_register_driver(struct cpuidle_driver *drv)
58 spin_unlock(&cpuidle_driver_lock); 57 spin_unlock(&cpuidle_driver_lock);
59 return -EBUSY; 58 return -EBUSY;
60 } 59 }
61 __cpuidle_register_driver(drv); 60
61 if (!drv->power_specified)
62 set_power_states(drv);
63
62 cpuidle_curr_driver = drv; 64 cpuidle_curr_driver = drv;
65
63 spin_unlock(&cpuidle_driver_lock); 66 spin_unlock(&cpuidle_driver_lock);
64 67
65 return 0; 68 return 0;