2014-04-14 19:10:13 +04:00
/*
* Marvell Armada 370 and Armada XP SoC cpuidle driver
*
* Copyright ( C ) 2014 Marvell
*
* Nadav Haklai < nadavh @ marvell . com >
* Gregory CLEMENT < gregory . clement @ free - electrons . com >
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed " as is " without any
* warranty of any kind , whether express or implied .
*
* Maintainer : Gregory CLEMENT < gregory . clement @ free - electrons . com >
*/
# include <linux/cpu_pm.h>
# include <linux/cpuidle.h>
# include <linux/module.h>
# include <linux/of.h>
# include <linux/suspend.h>
# include <linux/platform_device.h>
# include <asm/cpuidle.h>
2014-07-23 17:00:48 +04:00
# define MVEBU_V7_FLAG_DEEP_IDLE 0x10000
2014-04-14 19:10:13 +04:00
2014-07-23 17:00:48 +04:00
static int ( * mvebu_v7_cpu_suspend ) ( int ) ;
2014-04-14 19:10:13 +04:00
2014-07-23 17:00:48 +04:00
static int mvebu_v7_enter_idle ( struct cpuidle_device * dev ,
2014-04-14 19:10:13 +04:00
struct cpuidle_driver * drv ,
int index )
{
int ret ;
bool deepidle = false ;
cpu_pm_enter ( ) ;
2014-07-23 17:00:48 +04:00
if ( drv - > states [ index ] . flags & MVEBU_V7_FLAG_DEEP_IDLE )
2014-04-14 19:10:13 +04:00
deepidle = true ;
2014-07-23 17:00:48 +04:00
ret = mvebu_v7_cpu_suspend ( deepidle ) ;
2014-04-14 19:10:13 +04:00
if ( ret )
return ret ;
cpu_pm_exit ( ) ;
return index ;
}
2014-07-23 17:00:48 +04:00
static struct cpuidle_driver armadaxp_idle_driver = {
. name = " armada_xp_idle " ,
2014-04-14 19:10:13 +04:00
. states [ 0 ] = ARM_CPUIDLE_WFI_STATE ,
. states [ 1 ] = {
2014-07-23 17:00:48 +04:00
. enter = mvebu_v7_enter_idle ,
2014-04-14 19:10:13 +04:00
. exit_latency = 10 ,
. power_usage = 50 ,
. target_residency = 100 ,
. flags = CPUIDLE_FLAG_TIME_VALID ,
. name = " MV CPU IDLE " ,
. desc = " CPU power down " ,
} ,
. states [ 2 ] = {
2014-07-23 17:00:48 +04:00
. enter = mvebu_v7_enter_idle ,
2014-04-14 19:10:13 +04:00
. exit_latency = 100 ,
. power_usage = 5 ,
. target_residency = 1000 ,
. flags = CPUIDLE_FLAG_TIME_VALID |
2014-07-23 17:00:48 +04:00
MVEBU_V7_FLAG_DEEP_IDLE ,
2014-04-14 19:10:13 +04:00
. name = " MV CPU DEEP IDLE " ,
. desc = " CPU and L2 Fabric power down " ,
} ,
2014-07-23 17:00:48 +04:00
. state_count = 3 ,
2014-04-14 19:10:13 +04:00
} ;
2014-07-23 17:00:49 +04:00
static struct cpuidle_driver armada370_idle_driver = {
. name = " armada_370_idle " ,
. states [ 0 ] = ARM_CPUIDLE_WFI_STATE ,
. states [ 1 ] = {
. enter = mvebu_v7_enter_idle ,
. exit_latency = 100 ,
. power_usage = 5 ,
. target_residency = 1000 ,
. flags = ( CPUIDLE_FLAG_TIME_VALID |
MVEBU_V7_FLAG_DEEP_IDLE ) ,
. name = " Deep Idle " ,
. desc = " CPU and L2 Fabric power down " ,
} ,
. state_count = 2 ,
} ;
2014-07-23 17:00:48 +04:00
static int mvebu_v7_cpuidle_probe ( struct platform_device * pdev )
2014-04-14 19:10:13 +04:00
{
2014-07-23 17:00:48 +04:00
mvebu_v7_cpu_suspend = pdev - > dev . platform_data ;
2014-07-23 17:00:49 +04:00
if ( ! strcmp ( pdev - > dev . driver - > name , " cpuidle-armada-xp " ) )
return cpuidle_register ( & armadaxp_idle_driver , NULL ) ;
else if ( ! strcmp ( pdev - > dev . driver - > name , " cpuidle-armada-370 " ) )
return cpuidle_register ( & armada370_idle_driver , NULL ) ;
else
return - EINVAL ;
2014-04-14 19:10:13 +04:00
}
2014-07-23 17:00:48 +04:00
static struct platform_driver armadaxp_cpuidle_plat_driver = {
2014-04-14 19:10:13 +04:00
. driver = {
2014-07-23 17:00:48 +04:00
. name = " cpuidle-armada-xp " ,
2014-04-14 19:10:13 +04:00
. owner = THIS_MODULE ,
} ,
2014-07-23 17:00:48 +04:00
. probe = mvebu_v7_cpuidle_probe ,
2014-04-14 19:10:13 +04:00
} ;
2014-07-23 17:00:48 +04:00
module_platform_driver ( armadaxp_cpuidle_plat_driver ) ;
2014-04-14 19:10:13 +04:00
2014-07-23 17:00:49 +04:00
static struct platform_driver armada370_cpuidle_plat_driver = {
. driver = {
. name = " cpuidle-armada-370 " ,
. owner = THIS_MODULE ,
} ,
. probe = mvebu_v7_cpuidle_probe ,
} ;
module_platform_driver ( armada370_cpuidle_plat_driver ) ;
2014-04-14 19:10:13 +04:00
MODULE_AUTHOR ( " Gregory CLEMENT <gregory.clement@free-electrons.com> " ) ;
2014-07-23 17:00:48 +04:00
MODULE_DESCRIPTION ( " Marvell EBU v7 cpuidle driver " ) ;
2014-04-14 19:10:13 +04:00
MODULE_LICENSE ( " GPL " ) ;