Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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: Christian Krafft <krafft@de.ibm.com>
Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com>

authored by

Christian Krafft and committed by
Arnd Bergmann
e5ecc871 a964b9be

+8 -12
+8 -12
arch/powerpc/platforms/cell/cbe_cpufreq.c
··· 196 196 { 197 197 struct cpufreq_policy *policy = data; 198 198 199 - if (event != CPUFREQ_INCOMPATIBLE) 200 - return 0; 199 + if (pmi_frequency_limit) 200 + cpufreq_verify_within_limits(policy, 0, pmi_frequency_limit); 201 201 202 - cpufreq_verify_within_limits(policy, 0, pmi_frequency_limit); 203 202 return 0; 204 203 } 205 204 ··· 262 263 263 264 cpufreq_frequency_table_get_attr(cbe_freqs, policy->cpu); 264 265 265 - if (cbe_cpufreq_has_pmi) { 266 - /* frequency might get limited later, initialize limit with max_freq */ 267 - pmi_frequency_limit = max_freq; 268 - cpufreq_register_notifier(&pmi_notifier_block, CPUFREQ_POLICY_NOTIFIER); 269 - } 270 266 271 267 /* this ensures that policy->cpuinfo_min and policy->cpuinfo_max are set correctly */ 272 268 return cpufreq_frequency_table_cpuinfo(policy, cbe_freqs); ··· 269 275 270 276 static int cbe_cpufreq_cpu_exit(struct cpufreq_policy *policy) 271 277 { 272 - if (cbe_cpufreq_has_pmi) 273 - cpufreq_unregister_notifier(&pmi_notifier_block, CPUFREQ_POLICY_NOTIFIER); 274 - 275 278 cpufreq_frequency_table_put_attr(policy->cpu); 276 279 return 0; 277 280 } ··· 332 341 333 342 cbe_cpufreq_has_pmi = pmi_register_handler(&cbe_pmi_handler) == 0; 334 343 344 + if (cbe_cpufreq_has_pmi) 345 + cpufreq_register_notifier(&pmi_notifier_block, CPUFREQ_POLICY_NOTIFIER); 346 + 335 347 return cpufreq_register_driver(&cbe_cpufreq_driver); 336 348 } 337 349 ··· 342 348 { 343 349 cpufreq_unregister_driver(&cbe_cpufreq_driver); 344 350 345 - if (cbe_cpufreq_has_pmi) 351 + if (cbe_cpufreq_has_pmi) { 352 + cpufreq_unregister_notifier(&pmi_notifier_block, CPUFREQ_POLICY_NOTIFIER); 346 353 pmi_unregister_handler(&cbe_pmi_handler); 354 + } 347 355 } 348 356 349 357 module_init(cbe_cpufreq_init);