]> Pileus Git - ~andy/linux/blobdiff - drivers/cpufreq/spear-cpufreq.c
Merge branch 'acpi-config'
[~andy/linux] / drivers / cpufreq / spear-cpufreq.c
index 3f418166ce02b8fc57a664f3d870bfb8508f3018..d02ccd19c9c4f20e4b5a3cfdcf1035b0c15c97fd 100644 (file)
@@ -30,11 +30,6 @@ static struct {
        u32 cnt;
 } spear_cpufreq;
 
-static int spear_cpufreq_verify(struct cpufreq_policy *policy)
-{
-       return cpufreq_frequency_table_verify(policy, spear_cpufreq.freq_tbl);
-}
-
 static unsigned int spear_cpufreq_get(unsigned int cpu)
 {
        return clk_get_rate(spear_cpufreq.clk) / 1000;
@@ -110,20 +105,14 @@ static int spear1340_set_cpu_rate(struct clk *sys_pclk, unsigned long newfreq)
 }
 
 static int spear_cpufreq_target(struct cpufreq_policy *policy,
-               unsigned int target_freq, unsigned int relation)
+               unsigned int index)
 {
-       struct cpufreq_freqs freqs;
        long newfreq;
        struct clk *srcclk;
-       int index, ret, mult = 1;
-
-       if (cpufreq_frequency_table_target(policy, spear_cpufreq.freq_tbl,
-                               target_freq, relation, &index))
-               return -EINVAL;
-
-       freqs.old = spear_cpufreq_get(0);
+       int ret, mult = 1;
 
        newfreq = spear_cpufreq.freq_tbl[index].frequency * 1000;
+
        if (of_machine_is_compatible("st,spear1340")) {
                /*
                 * SPEAr1340 is special in the sense that due to the possibility
@@ -154,65 +143,32 @@ static int spear_cpufreq_target(struct cpufreq_policy *policy,
                return newfreq;
        }
 
-       freqs.new = newfreq / 1000;
-       freqs.new /= mult;
-
-       cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
-
        if (mult == 2)
                ret = spear1340_set_cpu_rate(srcclk, newfreq);
        else
                ret = clk_set_rate(spear_cpufreq.clk, newfreq);
 
-       /* Get current rate after clk_set_rate, in case of failure */
-       if (ret) {
+       if (ret)
                pr_err("CPU Freq: cpu clk_set_rate failed: %d\n", ret);
-               freqs.new = clk_get_rate(spear_cpufreq.clk) / 1000;
-       }
 
-       cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
        return ret;
 }
 
 static int spear_cpufreq_init(struct cpufreq_policy *policy)
 {
-       int ret;
-
-       ret = cpufreq_frequency_table_cpuinfo(policy, spear_cpufreq.freq_tbl);
-       if (ret) {
-               pr_err("cpufreq_frequency_table_cpuinfo() failed");
-               return ret;
-       }
-
-       cpufreq_frequency_table_get_attr(spear_cpufreq.freq_tbl, policy->cpu);
-       policy->cpuinfo.transition_latency = spear_cpufreq.transition_latency;
-       policy->cur = spear_cpufreq_get(0);
-
-       cpumask_setall(policy->cpus);
-
-       return 0;
-}
-
-static int spear_cpufreq_exit(struct cpufreq_policy *policy)
-{
-       cpufreq_frequency_table_put_attr(policy->cpu);
-       return 0;
+       return cpufreq_generic_init(policy, spear_cpufreq.freq_tbl,
+                       spear_cpufreq.transition_latency);
 }
 
-static struct freq_attr *spear_cpufreq_attr[] = {
-        &cpufreq_freq_attr_scaling_available_freqs,
-        NULL,
-};
-
 static struct cpufreq_driver spear_cpufreq_driver = {
        .name           = "cpufreq-spear",
        .flags          = CPUFREQ_STICKY,
-       .verify         = spear_cpufreq_verify,
-       .target         = spear_cpufreq_target,
+       .verify         = cpufreq_generic_frequency_table_verify,
+       .target_index   = spear_cpufreq_target,
        .get            = spear_cpufreq_get,
        .init           = spear_cpufreq_init,
-       .exit           = spear_cpufreq_exit,
-       .attr           = spear_cpufreq_attr,
+       .exit           = cpufreq_generic_exit,
+       .attr           = cpufreq_generic_attr,
 };
 
 static int spear_cpufreq_driver_init(void)