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