summaryrefslogtreecommitdiff
path: root/arch/arm
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2014-03-15 19:06:56 -0700
committerYu-Huan Hsu <yhsu@nvidia.com>2014-03-17 12:30:59 -0700
commit18410fc7404225aa4f578fb7741b7f8080dfa13d (patch)
treeb6ba32ac20ad417fa39d9deb74c86c8651ea148f /arch/arm
parentdefd0ba1d9596d0dac5af2e486aa51979dcc2091 (diff)
ARM: tegra: power: Add SiMon voltage settle delay
Added voltage settling time to SiMon grader description, and delay grading respectively. Bug 1343366 Change-Id: I0eb476cea75a51d015f9dd0c3686e2f52f31a8cb Signed-off-by: Alex Frid <afrid@nvidia.com> Reviewed-on: http://git-master/r/382334 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Yu-Huan Hsu <yhsu@nvidia.com>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/mach-tegra/tegra_simon.c15
-rw-r--r--arch/arm/mach-tegra/tegra_simon.h1
2 files changed, 16 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/tegra_simon.c b/arch/arm/mach-tegra/tegra_simon.c
index 585ee850f4e5..7a8a2d4af84e 100644
--- a/arch/arm/mach-tegra/tegra_simon.c
+++ b/arch/arm/mach-tegra/tegra_simon.c
@@ -23,6 +23,7 @@
#include <linux/debugfs.h>
#include <linux/seq_file.h>
#include <linux/hrtimer.h>
+#include <linux/delay.h>
#include <linux/thermal.h>
#include <linux/regulator/consumer.h>
@@ -49,6 +50,16 @@ static struct tegra_simon_grader simon_graders[TEGRA_SIMON_DOMAIN_NUM] = {
},
};
+static void settle_delay(struct tegra_simon_grader *grader)
+{
+ int us = grader->desc->settle_us;
+
+ if (us < MAX_UDELAY_MS * 1000)
+ udelay(us);
+ else
+ usleep_range(us, us + 100);
+}
+
/*
* GPU grading is implemented within vdd_gpu post-change notification chain that
* guarantees constant voltage during grading. First grading after boot can be
@@ -84,6 +95,7 @@ static int tegra_simon_gpu_grading_cb(
}
if (grader->desc->grade_simon_domain) {
+ settle_delay(grader); /* delay for voltage to settle */
grade = grader->desc->grade_simon_domain(grader->domain, mv, t);
if (grade < 0) {
pr_err("%s: Failed to grade %s\n",
@@ -180,6 +192,7 @@ static int tegra_simon_cpu_grading_cb(
mv = tegra_cl_dvfs_vmin_read_begin(cld, &start);
if (grader->desc->grade_simon_domain) {
+ settle_delay(grader); /* delay for voltage to settle */
grade = grader->desc->grade_simon_domain(grader->domain, mv, t);
if (grade < 0) {
pr_err("%s: Failed to grade %s\n",
@@ -409,12 +422,14 @@ static int fake_grader(int domain, int mv, int temperature)
static struct tegra_simon_grader_desc gpu_grader_desc = {
.domain = TEGRA_SIMON_DOMAIN_GPU,
.grading_mv_limit = 850,
+ .settle_us = 3000,
.grade_simon_domain = fake_grader,
};
static struct tegra_simon_grader_desc cpu_grader_desc = {
.domain = TEGRA_SIMON_DOMAIN_CPU,
.garding_rate_limit = 714000000,
+ .settle_us = 3000,
.grade_simon_domain = fake_grader,
};
diff --git a/arch/arm/mach-tegra/tegra_simon.h b/arch/arm/mach-tegra/tegra_simon.h
index 99c4a7e91f56..1fb717e43801 100644
--- a/arch/arm/mach-tegra/tegra_simon.h
+++ b/arch/arm/mach-tegra/tegra_simon.h
@@ -30,6 +30,7 @@ enum tegra_simon_domain {
struct tegra_simon_grader_desc {
enum tegra_simon_domain domain;
+ int settle_us;
int grading_mv_limit;
unsigned long garding_rate_limit;
int (*grade_simon_domain) (int domain, int mv, int temperature);