提交 f45e388f 编写于 作者: A Andrew Bresticker 提交者: Ralf Baechle

MIPS: Provide fallback reboot/poweroff/halt implementations

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: NAndrew Bresticker <abrestic@chromium.org>
Cc: James Hogan <james.hogan@imgtec.com>
Cc: Maciej W. Rozycki <macro@linux-mips.org>
Cc: linux-mips@linux-mips.org
Cc: linux-kernel@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/9600/Signed-off-by: NRalf Baechle <ralf@linux-mips.org>
上级 ea925a72
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/reboot.h> #include <linux/reboot.h>
#include <linux/delay.h>
#include <asm/reboot.h> #include <asm/reboot.h>
...@@ -29,16 +30,40 @@ void machine_restart(char *command) ...@@ -29,16 +30,40 @@ void machine_restart(char *command)
{ {
if (_machine_restart) if (_machine_restart)
_machine_restart(command); _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) void machine_halt(void)
{ {
if (_machine_halt) if (_machine_halt)
_machine_halt(); _machine_halt();
#ifdef CONFIG_SMP
preempt_disable();
smp_send_stop();
#endif
local_irq_disable();
while (1);
} }
void machine_power_off(void) void machine_power_off(void)
{ {
if (pm_power_off) if (pm_power_off)
pm_power_off(); pm_power_off();
#ifdef CONFIG_SMP
preempt_disable();
smp_send_stop();
#endif
local_irq_disable();
while (1);
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册