diff options
Diffstat (limited to 'drivers/cpufreq/sa1100-cpufreq.c')
-rw-r--r-- | drivers/cpufreq/sa1100-cpufreq.c | 49 |
1 files changed, 38 insertions, 11 deletions
diff --git a/drivers/cpufreq/sa1100-cpufreq.c b/drivers/cpufreq/sa1100-cpufreq.c index 623da74..cff18e8 100644 --- a/drivers/cpufreq/sa1100-cpufreq.c +++ b/drivers/cpufreq/sa1100-cpufreq.c @@ -177,33 +177,60 @@ static void sa1100_update_dram_timings(int current_speed, int new_speed) } } -static int sa1100_target(struct cpufreq_policy *policy, unsigned int ppcr) +static int sa1100_target(struct cpufreq_policy *policy, + unsigned int target_freq, + unsigned int relation) { unsigned int cur = sa11x0_getspeed(0); - unsigned int new_freq; + unsigned int new_ppcr; + struct cpufreq_freqs freqs; + + new_ppcr = sa11x0_freq_to_ppcr(target_freq); + switch (relation) { + case CPUFREQ_RELATION_L: + if (sa11x0_ppcr_to_freq(new_ppcr) > policy->max) + new_ppcr--; + break; + case CPUFREQ_RELATION_H: + if ((sa11x0_ppcr_to_freq(new_ppcr) > target_freq) && + (sa11x0_ppcr_to_freq(new_ppcr - 1) >= policy->min)) + new_ppcr--; + break; + } + + freqs.old = cur; + freqs.new = sa11x0_ppcr_to_freq(new_ppcr); - new_freq = sa11x0_freq_table[ppcr].frequency; + cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE); - if (new_freq > cur) - sa1100_update_dram_timings(cur, new_freq); + if (freqs.new > cur) + sa1100_update_dram_timings(cur, freqs.new); - PPCR = ppcr; + PPCR = new_ppcr; - if (new_freq < cur) - sa1100_update_dram_timings(cur, new_freq); + if (freqs.new < cur) + sa1100_update_dram_timings(cur, freqs.new); + + cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE); return 0; } static int __init sa1100_cpu_init(struct cpufreq_policy *policy) { - return cpufreq_generic_init(policy, sa11x0_freq_table, CPUFREQ_ETERNAL); + if (policy->cpu != 0) + return -EINVAL; + policy->cur = policy->min = policy->max = sa11x0_getspeed(0); + policy->cpuinfo.min_freq = 59000; + policy->cpuinfo.max_freq = 287000; + policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL; + return 0; } static struct cpufreq_driver sa1100_driver __refdata = { .flags = CPUFREQ_STICKY, - .verify = cpufreq_generic_frequency_table_verify, - .target_index = sa1100_target, + .verify = sa11x0_verify_speed, + .target = sa1100_target, .get = sa11x0_getspeed, .init = sa1100_cpu_init, .name = "sa1100", |