1 // SPDX-License-Identifier: GPL-2.0 2 #include <linux/pm.h> 3 #include <linux/kexec.h> 4 #include <linux/kernel.h> 5 #include <linux/reboot.h> 6 #include <linux/module.h> 7 #include <asm/watchdog.h> 8 #include <asm/addrspace.h> 9 #include <asm/reboot.h> 10 #include <asm/tlbflush.h> 11 #include <asm/traps.h> 12 13 void (*pm_power_off)(void); 14 EXPORT_SYMBOL(pm_power_off); 15 16 static void watchdog_trigger_immediate(void) 17 { 18 sh_wdt_write_cnt(0xFF); 19 sh_wdt_write_csr(0xC2); 20 } 21 22 static void native_machine_restart(char * __unused) 23 { 24 local_irq_disable(); 25 26 /* Destroy all of the TLBs in preparation for reset by MMU */ 27 __flush_tlb_global(); 28 29 /* Address error with SR.BL=1 first. */ 30 trigger_address_error(); 31 32 /* If that fails or is unsupported, go for the watchdog next. */ 33 watchdog_trigger_immediate(); 34 35 /* 36 * Give up and sleep. 37 */ 38 while (1) 39 cpu_sleep(); 40 } 41 42 static void native_machine_shutdown(void) 43 { 44 smp_send_stop(); 45 } 46 47 static void native_machine_power_off(void) 48 { 49 do_kernel_power_off(); 50 } 51 52 static void native_machine_halt(void) 53 { 54 /* stop other cpus */ 55 machine_shutdown(); 56 57 /* stop this cpu */ 58 stop_this_cpu(NULL); 59 } 60 61 struct machine_ops machine_ops = { 62 .power_off = native_machine_power_off, 63 .shutdown = native_machine_shutdown, 64 .restart = native_machine_restart, 65 .halt = native_machine_halt, 66 #ifdef CONFIG_KEXEC_CORE 67 .crash_shutdown = native_machine_crash_shutdown, 68 #endif 69 }; 70 71 void machine_power_off(void) 72 { 73 machine_ops.power_off(); 74 } 75 76 void machine_shutdown(void) 77 { 78 machine_ops.shutdown(); 79 } 80 81 void machine_restart(char *cmd) 82 { 83 machine_ops.restart(cmd); 84 } 85 86 void machine_halt(void) 87 { 88 machine_ops.halt(); 89 } 90 91 #ifdef CONFIG_KEXEC_CORE 92 void machine_crash_shutdown(struct pt_regs *regs) 93 { 94 machine_ops.crash_shutdown(regs); 95 } 96 #endif 97