From: Olof Johansson <ol...@chromium.org>

Add pm_power_off callback function for exynos5250 to make soft
power off work properly.

Signed-off-by: Abhilash Kesavan <a.kesa...@samsung.com>
Signed-off-by: Olof Johansson <ol...@chromium.org>
---
 arch/arm/mach-exynos/include/mach/regs-pmu.h |    3 +++
 arch/arm/mach-exynos/pmu.c                   |   20 ++++++++++++++++++++
 2 files changed, 23 insertions(+)

diff --git a/arch/arm/mach-exynos/include/mach/regs-pmu.h 
b/arch/arm/mach-exynos/include/mach/regs-pmu.h
index 2cdb63e..da2fab0 100644
--- a/arch/arm/mach-exynos/include/mach/regs-pmu.h
+++ b/arch/arm/mach-exynos/include/mach/regs-pmu.h
@@ -343,6 +343,7 @@
 #define EXYNOS5_TOP_PWR_OPTION                                 
S5P_PMUREG(0x2C48)
 #define EXYNOS5_TOP_PWR_SYSMEM_OPTION                          
S5P_PMUREG(0x2CC8)
 #define EXYNOS5_JPEG_MEM_OPTION                                        
S5P_PMUREG(0x2F48)
+#define EXYNOS5_PS_HOLD_CONTROL                                        
S5P_PMUREG(0x330C)
 #define EXYNOS5_GSCL_STATUS                                    
S5P_PMUREG(0x4004)
 #define EXYNOS5_ISP_STATUS                                     
S5P_PMUREG(0x4024)
 #define EXYNOS5_GSCL_OPTION                                    
S5P_PMUREG(0x4008)
@@ -365,4 +366,6 @@
 
 #define EXYNOS5_OPTION_USE_RETENTION                           (1 << 4)
 
+#define EXYNOS5_PS_HOLD_CONTROL_DATA                           (1 << 8)
+
 #endif /* __ASM_ARCH_REGS_PMU_H */
diff --git a/arch/arm/mach-exynos/pmu.c b/arch/arm/mach-exynos/pmu.c
index 5f4d26b..9053b6c 100644
--- a/arch/arm/mach-exynos/pmu.c
+++ b/arch/arm/mach-exynos/pmu.c
@@ -12,6 +12,8 @@
 #include <linux/io.h>
 #include <linux/kernel.h>
 #include <linux/bug.h>
+#include <linux/delay.h>
+#include <linux/pm.h>
 
 #include <mach/regs-clock.h>
 
@@ -409,6 +411,23 @@ void exynos_sys_powerdown_conf(enum sys_powerdown mode)
        }
 }
 
+static void exynos5_power_off(void)
+{
+       unsigned int tmp;
+
+       pr_info("Power down\n");
+       tmp = __raw_readl(EXYNOS5_PS_HOLD_CONTROL);
+       tmp &= ~EXYNOS5_PS_HOLD_CONTROL_DATA;
+       __raw_writel(tmp, EXYNOS5_PS_HOLD_CONTROL);
+
+       /* Wait a little so we don't give a false warning below */
+       mdelay(100);
+
+       pr_err("Power down failed, please power off system manually.\n");
+       while (1)
+               ;
+}
+
 static int __init exynos_pmu_init(void)
 {
        unsigned int value;
@@ -444,6 +463,7 @@ static int __init exynos_pmu_init(void)
                        __raw_writel(0x0, exynos5_list_disable_pmu_reg[i]);
 
                exynos_pmu_config = exynos5250_pmu_config;
+               pm_power_off = exynos5_power_off;
                pr_info("EXYNOS5250 PMU Initialize\n");
        } else {
                pr_info("EXYNOS: PMU not supported\n");
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to