Commit | Line | Data |
---|---|---|
9d704c04 SI |
1 | /* |
2 | * Copyright (C) STMicroelectronics 2009 | |
3 | * Copyright (C) ST-Ericsson SA 2010 | |
4 | * | |
5 | * License Terms: GNU General Public License v2 | |
6 | * Based on ARM realview platform | |
7 | * | |
8 | * Author: Sundar Iyer <sundar.iyer@stericsson.com> | |
9 | * | |
10 | */ | |
11 | #include <linux/kernel.h> | |
12 | #include <linux/errno.h> | |
13 | #include <linux/smp.h> | |
9d704c04 SI |
14 | |
15 | #include <asm/cacheflush.h> | |
16 | ||
17 | extern volatile int pen_release; | |
18 | ||
9d704c04 SI |
19 | static inline void platform_do_lowpower(unsigned int cpu) |
20 | { | |
21 | flush_cache_all(); | |
22 | ||
23 | /* we put the platform to just WFI */ | |
24 | for (;;) { | |
25 | __asm__ __volatile__("dsb\n\t" "wfi\n\t" | |
26 | : : : "memory"); | |
28763487 | 27 | if (pen_release == cpu_logical_map(cpu)) { |
9d704c04 SI |
28 | /* |
29 | * OK, proper wakeup, we're done | |
30 | */ | |
31 | break; | |
32 | } | |
33 | } | |
34 | } | |
35 | ||
36 | int platform_cpu_kill(unsigned int cpu) | |
37 | { | |
3c030bea | 38 | return 1; |
9d704c04 SI |
39 | } |
40 | ||
41 | /* | |
42 | * platform-specific code to shutdown a CPU | |
43 | * | |
44 | * Called with IRQs disabled | |
45 | */ | |
46 | void platform_cpu_die(unsigned int cpu) | |
47 | { | |
9d704c04 SI |
48 | /* directly enter low power state, skipping secure registers */ |
49 | platform_do_lowpower(cpu); | |
50 | } | |
51 | ||
52 | int platform_cpu_disable(unsigned int cpu) | |
53 | { | |
54 | /* | |
55 | * we don't allow CPU 0 to be shutdown (it is still too special | |
56 | * e.g. clock tick interrupts) | |
57 | */ | |
58 | return cpu == 0 ? -EPERM : 0; | |
59 | } |