From 3816bd77aad30bee3904358faa286b32c2b35b92 Mon Sep 17 00:00:00 2001 From: Bhuvanchandra DV Date: Sat, 22 Oct 2016 01:03:13 +0530 Subject: ARM: vf610: PM: register power_off function By registering 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. Code snippet is taken from 3.0 kernel: http://git.toradex.com/cgit/linux-toradex.git/commit/?h=colibri&id=28fc68ba39c7a2210f2bb11f866f20731f0918bd Signed-off-by: Bhuvanchandra DV Signed-off-by: Stefan Agner --- arch/arm/mach-imx/pm-vf610.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/arch/arm/mach-imx/pm-vf610.c b/arch/arm/mach-imx/pm-vf610.c index 7cadee2ffb95..f5c54abd8ccc 100644 --- a/arch/arm/mach-imx/pm-vf610.c +++ b/arch/arm/mach-imx/pm-vf610.c @@ -466,6 +466,22 @@ put_node: } #endif +static void vf610_power_off(void) +{ + void __iomem *gpc_base = pm_info->gpc_base.vbase; + u32 gpc_pgcr; + + /* + * Power gate Power Domain 1 + */ + gpc_pgcr = readl_relaxed(gpc_base + GPC_PGCR); + gpc_pgcr |= BM_PGCR_PG_PD1; + writel_relaxed(gpc_pgcr, gpc_base + GPC_PGCR); + + /* Set low power mode */ + vf610_set_lpm(VF610_STOP); +} + static int __init vf610_suspend_mem_init(const struct vf610_pm_socdata *socdata) { struct device_node *node; @@ -675,6 +691,8 @@ void __init vf610_pm_init(void) if (ret) pr_warn("%s: No DDR LPM support with suspend %d!\n", __func__, ret); + + pm_power_off = vf610_power_off; } } -- cgit v1.2.3