2012-12-28 13:25:11 +01:00
/*
* Power off by restarting and let u - boot keep hold of the machine
* until the user presses a button for example .
*
* Andrew Lunn < andrew @ lunn . ch >
*
* Copyright ( C ) 2012 Andrew Lunn
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/platform_device.h>
# include <linux/of_platform.h>
# include <linux/module.h>
# include <asm/system_misc.h>
static void restart_poweroff_do_poweroff ( void )
{
arm_pm_restart ( ' h ' , NULL ) ;
}
2013-01-30 12:28:13 +01:00
static int restart_poweroff_probe ( struct platform_device * pdev )
2012-12-28 13:25:11 +01:00
{
/* If a pm_power_off function has already been added, leave it alone */
if ( pm_power_off ! = NULL ) {
dev_err ( & pdev - > dev ,
" pm_power_off function already registered " ) ;
return - EBUSY ;
}
pm_power_off = & restart_poweroff_do_poweroff ;
return 0 ;
}
2013-01-30 12:28:13 +01:00
static int restart_poweroff_remove ( struct platform_device * pdev )
2012-12-28 13:25:11 +01:00
{
if ( pm_power_off = = & restart_poweroff_do_poweroff )
pm_power_off = NULL ;
return 0 ;
}
static const struct of_device_id of_restart_poweroff_match [ ] = {
{ . compatible = " restart-poweroff " , } ,
{ } ,
} ;
static struct platform_driver restart_poweroff_driver = {
. probe = restart_poweroff_probe ,
2013-01-30 12:28:13 +01:00
. remove = restart_poweroff_remove ,
2012-12-28 13:25:11 +01:00
. driver = {
. name = " poweroff-restart " ,
. owner = THIS_MODULE ,
. of_match_table = of_restart_poweroff_match ,
} ,
} ;
module_platform_driver ( restart_poweroff_driver ) ;
MODULE_AUTHOR ( " Andrew Lunn <andrew@lunn.ch " ) ;
MODULE_DESCRIPTION ( " restart poweroff driver " ) ;
MODULE_LICENSE ( " GPLv2 " ) ;
MODULE_ALIAS ( " platform:poweroff-restart " ) ;