diff options
author | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2012-03-13 19:18:39 -0400 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2012-03-20 15:31:28 -0400 |
commit | 448c8b1d07d5342922567e138a4b0108a42c24fb (patch) | |
tree | f995179c7a4afbe3eab6ed30e0d4d33eab5d967d | |
parent | 4bc25af79ec54b79266148f8c1b84bb1e7ff2621 (diff) |
provide disable_cpufreq() function to disable the API.
useful for disabling cpufreq altogether. The cpu frequency
scaling drivers and cpu frequency governors will fail to register.
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Dave Jones <davej@redhat.com>
-rw-r--r-- | drivers/cpufreq/cpufreq.c | 24 | ||||
-rw-r--r-- | include/linux/cpufreq.h | 2 |
2 files changed, 26 insertions, 0 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 8c2df3499da7..a9a1d81cadc4 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -126,6 +126,15 @@ static int __init init_cpufreq_transition_notifier_list(void) | |||
126 | } | 126 | } |
127 | pure_initcall(init_cpufreq_transition_notifier_list); | 127 | pure_initcall(init_cpufreq_transition_notifier_list); |
128 | 128 | ||
129 | static int off __read_mostly; | ||
130 | int cpufreq_disabled(void) | ||
131 | { | ||
132 | return off; | ||
133 | } | ||
134 | void disable_cpufreq(void) | ||
135 | { | ||
136 | off = 1; | ||
137 | } | ||
129 | static LIST_HEAD(cpufreq_governor_list); | 138 | static LIST_HEAD(cpufreq_governor_list); |
130 | static DEFINE_MUTEX(cpufreq_governor_mutex); | 139 | static DEFINE_MUTEX(cpufreq_governor_mutex); |
131 | 140 | ||
@@ -1442,6 +1451,9 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy, | |||
1442 | { | 1451 | { |
1443 | int retval = -EINVAL; | 1452 | int retval = -EINVAL; |
1444 | 1453 | ||
1454 | if (cpufreq_disabled()) | ||
1455 | return -ENODEV; | ||
1456 | |||
1445 | pr_debug("target for CPU %u: %u kHz, relation %u\n", policy->cpu, | 1457 | pr_debug("target for CPU %u: %u kHz, relation %u\n", policy->cpu, |
1446 | target_freq, relation); | 1458 | target_freq, relation); |
1447 | if (cpu_online(policy->cpu) && cpufreq_driver->target) | 1459 | if (cpu_online(policy->cpu) && cpufreq_driver->target) |
@@ -1550,6 +1562,9 @@ int cpufreq_register_governor(struct cpufreq_governor *governor) | |||
1550 | if (!governor) | 1562 | if (!governor) |
1551 | return -EINVAL; | 1563 | return -EINVAL; |
1552 | 1564 | ||
1565 | if (cpufreq_disabled()) | ||
1566 | return -ENODEV; | ||
1567 | |||
1553 | mutex_lock(&cpufreq_governor_mutex); | 1568 | mutex_lock(&cpufreq_governor_mutex); |
1554 | 1569 | ||
1555 | err = -EBUSY; | 1570 | err = -EBUSY; |
@@ -1573,6 +1588,9 @@ void cpufreq_unregister_governor(struct cpufreq_governor *governor) | |||
1573 | if (!governor) | 1588 | if (!governor) |
1574 | return; | 1589 | return; |
1575 | 1590 | ||
1591 | if (cpufreq_disabled()) | ||
1592 | return; | ||
1593 | |||
1576 | #ifdef CONFIG_HOTPLUG_CPU | 1594 | #ifdef CONFIG_HOTPLUG_CPU |
1577 | for_each_present_cpu(cpu) { | 1595 | for_each_present_cpu(cpu) { |
1578 | if (cpu_online(cpu)) | 1596 | if (cpu_online(cpu)) |
@@ -1815,6 +1833,9 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) | |||
1815 | unsigned long flags; | 1833 | unsigned long flags; |
1816 | int ret; | 1834 | int ret; |
1817 | 1835 | ||
1836 | if (cpufreq_disabled()) | ||
1837 | return -ENODEV; | ||
1838 | |||
1818 | if (!driver_data || !driver_data->verify || !driver_data->init || | 1839 | if (!driver_data || !driver_data->verify || !driver_data->init || |
1819 | ((!driver_data->setpolicy) && (!driver_data->target))) | 1840 | ((!driver_data->setpolicy) && (!driver_data->target))) |
1820 | return -EINVAL; | 1841 | return -EINVAL; |
@@ -1902,6 +1923,9 @@ static int __init cpufreq_core_init(void) | |||
1902 | { | 1923 | { |
1903 | int cpu; | 1924 | int cpu; |
1904 | 1925 | ||
1926 | if (cpufreq_disabled()) | ||
1927 | return -ENODEV; | ||
1928 | |||
1905 | for_each_possible_cpu(cpu) { | 1929 | for_each_possible_cpu(cpu) { |
1906 | per_cpu(cpufreq_policy_cpu, cpu) = -1; | 1930 | per_cpu(cpufreq_policy_cpu, cpu) = -1; |
1907 | init_rwsem(&per_cpu(cpu_policy_rwsem, cpu)); | 1931 | init_rwsem(&per_cpu(cpu_policy_rwsem, cpu)); |
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 6216115c7789..8ff442753c75 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h | |||
@@ -35,6 +35,7 @@ | |||
35 | #ifdef CONFIG_CPU_FREQ | 35 | #ifdef CONFIG_CPU_FREQ |
36 | int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list); | 36 | int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list); |
37 | int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list); | 37 | int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list); |
38 | extern void disable_cpufreq(void); | ||
38 | #else /* CONFIG_CPU_FREQ */ | 39 | #else /* CONFIG_CPU_FREQ */ |
39 | static inline int cpufreq_register_notifier(struct notifier_block *nb, | 40 | static inline int cpufreq_register_notifier(struct notifier_block *nb, |
40 | unsigned int list) | 41 | unsigned int list) |
@@ -46,6 +47,7 @@ static inline int cpufreq_unregister_notifier(struct notifier_block *nb, | |||
46 | { | 47 | { |
47 | return 0; | 48 | return 0; |
48 | } | 49 | } |
50 | static inline void disable_cpufreq(void) { } | ||
49 | #endif /* CONFIG_CPU_FREQ */ | 51 | #endif /* CONFIG_CPU_FREQ */ |
50 | 52 | ||
51 | /* if (cpufreq_driver->target) exists, the ->governor decides what frequency | 53 | /* if (cpufreq_driver->target) exists, the ->governor decides what frequency |