aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorRanjani Vaidyanathan <ra5478@freescale.com>2013-08-27 18:57:55 -0400
committerNitin Garg <nitin.garg@freescale.com>2014-04-16 09:05:33 -0400
commitf7acad14c0eea241c5a5ed0378c8f45bb002d14b (patch)
tree1276b80a350a7545d4e52c5c1440e602d5b10d5e /arch
parent312864a0b7e76ffe3308fa88ad6353ab53b2021f (diff)
ENGR00277382-1 [MX6SL] Ensure that PLL1 and PLL2 are always enabled.
Need to ensure that PLL1 and PLL2 have the enabled bit set even when the PLL is powered down and disabled. 1. Modifications to the ARM_PODF bits in the CCM require PLL1 to be enabled. 2. PLL2 will be set to bypass and enabled state (can be powered down) in low power IDLE mode. Signed-off-by: Ranjani Vaidyanathan <ra5478@freescale.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-imx/clk-imx6q.c14
-rw-r--r--arch/arm/mach-imx/clk-imx6sl.c14
-rw-r--r--arch/arm/mach-imx/clk-pllv3.c8
-rw-r--r--arch/arm/mach-imx/clk.h3
4 files changed, 22 insertions, 17 deletions
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c
index 4b892ac22346..51c6b9940323 100644
--- a/arch/arm/mach-imx/clk-imx6q.c
+++ b/arch/arm/mach-imx/clk-imx6q.c
@@ -164,13 +164,13 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
164 }; 164 };
165 165
166 /* type name parent_name base div_mask */ 166 /* type name parent_name base div_mask */
167 clk[pll1_sys] = imx_clk_pllv3(IMX_PLLV3_SYS, "pll1_sys", "osc", base, 0x7f); 167 clk[pll1_sys] = imx_clk_pllv3(IMX_PLLV3_SYS, "pll1_sys", "osc", base, 0x7f, false);
168 clk[pll2_bus] = imx_clk_pllv3(IMX_PLLV3_GENERIC, "pll2_bus", "osc", base + 0x30, 0x1); 168 clk[pll2_bus] = imx_clk_pllv3(IMX_PLLV3_GENERIC, "pll2_bus", "osc", base + 0x30, 0x1, false);
169 clk[pll3_usb_otg] = imx_clk_pllv3(IMX_PLLV3_USB, "pll3_usb_otg", "osc", base + 0x10, 0x3); 169 clk[pll3_usb_otg] = imx_clk_pllv3(IMX_PLLV3_USB, "pll3_usb_otg", "osc", base + 0x10, 0x3, false);
170 clk[pll4_audio] = imx_clk_pllv3(IMX_PLLV3_AV, "pll4_audio", "osc", base + 0x70, 0x7f); 170 clk[pll4_audio] = imx_clk_pllv3(IMX_PLLV3_AV, "pll4_audio", "osc", base + 0x70, 0x7f, false);
171 clk[pll5_video] = imx_clk_pllv3(IMX_PLLV3_AV, "pll5_video", "osc", base + 0xa0, 0x7f); 171 clk[pll5_video] = imx_clk_pllv3(IMX_PLLV3_AV, "pll5_video", "osc", base + 0xa0, 0x7f, false);
172 clk[pll6_enet] = imx_clk_pllv3(IMX_PLLV3_ENET, "pll6_enet", "osc", base + 0xe0, 0x3); 172 clk[pll6_enet] = imx_clk_pllv3(IMX_PLLV3_ENET, "pll6_enet", "osc", base + 0xe0, 0x3, false);
173 clk[pll7_usb_host] = imx_clk_pllv3(IMX_PLLV3_USB, "pll7_usb_host","osc", base + 0x20, 0x3); 173 clk[pll7_usb_host] = imx_clk_pllv3(IMX_PLLV3_USB, "pll7_usb_host", "osc", base + 0x20, 0x3, false);
174 174
175 /* name reg shift width parent_names num_parents */ 175 /* name reg shift width parent_names num_parents */
176 clk[lvds1_sel] = imx_clk_mux("lvds1_sel", base + 0x160, 0, 5, lvds_sels, ARRAY_SIZE(lvds_sels)); 176 clk[lvds1_sel] = imx_clk_mux("lvds1_sel", base + 0x160, 0, 5, lvds_sels, ARRAY_SIZE(lvds_sels));
diff --git a/arch/arm/mach-imx/clk-imx6sl.c b/arch/arm/mach-imx/clk-imx6sl.c
index 2c5f802b2c9c..cc054d122830 100644
--- a/arch/arm/mach-imx/clk-imx6sl.c
+++ b/arch/arm/mach-imx/clk-imx6sl.c
@@ -85,13 +85,13 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
85 WARN_ON(!base); 85 WARN_ON(!base);
86 86
87 /* type name parent base div_mask */ 87 /* type name parent base div_mask */
88 clks[IMX6SL_CLK_PLL1_SYS] = imx_clk_pllv3(IMX_PLLV3_SYS, "pll1_sys", "osc", base, 0x7f); 88 clks[IMX6SL_CLK_PLL1_SYS] = imx_clk_pllv3(IMX_PLLV3_SYS, "pll1_sys", "osc", base, 0x7f, true);
89 clks[IMX6SL_CLK_PLL2_BUS] = imx_clk_pllv3(IMX_PLLV3_GENERIC, "pll2_bus", "osc", base + 0x30, 0x1); 89 clks[IMX6SL_CLK_PLL2_BUS] = imx_clk_pllv3(IMX_PLLV3_GENERIC, "pll2_bus", "osc", base + 0x30, 0x1, true);
90 clks[IMX6SL_CLK_PLL3_USB_OTG] = imx_clk_pllv3(IMX_PLLV3_USB, "pll3_usb_otg", "osc", base + 0x10, 0x3); 90 clks[IMX6SL_CLK_PLL3_USB_OTG] = imx_clk_pllv3(IMX_PLLV3_USB, "pll3_usb_otg", "osc", base + 0x10, 0x3, false);
91 clks[IMX6SL_CLK_PLL4_AUDIO] = imx_clk_pllv3(IMX_PLLV3_AV, "pll4_audio", "osc", base + 0x70, 0x7f); 91 clks[IMX6SL_CLK_PLL4_AUDIO] = imx_clk_pllv3(IMX_PLLV3_AV, "pll4_audio", "osc", base + 0x70, 0x7f, false);
92 clks[IMX6SL_CLK_PLL5_VIDEO] = imx_clk_pllv3(IMX_PLLV3_AV, "pll5_video", "osc", base + 0xa0, 0x7f); 92 clks[IMX6SL_CLK_PLL5_VIDEO] = imx_clk_pllv3(IMX_PLLV3_AV, "pll5_video", "osc", base + 0xa0, 0x7f, false);
93 clks[IMX6SL_CLK_PLL6_ENET] = imx_clk_pllv3(IMX_PLLV3_ENET, "pll6_enet", "osc", base + 0xe0, 0x3); 93 clks[IMX6SL_CLK_PLL6_ENET] = imx_clk_pllv3(IMX_PLLV3_ENET, "pll6_enet", "osc", base + 0xe0, 0x3, false);
94 clks[IMX6SL_CLK_PLL7_USB_HOST] = imx_clk_pllv3(IMX_PLLV3_USB, "pll7_usb_host", "osc", base + 0x20, 0x3); 94 clks[IMX6SL_CLK_PLL7_USB_HOST] = imx_clk_pllv3(IMX_PLLV3_USB, "pll7_usb_host", "osc", base + 0x20, 0x3, false);
95 95
96 /* 96 /*
97 * usbphy1 and usbphy2 are implemented as dummy gates using reserve 97 * usbphy1 and usbphy2 are implemented as dummy gates using reserve
diff --git a/arch/arm/mach-imx/clk-pllv3.c b/arch/arm/mach-imx/clk-pllv3.c
index 21f64e0a7d5a..331ae0d30b9e 100644
--- a/arch/arm/mach-imx/clk-pllv3.c
+++ b/arch/arm/mach-imx/clk-pllv3.c
@@ -31,6 +31,7 @@
31 * @clk_hw: clock source 31 * @clk_hw: clock source
32 * @base: base address of PLL registers 32 * @base: base address of PLL registers
33 * @powerup_set: set POWER bit to power up the PLL 33 * @powerup_set: set POWER bit to power up the PLL
34 * @always_on : Leave the PLL powered up all the time.
34 * @div_mask: mask of divider bits 35 * @div_mask: mask of divider bits
35 * 36 *
36 * IMX PLL clock version 3, found on i.MX6 series. Divider for pllv3 37 * IMX PLL clock version 3, found on i.MX6 series. Divider for pllv3
@@ -40,6 +41,7 @@ struct clk_pllv3 {
40 struct clk_hw hw; 41 struct clk_hw hw;
41 void __iomem *base; 42 void __iomem *base;
42 bool powerup_set; 43 bool powerup_set;
44 bool always_on;
43 u32 div_mask; 45 u32 div_mask;
44}; 46};
45 47
@@ -116,7 +118,8 @@ static void clk_pllv3_disable(struct clk_hw *hw)
116 u32 val; 118 u32 val;
117 119
118 val = readl_relaxed(pll->base); 120 val = readl_relaxed(pll->base);
119 val &= ~BM_PLL_ENABLE; 121 if (!pll->always_on)
122 val &= ~BM_PLL_ENABLE;
120 writel_relaxed(val, pll->base); 123 writel_relaxed(val, pll->base);
121} 124}
122 125
@@ -322,7 +325,7 @@ static const struct clk_ops clk_pllv3_mlb_ops = {
322 325
323struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name, 326struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name,
324 const char *parent_name, void __iomem *base, 327 const char *parent_name, void __iomem *base,
325 u32 div_mask) 328 u32 div_mask, bool always_on)
326{ 329{
327 struct clk_pllv3 *pll; 330 struct clk_pllv3 *pll;
328 const struct clk_ops *ops; 331 const struct clk_ops *ops;
@@ -355,6 +358,7 @@ struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name,
355 } 358 }
356 pll->base = base; 359 pll->base = base;
357 pll->div_mask = div_mask; 360 pll->div_mask = div_mask;
361 pll->always_on = always_on;
358 362
359 init.name = name; 363 init.name = name;
360 init.ops = ops; 364 init.ops = ops;
diff --git a/arch/arm/mach-imx/clk.h b/arch/arm/mach-imx/clk.h
index 90c5806a4cc3..c42848fe6208 100644
--- a/arch/arm/mach-imx/clk.h
+++ b/arch/arm/mach-imx/clk.h
@@ -24,7 +24,8 @@ enum imx_pllv3_type {
24}; 24};
25 25
26struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name, 26struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name,
27 const char *parent_name, void __iomem *base, u32 div_mask); 27 const char *parent_name, void __iomem *base,
28 u32 div_mask, bool always_on);
28 29
29struct clk *clk_register_gate2(struct device *dev, const char *name, 30struct clk *clk_register_gate2(struct device *dev, const char *name,
30 const char *parent_name, unsigned long flags, 31 const char *parent_name, unsigned long flags,