diff options
Diffstat (limited to 'extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpufreq-fixes/0005-OMAP2-cpufreq-use-cpufreq_frequency_table_target.patch')
-rw-r--r-- | extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpufreq-fixes/0005-OMAP2-cpufreq-use-cpufreq_frequency_table_target.patch | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpufreq-fixes/0005-OMAP2-cpufreq-use-cpufreq_frequency_table_target.patch b/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpufreq-fixes/0005-OMAP2-cpufreq-use-cpufreq_frequency_table_target.patch new file mode 100644 index 00000000..504d1916 --- /dev/null +++ b/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpufreq-fixes/0005-OMAP2-cpufreq-use-cpufreq_frequency_table_target.patch @@ -0,0 +1,78 @@ +From 272d76bcb22b9509ccc1b59d3a62e3930d902d17 Mon Sep 17 00:00:00 2001 +From: Nishanth Menon <nm@ti.com> +Date: Fri, 13 May 2011 05:43:49 -0700 +Subject: [PATCH 5/6] OMAP2+: cpufreq: use cpufreq_frequency_table_target + +Use cpufreq_frequency_table_target for finding the proper target +instead of seeing if the frequency requested is divisible alone. +if we have a frequency table, we should restrict ourselves to +selecting the "approved" frequencies alone and only in the case +where the frequency table is not available should we attempt at +closest roundable clock frequency. + +Signed-off-by: Nishanth Menon <nm@ti.com> +Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> +--- + arch/arm/mach-omap2/omap2plus-cpufreq.c | 38 ++++++++++++++++++++++-------- + 1 files changed, 28 insertions(+), 10 deletions(-) + +diff --git a/arch/arm/mach-omap2/omap2plus-cpufreq.c b/arch/arm/mach-omap2/omap2plus-cpufreq.c +index 854f4b3..d0b4f97 100644 +--- a/arch/arm/mach-omap2/omap2plus-cpufreq.c ++++ b/arch/arm/mach-omap2/omap2plus-cpufreq.c +@@ -77,24 +77,42 @@ 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) { ++ ret = cpufreq_frequency_table_target(policy, freq_table, ++ target_freq, relation, &i); ++ if (ret) { ++ pr_debug("%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; ++ } else { ++ /* ++ * 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; ++ ++ freqs.new = clk_round_rate(mpu_clk, target_freq * 1000) / 1000; ++ } ++ if (!freqs.new) { ++ pr_err("%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) +-- +1.6.6.1 + |