1/* linux/arch/arm/mach-s3c64xx/cpuidle.c 2 * 3 * Copyright (c) 2011 Wolfson Microelectronics, plc 4 * Copyright (c) 2011 Samsung Electronics Co., Ltd. 5 * http://www.samsung.com 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as 9 * published by the Free Software Foundation. 10*/ 11 12#include <linux/kernel.h> 13#include <linux/init.h> 14#include <linux/cpuidle.h> 15#include <linux/io.h> 16#include <linux/export.h> 17#include <linux/time.h> 18 19#include <asm/cpuidle.h> 20 21#include <mach/map.h> 22 23#include "regs-sys.h" 24#include "regs-syscon-power.h" 25 26static int s3c64xx_enter_idle(struct cpuidle_device *dev, 27 struct cpuidle_driver *drv, 28 int index) 29{ 30 unsigned long tmp; 31 32 /* Setup PWRCFG to enter idle mode */ 33 tmp = __raw_readl(S3C64XX_PWR_CFG); 34 tmp &= ~S3C64XX_PWRCFG_CFG_WFI_MASK; 35 tmp |= S3C64XX_PWRCFG_CFG_WFI_IDLE; 36 __raw_writel(tmp, S3C64XX_PWR_CFG); 37 38 cpu_do_idle(); 39 40 return index; 41} 42 43static struct cpuidle_driver s3c64xx_cpuidle_driver = { 44 .name = "s3c64xx_cpuidle", 45 .owner = THIS_MODULE, 46 .states = { 47 { 48 .enter = s3c64xx_enter_idle, 49 .exit_latency = 1, 50 .target_residency = 1, 51 .name = "IDLE", 52 .desc = "System active, ARM gated", 53 }, 54 }, 55 .state_count = 1, 56}; 57 58static int __init s3c64xx_init_cpuidle(void) 59{ 60 return cpuidle_register(&s3c64xx_cpuidle_driver, NULL); 61} 62device_initcall(s3c64xx_init_cpuidle); 63