aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2012-03-13 19:18:39 -0400
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2012-03-20 15:31:28 -0400
commit448c8b1d07d5342922567e138a4b0108a42c24fb (patch)
treef995179c7a4afbe3eab6ed30e0d4d33eab5d967d
parent4bc25af79ec54b79266148f8c1b84bb1e7ff2621 (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.c24
-rw-r--r--include/linux/cpufreq.h2
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}
127pure_initcall(init_cpufreq_transition_notifier_list); 127pure_initcall(init_cpufreq_transition_notifier_list);
128 128
129static int off __read_mostly;
130int cpufreq_disabled(void)
131{
132 return off;
133}
134void disable_cpufreq(void)
135{
136 off = 1;
137}
129static LIST_HEAD(cpufreq_governor_list); 138static LIST_HEAD(cpufreq_governor_list);
130static DEFINE_MUTEX(cpufreq_governor_mutex); 139static 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
36int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list); 36int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list);
37int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list); 37int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list);
38extern void disable_cpufreq(void);
38#else /* CONFIG_CPU_FREQ */ 39#else /* CONFIG_CPU_FREQ */
39static inline int cpufreq_register_notifier(struct notifier_block *nb, 40static 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}
50static 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