Commit | Line | Data |
---|---|---|
2abf13c9 MB |
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 | ||
eeebc3bb | 19 | #include <asm/cpuidle.h> |
2abf13c9 MB |
20 | |
21 | #include <mach/map.h> | |
22 | ||
f2bfd174 | 23 | #include "regs-sys.h" |
3a71c5c3 | 24 | #include "regs-syscon-power.h" |
f2bfd174 | 25 | |
2abf13c9 MB |
26 | static int s3c64xx_enter_idle(struct cpuidle_device *dev, |
27 | struct cpuidle_driver *drv, | |
28 | int index) | |
29 | { | |
2abf13c9 | 30 | unsigned long tmp; |
2abf13c9 MB |
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 | ||
2abf13c9 MB |
40 | return index; |
41 | } | |
42 | ||
2abf13c9 | 43 | static struct cpuidle_driver s3c64xx_cpuidle_driver = { |
4c8b2075 DL |
44 | .name = "s3c64xx_cpuidle", |
45 | .owner = THIS_MODULE, | |
46 | .states = { | |
47 | { | |
48 | .enter = s3c64xx_enter_idle, | |
49 | .exit_latency = 1, | |
50 | .target_residency = 1, | |
4c8b2075 DL |
51 | .name = "IDLE", |
52 | .desc = "System active, ARM gated", | |
53 | }, | |
54 | }, | |
55 | .state_count = 1, | |
2abf13c9 MB |
56 | }; |
57 | ||
58 | static int __init s3c64xx_init_cpuidle(void) | |
59 | { | |
9fe3d35a | 60 | return cpuidle_register(&s3c64xx_cpuidle_driver, NULL); |
2abf13c9 MB |
61 | } |
62 | device_initcall(s3c64xx_init_cpuidle); |