diff options
author | Ranjani Vaidyanathan <ra5478@freescale.com> | 2013-08-27 18:57:55 -0400 |
---|---|---|
committer | Nitin Garg <nitin.garg@freescale.com> | 2014-04-16 09:05:33 -0400 |
commit | f7acad14c0eea241c5a5ed0378c8f45bb002d14b (patch) | |
tree | 1276b80a350a7545d4e52c5c1440e602d5b10d5e /arch | |
parent | 312864a0b7e76ffe3308fa88ad6353ab53b2021f (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.c | 14 | ||||
-rw-r--r-- | arch/arm/mach-imx/clk-imx6sl.c | 14 | ||||
-rw-r--r-- | arch/arm/mach-imx/clk-pllv3.c | 8 | ||||
-rw-r--r-- | arch/arm/mach-imx/clk.h | 3 |
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 | ||
323 | struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name, | 326 | struct 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 | ||
26 | struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name, | 26 | struct 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 | ||
29 | struct clk *clk_register_gate2(struct device *dev, const char *name, | 30 | struct 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, |