diff options
author | Stefan Agner <stefan.agner@toradex.com> | 2014-03-04 13:29:56 +0100 |
---|---|---|
committer | Stefan Agner <stefan.agner@toradex.com> | 2014-03-04 13:29:56 +0100 |
commit | 28fc68ba39c7a2210f2bb11f866f20731f0918bd (patch) | |
tree | 74bb3caed6d83feb2ceb925f33690c71e6962388 | |
parent | 1c272deae1df4114d94c561bf2fe401b5c9ca6e4 (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.c | 19 |
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) |