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>

Rebase-Id: R95465facdc3c6d2b402ff3f33819909f86266f06

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

index 507c23d..7f75250 100644 (file)
@@ -115,7 +115,6 @@ config ARCH_TEGRA_11x_SOC
        select TEGRA_LATENCY_ALLOWANCE if !TEGRA_FPGA_PLATFORM
        select TEGRA_LP2_CPU_TIMER if !TEGRA_RAIL_OFF_MULTIPLE_CPUS
        select TEGRA_MC_PTSA if !TEGRA_FPGA_PLATFORM
-       select TEGRA_USE_DFLL if TEGRA_SILICON_PLATFORM
        select USB_ARCH_HAS_EHCI if USB_SUPPORT
        select USB_EHCI_TEGRA if USB_SUPPORT
        select USB_ULPI if USB_SUPPORT
@@ -502,13 +501,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 5d90d58..474fbe5 100644 (file)
@@ -3268,6 +3268,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");
 
@@ -3287,13 +3288,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 */