| From 3540a0ddf4af5a4e1782baf21d9d9dd153f075ad Mon Sep 17 00:00:00 2001 |
| From: Magnus Damm <damm@opensource.se> |
| Date: Wed, 31 Jul 2013 16:07:31 +0900 |
| Subject: ARM: shmobile: Use shared SCU SMP boot code on r8a7779 |
| |
| Use shared SCU code on r8a7779 for SMP boot. |
| |
| Signed-off-by: Magnus Damm <damm@opensource.se> |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| (cherry picked from commit 0ca2894b5a9007091ad1a4d82b9f3132d4dd9410) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| arch/arm/mach-shmobile/Makefile | 2 +- |
| arch/arm/mach-shmobile/smp-r8a7779.c | 23 ++++++++++++----------- |
| 2 files changed, 13 insertions(+), 12 deletions(-) |
| |
| diff --git a/arch/arm/mach-shmobile/Makefile b/arch/arm/mach-shmobile/Makefile |
| index af7c6ccb..1682b9d3 100644 |
| --- a/arch/arm/mach-shmobile/Makefile |
| +++ b/arch/arm/mach-shmobile/Makefile |
| @@ -33,7 +33,7 @@ endif |
| # SMP objects |
| smp-y := platsmp.o headsmp.o |
| smp-$(CONFIG_ARCH_SH73A0) += smp-sh73a0.o headsmp-scu.o platsmp-scu.o |
| -smp-$(CONFIG_ARCH_R8A7779) += smp-r8a7779.o headsmp-scu.o |
| +smp-$(CONFIG_ARCH_R8A7779) += smp-r8a7779.o headsmp-scu.o platsmp-scu.o |
| smp-$(CONFIG_ARCH_EMEV2) += smp-emev2.o headsmp-scu.o |
| |
| # IRQ objects |
| diff --git a/arch/arm/mach-shmobile/smp-r8a7779.c b/arch/arm/mach-shmobile/smp-r8a7779.c |
| index bb3adae7..1963d0d4 100644 |
| --- a/arch/arm/mach-shmobile/smp-r8a7779.c |
| +++ b/arch/arm/mach-shmobile/smp-r8a7779.c |
| @@ -84,33 +84,34 @@ static int r8a7779_platform_cpu_kill(unsigned int cpu) |
| static int __cpuinit r8a7779_boot_secondary(unsigned int cpu, struct task_struct *idle) |
| { |
| struct r8a7779_pm_ch *ch = NULL; |
| - int ret = -EIO; |
| + unsigned int lcpu = cpu_logical_map(cpu); |
| + int ret; |
| |
| - cpu = cpu_logical_map(cpu); |
| + ret = shmobile_smp_scu_boot_secondary(cpu, idle); |
| + if (ret) |
| + return ret; |
| |
| - if (cpu < ARRAY_SIZE(r8a7779_ch_cpu)) |
| - ch = r8a7779_ch_cpu[cpu]; |
| + if (lcpu < ARRAY_SIZE(r8a7779_ch_cpu)) |
| + ch = r8a7779_ch_cpu[lcpu]; |
| |
| if (ch) |
| ret = r8a7779_sysc_power_up(ch); |
| + else |
| + ret = -EIO; |
| |
| return ret; |
| } |
| |
| static void __init r8a7779_smp_prepare_cpus(unsigned int max_cpus) |
| { |
| - |
| - /* setup r8a7779 specific SCU base */ |
| - shmobile_scu_base = IOMEM(R8A7779_SCU_BASE); |
| - scu_enable(shmobile_scu_base); |
| - |
| /* Map the reset vector (in headsmp-scu.S, headsmp.S) */ |
| __raw_writel(__pa(shmobile_boot_vector), AVECR); |
| shmobile_boot_fn = virt_to_phys(shmobile_boot_scu); |
| shmobile_boot_arg = (unsigned long)shmobile_scu_base; |
| |
| - /* enable cache coherency on booting CPU */ |
| - scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL); |
| + /* setup r8a7779 specific SCU bits */ |
| + shmobile_scu_base = IOMEM(R8A7779_SCU_BASE); |
| + shmobile_smp_scu_prepare_cpus(max_cpus); |
| |
| r8a7779_pm_init(); |
| |
| -- |
| 1.8.4.3.gca3854a |
| |