1 /*
2  * poweroff.c - sysrq handler to gracefully power down machine.
3  *
4  * This file is released under the GPL v2
5  */
6 
7 #include <linux/kernel.h>
8 #include <linux/sysrq.h>
9 #include <linux/init.h>
10 #include <linux/pm.h>
11 #include <linux/workqueue.h>
12 #include <linux/reboot.h>
13 #include <linux/cpumask.h>
14 
15 /*
16  * When the user hits Sys-Rq o to power down the machine this is the
17  * callback we use.
18  */
19 
do_poweroff(struct work_struct * dummy)20 static void do_poweroff(struct work_struct *dummy)
21 {
22 	kernel_power_off();
23 }
24 
25 static DECLARE_WORK(poweroff_work, do_poweroff);
26 
handle_poweroff(int key)27 static void handle_poweroff(int key)
28 {
29 	/* run sysrq poweroff on boot cpu */
30 	schedule_work_on(cpumask_first(cpu_online_mask), &poweroff_work);
31 }
32 
33 static struct sysrq_key_op	sysrq_poweroff_op = {
34 	.handler        = handle_poweroff,
35 	.help_msg       = "powerOff",
36 	.action_msg     = "Power Off",
37 	.enable_mask	= SYSRQ_ENABLE_BOOT,
38 };
39 
pm_sysrq_init(void)40 static int pm_sysrq_init(void)
41 {
42 	register_sysrq_key('o', &sysrq_poweroff_op);
43 	return 0;
44 }
45 
46 subsys_initcall(pm_sysrq_init);
47