|
@@ -126,6 +126,15 @@ static int __init init_cpufreq_transition_notifier_list(void)
|
|
|
}
|
|
|
pure_initcall(init_cpufreq_transition_notifier_list);
|
|
|
|
|
|
+static int off __read_mostly;
|
|
|
+int cpufreq_disabled(void)
|
|
|
+{
|
|
|
+ return off;
|
|
|
+}
|
|
|
+void disable_cpufreq(void)
|
|
|
+{
|
|
|
+ off = 1;
|
|
|
+}
|
|
|
static LIST_HEAD(cpufreq_governor_list);
|
|
|
static DEFINE_MUTEX(cpufreq_governor_mutex);
|
|
|
|
|
@@ -1441,6 +1450,9 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy,
|
|
|
{
|
|
|
int retval = -EINVAL;
|
|
|
|
|
|
+ if (cpufreq_disabled())
|
|
|
+ return -ENODEV;
|
|
|
+
|
|
|
pr_debug("target for CPU %u: %u kHz, relation %u\n", policy->cpu,
|
|
|
target_freq, relation);
|
|
|
if (cpu_online(policy->cpu) && cpufreq_driver->target)
|
|
@@ -1549,6 +1561,9 @@ int cpufreq_register_governor(struct cpufreq_governor *governor)
|
|
|
if (!governor)
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ if (cpufreq_disabled())
|
|
|
+ return -ENODEV;
|
|
|
+
|
|
|
mutex_lock(&cpufreq_governor_mutex);
|
|
|
|
|
|
err = -EBUSY;
|
|
@@ -1572,6 +1587,9 @@ void cpufreq_unregister_governor(struct cpufreq_governor *governor)
|
|
|
if (!governor)
|
|
|
return;
|
|
|
|
|
|
+ if (cpufreq_disabled())
|
|
|
+ return;
|
|
|
+
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
|
for_each_present_cpu(cpu) {
|
|
|
if (cpu_online(cpu))
|
|
@@ -1814,6 +1832,9 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
|
|
|
unsigned long flags;
|
|
|
int ret;
|
|
|
|
|
|
+ if (cpufreq_disabled())
|
|
|
+ return -ENODEV;
|
|
|
+
|
|
|
if (!driver_data || !driver_data->verify || !driver_data->init ||
|
|
|
((!driver_data->setpolicy) && (!driver_data->target)))
|
|
|
return -EINVAL;
|
|
@@ -1901,6 +1922,9 @@ static int __init cpufreq_core_init(void)
|
|
|
{
|
|
|
int cpu;
|
|
|
|
|
|
+ if (cpufreq_disabled())
|
|
|
+ return -ENODEV;
|
|
|
+
|
|
|
for_each_possible_cpu(cpu) {
|
|
|
per_cpu(cpufreq_policy_cpu, cpu) = -1;
|
|
|
init_rwsem(&per_cpu(cpu_policy_rwsem, cpu));
|