diff options
author | Alex Frid <afrid@nvidia.com> | 2014-03-15 19:06:56 -0700 |
---|---|---|
committer | Yu-Huan Hsu <yhsu@nvidia.com> | 2014-03-17 12:30:59 -0700 |
commit | 18410fc7404225aa4f578fb7741b7f8080dfa13d (patch) | |
tree | b6ba32ac20ad417fa39d9deb74c86c8651ea148f /arch/arm | |
parent | defd0ba1d9596d0dac5af2e486aa51979dcc2091 (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.c | 15 | ||||
-rw-r--r-- | arch/arm/mach-tegra/tegra_simon.h | 1 |
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); |