]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | // SPDX-License-Identifier: GPL-2.0 |
fbb82b03 PM |
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> | |
59615ecd | 12 | #include <asm/tlbflush.h> |
e839ca52 | 13 | #include <asm/traps.h> |
fbb82b03 PM |
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 | ||
59615ecd PM |
30 | /* Destroy all of the TLBs in preparation for reset by MMU */ |
31 | __flush_tlb_global(); | |
32 | ||
fbb82b03 PM |
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 |