]>
Commit | Line | Data |
---|---|---|
4f86d3a8 LB |
1 | /* |
2 | * driver.c - driver support | |
3 | * | |
4 | * (C) 2006-2007 Venkatesh Pallipadi <[email protected]> | |
5 | * Shaohua Li <[email protected]> | |
6 | * Adam Belay <[email protected]> | |
7 | * | |
8 | * This code is licenced under the GPL. | |
9 | */ | |
10 | ||
11 | #include <linux/mutex.h> | |
12 | #include <linux/module.h> | |
13 | #include <linux/cpuidle.h> | |
14 | ||
15 | #include "cpuidle.h" | |
16 | ||
752138df | 17 | static struct cpuidle_driver *cpuidle_curr_driver; |
4f86d3a8 LB |
18 | DEFINE_SPINLOCK(cpuidle_driver_lock); |
19 | ||
20 | /** | |
21 | * cpuidle_register_driver - registers a driver | |
22 | * @drv: the driver | |
23 | */ | |
24 | int cpuidle_register_driver(struct cpuidle_driver *drv) | |
25 | { | |
26 | if (!drv) | |
27 | return -EINVAL; | |
28 | ||
29 | spin_lock(&cpuidle_driver_lock); | |
30 | if (cpuidle_curr_driver) { | |
31 | spin_unlock(&cpuidle_driver_lock); | |
32 | return -EBUSY; | |
33 | } | |
34 | cpuidle_curr_driver = drv; | |
35 | spin_unlock(&cpuidle_driver_lock); | |
36 | ||
37 | return 0; | |
38 | } | |
39 | ||
40 | EXPORT_SYMBOL_GPL(cpuidle_register_driver); | |
41 | ||
752138df LB |
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 | ||
4f86d3a8 LB |
51 | /** |
52 | * cpuidle_unregister_driver - unregisters a driver | |
53 | * @drv: the driver | |
54 | */ | |
55 | void cpuidle_unregister_driver(struct cpuidle_driver *drv) | |
56 | { | |
c0d64cb0 LB |
57 | if (drv != cpuidle_curr_driver) { |
58 | WARN(1, "invalid cpuidle_unregister_driver(%s)\n", | |
59 | drv->name); | |
4f86d3a8 | 60 | return; |
c0d64cb0 | 61 | } |
4f86d3a8 LB |
62 | |
63 | spin_lock(&cpuidle_driver_lock); | |
64 | cpuidle_curr_driver = NULL; | |
65 | spin_unlock(&cpuidle_driver_lock); | |
66 | } | |
67 | ||
68 | EXPORT_SYMBOL_GPL(cpuidle_unregister_driver); |