2019-06-03 08:45:04 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2005-04-17 02:20:36 +04: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 21:47:32 +04:00
# include <linux/reboot.h>
2008-07-24 08:28:40 +04:00
# include <linux/cpumask.h>
2005-04-17 02:20:36 +04:00
/*
* When the user hits Sys - Rq o to power down the machine this is the
* callback we use .
*/
2006-11-22 17:55:48 +03:00
static void do_poweroff ( struct work_struct * dummy )
2005-04-17 02:20:36 +04:00
{
2005-07-26 21:47:32 +04:00
kernel_power_off ( ) ;
2005-04-17 02:20:36 +04:00
}
2006-11-22 17:55:48 +03:00
static DECLARE_WORK ( poweroff_work , do_poweroff ) ;
2005-04-17 02:20:36 +04:00
2010-08-18 08:15:46 +04:00
static void handle_poweroff ( int key )
2005-04-17 02:20:36 +04:00
{
2008-07-24 08:28:40 +04:00
/* run sysrq poweroff on boot cpu */
2009-01-01 02:42:28 +03:00
schedule_work_on ( cpumask_first ( cpu_online_mask ) , & poweroff_work ) ;
2005-04-17 02:20:36 +04:00
}
2020-05-14 00:43:50 +03:00
static const struct sysrq_key_op sysrq_poweroff_op = {
2005-04-17 02:20:36 +04:00
. handler = handle_poweroff ,
2013-05-01 02:28:52 +04:00
. help_msg = " poweroff(o) " ,
2005-04-17 02:20:36 +04:00
. action_msg = " Power Off " ,
2009-02-22 07:54:27 +03:00
. enable_mask = SYSRQ_ENABLE_BOOT ,
2005-04-17 02:20:36 +04:00
} ;
2012-09-10 16:05:18 +04:00
static int __init pm_sysrq_init ( void )
2005-04-17 02:20:36 +04:00
{
register_sysrq_key ( ' o ' , & sysrq_poweroff_op ) ;
return 0 ;
}
subsys_initcall ( pm_sysrq_init ) ;