Merge tag 'pcmcia-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo...
[sfrench/cifs-2.6.git] / arch / sh / kernel / reboot.c
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