diff options
Diffstat (limited to 'drivers/cpufreq/cpufreq.c')
-rw-r--r-- | drivers/cpufreq/cpufreq.c | 46 |
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(); |