| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * poweroff.c - sysrq handler to gracefully power down machine. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This file is released under the GPL v2 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/kernel.h>
 | 
					
						
							|  |  |  | #include <linux/sysrq.h>
 | 
					
						
							|  |  |  | #include <linux/init.h>
 | 
					
						
							|  |  |  | #include <linux/pm.h>
 | 
					
						
							|  |  |  | #include <linux/workqueue.h>
 | 
					
						
							| 
									
										
										
										
											2005-07-26 11:47:32 -06:00
										 |  |  | #include <linux/reboot.h>
 | 
					
						
							| 
									
										
										
										
											2008-07-23 21:28:40 -07:00
										 |  |  | #include <linux/cpumask.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * When the user hits Sys-Rq o to power down the machine this is the | 
					
						
							|  |  |  |  * callback we use. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-22 14:55:48 +00:00
										 |  |  | static void do_poweroff(struct work_struct *dummy) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2005-07-26 11:47:32 -06:00
										 |  |  | 	kernel_power_off(); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-22 14:55:48 +00:00
										 |  |  | static DECLARE_WORK(poweroff_work, do_poweroff); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-17 21:15:46 -07:00
										 |  |  | static void handle_poweroff(int key) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-07-23 21:28:40 -07:00
										 |  |  | 	/* run sysrq poweroff on boot cpu */ | 
					
						
							| 
									
										
										
										
											2009-01-01 10:12:28 +10:30
										 |  |  | 	schedule_work_on(cpumask_first(cpu_online_mask), &poweroff_work); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static struct sysrq_key_op	sysrq_poweroff_op = { | 
					
						
							|  |  |  | 	.handler        = handle_poweroff, | 
					
						
							| 
									
										
										
										
											2013-04-30 15:28:52 -07:00
										 |  |  | 	.help_msg       = "poweroff(o)", | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	.action_msg     = "Power Off", | 
					
						
							| 
									
										
										
										
											2009-02-22 10:24:27 +05:30
										 |  |  | 	.enable_mask	= SYSRQ_ENABLE_BOOT, | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-10 12:05:18 +00:00
										 |  |  | static int __init pm_sysrq_init(void) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							|  |  |  | 	register_sysrq_key('o', &sysrq_poweroff_op); | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | subsys_initcall(pm_sysrq_init); |