Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f45e388f authored by Andrew Bresticker's avatar Andrew Bresticker Committed by Ralf Baechle
Browse files

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: default avatarAndrew 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: default avatarRalf Baechle <ralf@linux-mips.org>
parent ea925a72
Loading
Loading
Loading
Loading
+25 −0
Original line number Original line Diff line number Diff line
@@ -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)
{
{
	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);
}
}