ARM: tegra12: dvfs: Update DFLL range configuration
Bhanu Chetlapalli [Sat, 27 Oct 2012 02:01:57 +0000 (19:01 -0700)]
Picked from tegra11 & applied to tegra12
Original Commit: 63e37d089bb55dbdd768ff711e1ed4cecac4615a

Replaced boolean DFLL usage configuration option with integer
TEGRA_USE_DFLL_RANGE option that specifies default range for
DFLL to be used as CPU clock source:
"0" - DFLL is not used,
"1" - DFLL is used as a source for all CPU rates
"2" - DFLL is used only for high rates above crossover with
PLL dvfs curve

Made sure that valid cvb tables for DFLL and PLL modes provide
crossover between DFLL and PLL dvfs voltage ranges.

Signed-off-by: Bhanu Chetlapalli <bchetlapalli@nvidia.com>
Change-Id: I3e2848ee7473f338ac6dff31e84b117f9dc27756
Reviewed-on: http://git-master/r/193149
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Chao Xu <cxu@nvidia.com>

arch/arm/mach-tegra/tegra12_clocks.c
arch/arm/mach-tegra/tegra12_dvfs.c

index 9a7d1c6..18a6915 100644 (file)
@@ -3312,6 +3312,7 @@ static struct clk_ops tegra_plle_ops = {
 /* DFLL operations */
 static void __init tegra12_dfll_cpu_late_init(struct clk *c)
 {
+#ifdef CONFIG_ARCH_TEGRA_HAS_CL_DVFS
        int ret;
        struct clk *cpu = tegra_get_clock_by_name("cpu");
 
@@ -3322,13 +3323,12 @@ static void __init tegra12_dfll_cpu_late_init(struct clk *c)
        if (!ret) {
                c->state = OFF;
                c->u.dfll.cl_dvfs = platform_get_drvdata(&tegra_cl_dvfs_device);
-               pr_info("Tegra CPU DFLL is initialized\n");
 
-#ifdef CONFIG_TEGRA_USE_DFLL
-               use_dfll = DFLL_RANGE_ALL_RATES;
-#endif
+               use_dfll = CONFIG_TEGRA_USE_DFLL_RANGE;
                tegra_dvfs_set_dfll_range(cpu->parent->dvfs, use_dfll);
+               pr_info("Tegra CPU DFLL is initialized\n");
        }
+#endif
 }
 #endif
 
index d884486..c6be0af 100644 (file)
@@ -523,12 +523,10 @@ static int __init set_cpu_dvfs_data(int speedo_id, struct dvfs *cpu_dvfs,
                return -ENOENT;
        }
 
-       /* In the dfll operating range dfll voltage at any rate should be
-          better (below) than pll voltage */
+       /* Must have crossover between dfll and pll operating ranges */
        if (!fmin_use_dfll || (fmin_use_dfll > fmax_at_vmin)) {
-               WARN(1, "tegra12_dvfs: pll voltage is below dfll in the dfll"
-                       " operating range\n");
-               fmin_use_dfll = fmax_at_vmin;
+               pr_err("tegra12_dvfs: no crossover of dfll and pll voltages\n");
+               return -EINVAL;
        }
 
        /* dvfs tables are successfully populated - fill in the rest */