diff options
author | Magnus Damm <damm@opensource.se> | 2013-07-31 03:07:21 -0400 |
---|---|---|
committer | Simon Horman <horms+renesas@verge.net.au> | 2013-08-06 05:07:24 -0400 |
commit | 12eb8474386228c91e35be031d7c3eaa1318b5cf (patch) | |
tree | 6b13ea67b3a37ea1a68039226eb7fdb7f3adfd7d | |
parent | c970d4ef3ac6d56f5fd02902ad2ad80377c0bca1 (diff) |
ARM: shmobile: Use shared SCU SMP boot code on sh73a0
Use shared SCU code on sh73a0 for SMP boot.
Signed-off-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
-rw-r--r-- | arch/arm/mach-shmobile/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/smp-sh73a0.c | 26 |
2 files changed, 14 insertions, 14 deletions
diff --git a/arch/arm/mach-shmobile/Makefile b/arch/arm/mach-shmobile/Makefile index e401c737fb4d..a32dc1584a25 100644 --- a/arch/arm/mach-shmobile/Makefile +++ b/arch/arm/mach-shmobile/Makefile | |||
@@ -17,7 +17,7 @@ obj-$(CONFIG_ARCH_EMEV2) += setup-emev2.o clock-emev2.o | |||
17 | 17 | ||
18 | # SMP objects | 18 | # SMP objects |
19 | smp-y := platsmp.o headsmp.o | 19 | smp-y := platsmp.o headsmp.o |
20 | smp-$(CONFIG_ARCH_SH73A0) += smp-sh73a0.o headsmp-scu.o | 20 | smp-$(CONFIG_ARCH_SH73A0) += smp-sh73a0.o headsmp-scu.o platsmp-scu.o |
21 | smp-$(CONFIG_ARCH_R8A7779) += smp-r8a7779.o headsmp-scu.o | 21 | smp-$(CONFIG_ARCH_R8A7779) += smp-r8a7779.o headsmp-scu.o |
22 | smp-$(CONFIG_ARCH_EMEV2) += smp-emev2.o headsmp-scu.o | 22 | smp-$(CONFIG_ARCH_EMEV2) += smp-emev2.o headsmp-scu.o |
23 | 23 | ||
diff --git a/arch/arm/mach-shmobile/smp-sh73a0.c b/arch/arm/mach-shmobile/smp-sh73a0.c index 1b3dc7c1e87e..1096b0eb6c5e 100644 --- a/arch/arm/mach-shmobile/smp-sh73a0.c +++ b/arch/arm/mach-shmobile/smp-sh73a0.c | |||
@@ -50,30 +50,30 @@ void __init sh73a0_register_twd(void) | |||
50 | 50 | ||
51 | static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct *idle) | 51 | static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct *idle) |
52 | { | 52 | { |
53 | cpu = cpu_logical_map(cpu); | 53 | unsigned int lcpu = cpu_logical_map(cpu); |
54 | int ret; | ||
54 | 55 | ||
55 | if (((__raw_readl(PSTR) >> (4 * cpu)) & 3) == 3) | 56 | ret = shmobile_smp_scu_boot_secondary(cpu, idle); |
56 | __raw_writel(1 << cpu, WUPCR); /* wake up */ | 57 | if (ret) |
58 | return ret; | ||
59 | |||
60 | if (((__raw_readl(PSTR) >> (4 * lcpu)) & 3) == 3) | ||
61 | __raw_writel(1 << lcpu, WUPCR); /* wake up */ | ||
57 | else | 62 | else |
58 | __raw_writel(1 << cpu, SRESCR); /* reset */ | 63 | __raw_writel(1 << lcpu, SRESCR); /* reset */ |
59 | 64 | ||
60 | return 0; | 65 | return 0; |
61 | } | 66 | } |
62 | 67 | ||
63 | static void __init sh73a0_smp_prepare_cpus(unsigned int max_cpus) | 68 | static void __init sh73a0_smp_prepare_cpus(unsigned int max_cpus) |
64 | { | 69 | { |
65 | /* setup sh73a0 specific SCU base */ | 70 | /* Map the reset vector (in headsmp.S) */ |
66 | shmobile_scu_base = IOMEM(SH73A0_SCU_BASE); | ||
67 | scu_enable(shmobile_scu_base); | ||
68 | |||
69 | /* Map the reset vector (in headsmp-scu.S, headsmp.S) */ | ||
70 | __raw_writel(0, APARMBAREA); /* 4k */ | 71 | __raw_writel(0, APARMBAREA); /* 4k */ |
71 | __raw_writel(__pa(shmobile_boot_vector), SBAR); | 72 | __raw_writel(__pa(shmobile_boot_vector), SBAR); |
72 | shmobile_boot_fn = virt_to_phys(shmobile_boot_scu); | ||
73 | shmobile_boot_arg = (unsigned long)shmobile_scu_base; | ||
74 | 73 | ||
75 | /* enable cache coherency on booting CPU */ | 74 | /* setup sh73a0 specific SCU bits */ |
76 | scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL); | 75 | shmobile_scu_base = IOMEM(SH73A0_SCU_BASE); |
76 | shmobile_smp_scu_prepare_cpus(max_cpus); | ||
77 | } | 77 | } |
78 | 78 | ||
79 | #ifdef CONFIG_HOTPLUG_CPU | 79 | #ifdef CONFIG_HOTPLUG_CPU |