diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2013-10-16 18:13:39 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2013-10-16 18:13:39 -0400 |
commit | 80b1ce57803e52cf061a3a18e6f7f121491722b2 (patch) | |
tree | 7964fdc2c15a82e39089276434d56c60926c2365 /drivers | |
parent | ac9f1cc2ce1a178696763444f2a2f8a0ec661772 (diff) | |
parent | 6b625891c6b541080bdaad97bcb82bd9ecd9e44b (diff) |
Merge branch 'cpuidle/arm-next' of git://git.linaro.org/people/dlezcano/linux into pm-cpuidle
Pull cpuidle updates for v3.13 from Daniel Lezcano:
- Daniel Lezcano converted cpuidle to a platform_driver for at91.
The standby callback is stored in the platform_device's data
field as a callback for the driver, so the pm specific code and
the backend driver have no more dependency. Each SoC init function
fills the right callback at init time. As there are no more
dependency, we can move the driver in the drivers/cpuidle directory.
- Jean-Christophe Plagnol-Villard and Nicolas Ferre made a cleanup on
top of the patch described above and fixed up the ddr standby callback
so more SoC are supported. Even if the modifications are in the
mach-at91 directory, they asked these patches to be included through
the PM tree as they depend on the platform_driver conversion.
* 'cpuidle/arm-next' of git://git.linaro.org/people/dlezcano/linux:
ARM: AT91: DT: pm: Select ram controller standby based on DT
ARM: AT91: pm: Factorize standby function
ARM: at91: cpuidle: Move driver to drivers/cpuidle
ARM: at91: cpuidle: Convert to platform driver
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/cpuidle/Kconfig.arm | 7 | ||||
-rw-r--r-- | drivers/cpuidle/Makefile | 1 | ||||
-rw-r--r-- | drivers/cpuidle/cpuidle-at91.c | 69 |
3 files changed, 77 insertions, 0 deletions
diff --git a/drivers/cpuidle/Kconfig.arm b/drivers/cpuidle/Kconfig.arm index 6a7e6f2d8adc..f23bd75426cd 100644 --- a/drivers/cpuidle/Kconfig.arm +++ b/drivers/cpuidle/Kconfig.arm | |||
@@ -37,3 +37,10 @@ config ARM_U8500_CPUIDLE | |||
37 | depends on ARCH_U8500 | 37 | depends on ARCH_U8500 |
38 | help | 38 | help |
39 | Select this to enable cpuidle for ST-E u8500 processors | 39 | Select this to enable cpuidle for ST-E u8500 processors |
40 | |||
41 | config ARM_AT91_CPUIDLE | ||
42 | bool "Cpu Idle Driver for the AT91 processors" | ||
43 | default y | ||
44 | depends on ARCH_AT91 | ||
45 | help | ||
46 | Select this to enable cpuidle for AT91 processors | ||
diff --git a/drivers/cpuidle/Makefile b/drivers/cpuidle/Makefile index d08bd4055a49..527be28e5c1e 100644 --- a/drivers/cpuidle/Makefile +++ b/drivers/cpuidle/Makefile | |||
@@ -12,3 +12,4 @@ obj-$(CONFIG_ARM_HIGHBANK_CPUIDLE) += cpuidle-calxeda.o | |||
12 | obj-$(CONFIG_ARM_KIRKWOOD_CPUIDLE) += cpuidle-kirkwood.o | 12 | obj-$(CONFIG_ARM_KIRKWOOD_CPUIDLE) += cpuidle-kirkwood.o |
13 | obj-$(CONFIG_ARM_ZYNQ_CPUIDLE) += cpuidle-zynq.o | 13 | obj-$(CONFIG_ARM_ZYNQ_CPUIDLE) += cpuidle-zynq.o |
14 | obj-$(CONFIG_ARM_U8500_CPUIDLE) += cpuidle-ux500.o | 14 | obj-$(CONFIG_ARM_U8500_CPUIDLE) += cpuidle-ux500.o |
15 | obj-$(CONFIG_ARM_AT91_CPUIDLE) += cpuidle-at91.o | ||
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); | ||