diff options
Diffstat (limited to 'target/linux/kirkwood/patches/004-cpuidle.patch')
-rw-r--r-- | target/linux/kirkwood/patches/004-cpuidle.patch | 146 |
1 files changed, 0 insertions, 146 deletions
diff --git a/target/linux/kirkwood/patches/004-cpuidle.patch b/target/linux/kirkwood/patches/004-cpuidle.patch deleted file mode 100644 index 876fe89f57..0000000000 --- a/target/linux/kirkwood/patches/004-cpuidle.patch +++ /dev/null @@ -1,146 +0,0 @@ -From: Rabeeh Khoury <rabeeh@marvell.com> -Date: Tue, 24 Mar 2009 14:10:15 +0000 (+0200) -Subject: [ARM] Kirkwood: CPU idle driver -X-Git-Url: http://git.marvell.com/?p=orion.git;a=commitdiff_plain;h=039b97666e1335eac517c7d35a0fa1143af689f0;hp=56a50adda49b2020156616c4eb15353e0f9ad7de - -[ARM] Kirkwood: CPU idle driver - -The patch adds support for Kirkwood cpu idle. -Two idle states are defined: -1. Wait-for-interrupt (replacing default kirkwood wfi) -2. Wait-for-interrupt and DDR self refresh - -Signed-off-by: Rabeeh Khoury <rabeeh@marvell.com> -Signed-off-by: Nicolas Pitre <nico@marvell.com> ---- - ---- a/arch/arm/configs/kirkwood_defconfig -+++ b/arch/arm/configs/kirkwood_defconfig -@@ -270,7 +270,9 @@ CONFIG_CMDLINE="" - # - # CPU Power Management - # --# CONFIG_CPU_IDLE is not set -+CONFIG_CPU_IDLE=y -+CONFIG_CPU_IDLE_GOV_LADDER=y -+CONFIG_CPU_IDLE_GOV_MENU=y - - # - # Floating point emulation ---- a/arch/arm/mach-kirkwood/Makefile -+++ b/arch/arm/mach-kirkwood/Makefile -@@ -5,3 +5,5 @@ obj-$(CONFIG_MACH_RD88F6192_NAS) += rd88 - obj-$(CONFIG_MACH_RD88F6281) += rd88f6281-setup.o - obj-$(CONFIG_MACH_SHEEVAPLUG) += sheevaplug-setup.o - obj-$(CONFIG_MACH_TS219) += ts219-setup.o -+ -+obj-$(CONFIG_CPU_IDLE) += cpuidle.o ---- /dev/null -+++ b/arch/arm/mach-kirkwood/cpuidle.c -@@ -0,0 +1,96 @@ -+/* -+ * arch/arm/mach-kirkwood/cpuidle.c -+ * -+ * CPU idle Marvell Kirkwood SoCs -+ * -+ * This file is licensed under the terms of the GNU General Public -+ * License version 2. This program is licensed "as is" without any -+ * warranty of any kind, whether express or implied. -+ * -+ * The cpu idle uses wait-for-interrupt and DDR self refresh in order -+ * to implement two idle states - -+ * #1 wait-for-interrupt -+ * #2 wait-for-interrupt and DDR self refresh -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/init.h> -+#include <linux/platform_device.h> -+#include <linux/cpuidle.h> -+#include <asm/io.h> -+#include <asm/proc-fns.h> -+#include <mach/kirkwood.h> -+ -+#define KIRKWOOD_MAX_STATES 2 -+ -+static struct cpuidle_driver kirkwood_idle_driver = { -+ .name = "kirkwood_idle", -+ .owner = THIS_MODULE, -+}; -+ -+static DEFINE_PER_CPU(struct cpuidle_device, kirkwood_cpuidle_device); -+ -+/* Actual code that puts the SoC in different idle states */ -+static int kirkwood_enter_idle(struct cpuidle_device *dev, -+ struct cpuidle_state *state) -+{ -+ struct timeval before, after; -+ int idle_time; -+ -+ local_irq_disable(); -+ do_gettimeofday(&before); -+ if (state == &dev->states[0]) -+ /* Wait for interrupt state */ -+ cpu_do_idle(); -+ else if (state == &dev->states[1]) { -+ /* -+ * Following write will put DDR in self refresh. -+ * Note that we have 256 cycles before DDR puts it -+ * self in self-refresh, so the wait-for-interrupt -+ * call afterwards won't get the DDR from self refresh -+ * mode. -+ */ -+ writel(0x7, DDR_OPERATION_BASE); -+ cpu_do_idle(); -+ } -+ do_gettimeofday(&after); -+ local_irq_enable(); -+ idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC + -+ (after.tv_usec - before.tv_usec); -+ return idle_time; -+} -+ -+/* Initialize CPU idle by registering the idle states */ -+static int kirkwood_init_cpuidle(void) -+{ -+ struct cpuidle_device *device; -+ -+ cpuidle_register_driver(&kirkwood_idle_driver); -+ -+ device = &per_cpu(kirkwood_cpuidle_device, smp_processor_id()); -+ device->state_count = KIRKWOOD_MAX_STATES; -+ -+ /* Wait for interrupt state */ -+ device->states[0].enter = kirkwood_enter_idle; -+ device->states[0].exit_latency = 1; -+ device->states[0].target_residency = 10000; -+ device->states[0].flags = CPUIDLE_FLAG_TIME_VALID; -+ strcpy(device->states[0].name, "WFI"); -+ strcpy(device->states[0].desc, "Wait for interrupt"); -+ -+ /* Wait for interrupt and DDR self refresh state */ -+ device->states[1].enter = kirkwood_enter_idle; -+ device->states[1].exit_latency = 10; -+ device->states[1].target_residency = 10000; -+ device->states[1].flags = CPUIDLE_FLAG_TIME_VALID; -+ strcpy(device->states[1].name, "DDR SR"); -+ strcpy(device->states[1].desc, "WFI and DDR Self Refresh"); -+ -+ if (cpuidle_register_device(device)) { -+ printk(KERN_ERR "kirkwood_init_cpuidle: Failed registering\n"); -+ return -EIO; -+ } -+ return 0; -+} -+ -+device_initcall(kirkwood_init_cpuidle); ---- a/arch/arm/mach-kirkwood/include/mach/kirkwood.h -+++ b/arch/arm/mach-kirkwood/include/mach/kirkwood.h -@@ -48,6 +48,7 @@ - */ - #define DDR_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x00000) - #define DDR_WINDOW_CPU_BASE (DDR_VIRT_BASE | 0x1500) -+#define DDR_OPERATION_BASE (DDR_VIRT_BASE | 0x1418) - - #define DEV_BUS_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x10000) - #define DEV_BUS_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x10000) |