Commit e5ecc871 authored by Christian Krafft's avatar Christian Krafft Committed by Arnd Bergmann

[CELL] cbe_cpufreq: fix initialization

This patch fixes the initialization of the cbe_cpufreq driver.
The code that initializes the PMI related functions was called per cpu:
* registering cpufreq notifier block
* registering a pmi handler

This ends in a bug that the notifier block gets called in an endless loop.
The initialization code is being put to the
module init code path by this patch. This way it only gets called once.
Signed-off-by: default avatarChristian Krafft <krafft@de.ibm.com>
Signed-off-by: default avatarArnd Bergmann <arnd.bergmann@de.ibm.com>
parent a964b9be
...@@ -196,10 +196,9 @@ static int pmi_notifier(struct notifier_block *nb, ...@@ -196,10 +196,9 @@ static int pmi_notifier(struct notifier_block *nb,
{ {
struct cpufreq_policy *policy = data; struct cpufreq_policy *policy = data;
if (event != CPUFREQ_INCOMPATIBLE) if (pmi_frequency_limit)
return 0; cpufreq_verify_within_limits(policy, 0, pmi_frequency_limit);
cpufreq_verify_within_limits(policy, 0, pmi_frequency_limit);
return 0; return 0;
} }
...@@ -263,11 +262,6 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy *policy) ...@@ -263,11 +262,6 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy *policy)
cpufreq_frequency_table_get_attr(cbe_freqs, policy->cpu); cpufreq_frequency_table_get_attr(cbe_freqs, policy->cpu);
if (cbe_cpufreq_has_pmi) {
/* frequency might get limited later, initialize limit with max_freq */
pmi_frequency_limit = max_freq;
cpufreq_register_notifier(&pmi_notifier_block, CPUFREQ_POLICY_NOTIFIER);
}
/* this ensures that policy->cpuinfo_min and policy->cpuinfo_max are set correctly */ /* this ensures that policy->cpuinfo_min and policy->cpuinfo_max are set correctly */
return cpufreq_frequency_table_cpuinfo(policy, cbe_freqs); return cpufreq_frequency_table_cpuinfo(policy, cbe_freqs);
...@@ -275,9 +269,6 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy *policy) ...@@ -275,9 +269,6 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy *policy)
static int cbe_cpufreq_cpu_exit(struct cpufreq_policy *policy) static int cbe_cpufreq_cpu_exit(struct cpufreq_policy *policy)
{ {
if (cbe_cpufreq_has_pmi)
cpufreq_unregister_notifier(&pmi_notifier_block, CPUFREQ_POLICY_NOTIFIER);
cpufreq_frequency_table_put_attr(policy->cpu); cpufreq_frequency_table_put_attr(policy->cpu);
return 0; return 0;
} }
...@@ -341,6 +332,9 @@ static int __init cbe_cpufreq_init(void) ...@@ -341,6 +332,9 @@ static int __init cbe_cpufreq_init(void)
cbe_cpufreq_has_pmi = pmi_register_handler(&cbe_pmi_handler) == 0; cbe_cpufreq_has_pmi = pmi_register_handler(&cbe_pmi_handler) == 0;
if (cbe_cpufreq_has_pmi)
cpufreq_register_notifier(&pmi_notifier_block, CPUFREQ_POLICY_NOTIFIER);
return cpufreq_register_driver(&cbe_cpufreq_driver); return cpufreq_register_driver(&cbe_cpufreq_driver);
} }
...@@ -348,8 +342,10 @@ static void __exit cbe_cpufreq_exit(void) ...@@ -348,8 +342,10 @@ static void __exit cbe_cpufreq_exit(void)
{ {
cpufreq_unregister_driver(&cbe_cpufreq_driver); cpufreq_unregister_driver(&cbe_cpufreq_driver);
if (cbe_cpufreq_has_pmi) if (cbe_cpufreq_has_pmi) {
cpufreq_unregister_notifier(&pmi_notifier_block, CPUFREQ_POLICY_NOTIFIER);
pmi_unregister_handler(&cbe_pmi_handler); pmi_unregister_handler(&cbe_pmi_handler);
}
} }
module_init(cbe_cpufreq_init); module_init(cbe_cpufreq_init);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment