blob: 69c1b6c047d53218583d0ad84aa8a20367bb5a01 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001// SPDX-License-Identifier: GPL-2.0
David S. Millercdb35922008-09-01 19:31:16 -07002/* reboot.c: reboot/shutdown/halt/poweroff handling
3 *
4 * Copyright (C) 2008 David S. Miller <davem@davemloft.net>
5 */
6#include <linux/kernel.h>
7#include <linux/reboot.h>
Paul Gortmaker066bcac2011-07-22 13:18:16 -04008#include <linux/export.h>
David S. Millercdb35922008-09-01 19:31:16 -07009#include <linux/pm.h>
Rob Herring88ca0552018-11-16 15:06:59 -060010#include <linux/of.h>
David S. Millercdb35922008-09-01 19:31:16 -070011
David S. Millercdb35922008-09-01 19:31:16 -070012#include <asm/oplib.h>
13#include <asm/prom.h>
David Howellsd550bbd2012-03-28 18:30:03 +010014#include <asm/setup.h>
David S. Millercdb35922008-09-01 19:31:16 -070015
16/* sysctl - toggle power-off restriction for serial console
17 * systems in machine_power_off()
18 */
19int scons_pwroff = 1;
20
21/* This isn't actually used, it exists merely to satisfy the
22 * reference in kernel/sys.c
23 */
24void (*pm_power_off)(void) = machine_power_off;
25EXPORT_SYMBOL(pm_power_off);
26
27void machine_power_off(void)
28{
Rob Herring88ca0552018-11-16 15:06:59 -060029 if (!of_node_is_type(of_console_device, "serial") || scons_pwroff)
David S. Millercdb35922008-09-01 19:31:16 -070030 prom_halt_power_off();
31
32 prom_halt();
33}
34
35void machine_halt(void)
36{
David S. Millercdb35922008-09-01 19:31:16 -070037 prom_halt();
38 panic("Halt failed!");
39}
40
41void machine_restart(char *cmd)
42{
43 char *p;
44
David S. Millercdb35922008-09-01 19:31:16 -070045 p = strchr(reboot_command, '\n');
46 if (p)
47 *p = 0;
48 if (cmd)
49 prom_reboot(cmd);
50 if (*reboot_command)
51 prom_reboot(reboot_command);
52 prom_reboot("");
53 panic("Reboot failed!");
54}
55