Merge branch 'timers/clockevents' of git://git.linaro.org/people/dlezcano/clockevents...
[firefly-linux-kernel-4.4.55.git] / drivers / cpufreq / imx6q-cpufreq.c
index b78bc35973ba33f74cf795e67ba8eda00b069cc5..e37cdaedbb5b39b244e3aa6caec947721297999d 100644 (file)
@@ -68,8 +68,6 @@ static int imx6q_set_target(struct cpufreq_policy *policy,
        if (freqs.old == freqs.new)
                return 0;
 
-       cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
-
        rcu_read_lock();
        opp = opp_find_freq_ceil(cpu_dev, &freq_hz);
        if (IS_ERR(opp)) {
@@ -86,13 +84,16 @@ static int imx6q_set_target(struct cpufreq_policy *policy,
                freqs.old / 1000, volt_old / 1000,
                freqs.new / 1000, volt / 1000);
 
+       cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
+
        /* scaling up?  scale voltage before frequency */
        if (freqs.new > freqs.old) {
                ret = regulator_set_voltage_tol(arm_reg, volt, 0);
                if (ret) {
                        dev_err(cpu_dev,
                                "failed to scale vddarm up: %d\n", ret);
-                       return ret;
+                       freqs.new = freqs.old;
+                       goto post_notify;
                }
 
                /*
@@ -145,15 +146,18 @@ static int imx6q_set_target(struct cpufreq_policy *policy,
        if (ret) {
                dev_err(cpu_dev, "failed to set clock rate: %d\n", ret);
                regulator_set_voltage_tol(arm_reg, volt_old, 0);
-               return ret;
+               freqs.new = freqs.old;
+               goto post_notify;
        }
 
        /* scaling down?  scale voltage after frequency */
        if (freqs.new < freqs.old) {
                ret = regulator_set_voltage_tol(arm_reg, volt, 0);
-               if (ret)
+               if (ret) {
                        dev_warn(cpu_dev,
                                 "failed to scale vddarm down: %d\n", ret);
+                       ret = 0;
+               }
 
                if (freqs.old == FREQ_1P2_GHZ / 1000) {
                        regulator_set_voltage_tol(pu_reg,
@@ -163,9 +167,10 @@ static int imx6q_set_target(struct cpufreq_policy *policy,
                }
        }
 
+post_notify:
        cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
 
-       return 0;
+       return ret;
 }
 
 static int imx6q_cpufreq_init(struct cpufreq_policy *policy)