2009-11-01 20:40:50 +03:00
/*
* based on arch / arm / mach - kirkwood / cpuidle . c
*
* CPU idle support for AT91 SoC
*
* 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 .
*
* The cpu idle uses wait - for - interrupt and RAM self refresh in order
* to implement two idle states -
* # 1 wait - for - interrupt
* # 2 wait - for - interrupt and RAM self refresh
*/
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/platform_device.h>
# include <linux/cpuidle.h>
# include <linux/io.h>
2011-08-01 00:17:29 +04:00
# include <linux/export.h>
2012-03-21 00:22:43 +04:00
# include <asm/proc-fns.h>
# include <asm/cpuidle.h>
2009-11-01 20:40:50 +03:00
# define AT91_MAX_STATES 2
2013-09-23 00:29:57 +04:00
static void ( * at91_standby ) ( void ) ;
2009-11-01 20:40:50 +03:00
/* Actual code that puts the SoC in different idle states */
static int at91_enter_idle ( struct cpuidle_device * dev ,
2011-10-28 14:50:42 +04:00
struct cpuidle_driver * drv ,
2011-10-28 14:50:09 +04:00
int index )
2009-11-01 20:40:50 +03:00
{
2013-09-23 00:29:57 +04:00
at91_standby ( ) ;
2011-10-28 14:50:09 +04:00
return index ;
2009-11-01 20:40:50 +03:00
}
2012-03-21 00:22:43 +04:00
static struct cpuidle_driver at91_idle_driver = {
. name = " at91_idle " ,
. owner = THIS_MODULE ,
. states [ 0 ] = ARM_CPUIDLE_WFI_STATE ,
. states [ 1 ] = {
. enter = at91_enter_idle ,
. exit_latency = 10 ,
2013-06-21 16:36:59 +04:00
. target_residency = 10000 ,
2012-03-21 00:22:43 +04:00
. name = " RAM_SR " ,
. desc = " WFI and DDR Self Refresh " ,
} ,
. state_count = AT91_MAX_STATES ,
} ;
2009-11-01 20:40:50 +03:00
/* Initialize CPU idle by registering the idle states */
2013-09-23 00:29:57 +04:00
static int at91_cpuidle_probe ( struct platform_device * dev )
2009-11-01 20:40:50 +03:00
{
2013-09-23 00:29:57 +04:00
at91_standby = ( void * ) ( dev - > dev . platform_data ) ;
2013-04-23 12:54:35 +04:00
return cpuidle_register ( & at91_idle_driver , NULL ) ;
2009-11-01 20:40:50 +03:00
}
2013-09-23 00:29:57 +04:00
static struct platform_driver at91_cpuidle_driver = {
. driver = {
. name = " cpuidle-at91 " ,
} ,
. probe = at91_cpuidle_probe ,
} ;
module_platform_driver ( at91_cpuidle_driver ) ;