summaryrefslogtreecommitdiffstats
path: root/arch/mips/loongson/loongson-3/irq.c
diff options
context:
space:
mode:
authorHuacai Chen <chenhc@lemote.com>2014-03-21 18:44:09 +0800
committerRalf Baechle <ralf@linux-mips.org>2014-03-31 18:17:12 +0200
commitc4a987db1b3cd89207cece4b8121c09cbfbc978a (patch)
treed9dc9db58b7259ac9e986b948e8b9c0abbebff39 /arch/mips/loongson/loongson-3/irq.c
parent300459d558725cdada5ddebbe52c24ef6e1853d3 (diff)
downloadlinux-c4a987db1b3cd89207cece4b8121c09cbfbc978a.tar.bz2
MIPS: Loongson 3: Add CPU hotplug support
Tips of Loongson's CPU hotplug: 1, To fully shutdown a core in Loongson 3, the target core should go to CKSEG1 and flush all L1 cache entries at first. Then, another core (usually Core 0) can safely disable the clock of the target core. So play_dead() call loongson3_play_dead() via CKSEG1 (both uncached and unmmaped). 2, The default clocksource of Loongson is MIPS. Since clock source is a global device, timekeeping need the CP0' Count registers of each core be synchronous. Thus, when a core is up, we use a SMP_ASK_C0COUNT IPI to ask Core-0's Count. Signed-off-by: Huacai Chen <chenhc@lemote.com> Signed-off-by: Hongliang Tao <taohl@lemote.com> Signed-off-by: Hua Yan <yanh@lemote.com> Tested-by: Alex Smith <alex.smith@imgtec.com> Reviewed-by: Alex Smith <alex.smith@imgtec.com> Cc: John Crispin <john@phrozen.org> Cc: Steven J. Hill <Steven.Hill@imgtec.com> Cc: Aurelien Jarno <aurelien@aurel32.net> Cc: linux-mips@linux-mips.org Cc: Fuxin Zhang <zhangfx@lemote.com> Cc: Zhangjin Wu <wuzhangjin@gmail.com> Patchwork: https://patchwork.linux-mips.org/patch/6639 Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/loongson/loongson-3/irq.c')
-rw-r--r--arch/mips/loongson/loongson-3/irq.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/arch/mips/loongson/loongson-3/irq.c b/arch/mips/loongson/loongson-3/irq.c
index 088fd5e4fd64..f240828181ff 100644
--- a/arch/mips/loongson/loongson-3/irq.c
+++ b/arch/mips/loongson/loongson-3/irq.c
@@ -114,3 +114,13 @@ void __init mach_init_irq(void)
set_c0_status(STATUSF_IP2 | STATUSF_IP6);
}
+
+#ifdef CONFIG_HOTPLUG_CPU
+
+void fixup_irqs(void)
+{
+ irq_cpu_offline();
+ clear_c0_status(ST0_IM);
+}
+
+#endif