forked from Minki/linux
f45e388ff0
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 <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: Ralf Baechle <ralf@linux-mips.org>
70 lines
1.3 KiB
C
70 lines
1.3 KiB
C
/*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*
|
|
* Copyright (C) 2001, 06 by Ralf Baechle (ralf@linux-mips.org)
|
|
* Copyright (C) 2001 MIPS Technologies, Inc.
|
|
*/
|
|
#include <linux/kernel.h>
|
|
#include <linux/export.h>
|
|
#include <linux/pm.h>
|
|
#include <linux/types.h>
|
|
#include <linux/reboot.h>
|
|
#include <linux/delay.h>
|
|
|
|
#include <asm/reboot.h>
|
|
|
|
/*
|
|
* Urgs ... Too many MIPS machines to handle this in a generic way.
|
|
* So handle all using function pointers to machine specific
|
|
* functions.
|
|
*/
|
|
void (*_machine_restart)(char *command);
|
|
void (*_machine_halt)(void);
|
|
void (*pm_power_off)(void);
|
|
|
|
EXPORT_SYMBOL(pm_power_off);
|
|
|
|
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);
|
|
}
|