Merge tag 'squashfs-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/pkl/squas...
[firefly-linux-kernel-4.4.55.git] / drivers / cpufreq / davinci-cpufreq.c
index 551dd655c6f2ac1d49fb1238ee20f38c213e3f36..5e8a854381b781876eb6ae3658e0a40ce632195a 100644 (file)
@@ -50,9 +50,7 @@ static int davinci_verify_speed(struct cpufreq_policy *policy)
        if (policy->cpu)
                return -EINVAL;
 
-       cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq,
-                                    policy->cpuinfo.max_freq);
-
+       cpufreq_verify_within_cpu_limits(policy);
        policy->min = clk_round_rate(armclk, policy->min * 1000) / 1000;
        policy->max = clk_round_rate(armclk, policy->max * 1000) / 1000;
        cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq,
@@ -68,58 +66,38 @@ static unsigned int davinci_getspeed(unsigned int cpu)
        return clk_get_rate(cpufreq.armclk) / 1000;
 }
 
-static int davinci_target(struct cpufreq_policy *policy,
-                               unsigned int target_freq, unsigned int relation)
+static int davinci_target(struct cpufreq_policy *policy, unsigned int idx)
 {
-       int ret = 0;
-       unsigned int idx;
-       struct cpufreq_freqs freqs;
        struct davinci_cpufreq_config *pdata = cpufreq.dev->platform_data;
        struct clk *armclk = cpufreq.armclk;
+       unsigned int old_freq, new_freq;
+       int ret = 0;
 
-       freqs.old = davinci_getspeed(0);
-       freqs.new = clk_round_rate(armclk, target_freq * 1000) / 1000;
-
-       if (freqs.old == freqs.new)
-               return ret;
-
-       dev_dbg(cpufreq.dev, "transition: %u --> %u\n", freqs.old, freqs.new);
-
-       ret = cpufreq_frequency_table_target(policy, pdata->freq_table,
-                                               freqs.new, relation, &idx);
-       if (ret)
-               return -EINVAL;
-
-       cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
+       old_freq = davinci_getspeed(0);
+       new_freq = pdata->freq_table[idx].frequency;
 
        /* if moving to higher frequency, up the voltage beforehand */
-       if (pdata->set_voltage && freqs.new > freqs.old) {
+       if (pdata->set_voltage && new_freq > old_freq) {
                ret = pdata->set_voltage(idx);
                if (ret)
-                       goto out;
+                       return ret;
        }
 
        ret = clk_set_rate(armclk, idx);
        if (ret)
-               goto out;
+               return ret;
 
        if (cpufreq.asyncclk) {
                ret = clk_set_rate(cpufreq.asyncclk, cpufreq.asyncrate);
                if (ret)
-                       goto out;
+                       return ret;
        }
 
        /* if moving to lower freq, lower the voltage after lowering freq */
-       if (pdata->set_voltage && freqs.new < freqs.old)
+       if (pdata->set_voltage && new_freq < old_freq)
                pdata->set_voltage(idx);
 
-out:
-       if (ret)
-               freqs.new = freqs.old;
-
-       cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
-
-       return ret;
+       return 0;
 }
 
 static int davinci_cpu_init(struct cpufreq_policy *policy)
@@ -138,47 +116,24 @@ static int davinci_cpu_init(struct cpufreq_policy *policy)
                        return result;
        }
 
-       policy->cur = davinci_getspeed(0);
-
-       result = cpufreq_frequency_table_cpuinfo(policy, freq_table);
-       if (result) {
-               pr_err("%s: cpufreq_frequency_table_cpuinfo() failed",
-                               __func__);
-               return result;
-       }
-
-       cpufreq_frequency_table_get_attr(freq_table, policy->cpu);
-
        /*
         * Time measurement across the target() function yields ~1500-1800us
         * time taken with no drivers on notification list.
         * Setting the latency to 2000 us to accommodate addition of drivers
         * to pre/post change notification list.
         */
-       policy->cpuinfo.transition_latency = 2000 * 1000;
-       return 0;
+       return cpufreq_generic_init(policy, freq_table, 2000 * 1000);
 }
 
-static int davinci_cpu_exit(struct cpufreq_policy *policy)
-{
-       cpufreq_frequency_table_put_attr(policy->cpu);
-       return 0;
-}
-
-static struct freq_attr *davinci_cpufreq_attr[] = {
-       &cpufreq_freq_attr_scaling_available_freqs,
-       NULL,
-};
-
 static struct cpufreq_driver davinci_driver = {
        .flags          = CPUFREQ_STICKY,
        .verify         = davinci_verify_speed,
-       .target         = davinci_target,
+       .target_index   = davinci_target,
        .get            = davinci_getspeed,
        .init           = davinci_cpu_init,
-       .exit           = davinci_cpu_exit,
+       .exit           = cpufreq_generic_exit,
        .name           = "davinci",
-       .attr           = davinci_cpufreq_attr,
+       .attr           = cpufreq_generic_attr,
 };
 
 static int __init davinci_cpufreq_probe(struct platform_device *pdev)