Branch data Line data Source code
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 : :
20 : 0 : static void do_poweroff(struct work_struct *dummy)
21 : : {
22 : 0 : kernel_power_off();
23 : 0 : }
24 : :
25 : : static DECLARE_WORK(poweroff_work, do_poweroff);
26 : :
27 : 0 : static void handle_poweroff(int key)
28 : : {
29 : : /* run sysrq poweroff on boot cpu */
30 : 0 : schedule_work_on(cpumask_first(cpu_online_mask), &poweroff_work);
31 : 0 : }
32 : :
33 : : static struct sysrq_key_op sysrq_poweroff_op = {
34 : : .handler = handle_poweroff,
35 : : .help_msg = "poweroff(o)",
36 : : .action_msg = "Power Off",
37 : : .enable_mask = SYSRQ_ENABLE_BOOT,
38 : : };
39 : :
40 : 0 : static int __init pm_sysrq_init(void)
41 : : {
42 : 0 : register_sysrq_key('o', &sysrq_poweroff_op);
43 : 0 : return 0;
44 : : }
45 : :
46 : : subsys_initcall(pm_sysrq_init);
|