diff options
-rw-r--r-- | arch/arm/include/asm/suspend.h | 9 | ||||
-rw-r--r-- | arch/arm/kernel/sleep.S | 11 | ||||
-rw-r--r-- | arch/arm/mach-exynos4/pm.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/pm34xx.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-pxa/include/mach/pm.h | 4 | ||||
-rw-r--r-- | arch/arm/mach-pxa/pxa3xx.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-s3c2412/pm.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-s3c2416/pm.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-s3c64xx/pm.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-sa1100/pm.c | 2 | ||||
-rw-r--r-- | arch/arm/plat-samsung/include/plat/pm.h | 4 | ||||
-rw-r--r-- | arch/arm/plat-samsung/pm.c | 2 |
12 files changed, 31 insertions, 18 deletions
diff --git a/arch/arm/include/asm/suspend.h b/arch/arm/include/asm/suspend.h index f8db9d096bc7..b0e4e1a02318 100644 --- a/arch/arm/include/asm/suspend.h +++ b/arch/arm/include/asm/suspend.h | |||
@@ -10,12 +10,13 @@ extern void cpu_resume(void); | |||
10 | * Hide the first two arguments to __cpu_suspend - these are an implementation | 10 | * Hide the first two arguments to __cpu_suspend - these are an implementation |
11 | * detail which platform code shouldn't have to know about. | 11 | * detail which platform code shouldn't have to know about. |
12 | */ | 12 | */ |
13 | static inline void cpu_suspend(unsigned long arg, void (*fn)(unsigned long)) | 13 | static inline int cpu_suspend(unsigned long arg, int (*fn)(unsigned long)) |
14 | { | 14 | { |
15 | extern void __cpu_suspend(int, long, unsigned long, | 15 | extern int __cpu_suspend(int, long, unsigned long, |
16 | void (*)(unsigned long)); | 16 | int (*)(unsigned long)); |
17 | __cpu_suspend(0, PHYS_OFFSET - PAGE_OFFSET, arg, fn); | 17 | int ret = __cpu_suspend(0, PHYS_OFFSET - PAGE_OFFSET, arg, fn); |
18 | flush_tlb_all(); | 18 | flush_tlb_all(); |
19 | return ret; | ||
19 | } | 20 | } |
20 | 21 | ||
21 | #endif | 22 | #endif |
diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S index c156d0e5f455..dc902f2c6845 100644 --- a/arch/arm/kernel/sleep.S +++ b/arch/arm/kernel/sleep.S | |||
@@ -12,7 +12,6 @@ | |||
12 | * r1 = v:p offset | 12 | * r1 = v:p offset |
13 | * r2 = suspend function arg0 | 13 | * r2 = suspend function arg0 |
14 | * r3 = suspend function | 14 | * r3 = suspend function |
15 | * Note: does not return until system resumes | ||
16 | */ | 15 | */ |
17 | ENTRY(__cpu_suspend) | 16 | ENTRY(__cpu_suspend) |
18 | stmfd sp!, {r4 - r11, lr} | 17 | stmfd sp!, {r4 - r11, lr} |
@@ -26,7 +25,7 @@ ENTRY(__cpu_suspend) | |||
26 | #endif | 25 | #endif |
27 | mov r6, sp @ current virtual SP | 26 | mov r6, sp @ current virtual SP |
28 | sub sp, sp, r5 @ allocate CPU state on stack | 27 | sub sp, sp, r5 @ allocate CPU state on stack |
29 | mov r0, sp @ save pointer | 28 | mov r0, sp @ save pointer to CPU save block |
30 | add ip, ip, r1 @ convert resume fn to phys | 29 | add ip, ip, r1 @ convert resume fn to phys |
31 | stmfd sp!, {r1, r6, ip} @ save v:p, virt SP, phys resume fn | 30 | stmfd sp!, {r1, r6, ip} @ save v:p, virt SP, phys resume fn |
32 | ldr r5, =sleep_save_sp | 31 | ldr r5, =sleep_save_sp |
@@ -55,10 +54,17 @@ ENTRY(__cpu_suspend) | |||
55 | #else | 54 | #else |
56 | bl __cpuc_flush_kern_all | 55 | bl __cpuc_flush_kern_all |
57 | #endif | 56 | #endif |
57 | adr lr, BSYM(cpu_suspend_abort) | ||
58 | ldmfd sp!, {r0, pc} @ call suspend fn | 58 | ldmfd sp!, {r0, pc} @ call suspend fn |
59 | ENDPROC(__cpu_suspend) | 59 | ENDPROC(__cpu_suspend) |
60 | .ltorg | 60 | .ltorg |
61 | 61 | ||
62 | cpu_suspend_abort: | ||
63 | ldmia sp!, {r1 - r3} @ pop v:p, virt SP, phys resume fn | ||
64 | mov sp, r2 | ||
65 | ldmfd sp!, {r4 - r11, pc} | ||
66 | ENDPROC(cpu_suspend_abort) | ||
67 | |||
62 | /* | 68 | /* |
63 | * r0 = control register value | 69 | * r0 = control register value |
64 | * r1 = v:p offset (preserved by cpu_do_resume) | 70 | * r1 = v:p offset (preserved by cpu_do_resume) |
@@ -89,6 +95,7 @@ cpu_resume_after_mmu: | |||
89 | str r5, [r2, r4, lsl #2] @ restore old mapping | 95 | str r5, [r2, r4, lsl #2] @ restore old mapping |
90 | mcr p15, 0, r0, c1, c0, 0 @ turn on D-cache | 96 | mcr p15, 0, r0, c1, c0, 0 @ turn on D-cache |
91 | bl cpu_init @ restore the und/abt/irq banked regs | 97 | bl cpu_init @ restore the und/abt/irq banked regs |
98 | mov r0, #0 @ return zero on success | ||
92 | ldmfd sp!, {r4 - r11, pc} | 99 | ldmfd sp!, {r4 - r11, pc} |
93 | ENDPROC(cpu_resume_after_mmu) | 100 | ENDPROC(cpu_resume_after_mmu) |
94 | 101 | ||
diff --git a/arch/arm/mach-exynos4/pm.c b/arch/arm/mach-exynos4/pm.c index 5c01c6076645..533c28f758ca 100644 --- a/arch/arm/mach-exynos4/pm.c +++ b/arch/arm/mach-exynos4/pm.c | |||
@@ -280,7 +280,7 @@ static struct sleep_save exynos4_l2cc_save[] = { | |||
280 | SAVE_ITEM(S5P_VA_L2CC + L2X0_AUX_CTRL), | 280 | SAVE_ITEM(S5P_VA_L2CC + L2X0_AUX_CTRL), |
281 | }; | 281 | }; |
282 | 282 | ||
283 | void exynos4_cpu_suspend(unsigned long arg) | 283 | static int exynos4_cpu_suspend(unsigned long arg) |
284 | { | 284 | { |
285 | unsigned long tmp; | 285 | unsigned long tmp; |
286 | unsigned long mask = 0xFFFFFFFF; | 286 | unsigned long mask = 0xFFFFFFFF; |
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 7238a63e24e2..b77d82665abb 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -321,9 +321,10 @@ static void omap34xx_save_context(u32 *save) | |||
321 | *save++ = val; | 321 | *save++ = val; |
322 | } | 322 | } |
323 | 323 | ||
324 | static void omap34xx_do_sram_idle(unsigned long save_state) | 324 | static int omap34xx_do_sram_idle(unsigned long save_state) |
325 | { | 325 | { |
326 | omap34xx_cpu_suspend(save_state); | 326 | omap34xx_cpu_suspend(save_state); |
327 | return 0; | ||
327 | } | 328 | } |
328 | 329 | ||
329 | void omap_sram_idle(void) | 330 | void omap_sram_idle(void) |
diff --git a/arch/arm/mach-pxa/include/mach/pm.h b/arch/arm/mach-pxa/include/mach/pm.h index a566720527cf..51558bcee999 100644 --- a/arch/arm/mach-pxa/include/mach/pm.h +++ b/arch/arm/mach-pxa/include/mach/pm.h | |||
@@ -22,8 +22,8 @@ struct pxa_cpu_pm_fns { | |||
22 | extern struct pxa_cpu_pm_fns *pxa_cpu_pm_fns; | 22 | extern struct pxa_cpu_pm_fns *pxa_cpu_pm_fns; |
23 | 23 | ||
24 | /* sleep.S */ | 24 | /* sleep.S */ |
25 | extern void pxa25x_finish_suspend(unsigned long); | 25 | extern int pxa25x_finish_suspend(unsigned long); |
26 | extern void pxa27x_finish_suspend(unsigned long); | 26 | extern int pxa27x_finish_suspend(unsigned long); |
27 | 27 | ||
28 | extern int pxa_pm_enter(suspend_state_t state); | 28 | extern int pxa_pm_enter(suspend_state_t state); |
29 | extern int pxa_pm_prepare(void); | 29 | extern int pxa_pm_prepare(void); |
diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c index 9fe947b5d5f7..ef1c56a67afc 100644 --- a/arch/arm/mach-pxa/pxa3xx.c +++ b/arch/arm/mach-pxa/pxa3xx.c | |||
@@ -148,7 +148,7 @@ static void pxa3xx_cpu_pm_suspend(void) | |||
148 | asm volatile("mra %Q0, %R0, acc0" : "=r" (acc0)); | 148 | asm volatile("mra %Q0, %R0, acc0" : "=r" (acc0)); |
149 | #endif | 149 | #endif |
150 | 150 | ||
151 | extern void pxa3xx_finish_suspend(unsigned long); | 151 | extern int pxa3xx_finish_suspend(unsigned long); |
152 | 152 | ||
153 | /* resuming from D2 requires the HSIO2/BOOT/TPM clocks enabled */ | 153 | /* resuming from D2 requires the HSIO2/BOOT/TPM clocks enabled */ |
154 | CKENA |= (1 << CKEN_BOOT) | (1 << CKEN_TPM); | 154 | CKENA |= (1 << CKEN_BOOT) | (1 << CKEN_TPM); |
diff --git a/arch/arm/mach-s3c2412/pm.c b/arch/arm/mach-s3c2412/pm.c index 9a1fb898db53..f4077efa51fa 100644 --- a/arch/arm/mach-s3c2412/pm.c +++ b/arch/arm/mach-s3c2412/pm.c | |||
@@ -37,7 +37,7 @@ | |||
37 | 37 | ||
38 | extern void s3c2412_sleep_enter(void); | 38 | extern void s3c2412_sleep_enter(void); |
39 | 39 | ||
40 | static void s3c2412_cpu_suspend(unsigned long arg) | 40 | static int s3c2412_cpu_suspend(unsigned long arg) |
41 | { | 41 | { |
42 | unsigned long tmp; | 42 | unsigned long tmp; |
43 | 43 | ||
@@ -48,6 +48,8 @@ static void s3c2412_cpu_suspend(unsigned long arg) | |||
48 | __raw_writel(tmp, S3C2412_PWRCFG); | 48 | __raw_writel(tmp, S3C2412_PWRCFG); |
49 | 49 | ||
50 | s3c2412_sleep_enter(); | 50 | s3c2412_sleep_enter(); |
51 | |||
52 | panic("sleep resumed to originator?"); | ||
51 | } | 53 | } |
52 | 54 | ||
53 | static void s3c2412_pm_prepare(void) | 55 | static void s3c2412_pm_prepare(void) |
diff --git a/arch/arm/mach-s3c2416/pm.c b/arch/arm/mach-s3c2416/pm.c index 9e67a2a07a86..9ec54f1d8e75 100644 --- a/arch/arm/mach-s3c2416/pm.c +++ b/arch/arm/mach-s3c2416/pm.c | |||
@@ -24,7 +24,7 @@ | |||
24 | 24 | ||
25 | extern void s3c2412_sleep_enter(void); | 25 | extern void s3c2412_sleep_enter(void); |
26 | 26 | ||
27 | static void s3c2416_cpu_suspend(unsigned long arg) | 27 | static int s3c2416_cpu_suspend(unsigned long arg) |
28 | { | 28 | { |
29 | /* enable wakeup sources regardless of battery state */ | 29 | /* enable wakeup sources regardless of battery state */ |
30 | __raw_writel(S3C2443_PWRCFG_SLEEP, S3C2443_PWRCFG); | 30 | __raw_writel(S3C2443_PWRCFG_SLEEP, S3C2443_PWRCFG); |
@@ -33,6 +33,8 @@ static void s3c2416_cpu_suspend(unsigned long arg) | |||
33 | __raw_writel(0x2BED, S3C2443_PWRMODE); | 33 | __raw_writel(0x2BED, S3C2443_PWRMODE); |
34 | 34 | ||
35 | s3c2412_sleep_enter(); | 35 | s3c2412_sleep_enter(); |
36 | |||
37 | panic("sleep resumed to originator?"); | ||
36 | } | 38 | } |
37 | 39 | ||
38 | static void s3c2416_pm_prepare(void) | 40 | static void s3c2416_pm_prepare(void) |
diff --git a/arch/arm/mach-s3c64xx/pm.c b/arch/arm/mach-s3c64xx/pm.c index 7cc1879af722..8bad64370689 100644 --- a/arch/arm/mach-s3c64xx/pm.c +++ b/arch/arm/mach-s3c64xx/pm.c | |||
@@ -112,7 +112,7 @@ void s3c_pm_save_core(void) | |||
112 | * this. | 112 | * this. |
113 | */ | 113 | */ |
114 | 114 | ||
115 | static void s3c64xx_cpu_suspend(unsigned long arg) | 115 | static int s3c64xx_cpu_suspend(unsigned long arg) |
116 | { | 116 | { |
117 | unsigned long tmp; | 117 | unsigned long tmp; |
118 | 118 | ||
diff --git a/arch/arm/mach-sa1100/pm.c b/arch/arm/mach-sa1100/pm.c index cf9a1e9fb70d..bf85b8b259d5 100644 --- a/arch/arm/mach-sa1100/pm.c +++ b/arch/arm/mach-sa1100/pm.c | |||
@@ -33,7 +33,7 @@ | |||
33 | #include <asm/system.h> | 33 | #include <asm/system.h> |
34 | #include <asm/mach/time.h> | 34 | #include <asm/mach/time.h> |
35 | 35 | ||
36 | extern void sa1100_finish_suspend(unsigned long); | 36 | extern int sa1100_finish_suspend(unsigned long); |
37 | 37 | ||
38 | #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x | 38 | #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x |
39 | #define RESTORE(x) x = sleep_save[SLEEP_SAVE_##x] | 39 | #define RESTORE(x) x = sleep_save[SLEEP_SAVE_##x] |
diff --git a/arch/arm/plat-samsung/include/plat/pm.h b/arch/arm/plat-samsung/include/plat/pm.h index 0a5b7faca836..f6749916d194 100644 --- a/arch/arm/plat-samsung/include/plat/pm.h +++ b/arch/arm/plat-samsung/include/plat/pm.h | |||
@@ -42,7 +42,7 @@ extern unsigned long s3c_irqwake_eintallow; | |||
42 | /* per-cpu sleep functions */ | 42 | /* per-cpu sleep functions */ |
43 | 43 | ||
44 | extern void (*pm_cpu_prep)(void); | 44 | extern void (*pm_cpu_prep)(void); |
45 | extern void (*pm_cpu_sleep)(unsigned long); | 45 | extern int (*pm_cpu_sleep)(unsigned long); |
46 | 46 | ||
47 | /* Flags for PM Control */ | 47 | /* Flags for PM Control */ |
48 | 48 | ||
@@ -54,7 +54,7 @@ extern unsigned char pm_uart_udivslot; /* true to save UART UDIVSLOT */ | |||
54 | 54 | ||
55 | extern void s3c_cpu_resume(void); | 55 | extern void s3c_cpu_resume(void); |
56 | 56 | ||
57 | extern void s3c2410_cpu_suspend(unsigned long); | 57 | extern int s3c2410_cpu_suspend(unsigned long); |
58 | 58 | ||
59 | /* sleep save info */ | 59 | /* sleep save info */ |
60 | 60 | ||
diff --git a/arch/arm/plat-samsung/pm.c b/arch/arm/plat-samsung/pm.c index 69d6b040a019..5fa1742d019b 100644 --- a/arch/arm/plat-samsung/pm.c +++ b/arch/arm/plat-samsung/pm.c | |||
@@ -232,7 +232,7 @@ static void __maybe_unused s3c_pm_show_resume_irqs(int start, | |||
232 | 232 | ||
233 | 233 | ||
234 | void (*pm_cpu_prep)(void); | 234 | void (*pm_cpu_prep)(void); |
235 | void (*pm_cpu_sleep)(unsigned long); | 235 | int (*pm_cpu_sleep)(unsigned long); |
236 | 236 | ||
237 | #define any_allowed(mask, allow) (((mask) & (allow)) != (allow)) | 237 | #define any_allowed(mask, allow) (((mask) & (allow)) != (allow)) |
238 | 238 | ||