summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2011-03-09 18:58:01 -0800
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:42:24 -0800
commit3b78c03df40d902bc6abb9812c04fca81054fdab (patch)
treee5bbab7f0f5577e8ec41b3a5b248be9f0ffb221a
parentdc930f7e452c147783ed974a198be129e94445f7 (diff)
ARM: tegra: dvfs: Add Tegra3 EMC and CPU rates dependency
Original-Change-Id: I28155e59fd6cb36ccd63d8d17ed01b70b9209f97 Original-Change-Id: Ic4ebe6007ab9ee308039ad86c0930f85d116fdd5 Reviewed-on: http://git-master/r/22531 Reviewed-by: Aleksandr Frid <afrid@nvidia.com> Tested-by: Aleksandr Frid <afrid@nvidia.com> Reviewed-by: Narendra Damahe <ndamahe@nvidia.com> Reviewed-by: Yu-Huan Hsu <yhsu@nvidia.com> Original-Change-Id: I4e5e939921d6d82aa8687545399a867901655069 Rebase-Id: R71c8b69183d12414112d88d60fe54a7b85a6d3de
-rw-r--r--arch/arm/mach-tegra/clock.h1
-rw-r--r--arch/arm/mach-tegra/cpu-tegra.c11
-rw-r--r--arch/arm/mach-tegra/tegra2_clocks.c15
-rw-r--r--arch/arm/mach-tegra/tegra3_clocks.c21
4 files changed, 38 insertions, 10 deletions
diff --git a/arch/arm/mach-tegra/clock.h b/arch/arm/mach-tegra/clock.h
index 0a9c3d95031c..4fec266d8d57 100644
--- a/arch/arm/mach-tegra/clock.h
+++ b/arch/arm/mach-tegra/clock.h
@@ -246,6 +246,7 @@ struct tegra_cpufreq_table_data {
int throttle_highest_index;
};
struct tegra_cpufreq_table_data *tegra_cpufreq_table_get(void);
+unsigned long tegra_emc_to_cpu_ratio(unsigned long cpu_rate);
#endif
#endif
diff --git a/arch/arm/mach-tegra/cpu-tegra.c b/arch/arm/mach-tegra/cpu-tegra.c
index ea6b7aaffa90..48386d0129e0 100644
--- a/arch/arm/mach-tegra/cpu-tegra.c
+++ b/arch/arm/mach-tegra/cpu-tegra.c
@@ -216,16 +216,7 @@ static int tegra_update_cpu_speed(unsigned long rate)
* Vote on memory bus frequency based on cpu frequency
* This sets the minimum frequency, display or avp may request higher
*/
- if (rate >= 816000)
- clk_set_rate(emc_clk, 600000000); /* cpu 816 MHz, emc max */
- else if (rate >= 608000)
- clk_set_rate(emc_clk, 300000000); /* cpu 608 MHz, emc 150Mhz */
- else if (rate >= 456000)
- clk_set_rate(emc_clk, 150000000); /* cpu 456 MHz, emc 75Mhz */
- else if (rate >= 312000)
- clk_set_rate(emc_clk, 100000000); /* cpu 312 MHz, emc 50Mhz */
- else
- clk_set_rate(emc_clk, 50000000); /* emc 25Mhz */
+ clk_set_rate(emc_clk, tegra_emc_to_cpu_ratio(rate));
for_each_online_cpu(freqs.cpu)
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
diff --git a/arch/arm/mach-tegra/tegra2_clocks.c b/arch/arm/mach-tegra/tegra2_clocks.c
index 0ae724cae9ae..941f75d78963 100644
--- a/arch/arm/mach-tegra/tegra2_clocks.c
+++ b/arch/arm/mach-tegra/tegra2_clocks.c
@@ -2499,6 +2499,21 @@ struct tegra_cpufreq_table_data *tegra_cpufreq_table_get(void)
BUG();
return &cpufreq_tables[0];
}
+
+unsigned long tegra_emc_to_cpu_ratio(unsigned long cpu_rate)
+{
+ /* Vote on memory bus frequency based on cpu frequency */
+ if (cpu_rate >= 816000)
+ return 600000000; /* cpu 816 MHz, emc max */
+ else if (cpu_rate >= 608000)
+ return 300000000; /* cpu 608 MHz, emc 150Mhz */
+ else if (cpu_rate >= 456000)
+ return 150000000; /* cpu 456 MHz, emc 75Mhz */
+ else if (cpu_rate >= 312000)
+ return 100000000; /* cpu 312 MHz, emc 50Mhz */
+ else
+ return 50000000; /* emc 25Mhz */
+}
#endif
#ifdef CONFIG_PM
diff --git a/arch/arm/mach-tegra/tegra3_clocks.c b/arch/arm/mach-tegra/tegra3_clocks.c
index 63bf68595956..c613f0dad417 100644
--- a/arch/arm/mach-tegra/tegra3_clocks.c
+++ b/arch/arm/mach-tegra/tegra3_clocks.c
@@ -2961,6 +2961,7 @@ static struct clk tegra_clk_emc = {
.ops = &tegra_emc_clk_ops,
.reg = 0x19c,
.max_rate = 800000000,
+ .min_rate = 50000000,
.inputs = mux_pllm_pllc_pllp_clkm,
.flags = MUX | DIV_U71 | PERIPH_EMC_ENB,
.u.periph = {
@@ -3299,6 +3300,26 @@ struct tegra_cpufreq_table_data *tegra_cpufreq_table_get(void)
BUG();
return &cpufreq_tables[0];
}
+
+unsigned long tegra_emc_to_cpu_ratio(unsigned long cpu_rate)
+{
+ static unsigned long emc_max_rate = 0;
+
+ if (emc_max_rate == 0)
+ emc_max_rate = clk_round_rate(
+ tegra_get_clock_by_name("emc"), ULONG_MAX);
+
+ /* Vote on memory bus frequency based on cpu frequency;
+ cpu rate is in kHz, emc rate is in Hz */
+ if (cpu_rate >= 750000)
+ return emc_max_rate; /* cpu >= 750 MHz, emc max */
+ else if (cpu_rate >= 450000)
+ return emc_max_rate/2; /* cpu >= 500 MHz, emc max/2 */
+ else if (cpu_rate >= 250000)
+ return 100000000; /* cpu >= 250 MHz, emc 100 MHz */
+ else
+ return 0; /* emc min */
+}
#endif
#ifdef CONFIG_PM