summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmit Kamath <akamath@nvidia.com>2012-12-13 17:24:15 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 12:57:55 -0700
commitaf4ee0fed33542178bf61ee2f9f716845ae8f125 (patch)
tree50a42a4111a29d6433a8a3af25dcb763fe53e754
parent1bd331d4baf43f047ed41cfde9ac94aec8677fe6 (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.c24
-rw-r--r--arch/arm/mach-tegra/cpu-tegra.h1
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);