diff options
author | Alex Frid <afrid@nvidia.com> | 2011-10-25 23:36:26 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:49:57 -0800 |
commit | f7608a5f206b42f1b598e6f0b1c9d03594688f98 (patch) | |
tree | b0a443e7b0db17388d889a883785d54aa9030534 /arch/arm/mach-tegra/dvfs.c | |
parent | 529ed3a4eef9a419faefc700565cd442c102e778 (diff) |
ARM: tegra: dvfs: Optimize Tegra3 VDD_CPU control in LP mode
Optimized Tegra3 VDD_CPU control when VDD_CPU target is set to zero,
which could happen only while CPU is in LP mode (and CPU regulator
output is turned off by side-band signal, anyway):
- Ignore VDD_CPU dependency on VDD_CORE while VDD_CPU target is zero
- Allow VDD_CPU one step change to zero (i.e., to minimum voltage set
by constraints) after entry to LP mode
- Allow VDD_CPU one step change to the predicted G mode target before
exit from LP mode
(cherry picked from commit 5826f3e28867207b5dad1c50795de8275d1af872)
(cherry picked from commit 79c531421dfc65e27af657fd12b64c4187c67827)
Change-Id: I3c469132034a431d2e9b8727d11d604c306122f1
Reviewed-on: http://git-master/r/63357
Reviewed-by: Varun Colbert <vcolbert@nvidia.com>
Tested-by: Varun Colbert <vcolbert@nvidia.com>
Rebase-Id: R4c4f6e79decddb778f58cb5eef853a4c9d52ca94
Diffstat (limited to 'arch/arm/mach-tegra/dvfs.c')
-rw-r--r-- | arch/arm/mach-tegra/dvfs.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/arch/arm/mach-tegra/dvfs.c b/arch/arm/mach-tegra/dvfs.c index dc0d779870a6..2276c8befbe5 100644 --- a/arch/arm/mach-tegra/dvfs.c +++ b/arch/arm/mach-tegra/dvfs.c @@ -98,6 +98,7 @@ static int dvfs_rail_set_voltage(struct dvfs_rail *rail, int millivolts) int step = (millivolts > rail->millivolts) ? rail->step : -rail->step; int i; int steps; + bool jmp_to_zero; if (!rail->reg) { if (millivolts == rail->millivolts) @@ -110,10 +111,14 @@ static int dvfs_rail_set_voltage(struct dvfs_rail *rail, int millivolts) return 0; rail->resolving_to = true; - steps = DIV_ROUND_UP(abs(millivolts - rail->millivolts), rail->step); + jmp_to_zero = rail->jmp_to_zero && + ((millivolts == 0) || (rail->millivolts == 0)); + steps = jmp_to_zero ? 1 : + DIV_ROUND_UP(abs(millivolts - rail->millivolts), rail->step); for (i = 0; i < steps; i++) { - if (abs(millivolts - rail->millivolts) > rail->step) + if (!jmp_to_zero && + (abs(millivolts - rail->millivolts) > rail->step)) rail->new_millivolts = rail->millivolts + step; else rail->new_millivolts = millivolts; |