diff options
-rw-r--r-- | arch/arm/mach-exynos/common.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-exynos/common.h | 6 | ||||
-rw-r--r-- | arch/arm/mach-exynos/pm.c | 50 |
3 files changed, 19 insertions, 38 deletions
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c index 025fd8215ca3..e98ddadc5f74 100644 --- a/arch/arm/mach-exynos/common.c +++ b/arch/arm/mach-exynos/common.c | |||
@@ -315,6 +315,7 @@ void __init exynos_init_late(void) | |||
315 | return; | 315 | return; |
316 | 316 | ||
317 | pm_genpd_poweroff_unused(); | 317 | pm_genpd_poweroff_unused(); |
318 | exynos_pm_init(); | ||
318 | } | 319 | } |
319 | 320 | ||
320 | static int __init exynos_fdt_map_chipid(unsigned long node, const char *uname, | 321 | static int __init exynos_fdt_map_chipid(unsigned long node, const char *uname, |
diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h index f76967b1c551..82e08fb83eae 100644 --- a/arch/arm/mach-exynos/common.h +++ b/arch/arm/mach-exynos/common.h | |||
@@ -27,6 +27,12 @@ void exynos_init_late(void); | |||
27 | 27 | ||
28 | void exynos_firmware_init(void); | 28 | void exynos_firmware_init(void); |
29 | 29 | ||
30 | #ifdef CONFIG_PM_SLEEP | ||
31 | extern void __init exynos_pm_init(void); | ||
32 | #else | ||
33 | static inline void exynos_pm_init(void) {} | ||
34 | #endif | ||
35 | |||
30 | extern struct smp_operations exynos_smp_ops; | 36 | extern struct smp_operations exynos_smp_ops; |
31 | 37 | ||
32 | extern void exynos_cpu_die(unsigned int cpu); | 38 | extern void exynos_cpu_die(unsigned int cpu); |
diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c index ba18214c9aca..596ed13c4166 100644 --- a/arch/arm/mach-exynos/pm.c +++ b/arch/arm/mach-exynos/pm.c | |||
@@ -92,39 +92,6 @@ static void exynos_pm_prepare(void) | |||
92 | __raw_writel(virt_to_phys(s3c_cpu_resume), S5P_INFORM0); | 92 | __raw_writel(virt_to_phys(s3c_cpu_resume), S5P_INFORM0); |
93 | } | 93 | } |
94 | 94 | ||
95 | static int exynos_pm_add(struct device *dev, struct subsys_interface *sif) | ||
96 | { | ||
97 | pm_cpu_prep = exynos_pm_prepare; | ||
98 | pm_cpu_sleep = exynos_cpu_suspend; | ||
99 | |||
100 | return 0; | ||
101 | } | ||
102 | |||
103 | static struct subsys_interface exynos_pm_interface = { | ||
104 | .name = "exynos_pm", | ||
105 | .subsys = &exynos_subsys, | ||
106 | .add_dev = exynos_pm_add, | ||
107 | }; | ||
108 | |||
109 | static __init int exynos_pm_drvinit(void) | ||
110 | { | ||
111 | unsigned int tmp; | ||
112 | |||
113 | if (soc_is_exynos5440()) | ||
114 | return 0; | ||
115 | |||
116 | s3c_pm_init(); | ||
117 | |||
118 | /* All wakeup disable */ | ||
119 | |||
120 | tmp = __raw_readl(S5P_WAKEUP_MASK); | ||
121 | tmp |= ((0xFF << 8) | (0x1F << 1)); | ||
122 | __raw_writel(tmp, S5P_WAKEUP_MASK); | ||
123 | |||
124 | return subsys_interface_register(&exynos_pm_interface); | ||
125 | } | ||
126 | arch_initcall(exynos_pm_drvinit); | ||
127 | |||
128 | static int exynos_pm_suspend(void) | 95 | static int exynos_pm_suspend(void) |
129 | { | 96 | { |
130 | unsigned long tmp; | 97 | unsigned long tmp; |
@@ -220,12 +187,19 @@ static struct syscore_ops exynos_pm_syscore_ops = { | |||
220 | .resume = exynos_pm_resume, | 187 | .resume = exynos_pm_resume, |
221 | }; | 188 | }; |
222 | 189 | ||
223 | static __init int exynos_pm_syscore_init(void) | 190 | void __init exynos_pm_init(void) |
224 | { | 191 | { |
225 | if (soc_is_exynos5440()) | 192 | u32 tmp; |
226 | return 0; | 193 | |
194 | pm_cpu_prep = exynos_pm_prepare; | ||
195 | pm_cpu_sleep = exynos_cpu_suspend; | ||
196 | |||
197 | s3c_pm_init(); | ||
198 | |||
199 | /* All wakeup disable */ | ||
200 | tmp = __raw_readl(S5P_WAKEUP_MASK); | ||
201 | tmp |= ((0xFF << 8) | (0x1F << 1)); | ||
202 | __raw_writel(tmp, S5P_WAKEUP_MASK); | ||
227 | 203 | ||
228 | register_syscore_ops(&exynos_pm_syscore_ops); | 204 | register_syscore_ops(&exynos_pm_syscore_ops); |
229 | return 0; | ||
230 | } | 205 | } |
231 | arch_initcall(exynos_pm_syscore_init); | ||