2011-05-15 12:44:17 -05:00
/*
* Copyright 2011 Calxeda , Inc .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms and conditions of the GNU General Public License ,
* version 2 , as published by the Free Software Foundation .
*
* This program is distributed in the hope it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License for
* more details .
*
* You should have received a copy of the GNU General Public License along with
* this program . If not , see < http : //www.gnu.org/licenses/>.
*/
2012-12-30 10:15:07 -06:00
# include <linux/cpu_pm.h>
2011-05-15 12:44:17 -05:00
# include <linux/init.h>
2015-07-31 15:46:19 +01:00
# include <linux/psci.h>
2011-05-15 12:44:17 -05:00
# include <linux/suspend.h>
# include <asm/suspend.h>
2015-07-31 15:46:19 +01:00
# include <uapi/linux/psci.h>
# define HIGHBANK_SUSPEND_PARAM \
( ( 0 < < PSCI_0_2_POWER_STATE_ID_SHIFT ) | \
( 1 < < PSCI_0_2_POWER_STATE_AFFL_SHIFT ) | \
( PSCI_POWER_STATE_TYPE_POWER_DOWN < < PSCI_0_2_POWER_STATE_TYPE_SHIFT ) )
2011-05-15 12:44:17 -05:00
static int highbank_suspend_finish ( unsigned long val )
{
2015-07-31 15:46:19 +01:00
return psci_ops . cpu_suspend ( HIGHBANK_SUSPEND_PARAM , __pa ( cpu_resume ) ) ;
2011-05-15 12:44:17 -05:00
}
static int highbank_pm_enter ( suspend_state_t state )
{
2012-12-30 10:15:07 -06:00
cpu_pm_enter ( ) ;
cpu_cluster_pm_enter ( ) ;
2011-05-15 12:44:17 -05:00
cpu_suspend ( 0 , highbank_suspend_finish ) ;
2012-12-30 10:15:07 -06:00
cpu_cluster_pm_exit ( ) ;
cpu_pm_exit ( ) ;
2011-05-15 12:44:17 -05:00
return 0 ;
}
static const struct platform_suspend_ops highbank_pm_ops = {
. enter = highbank_pm_enter ,
. valid = suspend_valid_only_mem ,
} ;
2012-09-17 09:55:12 -05:00
void __init highbank_pm_init ( void )
2011-05-15 12:44:17 -05:00
{
2013-09-26 20:02:51 -05:00
if ( ! psci_ops . cpu_suspend )
return ;
2011-05-15 12:44:17 -05:00
suspend_set_ops ( & highbank_pm_ops ) ;
}