| 
									
										
										
										
											2011-12-24 11:38:27 +09:00
										 |  |  | /* linux/arch/arm/mach-s3c64xx/cpuidle.c
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (c) 2011 Wolfson Microelectronics, plc | 
					
						
							|  |  |  |  * Copyright (c) 2011 Samsung Electronics Co., Ltd. | 
					
						
							|  |  |  |  *		http://www.samsung.com
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU General Public License version 2 as | 
					
						
							|  |  |  |  * published by the Free Software Foundation. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #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/proc-fns.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <mach/map.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-02 13:31:15 -08:00
										 |  |  | #include "regs-sys.h"
 | 
					
						
							| 
									
										
										
										
											2013-01-09 16:45:51 -08:00
										 |  |  | #include "regs-syscon-power.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, | 
					
						
							|  |  |  | 			.flags            = CPUIDLE_FLAG_TIME_VALID, | 
					
						
							|  |  |  | 			.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) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-04-23 14:41:16 +00:00
										 |  |  | 	return cpuidle_register(&s3c64xx_cpuidle_driver, NULL); | 
					
						
							| 
									
										
										
										
											2011-12-24 11:38:27 +09:00
										 |  |  | } | 
					
						
							|  |  |  | device_initcall(s3c64xx_init_cpuidle); |