summaryrefslogtreecommitdiff
path: root/drivers/cpufreq/cpufreq.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/cpufreq/cpufreq.c')
-rw-r--r--drivers/cpufreq/cpufreq.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 7b728143440d..118dbf1cef44 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -130,6 +130,7 @@ static void handle_update(struct work_struct *work);
*/
static BLOCKING_NOTIFIER_HEAD(cpufreq_policy_notifier_list);
static struct srcu_notifier_head cpufreq_transition_notifier_list;
+struct atomic_notifier_head cpufreq_govinfo_notifier_list;
static bool init_cpufreq_transition_notifier_list_called;
static int __init init_cpufreq_transition_notifier_list(void)
@@ -140,6 +141,15 @@ static int __init init_cpufreq_transition_notifier_list(void)
}
pure_initcall(init_cpufreq_transition_notifier_list);
+static bool init_cpufreq_govinfo_notifier_list_called;
+static int __init init_cpufreq_govinfo_notifier_list(void)
+{
+ ATOMIC_INIT_NOTIFIER_HEAD(&cpufreq_govinfo_notifier_list);
+ init_cpufreq_govinfo_notifier_list_called = true;
+ return 0;
+}
+pure_initcall(init_cpufreq_govinfo_notifier_list);
+
static int off __read_mostly;
static int cpufreq_disabled(void)
{
@@ -1061,7 +1071,8 @@ static int cpufreq_add_policy_cpu(struct cpufreq_policy *policy, unsigned int cp
if (has_target()) {
ret = __cpufreq_governor(policy, CPUFREQ_GOV_STOP);
if (ret) {
- pr_err("%s: Failed to stop governor\n", __func__);
+ pr_err("%s: Failed to stop governor for CPU%u, policy CPU%u\n",
+ __func__, cpu, policy->cpu);
return ret;
}
}
@@ -1076,7 +1087,8 @@ static int cpufreq_add_policy_cpu(struct cpufreq_policy *policy, unsigned int cp
ret = __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
if (ret) {
- pr_err("%s: Failed to start governor\n", __func__);
+ pr_err("%s: Failed to start governor for CPU%u, policy CPU%u\n",
+ __func__, cpu, policy->cpu);
return ret;
}
}
@@ -1386,7 +1398,8 @@ static void cpufreq_offline_prepare(unsigned int cpu)
if (has_target()) {
int ret = __cpufreq_governor(policy, CPUFREQ_GOV_STOP);
if (ret)
- pr_err("%s: Failed to stop governor\n", __func__);
+ pr_err("%s: Failed to stop governor for CPU%u\n",
+ __func__, cpu);
}
down_write(&policy->rwsem);
@@ -1436,7 +1449,8 @@ static void cpufreq_offline_finish(unsigned int cpu)
if (has_target()) {
int ret = __cpufreq_governor(policy, CPUFREQ_GOV_POLICY_EXIT);
if (ret)
- pr_err("%s: Failed to exit governor\n", __func__);
+ pr_err("%s: Failed to start governor for CPU%u, policy CPU%u\n",
+ __func__, cpu, policy->cpu);
}
/*
@@ -1765,7 +1779,8 @@ int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list)
if (cpufreq_disabled())
return -EINVAL;
- WARN_ON(!init_cpufreq_transition_notifier_list_called);
+ WARN_ON(!init_cpufreq_transition_notifier_list_called ||
+ !init_cpufreq_govinfo_notifier_list_called);
switch (list) {
case CPUFREQ_TRANSITION_NOTIFIER:
@@ -1776,6 +1791,10 @@ int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list)
ret = blocking_notifier_chain_register(
&cpufreq_policy_notifier_list, nb);
break;
+ case CPUFREQ_GOVINFO_NOTIFIER:
+ ret = atomic_notifier_chain_register(
+ &cpufreq_govinfo_notifier_list, nb);
+ break;
default:
ret = -EINVAL;
}
@@ -1810,6 +1829,10 @@ int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list)
ret = blocking_notifier_chain_unregister(
&cpufreq_policy_notifier_list, nb);
break;
+ case CPUFREQ_GOVINFO_NOTIFIER:
+ ret = atomic_notifier_chain_unregister(
+ &cpufreq_govinfo_notifier_list, nb);
+ break;
default:
ret = -EINVAL;
}
@@ -1922,15 +1945,6 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy,
pr_debug("target for CPU %u: %u kHz, relation %u, requested %u kHz\n",
policy->cpu, target_freq, relation, old_target_freq);
- /*
- * This might look like a redundant call as we are checking it again
- * after finding index. But it is left intentionally for cases where
- * exactly same freq is called again and so we can save on few function
- * calls.
- */
- if (target_freq == policy->cur)
- return 0;
-
/* Save last value to restore later on errors */
policy->restore_freq = policy->cur;
@@ -2517,7 +2531,7 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
}
register_hotcpu_notifier(&cpufreq_cpu_notifier);
- pr_debug("driver %s up and running\n", driver_data->name);
+ pr_info("driver %s up and running\n", driver_data->name);
out:
put_online_cpus();
@@ -2550,7 +2564,7 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
if (!cpufreq_driver || (driver != cpufreq_driver))
return -EINVAL;
- pr_debug("unregistering driver %s\n", driver->name);
+ pr_info("unregistering driver %s\n", driver->name);
/* Protect against concurrent cpu hotplug */
get_online_cpus();