| // SPDX-License-Identifier: GPL-2.0 | 
 | // | 
 | // Copyright (c) 2011 Wolfson Microelectronics, plc | 
 | // Copyright (c) 2011 Samsung Electronics Co., Ltd. | 
 | //		http://www.samsung.com | 
 |  | 
 | #include <linux/kernel.h> | 
 | #include <linux/init.h> | 
 | #include <linux/cpuidle.h> | 
 | #include <linux/io.h> | 
 | #include <linux/export.h> | 
 | #include <linux/time.h> | 
 |  | 
 | #include <asm/cpuidle.h> | 
 |  | 
 | #include <plat/cpu.h> | 
 | #include <mach/map.h> | 
 |  | 
 | #include "regs-sys.h" | 
 | #include "regs-syscon-power.h" | 
 |  | 
 | 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 = { | 
 | 	.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, | 
 | }; | 
 |  | 
 | static int __init s3c64xx_init_cpuidle(void) | 
 | { | 
 | 	if (soc_is_s3c64xx()) | 
 | 		return cpuidle_register(&s3c64xx_cpuidle_driver, NULL); | 
 | 	return 0; | 
 | } | 
 | device_initcall(s3c64xx_init_cpuidle); |