aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnson Huang <b20788@freescale.com>2013-08-19 15:14:43 -0400
committerNitin Garg <nitin.garg@freescale.com>2014-04-16 09:01:22 -0400
commit17d937b633705f0f3b16a2dcf082f55c643dc548 (patch)
tree5e3ff315ccca9efcb256c4f7b604a6bd3a60fa55
parente72b8a329a0c6c9d6fe7912469a3d2d6dbbc5d0c (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.dtsi5
-rw-r--r--arch/arm/mach-imx/clk-imx6sl.c4
-rw-r--r--arch/arm/mach-imx/gpc.c72
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 = <&reg_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)
150static void imx_pu_clk(bool enable) 151static 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);