ARM: tegra11: dvfs: Update DFLL range configuration
Alex Frid [Sat, 27 Oct 2012 02:01:57 +0000 (19:01 -0700)]
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.

Change-Id: Idf50ee15b7a30c10a15360f7be2079586c0118f4
Signed-off-by: Alex Frid <afrid@nvidia.com>
Reviewed-on: http://git-master/r/159728
Reviewed-by: Simone Willett <swillett@nvidia.com>
Tested-by: Simone Willett <swillett@nvidia.com>

arch/arm/mach-tegra/Kconfig
arch/arm/mach-tegra/tegra11_clocks.c
arch/arm/mach-tegra/tegra11_dvfs.c

index dec9d51..e88bf49 100644 (file)
@@ -121,7 +121,6 @@ config ARCH_TEGRA_11x_SOC
        select TEGRA_LATENCY_ALLOWANCE if !TEGRA_FPGA_PLATFORM
        select TEGRA_MC_PTSA if !TEGRA_FPGA_PLATFORM
        select SOC_BUS
-       select TEGRA_USE_DFLL if TEGRA_SILICON_PLATFORM
        select TEGRA_ISOMGR
        select TEGRA_ISOMGR_SYSFS
        select TEGRA_ISOMGR_DEBUG
@@ -780,13 +779,19 @@ config TEGRA_IO_DPD
          Deep Power Down (DPD) state. This is a temporary config
          option until a proper way is implemented to resolve this issue.
 
-config TEGRA_USE_DFLL
-       bool "Use DFLL as CPU clock source by default"
+config TEGRA_USE_DFLL_RANGE
+       int "Default CPU DFLL operating range"
        depends on ARCH_TEGRA_HAS_CL_DVFS
-       default n
-        help
-         Enables dynamic frequency lock loop (DFLL) as CPU clock
-         source.
+       range 0 2
+       default "1" if TEGRA_SILICON_PLATFORM
+       default "0"
+       help
+         Defines default range for dynamic frequency lock loop (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
 
 config TEGRA_SOCTHERM
        bool "Enable soctherm"
index c8df2e8..27e06a7 100644 (file)
@@ -3265,6 +3265,7 @@ static struct clk_ops tegra_plle_ops = {
 /* DFLL operations */
 static void __init tegra11_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");
 
@@ -3284,13 +3285,12 @@ static void __init tegra11_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
 }
 
 static int tegra11_dfll_clk_enable(struct clk *c)
index 2466859..12b6fb2 100644 (file)
@@ -466,12 +466,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, "tegra11_dvfs: pll voltage is below dfll in the dfll"
-                       " operating range\n");
-               fmin_use_dfll = fmax_at_vmin;
+               pr_err("tegra11_dvfs: no crossover of dfll and pll voltages\n");
+               return -EINVAL;
        }
 
        /* dvfs tables are successfully populated - fill in the rest */