2011-04-29 02:36:07 +09:00
/*
* CPUIdle support code for SH - Mobile ARM
*
* Copyright ( C ) 2011 Magnus Damm
*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*/
# include <linux/pm.h>
# include <linux/cpuidle.h>
# include <linux/suspend.h>
# include <linux/module.h>
# include <linux/err.h>
2012-03-20 15:22:48 -05:00
# include <asm/cpuidle.h>
2011-04-29 02:36:07 +09:00
# include <asm/io.h>
static void shmobile_enter_wfi ( void )
{
cpu_do_idle ( ) ;
}
void ( * shmobile_cpuidle_modes [ CPUIDLE_STATE_MAX ] ) ( void ) = {
shmobile_enter_wfi , /* regular sleep mode */
} ;
static int shmobile_cpuidle_enter ( struct cpuidle_device * dev ,
2011-11-11 14:01:30 +09:00
struct cpuidle_driver * drv ,
int index )
2011-04-29 02:36:07 +09:00
{
2011-11-11 14:01:30 +09:00
shmobile_cpuidle_modes [ index ] ( ) ;
2011-04-29 02:36:07 +09:00
2011-11-11 14:01:30 +09:00
return index ;
2011-04-29 02:36:07 +09:00
}
static struct cpuidle_device shmobile_cpuidle_dev ;
static struct cpuidle_driver shmobile_cpuidle_driver = {
2012-03-20 15:22:48 -05:00
. name = " shmobile_cpuidle " ,
. owner = THIS_MODULE ,
. en_core_tk_irqen = 1 ,
. states [ 0 ] = ARM_CPUIDLE_WFI_STATE ,
. safe_state_index = 0 , /* C1 */
. state_count = 1 ,
2011-04-29 02:36:07 +09:00
} ;
2011-11-11 14:01:30 +09:00
void ( * shmobile_cpuidle_setup ) ( struct cpuidle_driver * drv ) ;
2011-04-29 02:36:07 +09:00
static int shmobile_cpuidle_init ( void )
{
struct cpuidle_device * dev = & shmobile_cpuidle_dev ;
2011-11-11 14:01:30 +09:00
struct cpuidle_driver * drv = & shmobile_cpuidle_driver ;
2011-04-29 02:36:07 +09:00
int i ;
2011-11-11 14:01:30 +09:00
for ( i = 0 ; i < CPUIDLE_STATE_MAX ; i + + )
drv - > states [ i ] . enter = shmobile_cpuidle_enter ;
2011-04-29 02:36:07 +09:00
if ( shmobile_cpuidle_setup )
2011-11-11 14:01:30 +09:00
shmobile_cpuidle_setup ( drv ) ;
cpuidle_register_driver ( drv ) ;
2011-04-29 02:36:07 +09:00
2011-11-11 14:01:30 +09:00
dev - > state_count = drv - > state_count ;
2011-04-29 02:36:07 +09:00
cpuidle_register_device ( dev ) ;
return 0 ;
}
late_initcall ( shmobile_cpuidle_init ) ;