aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-10-16 18:13:39 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-10-16 18:13:39 -0400
commit80b1ce57803e52cf061a3a18e6f7f121491722b2 (patch)
tree7964fdc2c15a82e39089276434d56c60926c2365 /drivers
parentac9f1cc2ce1a178696763444f2a2f8a0ec661772 (diff)
parent6b625891c6b541080bdaad97bcb82bd9ecd9e44b (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.arm7
-rw-r--r--drivers/cpuidle/Makefile1
-rw-r--r--drivers/cpuidle/cpuidle-at91.c69
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
41config 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
12obj-$(CONFIG_ARM_KIRKWOOD_CPUIDLE) += cpuidle-kirkwood.o 12obj-$(CONFIG_ARM_KIRKWOOD_CPUIDLE) += cpuidle-kirkwood.o
13obj-$(CONFIG_ARM_ZYNQ_CPUIDLE) += cpuidle-zynq.o 13obj-$(CONFIG_ARM_ZYNQ_CPUIDLE) += cpuidle-zynq.o
14obj-$(CONFIG_ARM_U8500_CPUIDLE) += cpuidle-ux500.o 14obj-$(CONFIG_ARM_U8500_CPUIDLE) += cpuidle-ux500.o
15obj-$(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
27static void (*at91_standby)(void);
28
29/* Actual code that puts the SoC in different idle states */
30static 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
38static 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 */
54static 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
61static struct platform_driver at91_cpuidle_driver = {
62 .driver = {
63 .name = "cpuidle-at91",
64 .owner = THIS_MODULE,
65 },
66 .probe = at91_cpuidle_probe,
67};
68
69module_platform_driver(at91_cpuidle_driver);