OMAP2+ all have frequency tables, hence the hacks we had for older
silicon do not need to be carried forward. As part of this change,
use cpufreq_frequency_table_target to find the best match for
frequency requested.
Signed-off-by: Nishanth Menon n...@ti.com
---
arch/arm/mach-omap2/omap2plus-cpufreq.c | 64 +++---
1 files changed, 32 insertions(+), 32 deletions(-)
diff --git a/arch/arm/mach-omap2/omap2plus-cpufreq.c
b/arch/arm/mach-omap2/omap2plus-cpufreq.c
index dbbf8b2..7c0eb77 100644
--- a/arch/arm/mach-omap2/omap2plus-cpufreq.c
+++ b/arch/arm/mach-omap2/omap2plus-cpufreq.c
@@ -38,8 +38,6 @@
#include mach/hardware.h
-#define VERY_HI_RATE 9
-
static struct cpufreq_frequency_table *freq_table;
static struct clk *mpu_clk;
static char *mpu_clk_name;
@@ -48,20 +46,9 @@ static bool use_opp;
static int omap_verify_speed(struct cpufreq_policy *policy)
{
- if (freq_table)
- return cpufreq_frequency_table_verify(policy, freq_table);
-
- if (policy-cpu)
+ if (!freq_table)
return -EINVAL;
-
- cpufreq_verify_within_limits(policy, policy-cpuinfo.min_freq,
-policy-cpuinfo.max_freq);
-
- policy-min = clk_round_rate(mpu_clk, policy-min * 1000) / 1000;
- policy-max = clk_round_rate(mpu_clk, policy-max * 1000) / 1000;
- cpufreq_verify_within_limits(policy, policy-cpuinfo.min_freq,
-policy-cpuinfo.max_freq);
- return 0;
+ return cpufreq_frequency_table_verify(policy, freq_table);
}
static unsigned int omap_getspeed(unsigned int cpu)
@@ -79,22 +66,35 @@ static int omap_target(struct cpufreq_policy *policy,
unsigned int target_freq,
unsigned int relation)
{
- int i, ret = 0;
+ unsigned int i;
+ int ret = 0;
struct cpufreq_freqs freqs;
/* Changes not allowed until all CPUs are online */
if (is_smp() (num_online_cpus() NR_CPUS))
return ret;
- /* Ensure desired rate is within allowed range. Some govenors
-* (ondemand) will just pass target_freq=0 to get the minimum. */
- if (target_freq policy-min)
- target_freq = policy-min;
- if (target_freq policy-max)
- target_freq = policy-max;
+ if (!freq_table) {
+ dev_err(mpu_dev, %s: cpu%d: no freq table!\n, __func__,
+ policy-cpu);
+ return -EINVAL;
+ }
+
+ ret = cpufreq_frequency_table_target(policy, freq_table, target_freq,
+ relation, i);
+ if (ret) {
+ dev_dbg(mpu_dev, %s: cpu%d: no freq match for %d(ret=%d)\n,
+ __func__, policy-cpu, target_freq, ret);
+ return ret;
+ }
+ freqs.new = freq_table[i].frequency;
+ if (!freqs.new) {
+ dev_err(mpu_dev, %s: cpu%d: no match for freq %d\n, __func__,
+ policy-cpu, target_freq);
+ return -EINVAL;
+ }
freqs.old = omap_getspeed(policy-cpu);
- freqs.new = clk_round_rate(mpu_clk, target_freq * 1000) / 1000;
freqs.cpu = policy-cpu;
if (freqs.old == freqs.new)
@@ -172,17 +172,17 @@ static int __cpuinit omap_cpu_init(struct cpufreq_policy
*policy)
else
clk_init_cpufreq_table(freq_table);
- if (freq_table) {
- result = cpufreq_frequency_table_cpuinfo(policy, freq_table);
- if (!result)
- cpufreq_frequency_table_get_attr(freq_table,
- policy-cpu);
- } else {
- policy-cpuinfo.min_freq = clk_round_rate(mpu_clk, 0) / 1000;
- policy-cpuinfo.max_freq = clk_round_rate(mpu_clk,
- VERY_HI_RATE) / 1000;
+ if (!freq_table) {
+ dev_err(mpu_dev, %s: cpu%d: unable to allocate freq table\n,
+ __func__, policy-cpu);
+ return -ENOMEM;
}
+ result = cpufreq_frequency_table_cpuinfo(policy, freq_table);
+ if (!result)
+ cpufreq_frequency_table_get_attr(freq_table,
+ policy-cpu);
+
policy-min = policy-cpuinfo.min_freq;
policy-max = policy-cpuinfo.max_freq;
policy-cur = omap_getspeed(policy-cpu);
--
1.7.1
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html