diff options
author | Anson Huang <b20788@freescale.com> | 2013-08-19 15:14:43 -0400 |
---|---|---|
committer | Nitin Garg <nitin.garg@freescale.com> | 2014-04-16 09:01:22 -0400 |
commit | 17d937b633705f0f3b16a2dcf082f55c643dc548 (patch) | |
tree | 5e3ff315ccca9efcb256c4f7b604a6bd3a60fa55 | |
parent | e72b8a329a0c6c9d6fe7912469a3d2d6dbbc5d0c (diff) |
ENGR00275542-1 ARM: imx: Enable PU power management for i.MX6SL
Enable dynamical PU power management for i.MX6SL.
Signed-off-by: Anson Huang <b20788@freescale.com>
-rw-r--r-- | arch/arm/boot/dts/imx6sl.dtsi | 5 | ||||
-rw-r--r-- | arch/arm/mach-imx/clk-imx6sl.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-imx/gpc.c | 72 |
3 files changed, 55 insertions, 26 deletions
diff --git a/arch/arm/boot/dts/imx6sl.dtsi b/arch/arm/boot/dts/imx6sl.dtsi index 36a1fa2d8840..93f96791eadb 100644 --- a/arch/arm/boot/dts/imx6sl.dtsi +++ b/arch/arm/boot/dts/imx6sl.dtsi | |||
@@ -465,7 +465,6 @@ | |||
465 | regulator-name = "vddpu"; | 465 | regulator-name = "vddpu"; |
466 | regulator-min-microvolt = <725000>; | 466 | regulator-min-microvolt = <725000>; |
467 | regulator-max-microvolt = <1450000>; | 467 | regulator-max-microvolt = <1450000>; |
468 | regulator-always-on; | ||
469 | anatop-reg-offset = <0x140>; | 468 | anatop-reg-offset = <0x140>; |
470 | anatop-vol-bit-shift = <9>; | 469 | anatop-vol-bit-shift = <9>; |
471 | anatop-vol-bit-width = <5>; | 470 | anatop-vol-bit-width = <5>; |
@@ -543,6 +542,10 @@ | |||
543 | compatible = "fsl,imx6sl-gpc", "fsl,imx6q-gpc"; | 542 | compatible = "fsl,imx6sl-gpc", "fsl,imx6q-gpc"; |
544 | reg = <0x020dc000 0x4000>; | 543 | reg = <0x020dc000 0x4000>; |
545 | interrupts = <0 89 0x04>; | 544 | interrupts = <0 89 0x04>; |
545 | clocks = <&clks IMX6SL_CLK_GPU2D_PODF>, <&clks IMX6SL_CLK_GPU2D_OVG>, | ||
546 | <&clks IMX6SL_CLK_IPG>; | ||
547 | clock-names = "gpu2d_podf", "gpu2d_ovg", "ipg"; | ||
548 | pu-supply = <®_pu>; | ||
546 | }; | 549 | }; |
547 | 550 | ||
548 | gpr: iomuxc-gpr@020e0000 { | 551 | gpr: iomuxc-gpr@020e0000 { |
diff --git a/arch/arm/mach-imx/clk-imx6sl.c b/arch/arm/mach-imx/clk-imx6sl.c index 7a8d13a65c99..11856b6cba13 100644 --- a/arch/arm/mach-imx/clk-imx6sl.c +++ b/arch/arm/mach-imx/clk-imx6sl.c | |||
@@ -268,6 +268,10 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node) | |||
268 | clk_prepare_enable(clks[IMX6SL_CLK_USBPHY2_GATE]); | 268 | clk_prepare_enable(clks[IMX6SL_CLK_USBPHY2_GATE]); |
269 | } | 269 | } |
270 | 270 | ||
271 | clk_set_parent(clks[IMX6SL_CLK_GPU2D_OVG_SEL], | ||
272 | clks[IMX6SL_CLK_PLL2_BUS]); | ||
273 | clk_set_parent(clks[IMX6SL_CLK_GPU2D_SEL], clks[IMX6SL_CLK_PLL2_BUS]); | ||
274 | |||
271 | /* set perclk to source from OSC 24MHz */ | 275 | /* set perclk to source from OSC 24MHz */ |
272 | clk_set_parent(clks[IMX6SL_CLK_PERCLK_SEL], clks[IMX6SL_CLK_OSC]); | 276 | clk_set_parent(clks[IMX6SL_CLK_PERCLK_SEL], clks[IMX6SL_CLK_OSC]); |
273 | np = of_find_compatible_node(NULL, NULL, "fsl,imx6sl-gpt"); | 277 | np = of_find_compatible_node(NULL, NULL, "fsl,imx6sl-gpt"); |
diff --git a/arch/arm/mach-imx/gpc.c b/arch/arm/mach-imx/gpc.c index 91e436f2f452..dc6c099bde2b 100644 --- a/arch/arm/mach-imx/gpc.c +++ b/arch/arm/mach-imx/gpc.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/irqchip/arm-gic.h> | 22 | #include <linux/irqchip/arm-gic.h> |
23 | #include <linux/regulator/consumer.h> | 23 | #include <linux/regulator/consumer.h> |
24 | #include "common.h" | 24 | #include "common.h" |
25 | #include "hardware.h" | ||
25 | 26 | ||
26 | #define GPC_IMR1 0x008 | 27 | #define GPC_IMR1 0x008 |
27 | #define GPC_PGC_CPU_PDN 0x2a0 | 28 | #define GPC_PGC_CPU_PDN 0x2a0 |
@@ -150,19 +151,29 @@ void imx_gpc_irq_mask(struct irq_data *d) | |||
150 | static void imx_pu_clk(bool enable) | 151 | static void imx_pu_clk(bool enable) |
151 | { | 152 | { |
152 | if (enable) { | 153 | if (enable) { |
153 | clk_prepare_enable(gpu3d_clk); | 154 | if (cpu_is_imx6sl()) { |
154 | clk_prepare_enable(gpu3d_shader_clk); | 155 | clk_prepare_enable(gpu2d_clk); |
155 | clk_prepare_enable(vpu_clk); | 156 | clk_prepare_enable(openvg_axi_clk); |
156 | clk_prepare_enable(gpu2d_clk); | 157 | } else { |
157 | clk_prepare_enable(gpu2d_axi_clk); | 158 | clk_prepare_enable(gpu3d_clk); |
158 | clk_prepare_enable(openvg_axi_clk); | 159 | clk_prepare_enable(gpu3d_shader_clk); |
160 | clk_prepare_enable(vpu_clk); | ||
161 | clk_prepare_enable(gpu2d_clk); | ||
162 | clk_prepare_enable(gpu2d_axi_clk); | ||
163 | clk_prepare_enable(openvg_axi_clk); | ||
164 | } | ||
159 | } else { | 165 | } else { |
160 | clk_disable_unprepare(gpu3d_clk); | 166 | if (cpu_is_imx6sl()) { |
161 | clk_disable_unprepare(gpu3d_shader_clk); | 167 | clk_disable_unprepare(gpu2d_clk); |
162 | clk_disable_unprepare(vpu_clk); | 168 | clk_disable_unprepare(openvg_axi_clk); |
163 | clk_disable_unprepare(gpu2d_clk); | 169 | } else { |
164 | clk_disable_unprepare(gpu2d_axi_clk); | 170 | clk_disable_unprepare(gpu3d_clk); |
165 | clk_disable_unprepare(openvg_axi_clk); | 171 | clk_disable_unprepare(gpu3d_shader_clk); |
172 | clk_disable_unprepare(vpu_clk); | ||
173 | clk_disable_unprepare(gpu2d_clk); | ||
174 | clk_disable_unprepare(gpu2d_axi_clk); | ||
175 | clk_disable_unprepare(openvg_axi_clk); | ||
176 | } | ||
166 | } | 177 | } |
167 | } | 178 | } |
168 | 179 | ||
@@ -307,19 +318,30 @@ static int imx_gpc_probe(struct platform_device *pdev) | |||
307 | nb.notifier_call = &imx_gpc_regulator_notify; | 318 | nb.notifier_call = &imx_gpc_regulator_notify; |
308 | 319 | ||
309 | /* Get gpu&vpu clk for power up PU by GPC */ | 320 | /* Get gpu&vpu clk for power up PU by GPC */ |
310 | gpu3d_clk = devm_clk_get(gpc_dev, "gpu3d_core"); | 321 | if (cpu_is_imx6sl()) { |
311 | gpu3d_shader_clk = devm_clk_get(gpc_dev, "gpu3d_shader"); | 322 | gpu2d_clk = devm_clk_get(gpc_dev, "gpu2d_podf"); |
312 | gpu2d_clk = devm_clk_get(gpc_dev, "gpu2d_core"); | 323 | openvg_axi_clk = devm_clk_get(gpc_dev, "gpu2d_ovg"); |
313 | gpu2d_axi_clk = devm_clk_get(gpc_dev, "gpu2d_axi"); | 324 | ipg_clk = devm_clk_get(gpc_dev, "ipg"); |
314 | openvg_axi_clk = devm_clk_get(gpc_dev, "openvg_axi"); | 325 | if (IS_ERR(gpu2d_clk) || IS_ERR(openvg_axi_clk) |
315 | vpu_clk = devm_clk_get(gpc_dev, "vpu_axi"); | 326 | || IS_ERR(ipg_clk)) { |
316 | ipg_clk = devm_clk_get(gpc_dev, "ipg"); | 327 | dev_err(gpc_dev, "failed to get clk!\n"); |
317 | if (IS_ERR(gpu3d_clk) || IS_ERR(gpu3d_shader_clk) | 328 | return -ENOENT; |
318 | || IS_ERR(gpu2d_clk) || IS_ERR(gpu2d_axi_clk) | 329 | } |
319 | || IS_ERR(openvg_axi_clk) || IS_ERR(vpu_clk) | 330 | } else { |
320 | || IS_ERR(ipg_clk)) { | 331 | gpu3d_clk = devm_clk_get(gpc_dev, "gpu3d_core"); |
321 | dev_err(gpc_dev, "failed to get clk!\n"); | 332 | gpu3d_shader_clk = devm_clk_get(gpc_dev, "gpu3d_shader"); |
322 | return -ENOENT; | 333 | gpu2d_clk = devm_clk_get(gpc_dev, "gpu2d_core"); |
334 | gpu2d_axi_clk = devm_clk_get(gpc_dev, "gpu2d_axi"); | ||
335 | openvg_axi_clk = devm_clk_get(gpc_dev, "openvg_axi"); | ||
336 | vpu_clk = devm_clk_get(gpc_dev, "vpu_axi"); | ||
337 | ipg_clk = devm_clk_get(gpc_dev, "ipg"); | ||
338 | if (IS_ERR(gpu3d_clk) || IS_ERR(gpu3d_shader_clk) | ||
339 | || IS_ERR(gpu2d_clk) || IS_ERR(gpu2d_axi_clk) | ||
340 | || IS_ERR(openvg_axi_clk) || IS_ERR(vpu_clk) | ||
341 | || IS_ERR(ipg_clk)) { | ||
342 | dev_err(gpc_dev, "failed to get clk!\n"); | ||
343 | return -ENOENT; | ||
344 | } | ||
323 | } | 345 | } |
324 | 346 | ||
325 | ret = regulator_register_notifier(pu_reg, &nb); | 347 | ret = regulator_register_notifier(pu_reg, &nb); |