MIPS: Provide fallback reboot/poweroff/halt implementations
authorAndrew Bresticker <[email protected]>
Wed, 25 Mar 2015 17:25:44 +0000 (10:25 -0700)
committerRalf Baechle <[email protected]>
Wed, 1 Apr 2015 15:21:58 +0000 (17:21 +0200)
If a machine-specific hook is not implemented for restart, poweroff,
or halt, fall back to halting secondary CPUs, disabling interrupts,
and spinning.  In the case of restart, attempt to restart the system
via do_kernel_restart() (which will call any registered restart
handlers) before halting.

Signed-off-by: Andrew Bresticker <[email protected]>
Cc: James Hogan <[email protected]>
Cc: Maciej W. Rozycki <[email protected]>
Cc: [email protected]
Cc: [email protected]
Patchwork: https://patchwork.linux-mips.org/patch/9600/
Signed-off-by: Ralf Baechle <[email protected]>
arch/mips/kernel/reset.c

index 07fc5244aed4917392542399e8547ed276aa3518..7c746d3458e71a93594760866f3933e6351bcc5a 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/pm.h>
 #include <linux/types.h>
 #include <linux/reboot.h>
+#include <linux/delay.h>
 
 #include <asm/reboot.h>
 
@@ -29,16 +30,40 @@ void machine_restart(char *command)
 {
        if (_machine_restart)
                _machine_restart(command);
+
+#ifdef CONFIG_SMP
+       preempt_disable();
+       smp_send_stop();
+#endif
+       do_kernel_restart(command);
+       mdelay(1000);
+       pr_emerg("Reboot failed -- System halted\n");
+       local_irq_disable();
+       while (1);
 }
 
 void machine_halt(void)
 {
        if (_machine_halt)
                _machine_halt();
+
+#ifdef CONFIG_SMP
+       preempt_disable();
+       smp_send_stop();
+#endif
+       local_irq_disable();
+       while (1);
 }
 
 void machine_power_off(void)
 {
        if (pm_power_off)
                pm_power_off();
+
+#ifdef CONFIG_SMP
+       preempt_disable();
+       smp_send_stop();
+#endif
+       local_irq_disable();
+       while (1);
 }