2019-06-03 07:45:04 +02:00
// SPDX-License-Identifier: GPL-2.0-only
2005-04-16 15:20:36 -07:00
/*
* poweroff . c - sysrq handler to gracefully power down machine .
*/
# 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 ) ;