diff options
author | Daniel Lezcano <daniel.lezcano@linaro.org> | 2014-05-25 15:50:34 -0400 |
---|---|---|
committer | Kukjin Kim <kgene.kim@samsung.com> | 2014-05-25 16:21:47 -0400 |
commit | cd245f59aae5d6ef265f46aa6cea78354d61b629 (patch) | |
tree | 9dbba90439d4c75c4a0594a55de32576ea05c338 | |
parent | ff6a9c039dc7da12fcfc70c28ccc9893d85f8e1f (diff) |
ARM: EXYNOS: Fix kernel panic when unplugging CPU1 on exynos
A look at the code reveals use of S5P_VA_SYSRAM macro, in case of certain SoC
revisions, which is not valid any longer, after SYSRAM started to be mapped
dynamically. The new dynamic mapping is stored in sysram_base_addr variable,
which is declared static in platsmp.c
This fix makes sysram_base_addr non-static, declared it in common.h and used
in pm.c instead of S5P_VA_SYSRAM.
Suggested-by: Tomasz Figa <t.figa@samsung.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Tomasz Figa <t.figa@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
-rw-r--r-- | arch/arm/mach-exynos/common.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-exynos/platsmp.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-exynos/pm.c | 4 |
3 files changed, 4 insertions, 3 deletions
diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h index 27c9abdeb79e..5848d3cc29e9 100644 --- a/arch/arm/mach-exynos/common.h +++ b/arch/arm/mach-exynos/common.h | |||
@@ -19,6 +19,7 @@ void mct_init(void __iomem *base, int irq_g0, int irq_l0, int irq_l1); | |||
19 | 19 | ||
20 | struct map_desc; | 20 | struct map_desc; |
21 | extern void __iomem *sysram_ns_base_addr; | 21 | extern void __iomem *sysram_ns_base_addr; |
22 | extern void __iomem *sysram_base_addr; | ||
22 | void exynos_init_io(void); | 23 | void exynos_init_io(void); |
23 | void exynos_restart(enum reboot_mode mode, const char *cmd); | 24 | void exynos_restart(enum reboot_mode mode, const char *cmd); |
24 | void exynos_cpuidle_init(void); | 25 | void exynos_cpuidle_init(void); |
diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c index 78002c7344b3..9e5e230575dd 100644 --- a/arch/arm/mach-exynos/platsmp.c +++ b/arch/arm/mach-exynos/platsmp.c | |||
@@ -34,7 +34,7 @@ | |||
34 | 34 | ||
35 | extern void exynos4_secondary_startup(void); | 35 | extern void exynos4_secondary_startup(void); |
36 | 36 | ||
37 | static void __iomem *sysram_base_addr; | 37 | void __iomem *sysram_base_addr; |
38 | void __iomem *sysram_ns_base_addr; | 38 | void __iomem *sysram_ns_base_addr; |
39 | 39 | ||
40 | static void __init exynos_smp_prepare_sysram(void) | 40 | static void __init exynos_smp_prepare_sysram(void) |
diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c index f7b0b77582f6..0d1a46e7b021 100644 --- a/arch/arm/mach-exynos/pm.c +++ b/arch/arm/mach-exynos/pm.c | |||
@@ -169,10 +169,10 @@ int exynos_cluster_power_state(int cluster) | |||
169 | 169 | ||
170 | #define EXYNOS_BOOT_VECTOR_ADDR (samsung_rev() == EXYNOS4210_REV_1_1 ? \ | 170 | #define EXYNOS_BOOT_VECTOR_ADDR (samsung_rev() == EXYNOS4210_REV_1_1 ? \ |
171 | S5P_INFORM7 : (samsung_rev() == EXYNOS4210_REV_1_0 ? \ | 171 | S5P_INFORM7 : (samsung_rev() == EXYNOS4210_REV_1_0 ? \ |
172 | (S5P_VA_SYSRAM + 0x24) : S5P_INFORM0)) | 172 | (sysram_base_addr + 0x24) : S5P_INFORM0)) |
173 | #define EXYNOS_BOOT_VECTOR_FLAG (samsung_rev() == EXYNOS4210_REV_1_1 ? \ | 173 | #define EXYNOS_BOOT_VECTOR_FLAG (samsung_rev() == EXYNOS4210_REV_1_1 ? \ |
174 | S5P_INFORM6 : (samsung_rev() == EXYNOS4210_REV_1_0 ? \ | 174 | S5P_INFORM6 : (samsung_rev() == EXYNOS4210_REV_1_0 ? \ |
175 | (S5P_VA_SYSRAM + 0x20) : S5P_INFORM1)) | 175 | (sysram_base_addr + 0x20) : S5P_INFORM1)) |
176 | 176 | ||
177 | #define S5P_CHECK_AFTR 0xFCBA0D10 | 177 | #define S5P_CHECK_AFTR 0xFCBA0D10 |
178 | #define S5P_CHECK_SLEEP 0x00000BAD | 178 | #define S5P_CHECK_SLEEP 0x00000BAD |