ARM: tegra11: clock: Change PLLE input clock
Alex Frid [Thu, 10 Jan 2013 06:13:39 +0000 (22:13 -0800)]
Changed PLLE input clock from PLL_RE to oscillator.

Bug 1167739

Change-Id: I26e6c34174a5d57903d5732b4a89439a6e166ed6
Signed-off-by: Alex Frid <afrid@nvidia.com>
Reviewed-on: http://git-master/r/190197
Reviewed-by: Mandar Padmawar <mpadmawar@nvidia.com>
Tested-by: Mandar Padmawar <mpadmawar@nvidia.com>

arch/arm/mach-tegra/tegra11_clocks.c

index bb26b98..36cf79b 100644 (file)
 /* PLLP default fixed rate in h/w controlled mode */
 #define PLLP_DEFAULT_FIXED_RATE                216000000
 
+/* Use PLL_RE as PLLE input (default - OSC via pll reference divider) */
+#define USE_PLLE_INPUT_PLLRE   0
+
 static bool tegra11_is_dyn_ramp(struct clk *c,
                                unsigned long rate, bool from_vco_min);
 static void tegra11_pllp_init_dependencies(unsigned long pllp_rate);
@@ -3215,10 +3218,28 @@ static u8 plle_p[PLLE_CMLDIV_MAX + 1] = {
 /* CMLDIV: 0, 1, 2, 3, 4, 5, 6,  7,  8,  9, 10, 11, 12, 13, 14 */
 /* p: */   1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 12, 16, 20, 24, 32 };
 
+static inline void select_pll_e_input(u32 aux_reg)
+{
+#if USE_PLLE_INPUT_PLLRE
+       aux_reg |= PLLE_AUX_PLLRE_SEL;
+#else
+       aux_reg &= ~(PLLE_AUX_PLLRE_SEL | PLLE_AUX_PLLP_SEL);
+#endif
+       clk_writel(aux_reg, PLLE_AUX);
+}
+
 static void tegra11_plle_clk_init(struct clk *c)
 {
        u32 val, p;
-       struct clk *ref = tegra_get_clock_by_name("pll_re_vco");
+       struct clk *pll_ref = tegra_get_clock_by_name("pll_ref");
+       struct clk *re_vco = tegra_get_clock_by_name("pll_re_vco");
+       struct clk *pllp = tegra_get_clock_by_name("pllp");
+#if USE_PLLE_INPUT_PLLRE
+       struct clk *ref = re_vco;
+#else
+       struct clk *ref = pll_ref;
+#endif
+
 
        val = clk_readl(c->reg + PLL_BASE);
        c->state = (val & PLL_BASE_ENABLE) ? ON : OFF;
@@ -3228,18 +3249,15 @@ static void tegra11_plle_clk_init(struct clk *c)
        c->div *= plle_p[p];
 
        val = clk_readl(PLLE_AUX);
-       c->parent = (val & PLLE_AUX_PLLRE_SEL) ? ref :
-                       (val & PLLE_AUX_PLLP_SEL) ?
-                               tegra_get_clock_by_name("pll_p") :
-                               tegra_get_clock_by_name("pll_ref");
+       c->parent = (val & PLLE_AUX_PLLRE_SEL) ? re_vco :
+               (val & PLLE_AUX_PLLP_SEL) ? pllp : pll_ref;
        if (c->parent != ref) {
                if (c->state == ON) {
                        WARN(1, "%s: pll_e is left enabled with %s input\n",
                             __func__, c->parent->name);
                } else {
                        c->parent = ref;
-                       val |= PLLE_AUX_PLLRE_SEL;
-                       clk_writel(val, PLLE_AUX);
+                       select_pll_e_input(val);
                }
        }
 }
@@ -3354,10 +3372,9 @@ static void tegra11_plle_clk_resume(struct clk *c)
        if (val & PLL_BASE_ENABLE)
                return;         /* already resumed */
 
-       /* Restore pll_re_vco as parent */
+       /* Restore parent */
        val = clk_readl(PLLE_AUX);
-       val |= PLLE_AUX_PLLRE_SEL;
-       clk_writel(val, PLLE_AUX);
+       select_pll_e_input(val);
 }
 #endif