diff options
author | Amit Kamath <akamath@nvidia.com> | 2012-12-13 17:24:15 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2013-09-14 12:57:55 -0700 |
commit | af4ee0fed33542178bf61ee2f9f716845ae8f125 (patch) | |
tree | 50a42a4111a29d6433a8a3af25dcb763fe53e754 | |
parent | 1bd331d4baf43f047ed41cfde9ac94aec8677fe6 (diff) |
arm: tegra: cpu: Add interface for voltage limiting
Interface to limit the frequency as per need to limit the voltage. This
will maintain the sanity of device over extended period.
bug 1042409
Change-Id: I89ed829a8435ce34370508b9d4b21a4492826504
Signed-off-by: Amit Kamath <akamath@nvidia.com>
Reviewed-on: http://git-master/r/170974
(cherry picked from commit e452785cb9dfc7726168bc80eaabb9da594bb0b2)
Signed-off-by: Richard Zhao <rizhao@nvidia.com>
Reviewed-on: http://git-master/r/201610
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
-rw-r--r-- | arch/arm/mach-tegra/cpu-tegra.c | 24 | ||||
-rw-r--r-- | arch/arm/mach-tegra/cpu-tegra.h | 1 |
2 files changed, 25 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/cpu-tegra.c b/arch/arm/mach-tegra/cpu-tegra.c index b53d5298a48a..d864e9b96ba4 100644 --- a/arch/arm/mach-tegra/cpu-tegra.c +++ b/arch/arm/mach-tegra/cpu-tegra.c @@ -52,6 +52,8 @@ static unsigned long target_cpu_speed[CONFIG_NR_CPUS]; static DEFINE_MUTEX(tegra_cpu_lock); static bool is_suspended; static int suspend_index; +static unsigned int volt_capped_speed; + static bool force_policy_max; @@ -608,6 +610,27 @@ unsigned long tegra_cpu_highest_speed(void) { return rate; } +void tegra_cpu_set_volt_cap(unsigned int cap) +{ + mutex_lock(&tegra_cpu_lock); + if (cap != volt_capped_speed) { + volt_capped_speed = cap; + tegra_cpu_set_speed_cap(NULL); + } + mutex_unlock(&tegra_cpu_lock); + if (cap) + pr_debug("tegra_cpu:volt limit to %u Khz\n", cap); + else + pr_debug("tegra_cpu:volt limit removed\n"); +} + +static unsigned int volt_cap_speed(unsigned int requested_speed) +{ + if (volt_capped_speed && requested_speed > volt_capped_speed) + return volt_capped_speed; + return requested_speed; +} + int tegra_cpu_set_speed_cap(unsigned int *speed_cap) { int ret = 0; @@ -623,6 +646,7 @@ int tegra_cpu_set_speed_cap(unsigned int *speed_cap) new_speed = tegra_throttle_governor_speed(new_speed); new_speed = edp_governor_speed(new_speed); new_speed = user_cap_speed(new_speed); + new_speed = volt_cap_speed(new_speed); if (speed_cap) *speed_cap = new_speed; diff --git a/arch/arm/mach-tegra/cpu-tegra.h b/arch/arm/mach-tegra/cpu-tegra.h index 37a6ffd0dac7..749ec6345cfa 100644 --- a/arch/arm/mach-tegra/cpu-tegra.h +++ b/arch/arm/mach-tegra/cpu-tegra.h @@ -27,6 +27,7 @@ unsigned int tegra_getspeed(unsigned int cpu); int tegra_update_cpu_speed(unsigned long rate); int tegra_cpu_set_speed_cap(unsigned int *speed_cap); +void tegra_cpu_set_volt_cap(unsigned int cap); unsigned int tegra_count_slow_cpus(unsigned long speed_limit); unsigned int tegra_get_slowest_cpu_n(void); unsigned long tegra_cpu_lowest_speed(void); |