2019-05-28 20:10:04 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2012-10-12 21:45:34 +04:00
/*
* Copyright 2012 Calxeda , Inc .
*
2013-04-26 15:05:44 +04:00
* Based on arch / arm / plat - mxc / cpuidle . c : # v3 .7
2012-10-12 21:45:34 +04:00
* Copyright 2012 Freescale Semiconductor , Inc .
* Copyright 2012 Linaro Ltd .
*
2013-04-26 15:05:44 +04:00
* Maintainer : Rob Herring < rob . herring @ calxeda . com >
2012-10-12 21:45:34 +04:00
*/
# include <linux/cpuidle.h>
2013-02-27 02:16:53 +04:00
# include <linux/cpu_pm.h>
2012-10-12 21:45:34 +04:00
# include <linux/init.h>
2013-02-27 02:05:46 +04:00
# include <linux/mm.h>
2013-09-27 14:47:45 +04:00
# include <linux/platform_device.h>
2015-07-31 17:46:19 +03:00
# include <linux/psci.h>
2012-10-12 21:45:34 +04:00
# include <asm/cpuidle.h>
# include <asm/suspend.h>
2015-07-31 17:46:19 +03:00
# include <uapi/linux/psci.h>
# define CALXEDA_IDLE_PARAM \
( ( 0 < < PSCI_0_2_POWER_STATE_ID_SHIFT ) | \
( 0 < < PSCI_0_2_POWER_STATE_AFFL_SHIFT ) | \
( PSCI_POWER_STATE_TYPE_POWER_DOWN < < PSCI_0_2_POWER_STATE_TYPE_SHIFT ) )
2012-10-12 21:45:34 +04:00
static int calxeda_idle_finish ( unsigned long val )
{
2015-07-31 17:46:19 +03:00
return psci_ops . cpu_suspend ( CALXEDA_IDLE_PARAM , __pa ( cpu_resume ) ) ;
2012-10-12 21:45:34 +04:00
}
static int calxeda_pwrdown_idle ( struct cpuidle_device * dev ,
struct cpuidle_driver * drv ,
int index )
{
2013-02-27 02:16:53 +04:00
cpu_pm_enter ( ) ;
2012-10-12 21:45:34 +04:00
cpu_suspend ( 0 , calxeda_idle_finish ) ;
2013-02-27 02:16:53 +04:00
cpu_pm_exit ( ) ;
2012-10-12 21:45:34 +04:00
return index ;
}
static struct cpuidle_driver calxeda_idle_driver = {
. name = " calxeda_idle " ,
. states = {
ARM_CPUIDLE_WFI_STATE ,
{
. name = " PG " ,
. desc = " Power Gate " ,
. exit_latency = 30 ,
. power_usage = 50 ,
. target_residency = 200 ,
. enter = calxeda_pwrdown_idle ,
} ,
} ,
. state_count = 2 ,
} ;
2013-12-14 00:49:19 +04:00
static int calxeda_cpuidle_probe ( struct platform_device * pdev )
2012-10-12 21:45:34 +04:00
{
2013-04-23 12:54:42 +04:00
return cpuidle_register ( & calxeda_idle_driver , NULL ) ;
2012-10-12 21:45:34 +04:00
}
2013-09-27 14:47:45 +04:00
static struct platform_driver calxeda_cpuidle_plat_driver = {
. driver = {
. name = " cpuidle-calxeda " ,
} ,
. probe = calxeda_cpuidle_probe ,
} ;
2015-05-02 03:10:57 +03:00
builtin_platform_driver ( calxeda_cpuidle_plat_driver ) ;