2019-05-29 07:17:58 -07:00
// SPDX-License-Identifier: GPL-2.0-only
2013-07-30 17:05:28 -07:00
/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
*/
# include <linux/delay.h>
# include <linux/err.h>
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/io.h>
# include <linux/of.h>
# include <linux/platform_device.h>
# include <linux/module.h>
# include <linux/reboot.h>
2014-09-25 17:03:51 +05:30
# include <linux/pm.h>
2013-07-30 17:05:28 -07:00
static void __iomem * msm_ps_hold ;
2018-01-07 19:33:13 -08:00
static int deassert_pshold ( struct notifier_block * nb , unsigned long action ,
2014-09-25 17:03:51 +05:30
void * data )
2013-07-30 17:05:28 -07:00
{
writel ( 0 , msm_ps_hold ) ;
mdelay ( 10000 ) ;
2014-09-25 17:03:51 +05:30
return NOTIFY_DONE ;
2013-07-30 17:05:28 -07:00
}
2014-09-25 17:03:51 +05:30
static struct notifier_block restart_nb = {
2018-01-07 19:33:13 -08:00
. notifier_call = deassert_pshold ,
2014-09-25 17:03:51 +05:30
. priority = 128 ,
} ;
2013-07-30 17:05:28 -07:00
static void do_msm_poweroff ( void )
{
2018-01-07 19:33:13 -08:00
deassert_pshold ( & restart_nb , 0 , NULL ) ;
2013-07-30 17:05:28 -07:00
}
static int msm_restart_probe ( struct platform_device * pdev )
{
struct device * dev = & pdev - > dev ;
struct resource * mem ;
mem = platform_get_resource ( pdev , IORESOURCE_MEM , 0 ) ;
msm_ps_hold = devm_ioremap_resource ( dev , mem ) ;
if ( IS_ERR ( msm_ps_hold ) )
return PTR_ERR ( msm_ps_hold ) ;
2014-09-25 17:03:51 +05:30
register_restart_handler ( & restart_nb ) ;
2013-07-30 17:05:28 -07:00
pm_power_off = do_msm_poweroff ;
2014-09-25 17:03:51 +05:30
2013-07-30 17:05:28 -07:00
return 0 ;
}
static const struct of_device_id of_msm_restart_match [ ] = {
{ . compatible = " qcom,pshold " , } ,
{ } ,
} ;
MODULE_DEVICE_TABLE ( of , of_msm_restart_match ) ;
static struct platform_driver msm_restart_driver = {
. probe = msm_restart_probe ,
. driver = {
. name = " msm-restart " ,
. of_match_table = of_match_ptr ( of_msm_restart_match ) ,
} ,
} ;
static int __init msm_restart_init ( void )
{
return platform_driver_register ( & msm_restart_driver ) ;
}
device_initcall ( msm_restart_init ) ;