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 .
*
* 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/>.
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 ) ;