diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-28 19:14:17 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-28 19:14:17 -0400 |
commit | e4f2e5eaac8f5f903ca4a8cc944d26e68745d6bb (patch) | |
tree | 1a8d89561fa5b231202d5287acc2683eccadee7f /drivers/cpuidle | |
parent | 9a90e09854a3c7cc603ab8fc9163f77bb1f66cfa (diff) | |
parent | 2671717265ae6e720a9ba5f13fbec3a718983b65 (diff) |
Merge branch 'idle-release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-idle-2.6
* 'idle-release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-idle-2.6:
intel_idle: native hardware cpuidle driver for latest Intel processors
ACPI: acpi_idle: touch TS_POLLING only in the non-MWAIT case
acpi_pad: uses MONITOR/MWAIT, so it doesn't need to clear TS_POLLING
sched: clarify commment for TS_POLLING
ACPI: allow a native cpuidle driver to displace ACPI
cpuidle: make cpuidle_curr_driver static
cpuidle: add cpuidle_unregister_driver() error check
cpuidle: fail to register if !CONFIG_CPU_IDLE
Diffstat (limited to 'drivers/cpuidle')
-rw-r--r-- | drivers/cpuidle/cpuidle.c | 12 | ||||
-rw-r--r-- | drivers/cpuidle/cpuidle.h | 1 | ||||
-rw-r--r-- | drivers/cpuidle/driver.c | 16 | ||||
-rw-r--r-- | drivers/cpuidle/sysfs.c | 5 |
4 files changed, 24 insertions, 10 deletions
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index 12fdd3987a36..199488576a05 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c | |||
@@ -156,7 +156,7 @@ int cpuidle_enable_device(struct cpuidle_device *dev) | |||
156 | 156 | ||
157 | if (dev->enabled) | 157 | if (dev->enabled) |
158 | return 0; | 158 | return 0; |
159 | if (!cpuidle_curr_driver || !cpuidle_curr_governor) | 159 | if (!cpuidle_get_driver() || !cpuidle_curr_governor) |
160 | return -EIO; | 160 | return -EIO; |
161 | if (!dev->state_count) | 161 | if (!dev->state_count) |
162 | return -EINVAL; | 162 | return -EINVAL; |
@@ -207,7 +207,7 @@ void cpuidle_disable_device(struct cpuidle_device *dev) | |||
207 | { | 207 | { |
208 | if (!dev->enabled) | 208 | if (!dev->enabled) |
209 | return; | 209 | return; |
210 | if (!cpuidle_curr_driver || !cpuidle_curr_governor) | 210 | if (!cpuidle_get_driver() || !cpuidle_curr_governor) |
211 | return; | 211 | return; |
212 | 212 | ||
213 | dev->enabled = 0; | 213 | dev->enabled = 0; |
@@ -271,10 +271,11 @@ static int __cpuidle_register_device(struct cpuidle_device *dev) | |||
271 | { | 271 | { |
272 | int ret; | 272 | int ret; |
273 | struct sys_device *sys_dev = get_cpu_sysdev((unsigned long)dev->cpu); | 273 | struct sys_device *sys_dev = get_cpu_sysdev((unsigned long)dev->cpu); |
274 | struct cpuidle_driver *cpuidle_driver = cpuidle_get_driver(); | ||
274 | 275 | ||
275 | if (!sys_dev) | 276 | if (!sys_dev) |
276 | return -EINVAL; | 277 | return -EINVAL; |
277 | if (!try_module_get(cpuidle_curr_driver->owner)) | 278 | if (!try_module_get(cpuidle_driver->owner)) |
278 | return -EINVAL; | 279 | return -EINVAL; |
279 | 280 | ||
280 | init_completion(&dev->kobj_unregister); | 281 | init_completion(&dev->kobj_unregister); |
@@ -284,7 +285,7 @@ static int __cpuidle_register_device(struct cpuidle_device *dev) | |||
284 | per_cpu(cpuidle_devices, dev->cpu) = dev; | 285 | per_cpu(cpuidle_devices, dev->cpu) = dev; |
285 | list_add(&dev->device_list, &cpuidle_detected_devices); | 286 | list_add(&dev->device_list, &cpuidle_detected_devices); |
286 | if ((ret = cpuidle_add_sysfs(sys_dev))) { | 287 | if ((ret = cpuidle_add_sysfs(sys_dev))) { |
287 | module_put(cpuidle_curr_driver->owner); | 288 | module_put(cpuidle_driver->owner); |
288 | return ret; | 289 | return ret; |
289 | } | 290 | } |
290 | 291 | ||
@@ -325,6 +326,7 @@ EXPORT_SYMBOL_GPL(cpuidle_register_device); | |||
325 | void cpuidle_unregister_device(struct cpuidle_device *dev) | 326 | void cpuidle_unregister_device(struct cpuidle_device *dev) |
326 | { | 327 | { |
327 | struct sys_device *sys_dev = get_cpu_sysdev((unsigned long)dev->cpu); | 328 | struct sys_device *sys_dev = get_cpu_sysdev((unsigned long)dev->cpu); |
329 | struct cpuidle_driver *cpuidle_driver = cpuidle_get_driver(); | ||
328 | 330 | ||
329 | if (dev->registered == 0) | 331 | if (dev->registered == 0) |
330 | return; | 332 | return; |
@@ -340,7 +342,7 @@ void cpuidle_unregister_device(struct cpuidle_device *dev) | |||
340 | 342 | ||
341 | cpuidle_resume_and_unlock(); | 343 | cpuidle_resume_and_unlock(); |
342 | 344 | ||
343 | module_put(cpuidle_curr_driver->owner); | 345 | module_put(cpuidle_driver->owner); |
344 | } | 346 | } |
345 | 347 | ||
346 | EXPORT_SYMBOL_GPL(cpuidle_unregister_device); | 348 | EXPORT_SYMBOL_GPL(cpuidle_unregister_device); |
diff --git a/drivers/cpuidle/cpuidle.h b/drivers/cpuidle/cpuidle.h index 9476ba33ee2c..33e50d556f17 100644 --- a/drivers/cpuidle/cpuidle.h +++ b/drivers/cpuidle/cpuidle.h | |||
@@ -9,7 +9,6 @@ | |||
9 | 9 | ||
10 | /* For internal use only */ | 10 | /* For internal use only */ |
11 | extern struct cpuidle_governor *cpuidle_curr_governor; | 11 | extern struct cpuidle_governor *cpuidle_curr_governor; |
12 | extern struct cpuidle_driver *cpuidle_curr_driver; | ||
13 | extern struct list_head cpuidle_governors; | 12 | extern struct list_head cpuidle_governors; |
14 | extern struct list_head cpuidle_detected_devices; | 13 | extern struct list_head cpuidle_detected_devices; |
15 | extern struct mutex cpuidle_lock; | 14 | extern struct mutex cpuidle_lock; |
diff --git a/drivers/cpuidle/driver.c b/drivers/cpuidle/driver.c index 2257004fe33d..fd1601e3d125 100644 --- a/drivers/cpuidle/driver.c +++ b/drivers/cpuidle/driver.c | |||
@@ -14,7 +14,7 @@ | |||
14 | 14 | ||
15 | #include "cpuidle.h" | 15 | #include "cpuidle.h" |
16 | 16 | ||
17 | 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 | 19 | ||
20 | /** | 20 | /** |
@@ -40,13 +40,25 @@ int cpuidle_register_driver(struct cpuidle_driver *drv) | |||
40 | EXPORT_SYMBOL_GPL(cpuidle_register_driver); | 40 | EXPORT_SYMBOL_GPL(cpuidle_register_driver); |
41 | 41 | ||
42 | /** | 42 | /** |
43 | * cpuidle_get_driver - return the current driver | ||
44 | */ | ||
45 | struct cpuidle_driver *cpuidle_get_driver(void) | ||
46 | { | ||
47 | return cpuidle_curr_driver; | ||
48 | } | ||
49 | EXPORT_SYMBOL_GPL(cpuidle_get_driver); | ||
50 | |||
51 | /** | ||
43 | * cpuidle_unregister_driver - unregisters a driver | 52 | * cpuidle_unregister_driver - unregisters a driver |
44 | * @drv: the driver | 53 | * @drv: the driver |
45 | */ | 54 | */ |
46 | void cpuidle_unregister_driver(struct cpuidle_driver *drv) | 55 | void cpuidle_unregister_driver(struct cpuidle_driver *drv) |
47 | { | 56 | { |
48 | if (!drv) | 57 | if (drv != cpuidle_curr_driver) { |
58 | WARN(1, "invalid cpuidle_unregister_driver(%s)\n", | ||
59 | drv->name); | ||
49 | return; | 60 | return; |
61 | } | ||
50 | 62 | ||
51 | spin_lock(&cpuidle_driver_lock); | 63 | spin_lock(&cpuidle_driver_lock); |
52 | cpuidle_curr_driver = NULL; | 64 | cpuidle_curr_driver = NULL; |
diff --git a/drivers/cpuidle/sysfs.c b/drivers/cpuidle/sysfs.c index 0ba9c8b8ee74..0310ffaec9df 100644 --- a/drivers/cpuidle/sysfs.c +++ b/drivers/cpuidle/sysfs.c | |||
@@ -47,10 +47,11 @@ static ssize_t show_current_driver(struct sysdev_class *class, | |||
47 | char *buf) | 47 | char *buf) |
48 | { | 48 | { |
49 | ssize_t ret; | 49 | ssize_t ret; |
50 | struct cpuidle_driver *cpuidle_driver = cpuidle_get_driver(); | ||
50 | 51 | ||
51 | spin_lock(&cpuidle_driver_lock); | 52 | spin_lock(&cpuidle_driver_lock); |
52 | if (cpuidle_curr_driver) | 53 | if (cpuidle_driver) |
53 | ret = sprintf(buf, "%s\n", cpuidle_curr_driver->name); | 54 | ret = sprintf(buf, "%s\n", cpuidle_driver->name); |
54 | else | 55 | else |
55 | ret = sprintf(buf, "none\n"); | 56 | ret = sprintf(buf, "none\n"); |
56 | spin_unlock(&cpuidle_driver_lock); | 57 | spin_unlock(&cpuidle_driver_lock); |