ARM: ux500: cpuidle: Move ux500 cpuidle driver to drivers/cpuidle
authorDaniel Lezcano <daniel.lezcano@linaro.org>
Wed, 10 Jul 2013 14:02:04 +0000 (16:02 +0200)
committerDaniel Lezcano <daniel.lezcano@linaro.org>
Sat, 27 Jul 2013 05:56:39 +0000 (07:56 +0200)
There is no more dependency with arch/arm headers, so we can safely move the
driver to the drivers/cpuidle directory.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
arch/arm/mach-ux500/Makefile
arch/arm/mach-ux500/cpuidle.c [deleted file]
drivers/cpuidle/Kconfig.arm
drivers/cpuidle/Makefile
drivers/cpuidle/cpuidle-ux500.c [new file with mode: 0644]

index bf9b6be5b18091bc3b94464f74502939b596ee40..fe1f3e26b88b114b2c47ecb082b358a6a220bea7 100644 (file)
@@ -4,7 +4,6 @@
 
 obj-y                          := cpu.o devices.o devices-common.o \
                                   id.o usb.o timer.o pm.o
-obj-$(CONFIG_CPU_IDLE)          += cpuidle.o
 obj-$(CONFIG_CACHE_L2X0)       += cache-l2x0.o
 obj-$(CONFIG_UX500_SOC_DB8500) += cpu-db8500.o devices-db8500.o
 obj-$(CONFIG_MACH_MOP500)      += board-mop500.o board-mop500-sdi.o \
diff --git a/arch/arm/mach-ux500/cpuidle.c b/arch/arm/mach-ux500/cpuidle.c
deleted file mode 100644 (file)
index e056465..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (c) 2012 Linaro : Daniel Lezcano <daniel.lezcano@linaro.org> (IBM)
- *
- * Based on the work of Rickard Andersson <rickard.andersson@stericsson.com>
- * and Jonas Aaberg <jonas.aberg@stericsson.com>.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/module.h>
-#include <linux/cpuidle.h>
-#include <linux/spinlock.h>
-#include <linux/atomic.h>
-#include <linux/smp.h>
-#include <linux/mfd/dbx500-prcmu.h>
-#include <linux/platform_data/arm-ux500-pm.h>
-#include <linux/platform_device.h>
-
-#include <asm/cpuidle.h>
-#include <asm/proc-fns.h>
-
-static atomic_t master = ATOMIC_INIT(0);
-static DEFINE_SPINLOCK(master_lock);
-
-static inline int ux500_enter_idle(struct cpuidle_device *dev,
-                                  struct cpuidle_driver *drv, int index)
-{
-       int this_cpu = smp_processor_id();
-       bool recouple = false;
-
-       if (atomic_inc_return(&master) == num_online_cpus()) {
-
-               /* With this lock, we prevent the other cpu to exit and enter
-                * this function again and become the master */
-               if (!spin_trylock(&master_lock))
-                       goto wfi;
-
-               /* decouple the gic from the A9 cores */
-               if (prcmu_gic_decouple()) {
-                       spin_unlock(&master_lock);
-                       goto out;
-               }
-
-               /* If an error occur, we will have to recouple the gic
-                * manually */
-               recouple = true;
-
-               /* At this state, as the gic is decoupled, if the other
-                * cpu is in WFI, we have the guarantee it won't be wake
-                * up, so we can safely go to retention */
-               if (!prcmu_is_cpu_in_wfi(this_cpu ? 0 : 1))
-                       goto out;
-
-               /* The prcmu will be in charge of watching the interrupts
-                * and wake up the cpus */
-               if (prcmu_copy_gic_settings())
-                       goto out;
-
-               /* Check in the meantime an interrupt did
-                * not occur on the gic ... */
-               if (prcmu_gic_pending_irq())
-                       goto out;
-
-               /* ... and the prcmu */
-               if (prcmu_pending_irq())
-                       goto out;
-
-               /* Go to the retention state, the prcmu will wait for the
-                * cpu to go WFI and this is what happens after exiting this
-                * 'master' critical section */
-               if (prcmu_set_power_state(PRCMU_AP_IDLE, true, true))
-                       goto out;
-
-               /* When we switch to retention, the prcmu is in charge
-                * of recoupling the gic automatically */
-               recouple = false;
-
-               spin_unlock(&master_lock);
-       }
-wfi:
-       cpu_do_idle();
-out:
-       atomic_dec(&master);
-
-       if (recouple) {
-               prcmu_gic_recouple();
-               spin_unlock(&master_lock);
-       }
-
-       return index;
-}
-
-static struct cpuidle_driver ux500_idle_driver = {
-       .name = "ux500_idle",
-       .owner = THIS_MODULE,
-       .states = {
-               ARM_CPUIDLE_WFI_STATE,
-               {
-                       .enter            = ux500_enter_idle,
-                       .exit_latency     = 70,
-                       .target_residency = 260,
-                       .flags            = CPUIDLE_FLAG_TIME_VALID |
-                                           CPUIDLE_FLAG_TIMER_STOP,
-                       .name             = "ApIdle",
-                       .desc             = "ARM Retention",
-               },
-       },
-       .safe_state_index = 0,
-       .state_count = 2,
-};
-
-static int __init dbx500_cpuidle_probe(struct platform_device *pdev)
-{
-       /* Configure wake up reasons */
-       prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) |
-                            PRCMU_WAKEUP(ABB));
-
-       return cpuidle_register(&ux500_idle_driver, NULL);
-}
-
-static struct platform_driver dbx500_cpuidle_plat_driver = {
-       .driver = {
-               .name = "cpuidle-dbx500",
-               .owner = THIS_MODULE,
-       },
-       .probe = dbx500_cpuidle_probe,
-};
-
-module_platform_driver(dbx500_cpuidle_plat_driver);
index 2c8f17d33ff486ea38f0e17cdb4cc2236d9444b0..b3302193c15a73861422c9bdff9b100efbca6713 100644 (file)
@@ -19,3 +19,11 @@ config ARM_ZYNQ_CPUIDLE
        bool "CPU Idle Driver for Xilinx Zynq processors"
        depends on ARCH_ZYNQ
        help
+         Select this to enable cpuidle on Xilinx Zynq processors.
+
+config ARM_U8500_CPUIDLE
+       bool "Cpu Idle Driver for the ST-E u8500 processors"
+       depends on ARCH_U8500
+       help
+         Select this to enable cpuidle for ST-E u8500 processors
+
index 77cf767b0875625a7fbf575c07b6eb95cf575339..0b9d200c7e454eefd4864abbc83bfee7f7dcb129 100644 (file)
@@ -10,3 +10,4 @@ obj-$(CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED) += coupled.o
 obj-$(CONFIG_ARM_HIGHBANK_CPUIDLE)     += cpuidle-calxeda.o
 obj-$(CONFIG_ARM_KIRKWOOD_CPUIDLE)     += cpuidle-kirkwood.o
 obj-$(CONFIG_ARM_ZYNQ_CPUIDLE)         += cpuidle-zynq.o
+obj-$(CONFIG_ARM_U8500_CPUIDLE)         += cpuidle-ux500.o
diff --git a/drivers/cpuidle/cpuidle-ux500.c b/drivers/cpuidle/cpuidle-ux500.c
new file mode 100644 (file)
index 0000000..e056465
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2012 Linaro : Daniel Lezcano <daniel.lezcano@linaro.org> (IBM)
+ *
+ * Based on the work of Rickard Andersson <rickard.andersson@stericsson.com>
+ * and Jonas Aaberg <jonas.aberg@stericsson.com>.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/module.h>
+#include <linux/cpuidle.h>
+#include <linux/spinlock.h>
+#include <linux/atomic.h>
+#include <linux/smp.h>
+#include <linux/mfd/dbx500-prcmu.h>
+#include <linux/platform_data/arm-ux500-pm.h>
+#include <linux/platform_device.h>
+
+#include <asm/cpuidle.h>
+#include <asm/proc-fns.h>
+
+static atomic_t master = ATOMIC_INIT(0);
+static DEFINE_SPINLOCK(master_lock);
+
+static inline int ux500_enter_idle(struct cpuidle_device *dev,
+                                  struct cpuidle_driver *drv, int index)
+{
+       int this_cpu = smp_processor_id();
+       bool recouple = false;
+
+       if (atomic_inc_return(&master) == num_online_cpus()) {
+
+               /* With this lock, we prevent the other cpu to exit and enter
+                * this function again and become the master */
+               if (!spin_trylock(&master_lock))
+                       goto wfi;
+
+               /* decouple the gic from the A9 cores */
+               if (prcmu_gic_decouple()) {
+                       spin_unlock(&master_lock);
+                       goto out;
+               }
+
+               /* If an error occur, we will have to recouple the gic
+                * manually */
+               recouple = true;
+
+               /* At this state, as the gic is decoupled, if the other
+                * cpu is in WFI, we have the guarantee it won't be wake
+                * up, so we can safely go to retention */
+               if (!prcmu_is_cpu_in_wfi(this_cpu ? 0 : 1))
+                       goto out;
+
+               /* The prcmu will be in charge of watching the interrupts
+                * and wake up the cpus */
+               if (prcmu_copy_gic_settings())
+                       goto out;
+
+               /* Check in the meantime an interrupt did
+                * not occur on the gic ... */
+               if (prcmu_gic_pending_irq())
+                       goto out;
+
+               /* ... and the prcmu */
+               if (prcmu_pending_irq())
+                       goto out;
+
+               /* Go to the retention state, the prcmu will wait for the
+                * cpu to go WFI and this is what happens after exiting this
+                * 'master' critical section */
+               if (prcmu_set_power_state(PRCMU_AP_IDLE, true, true))
+                       goto out;
+
+               /* When we switch to retention, the prcmu is in charge
+                * of recoupling the gic automatically */
+               recouple = false;
+
+               spin_unlock(&master_lock);
+       }
+wfi:
+       cpu_do_idle();
+out:
+       atomic_dec(&master);
+
+       if (recouple) {
+               prcmu_gic_recouple();
+               spin_unlock(&master_lock);
+       }
+
+       return index;
+}
+
+static struct cpuidle_driver ux500_idle_driver = {
+       .name = "ux500_idle",
+       .owner = THIS_MODULE,
+       .states = {
+               ARM_CPUIDLE_WFI_STATE,
+               {
+                       .enter            = ux500_enter_idle,
+                       .exit_latency     = 70,
+                       .target_residency = 260,
+                       .flags            = CPUIDLE_FLAG_TIME_VALID |
+                                           CPUIDLE_FLAG_TIMER_STOP,
+                       .name             = "ApIdle",
+                       .desc             = "ARM Retention",
+               },
+       },
+       .safe_state_index = 0,
+       .state_count = 2,
+};
+
+static int __init dbx500_cpuidle_probe(struct platform_device *pdev)
+{
+       /* Configure wake up reasons */
+       prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) |
+                            PRCMU_WAKEUP(ABB));
+
+       return cpuidle_register(&ux500_idle_driver, NULL);
+}
+
+static struct platform_driver dbx500_cpuidle_plat_driver = {
+       .driver = {
+               .name = "cpuidle-dbx500",
+               .owner = THIS_MODULE,
+       },
+       .probe = dbx500_cpuidle_probe,
+};
+
+module_platform_driver(dbx500_cpuidle_plat_driver);
This page took 0.136958 seconds and 5 git commands to generate.