diff options
author | Daniel Lezcano <daniel.lezcano@linaro.org> | 2012-10-31 12:44:45 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2012-11-14 18:34:22 -0500 |
commit | 42f67f2acab2b7179c0d1ab234869e391448dfa6 (patch) | |
tree | 2ae9b604adea21b4047228763b77307c50f2574b /drivers/cpuidle | |
parent | 8f3e9953e1e4ae5c11e2e880e7d85c03c0180613 (diff) |
cpuidle: move driver's refcount to cpuidle
We want to support different cpuidle drivers co-existing together.
In this case we should move the refcount to the cpuidle_driver
structure to handle several drivers at a time.
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Acked-by: Peter De Schrijver <pdeschrijver@nvidia.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/cpuidle')
-rw-r--r-- | drivers/cpuidle/driver.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/cpuidle/driver.c b/drivers/cpuidle/driver.c index 87db3877fead..39ba8e181e96 100644 --- a/drivers/cpuidle/driver.c +++ b/drivers/cpuidle/driver.c | |||
@@ -16,7 +16,6 @@ | |||
16 | 16 | ||
17 | static struct cpuidle_driver *cpuidle_curr_driver; | 17 | static struct cpuidle_driver *cpuidle_curr_driver; |
18 | DEFINE_SPINLOCK(cpuidle_driver_lock); | 18 | DEFINE_SPINLOCK(cpuidle_driver_lock); |
19 | int cpuidle_driver_refcount; | ||
20 | 19 | ||
21 | static void set_power_states(struct cpuidle_driver *drv) | 20 | static void set_power_states(struct cpuidle_driver *drv) |
22 | { | 21 | { |
@@ -61,6 +60,8 @@ int cpuidle_register_driver(struct cpuidle_driver *drv) | |||
61 | if (!drv->power_specified) | 60 | if (!drv->power_specified) |
62 | set_power_states(drv); | 61 | set_power_states(drv); |
63 | 62 | ||
63 | drv->refcnt = 0; | ||
64 | |||
64 | cpuidle_curr_driver = drv; | 65 | cpuidle_curr_driver = drv; |
65 | 66 | ||
66 | spin_unlock(&cpuidle_driver_lock); | 67 | spin_unlock(&cpuidle_driver_lock); |
@@ -92,7 +93,7 @@ void cpuidle_unregister_driver(struct cpuidle_driver *drv) | |||
92 | 93 | ||
93 | spin_lock(&cpuidle_driver_lock); | 94 | spin_lock(&cpuidle_driver_lock); |
94 | 95 | ||
95 | if (!WARN_ON(cpuidle_driver_refcount > 0)) | 96 | if (!WARN_ON(drv->refcnt > 0)) |
96 | cpuidle_curr_driver = NULL; | 97 | cpuidle_curr_driver = NULL; |
97 | 98 | ||
98 | spin_unlock(&cpuidle_driver_lock); | 99 | spin_unlock(&cpuidle_driver_lock); |
@@ -106,7 +107,7 @@ struct cpuidle_driver *cpuidle_driver_ref(void) | |||
106 | spin_lock(&cpuidle_driver_lock); | 107 | spin_lock(&cpuidle_driver_lock); |
107 | 108 | ||
108 | drv = cpuidle_curr_driver; | 109 | drv = cpuidle_curr_driver; |
109 | cpuidle_driver_refcount++; | 110 | drv->refcnt++; |
110 | 111 | ||
111 | spin_unlock(&cpuidle_driver_lock); | 112 | spin_unlock(&cpuidle_driver_lock); |
112 | return drv; | 113 | return drv; |
@@ -114,10 +115,12 @@ struct cpuidle_driver *cpuidle_driver_ref(void) | |||
114 | 115 | ||
115 | void cpuidle_driver_unref(void) | 116 | void cpuidle_driver_unref(void) |
116 | { | 117 | { |
118 | struct cpuidle_driver *drv = cpuidle_curr_driver; | ||
119 | |||
117 | spin_lock(&cpuidle_driver_lock); | 120 | spin_lock(&cpuidle_driver_lock); |
118 | 121 | ||
119 | if (!WARN_ON(cpuidle_driver_refcount <= 0)) | 122 | if (drv && !WARN_ON(drv->refcnt <= 0)) |
120 | cpuidle_driver_refcount--; | 123 | drv->refcnt--; |
121 | 124 | ||
122 | spin_unlock(&cpuidle_driver_lock); | 125 | spin_unlock(&cpuidle_driver_lock); |
123 | } | 126 | } |