diff options
author | Alex Frid <afrid@nvidia.com> | 2011-03-09 18:58:01 -0800 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:42:24 -0800 |
commit | 3b78c03df40d902bc6abb9812c04fca81054fdab (patch) | |
tree | e5bbab7f0f5577e8ec41b3a5b248be9f0ffb221a | |
parent | dc930f7e452c147783ed974a198be129e94445f7 (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.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-tegra/cpu-tegra.c | 11 | ||||
-rw-r--r-- | arch/arm/mach-tegra/tegra2_clocks.c | 15 | ||||
-rw-r--r-- | arch/arm/mach-tegra/tegra3_clocks.c | 21 |
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 |