From mboxrd@z Thu Jan 1 00:00:00 1970 From: romain.perier@gmail.com (Romain Perier) Date: Thu, 17 Jul 2014 17:11:50 +0000 Subject: [PATCH] ARM: rockchip: Add cpu hotplug support for RK3XXX SoCs Message-ID: <1405617110-1136-1-git-send-email-romain.perier@gmail.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Adds ability to shutdown all CPUs except the first one (since it might be special for a lot of platforms). It is now possible to use kexec which requires such a feature. Signed-off-by: Romain Perier --- arch/arm/mach-rockchip/platsmp.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/arch/arm/mach-rockchip/platsmp.c b/arch/arm/mach-rockchip/platsmp.c index 910835d..7c1299a 100644 --- a/arch/arm/mach-rockchip/platsmp.c +++ b/arch/arm/mach-rockchip/platsmp.c @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -178,8 +179,38 @@ static void __init rockchip_smp_prepare_cpus(unsigned int max_cpus) pmu_set_power_domain(0 + i, false); } +#ifdef CONFIG_HOTPLUG_CPU +static DECLARE_COMPLETION(cpu_died); + +static int rockchip_cpu_kill(unsigned int cpu) +{ + if (!wait_for_completion_timeout(&cpu_died, msecs_to_jiffies(1000))) { + pr_err("CPU%d: didn't die correctly\n", cpu); + return 0; + } + pmu_set_power_domain(0 + cpu, false); + return 1; +} + + +static void rockchip_cpu_die(unsigned int cpu) +{ + complete(&cpu_died); + flush_cache_louis(); + + v7_exit_coherency_flush(louis); + + while(1) + cpu_do_idle(); +} +#endif + static struct smp_operations rockchip_smp_ops __initdata = { .smp_prepare_cpus = rockchip_smp_prepare_cpus, .smp_boot_secondary = rockchip_boot_secondary, +#ifdef CONFIG_HOTPLUG_CPU + .cpu_kill = rockchip_cpu_kill, + .cpu_die = rockchip_cpu_die, +#endif }; CPU_METHOD_OF_DECLARE(rk3066_smp, "rockchip,rk3066-smp", &rockchip_smp_ops); -- 1.9.1