ARM: tegra11: clock: Allow switch to G CPU on PLLX
Alex Frid [Sat, 18 May 2013 06:19:22 +0000 (23:19 -0700)]
Enabled PLLX as CPU clock source immediately after LP CPU to G CPU
cluster switch when cross-over rate is below DFLL usage range, and
PLLX was the last G CPU clock source (before this commit DFLL was
selected as target source after cluster switch to G CPU always).

Bug 1291764

Change-Id: I55c75a819f4f6e0af89f00fa01504cb5349c378f
Signed-off-by: Alex Frid <afrid@nvidia.com>
Reviewed-on: http://git-master/r/230054
(cherry picked from commit 835d3c8b14949b853f198ac6545d7e1edda270f0)
Reviewed-on: http://git-master/r/235692
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Yu-Huan Hsu <yhsu@nvidia.com>

arch/arm/mach-tegra/tegra11_clocks.c

index b3c8df5..f40f6a8 100644 (file)
@@ -1438,8 +1438,8 @@ static int tegra11_cpu_cmplx_clk_set_parent(struct clk *c, struct clk *p)
                ret = clk_set_rate(p_source, rate);
                if (ret)
                        goto abort;
-       } else if ((p->parent->parent == dfll) || ((p->u.cpu.dynamic == dfll) &&
-                       (dfll->state != UNINITIALIZED) && use_dfll)) {
+       } else if ((p->parent->parent == dfll) ||
+                  (p->dvfs && tegra_dvfs_is_dfll_range(p->dvfs, rate))) {
                /* LP => G (DFLL selected as clock source) switch:
                 * set DFLL rate ready (DFLL is still disabled)
                 * (set target p_source as dfll, G source is already selected)
@@ -1501,11 +1501,9 @@ static int tegra11_cpu_cmplx_clk_set_parent(struct clk *c, struct clk *p)
 
        /*
         * Lock DFLL now (resume closed loop VDD_CPU control).
-        * G CPU operations are always resumed on DFLL if it can be used, even
-        * when autoswitch between PLL and DFLL is allowed, and resume rate is
-        * low enough to run on PLL. This makes CPU clock source ready for
-        * speedy ramp with cl_dvfs controlling volatge (and that ramp is the
-        * most likely reason for going to G CPU in the 1st place)
+        * G CPU operations are resumed on DFLL if it was the last G CPU
+        * clock source, or if resume rate is in DFLL usage range in case
+        * when auto-switch between PLL and DFLL is enabled.
         */
        if (p_source == dfll) {
                if (tegra_dvfs_rail_is_dfll_mode(tegra_cpu_rail)) {