1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 2a88b5ba8SSam Ravnborg /* reboot.c: reboot/shutdown/halt/poweroff handling 3a88b5ba8SSam Ravnborg * 4a88b5ba8SSam Ravnborg * Copyright (C) 2008 David S. Miller <davem@davemloft.net> 5a88b5ba8SSam Ravnborg */ 6a88b5ba8SSam Ravnborg #include <linux/kernel.h> 7a88b5ba8SSam Ravnborg #include <linux/reboot.h> 8066bcacaSPaul Gortmaker #include <linux/export.h> 9a88b5ba8SSam Ravnborg #include <linux/pm.h> 10*88ca0557SRob Herring #include <linux/of.h> 11a88b5ba8SSam Ravnborg 12a88b5ba8SSam Ravnborg #include <asm/oplib.h> 13a88b5ba8SSam Ravnborg #include <asm/prom.h> 14d550bbd4SDavid Howells #include <asm/setup.h> 15a88b5ba8SSam Ravnborg 16a88b5ba8SSam Ravnborg /* sysctl - toggle power-off restriction for serial console 17a88b5ba8SSam Ravnborg * systems in machine_power_off() 18a88b5ba8SSam Ravnborg */ 19a88b5ba8SSam Ravnborg int scons_pwroff = 1; 20a88b5ba8SSam Ravnborg 21a88b5ba8SSam Ravnborg /* This isn't actually used, it exists merely to satisfy the 22a88b5ba8SSam Ravnborg * reference in kernel/sys.c 23a88b5ba8SSam Ravnborg */ 24a88b5ba8SSam Ravnborg void (*pm_power_off)(void) = machine_power_off; 25a88b5ba8SSam Ravnborg EXPORT_SYMBOL(pm_power_off); 26a88b5ba8SSam Ravnborg machine_power_off(void)27a88b5ba8SSam Ravnborgvoid machine_power_off(void) 28a88b5ba8SSam Ravnborg { 29*88ca0557SRob Herring if (!of_node_is_type(of_console_device, "serial") || scons_pwroff) 30a88b5ba8SSam Ravnborg prom_halt_power_off(); 31a88b5ba8SSam Ravnborg 32a88b5ba8SSam Ravnborg prom_halt(); 33a88b5ba8SSam Ravnborg } 34a88b5ba8SSam Ravnborg machine_halt(void)35a88b5ba8SSam Ravnborgvoid machine_halt(void) 36a88b5ba8SSam Ravnborg { 37a88b5ba8SSam Ravnborg prom_halt(); 38a88b5ba8SSam Ravnborg panic("Halt failed!"); 39a88b5ba8SSam Ravnborg } 40a88b5ba8SSam Ravnborg machine_restart(char * cmd)41a88b5ba8SSam Ravnborgvoid machine_restart(char *cmd) 42a88b5ba8SSam Ravnborg { 43a88b5ba8SSam Ravnborg char *p; 44a88b5ba8SSam Ravnborg 45a88b5ba8SSam Ravnborg p = strchr(reboot_command, '\n'); 46a88b5ba8SSam Ravnborg if (p) 47a88b5ba8SSam Ravnborg *p = 0; 48a88b5ba8SSam Ravnborg if (cmd) 49a88b5ba8SSam Ravnborg prom_reboot(cmd); 50a88b5ba8SSam Ravnborg if (*reboot_command) 51a88b5ba8SSam Ravnborg prom_reboot(reboot_command); 52a88b5ba8SSam Ravnborg prom_reboot(""); 53a88b5ba8SSam Ravnborg panic("Reboot failed!"); 54a88b5ba8SSam Ravnborg } 55a88b5ba8SSam Ravnborg 56