Merge branch 'pm-cpufreq'
[cascardo/linux.git] / drivers / cpufreq / cpufreq-cpu0.c
index 37d23a0..3ab8294 100644 (file)
@@ -44,8 +44,9 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
 {
        struct cpufreq_freqs freqs;
        struct opp *opp;
-       unsigned long freq_Hz, volt = 0, volt_old = 0, tol = 0;
-       unsigned int index, cpu;
+       unsigned long volt = 0, volt_old = 0, tol = 0;
+       long freq_Hz;
+       unsigned int index;
        int ret;
 
        ret = cpufreq_frequency_table_target(policy, freq_table, target_freq,
@@ -65,10 +66,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
        if (freqs.old == freqs.new)
                return 0;
 
-       for_each_online_cpu(cpu) {
-               freqs.cpu = cpu;
-               cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
-       }
+       cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
 
        if (cpu_reg) {
                rcu_read_lock();
@@ -76,7 +74,9 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
                if (IS_ERR(opp)) {
                        rcu_read_unlock();
                        pr_err("failed to find OPP for %ld\n", freq_Hz);
-                       return PTR_ERR(opp);
+                       freqs.new = freqs.old;
+                       ret = PTR_ERR(opp);
+                       goto post_notify;
                }
                volt = opp_get_voltage(opp);
                rcu_read_unlock();
@@ -94,7 +94,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
                if (ret) {
                        pr_err("failed to scale voltage up: %d\n", ret);
                        freqs.new = freqs.old;
-                       return ret;
+                       goto post_notify;
                }
        }
 
@@ -103,7 +103,8 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
                pr_err("failed to set clock rate: %d\n", ret);
                if (cpu_reg)
                        regulator_set_voltage_tol(cpu_reg, volt_old, tol);
-               return ret;
+               freqs.new = freqs.old;
+               goto post_notify;
        }
 
        /* scaling down?  scale voltage after frequency */
@@ -113,25 +114,19 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
                        pr_err("failed to scale voltage down: %d\n", ret);
                        clk_set_rate(cpu_clk, freqs.old * 1000);
                        freqs.new = freqs.old;
-                       return ret;
                }
        }
 
-       for_each_online_cpu(cpu) {
-               freqs.cpu = cpu;
-               cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
-       }
+post_notify:
+       cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
 
-       return 0;
+       return ret;
 }
 
 static int cpu0_cpufreq_init(struct cpufreq_policy *policy)
 {
        int ret;
 
-       if (policy->cpu != 0)
-               return -EINVAL;
-
        ret = cpufreq_frequency_table_cpuinfo(policy, freq_table);
        if (ret) {
                pr_err("invalid frequency table: %d\n", ret);
@@ -262,6 +257,7 @@ static int cpu0_cpufreq_probe(struct platform_device *pdev)
        }
 
        of_node_put(np);
+       of_node_put(parent);
        return 0;
 
 out_free_table: