2017-12-25 20:54:33 +01:00
// SPDX-License-Identifier: GPL-2.0
//
// Copyright (c) 2011 Wolfson Microelectronics, plc
// Copyright (c) 2011 Samsung Electronics Co., Ltd.
// http://www.samsung.com
2011-12-24 11:38:27 +09:00
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/cpuidle.h>
# include <linux/io.h>
# include <linux/export.h>
# include <linux/time.h>
2015-02-02 16:32:46 +01:00
# include <asm/cpuidle.h>
2011-12-24 11:38:27 +09:00
2019-09-02 18:37:30 +02:00
# include "cpu.h"
# include "map.h"
2011-12-24 11:38:27 +09:00
2019-09-02 17:47:55 +02:00
# include "regs-sys-s3c64xx.h"
# include "regs-syscon-power-s3c64xx.h"
2013-01-02 13:31:15 -08:00
2011-12-24 11:38:27 +09:00
static int s3c64xx_enter_idle ( struct cpuidle_device * dev ,
struct cpuidle_driver * drv ,
int index )
{
unsigned long tmp ;
/* Setup PWRCFG to enter idle mode */
tmp = __raw_readl ( S3C64XX_PWR_CFG ) ;
tmp & = ~ S3C64XX_PWRCFG_CFG_WFI_MASK ;
tmp | = S3C64XX_PWRCFG_CFG_WFI_IDLE ;
__raw_writel ( tmp , S3C64XX_PWR_CFG ) ;
cpu_do_idle ( ) ;
return index ;
}
static struct cpuidle_driver s3c64xx_cpuidle_driver = {
2012-05-18 07:19:42 +09:00
. name = " s3c64xx_cpuidle " ,
. owner = THIS_MODULE ,
. states = {
{
. enter = s3c64xx_enter_idle ,
. exit_latency = 1 ,
. target_residency = 1 ,
. name = " IDLE " ,
. desc = " System active, ARM gated " ,
} ,
} ,
. state_count = 1 ,
2011-12-24 11:38:27 +09:00
} ;
static int __init s3c64xx_init_cpuidle ( void )
{
2015-02-27 20:31:51 +01:00
if ( soc_is_s3c64xx ( ) )
return cpuidle_register ( & s3c64xx_cpuidle_driver , NULL ) ;
return 0 ;
2011-12-24 11:38:27 +09:00
}
device_initcall ( s3c64xx_init_cpuidle ) ;