ARM: tegra: dvfs: Optimize Tegra3 VDD_CPU control in LP mode
Alex Frid [Wed, 26 Oct 2011 06:36:26 +0000 (23:36 -0700)]
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

arch/arm/mach-tegra/dvfs.c
arch/arm/mach-tegra/dvfs.h

index 6a832b3..aee4c35 100644 (file)
@@ -97,6 +97,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)
@@ -109,10 +110,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;
index 93d0009..4507141 100644 (file)
@@ -49,6 +49,7 @@ struct dvfs_rail {
        int max_millivolts;
        int nominal_millivolts;
        int step;
+       bool jmp_to_zero;
        bool disabled;
        bool updating;
        bool resolving_to;