summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Agner <stefan.agner@toradex.com>2014-03-04 13:29:56 +0100
committerStefan Agner <stefan.agner@toradex.com>2014-03-04 13:29:56 +0100
commit28fc68ba39c7a2210f2bb11f866f20731f0918bd (patch)
tree74bb3caed6d83feb2ceb925f33690c71e6962388
parent1c272deae1df4114d94c561bf2fe401b5c9ca6e4 (diff)
colibri_vf: register power_off function
By registring a power_off command the kernel does not go to halt state but instead tries to power off. Our power off function sets the SoC in a low power stop mode, which essentially turns itself off almost completely.
-rw-r--r--arch/arm/mach-mvf/board-colibri_vf.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/arch/arm/mach-mvf/board-colibri_vf.c b/arch/arm/mach-mvf/board-colibri_vf.c
index 1b537f2f7616..c6a4eb1f055a 100644
--- a/arch/arm/mach-mvf/board-colibri_vf.c
+++ b/arch/arm/mach-mvf/board-colibri_vf.c
@@ -60,6 +60,7 @@
#include <asm/mach/time.h>
#include "devices-mvf.h"
+#include "regs-pm.h"
#include "usb.h"
#include "crm_regs.h"
@@ -563,6 +564,22 @@ static void __init mvf_init_adc(void)
mvf_add_adc(1);
}
+static void mvf_power_off(void)
+{
+ void __iomem *gpc_base = MVF_GPC_BASE;
+ u32 gpc_pgcr;
+
+ /*
+ * Power gate Power Domain 1
+ */
+ gpc_pgcr = __raw_readl(gpc_base + GPC_PGCR_OFFSET);
+ gpc_pgcr |= GPC_PGCR_PG_PD1;
+ __raw_writel(gpc_pgcr, gpc_base + GPC_PGCR_OFFSET);
+
+ /* Set low power mode */
+ mvf_cpu_lp_set(STOP_MODE);
+}
+
/*!
* Board specific initialization.
*/
@@ -615,6 +632,8 @@ static void __init mvf_board_init(void)
imx_asrc_data.asrc_core_clk = clk_get(NULL, "asrc_clk");
imx_asrc_data.asrc_audio_clk = clk_get(NULL, "asrc_serial_clk");
mvf_add_asrc(&imx_asrc_data);
+
+ pm_power_off = mvf_power_off;
}
static void __init colibri_vf50_init(void)