Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=e5ecc8719212e2566440818491ec5741689f3743
Commit:     e5ecc8719212e2566440818491ec5741689f3743
Parent:     a964b9be3e475f30aee334654b4ff200bcdc0092
Author:     Christian Krafft <[EMAIL PROTECTED]>
AuthorDate: Fri Jul 20 21:39:20 2007 +0200
Committer:  Arnd Bergmann <[EMAIL PROTECTED]>
CommitDate: Fri Jul 20 21:41:36 2007 +0200

    [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 <[EMAIL PROTECTED]>
    Signed-off-by: Arnd Bergmann <[EMAIL PROTECTED]>
---
 arch/powerpc/platforms/cell/cbe_cpufreq.c |   20 ++++++++------------
 1 files changed, 8 insertions(+), 12 deletions(-)

diff --git a/arch/powerpc/platforms/cell/cbe_cpufreq.c 
b/arch/powerpc/platforms/cell/cbe_cpufreq.c
index 5820fb9..3a26b3c 100644
--- a/arch/powerpc/platforms/cell/cbe_cpufreq.c
+++ b/arch/powerpc/platforms/cell/cbe_cpufreq.c
@@ -196,10 +196,9 @@ static int pmi_notifier(struct notifier_block *nb,
 {
        struct cpufreq_policy *policy = data;
 
-       if (event != CPUFREQ_INCOMPATIBLE)
-               return 0;
+       if (pmi_frequency_limit)
+               cpufreq_verify_within_limits(policy, 0, pmi_frequency_limit);
 
-       cpufreq_verify_within_limits(policy, 0, pmi_frequency_limit);
        return 0;
 }
 
@@ -263,11 +262,6 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy 
*policy)
 
        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 */
        return cpufreq_frequency_table_cpuinfo(policy, cbe_freqs);
@@ -275,9 +269,6 @@ static int cbe_cpufreq_cpu_init(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);
        return 0;
 }
@@ -341,6 +332,9 @@ static int __init cbe_cpufreq_init(void)
 
        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);
 }
 
@@ -348,8 +342,10 @@ static void __exit cbe_cpufreq_exit(void)
 {
        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);
+       }
 }
 
 module_init(cbe_cpufreq_init);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to