diff options
Diffstat (limited to 'drivers/cpuidle/cpuidle-at91.c')
-rw-r--r-- | drivers/cpuidle/cpuidle-at91.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/drivers/cpuidle/cpuidle-at91.c b/drivers/cpuidle/cpuidle-at91.c new file mode 100644 index 000000000000..a0774370c6bc --- /dev/null +++ b/drivers/cpuidle/cpuidle-at91.c | |||
@@ -0,0 +1,69 @@ | |||
1 | /* | ||
2 | * based on arch/arm/mach-kirkwood/cpuidle.c | ||
3 | * | ||
4 | * CPU idle support for AT91 SoC | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public | ||
7 | * License version 2. This program is licensed "as is" without any | ||
8 | * warranty of any kind, whether express or implied. | ||
9 | * | ||
10 | * The cpu idle uses wait-for-interrupt and RAM self refresh in order | ||
11 | * to implement two idle states - | ||
12 | * #1 wait-for-interrupt | ||
13 | * #2 wait-for-interrupt and RAM self refresh | ||
14 | */ | ||
15 | |||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/platform_device.h> | ||
19 | #include <linux/cpuidle.h> | ||
20 | #include <linux/io.h> | ||
21 | #include <linux/export.h> | ||
22 | #include <asm/proc-fns.h> | ||
23 | #include <asm/cpuidle.h> | ||
24 | |||
25 | #define AT91_MAX_STATES 2 | ||
26 | |||
27 | static void (*at91_standby)(void); | ||
28 | |||
29 | /* Actual code that puts the SoC in different idle states */ | ||
30 | static int at91_enter_idle(struct cpuidle_device *dev, | ||
31 | struct cpuidle_driver *drv, | ||
32 | int index) | ||
33 | { | ||
34 | at91_standby(); | ||
35 | return index; | ||
36 | } | ||
37 | |||
38 | static struct cpuidle_driver at91_idle_driver = { | ||
39 | .name = "at91_idle", | ||
40 | .owner = THIS_MODULE, | ||
41 | .states[0] = ARM_CPUIDLE_WFI_STATE, | ||
42 | .states[1] = { | ||
43 | .enter = at91_enter_idle, | ||
44 | .exit_latency = 10, | ||
45 | .target_residency = 10000, | ||
46 | .flags = CPUIDLE_FLAG_TIME_VALID, | ||
47 | .name = "RAM_SR", | ||
48 | .desc = "WFI and DDR Self Refresh", | ||
49 | }, | ||
50 | .state_count = AT91_MAX_STATES, | ||
51 | }; | ||
52 | |||
53 | /* Initialize CPU idle by registering the idle states */ | ||
54 | static int at91_cpuidle_probe(struct platform_device *dev) | ||
55 | { | ||
56 | at91_standby = (void *)(dev->dev.platform_data); | ||
57 | |||
58 | return cpuidle_register(&at91_idle_driver, NULL); | ||
59 | } | ||
60 | |||
61 | static struct platform_driver at91_cpuidle_driver = { | ||
62 | .driver = { | ||
63 | .name = "cpuidle-at91", | ||
64 | .owner = THIS_MODULE, | ||
65 | }, | ||
66 | .probe = at91_cpuidle_probe, | ||
67 | }; | ||
68 | |||
69 | module_platform_driver(at91_cpuidle_driver); | ||