diff options
Diffstat (limited to 'arch/arm/mach-shmobile/cpuidle.c')
-rw-r--r-- | arch/arm/mach-shmobile/cpuidle.c | 39 |
1 files changed, 13 insertions, 26 deletions
diff --git a/arch/arm/mach-shmobile/cpuidle.c b/arch/arm/mach-shmobile/cpuidle.c index 7b541e911ab4..9e050268cde4 100644 --- a/arch/arm/mach-shmobile/cpuidle.c +++ b/arch/arm/mach-shmobile/cpuidle.c | |||
@@ -16,51 +16,38 @@ | |||
16 | #include <asm/cpuidle.h> | 16 | #include <asm/cpuidle.h> |
17 | #include <asm/io.h> | 17 | #include <asm/io.h> |
18 | 18 | ||
19 | static void shmobile_enter_wfi(void) | 19 | int shmobile_enter_wfi(struct cpuidle_device *dev, struct cpuidle_driver *drv, |
20 | int index) | ||
20 | { | 21 | { |
21 | cpu_do_idle(); | 22 | cpu_do_idle(); |
22 | } | 23 | return 0; |
23 | |||
24 | void (*shmobile_cpuidle_modes[CPUIDLE_STATE_MAX])(void) = { | ||
25 | shmobile_enter_wfi, /* regular sleep mode */ | ||
26 | }; | ||
27 | |||
28 | static int shmobile_cpuidle_enter(struct cpuidle_device *dev, | ||
29 | struct cpuidle_driver *drv, | ||
30 | int index) | ||
31 | { | ||
32 | shmobile_cpuidle_modes[index](); | ||
33 | |||
34 | return index; | ||
35 | } | 24 | } |
36 | 25 | ||
37 | static struct cpuidle_device shmobile_cpuidle_dev; | 26 | static struct cpuidle_device shmobile_cpuidle_dev; |
38 | static struct cpuidle_driver shmobile_cpuidle_driver = { | 27 | static struct cpuidle_driver shmobile_cpuidle_default_driver = { |
39 | .name = "shmobile_cpuidle", | 28 | .name = "shmobile_cpuidle", |
40 | .owner = THIS_MODULE, | 29 | .owner = THIS_MODULE, |
41 | .en_core_tk_irqen = 1, | 30 | .en_core_tk_irqen = 1, |
42 | .states[0] = ARM_CPUIDLE_WFI_STATE, | 31 | .states[0] = ARM_CPUIDLE_WFI_STATE, |
32 | .states[0].enter = shmobile_enter_wfi, | ||
43 | .safe_state_index = 0, /* C1 */ | 33 | .safe_state_index = 0, /* C1 */ |
44 | .state_count = 1, | 34 | .state_count = 1, |
45 | }; | 35 | }; |
46 | 36 | ||
47 | void (*shmobile_cpuidle_setup)(struct cpuidle_driver *drv); | 37 | static struct cpuidle_driver *cpuidle_drv = &shmobile_cpuidle_default_driver; |
38 | |||
39 | void shmobile_cpuidle_set_driver(struct cpuidle_driver *drv) | ||
40 | { | ||
41 | cpuidle_drv = drv; | ||
42 | } | ||
48 | 43 | ||
49 | int shmobile_cpuidle_init(void) | 44 | int shmobile_cpuidle_init(void) |
50 | { | 45 | { |
51 | struct cpuidle_device *dev = &shmobile_cpuidle_dev; | 46 | struct cpuidle_device *dev = &shmobile_cpuidle_dev; |
52 | struct cpuidle_driver *drv = &shmobile_cpuidle_driver; | ||
53 | int i; | ||
54 | |||
55 | for (i = 0; i < CPUIDLE_STATE_MAX; i++) | ||
56 | drv->states[i].enter = shmobile_cpuidle_enter; | ||
57 | |||
58 | if (shmobile_cpuidle_setup) | ||
59 | shmobile_cpuidle_setup(drv); | ||
60 | 47 | ||
61 | cpuidle_register_driver(drv); | 48 | cpuidle_register_driver(cpuidle_drv); |
62 | 49 | ||
63 | dev->state_count = drv->state_count; | 50 | dev->state_count = cpuidle_drv->state_count; |
64 | cpuidle_register_device(dev); | 51 | cpuidle_register_device(dev); |
65 | 52 | ||
66 | return 0; | 53 | return 0; |