1
2
3
4
5
6
7
8
9
10
11
12
13
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/cpuidle.h>
23
24#define AT91_MAX_STATES 2
25
26static void (*at91_standby)(void);
27
28
29static int at91_enter_idle(struct cpuidle_device *dev,
30 struct cpuidle_driver *drv,
31 int index)
32{
33 at91_standby();
34 return index;
35}
36
37static struct cpuidle_driver at91_idle_driver = {
38 .name = "at91_idle",
39 .owner = THIS_MODULE,
40 .states[0] = ARM_CPUIDLE_WFI_STATE,
41 .states[1] = {
42 .enter = at91_enter_idle,
43 .exit_latency = 10,
44 .target_residency = 10000,
45 .name = "RAM_SR",
46 .desc = "WFI and DDR Self Refresh",
47 },
48 .state_count = AT91_MAX_STATES,
49};
50
51
52static int at91_cpuidle_probe(struct platform_device *dev)
53{
54 at91_standby = (void *)(dev->dev.platform_data);
55
56 return cpuidle_register(&at91_idle_driver, NULL);
57}
58
59static struct platform_driver at91_cpuidle_driver = {
60 .driver = {
61 .name = "cpuidle-at91",
62 },
63 .probe = at91_cpuidle_probe,
64};
65builtin_platform_driver(at91_cpuidle_driver);
66