2013-01-21 17:49:06 +08:00
/*
* Copyright ( c ) 2013 , NVIDIA Corporation . All rights reserved .
*
* 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/>.
*/
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/cpuidle.h>
2013-07-19 17:25:26 +08:00
# include <linux/cpu_pm.h>
# include <linux/clockchips.h>
2013-01-21 17:49:06 +08:00
# include <asm/cpuidle.h>
2013-07-19 17:25:26 +08:00
# include <asm/suspend.h>
# include <asm/smp_plat.h>
# include "pm.h"
# include "sleep.h"
# ifdef CONFIG_PM_SLEEP
# define TEGRA114_MAX_STATES 2
# else
# define TEGRA114_MAX_STATES 1
# endif
# ifdef CONFIG_PM_SLEEP
static int tegra114_idle_power_down ( struct cpuidle_device * dev ,
struct cpuidle_driver * drv ,
int index )
{
local_fiq_disable ( ) ;
tegra_set_cpu_in_lp2 ( ) ;
cpu_pm_enter ( ) ;
clockevents_notify ( CLOCK_EVT_NOTIFY_BROADCAST_ENTER , & dev - > cpu ) ;
cpu_suspend ( 0 , tegra30_sleep_cpu_secondary_finish ) ;
clockevents_notify ( CLOCK_EVT_NOTIFY_BROADCAST_EXIT , & dev - > cpu ) ;
cpu_pm_exit ( ) ;
tegra_clear_cpu_in_lp2 ( ) ;
local_fiq_enable ( ) ;
return index ;
}
# endif
2013-01-21 17:49:06 +08:00
static struct cpuidle_driver tegra_idle_driver = {
. name = " tegra_idle " ,
. owner = THIS_MODULE ,
2013-07-19 17:25:26 +08:00
. state_count = TEGRA114_MAX_STATES ,
2013-01-21 17:49:06 +08:00
. states = {
[ 0 ] = ARM_CPUIDLE_WFI_STATE_PWR ( 600 ) ,
2013-07-19 17:25:26 +08:00
# ifdef CONFIG_PM_SLEEP
[ 1 ] = {
. enter = tegra114_idle_power_down ,
. exit_latency = 500 ,
. target_residency = 1000 ,
. power_usage = 0 ,
. flags = CPUIDLE_FLAG_TIME_VALID ,
. name = " powered-down " ,
. desc = " CPU power gated " ,
} ,
# endif
2013-01-21 17:49:06 +08:00
} ,
} ;
int __init tegra114_cpuidle_init ( void )
{
2013-04-23 08:54:37 +00:00
return cpuidle_register ( & tegra_idle_driver , NULL ) ;
2013-01-21 17:49:06 +08:00
}