aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts2
-rw-r--r--arch/arm/mach-vexpress/Kconfig11
-rw-r--r--arch/arm/mach-vexpress/Makefile1
-rw-r--r--arch/arm/mach-vexpress/cpuidle-tc2.c184
4 files changed, 1 insertions, 197 deletions
diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts
index dfe371ec274..972a56bc1d3 100644
--- a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts
+++ b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts
@@ -13,7 +13,7 @@
model = "V2P-CA15_CA7";
arm,hbi = <0x249>;
arm,vexpress,site = <0xf>;
- compatible = "arm,vexpress,v2p-ca15_a7", "arm,vexpress";
+ compatible = "arm,vexpress,v2p-ca15_a7", "arm,vexpress", "arm,generic";
interrupt-parent = <&gic>;
#address-cells = <2>;
#size-cells = <2>;
diff --git a/arch/arm/mach-vexpress/Kconfig b/arch/arm/mach-vexpress/Kconfig
index bca54a33598..8d997ee05b6 100644
--- a/arch/arm/mach-vexpress/Kconfig
+++ b/arch/arm/mach-vexpress/Kconfig
@@ -60,15 +60,4 @@ config ARCH_VEXPRESS_TC2
help
Support for CPU and cluster power management on TC2.
-config VEXPRESS_TC2_CPUIDLE
- bool "cpuidle support for TC2 test-chip (EXPERIMENTAL)"
- depends on CPU_IDLE && PM && ARCH_VEXPRESS_TC2
- select ARM_CPU_SUSPEND
- select ARM_SPC
- help
- Provides code that enables CPU idle power management on the
- TC2 testchip. It enables the CPU idle driver so that the kernel
- can enter cluster power down states provided by the power
- controller.
-
endmenu
diff --git a/arch/arm/mach-vexpress/Makefile b/arch/arm/mach-vexpress/Makefile
index 83741a9ca73..a95282125eb 100644
--- a/arch/arm/mach-vexpress/Makefile
+++ b/arch/arm/mach-vexpress/Makefile
@@ -10,4 +10,3 @@ obj-$(CONFIG_ARCH_VEXPRESS_TC2) += tc2_pm.o tc2_pm_setup.o
CFLAGS_REMOVE_tc2_pm.o = -pg
obj-$(CONFIG_SMP) += platsmp.o
obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
-obj-$(CONFIG_VEXPRESS_TC2_CPUIDLE) += cpuidle-tc2.o
diff --git a/arch/arm/mach-vexpress/cpuidle-tc2.c b/arch/arm/mach-vexpress/cpuidle-tc2.c
deleted file mode 100644
index 1f1efc4936f..00000000000
--- a/arch/arm/mach-vexpress/cpuidle-tc2.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * TC2 CPU idle driver.
- *
- * Copyright (C) 2012 ARM Ltd.
- * Author: Lorenzo Pieralisi <lorenzo.pieralisi@arm.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/arm-cci.h>
-#include <linux/bitmap.h>
-#include <linux/cpuidle.h>
-#include <linux/cpu_pm.h>
-#include <linux/clockchips.h>
-#include <linux/debugfs.h>
-#include <linux/hrtimer.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/tick.h>
-#include <linux/vexpress.h>
-#include <asm/bL_entry.h>
-#include <asm/cpuidle.h>
-#include <asm/cputype.h>
-#include <asm/idmap.h>
-#include <asm/proc-fns.h>
-#include <asm/suspend.h>
-
-#include <mach/motherboard.h>
-
-static int tc2_cpuidle_simple_enter(struct cpuidle_device *dev,
- struct cpuidle_driver *drv, int index)
-{
- ktime_t time_start, time_end;
- s64 diff;
-
- time_start = ktime_get();
-
- cpu_do_idle();
-
- time_end = ktime_get();
-
- local_irq_enable();
-
- diff = ktime_to_us(ktime_sub(time_end, time_start));
- if (diff > INT_MAX)
- diff = INT_MAX;
-
- dev->last_residency = (int) diff;
-
- return index;
-}
-
-static int tc2_enter_powerdown(struct cpuidle_device *dev,
- struct cpuidle_driver *drv, int idx);
-
-static struct cpuidle_state tc2_cpuidle_set[] __initdata = {
- [0] = {
- .enter = tc2_cpuidle_simple_enter,
- .exit_latency = 1,
- .target_residency = 1,
- .power_usage = UINT_MAX,
- .flags = CPUIDLE_FLAG_TIME_VALID,
- .name = "WFI",
- .desc = "ARM WFI",
- },
- [1] = {
- .enter = tc2_enter_powerdown,
- .exit_latency = 300,
- .target_residency = 1000,
- .flags = CPUIDLE_FLAG_TIME_VALID,
- .name = "C1",
- .desc = "ARM power down",
- },
-};
-
-struct cpuidle_driver tc2_idle_driver = {
- .name = "tc2_idle",
- .owner = THIS_MODULE,
- .safe_state_index = 0
-};
-
-static DEFINE_PER_CPU(struct cpuidle_device, tc2_idle_dev);
-
-static int notrace tc2_powerdown_finisher(unsigned long arg)
-{
- unsigned int mpidr = read_cpuid_mpidr();
- unsigned int cluster = (mpidr >> 8) & 0xf;
- unsigned int cpu = mpidr & 0xf;
-
- bL_set_entry_vector(cpu, cluster, cpu_resume);
- bL_cpu_suspend(0); /* 0 should be replaced with better value here */
- return 1;
-}
-
-/*
- * tc2_enter_powerdown - Programs CPU to enter the specified state
- * @dev: cpuidle device
- * @drv: The target state to be programmed
- * @idx: state index
- *
- * Called from the CPUidle framework to program the device to the
- * specified target state selected by the governor.
- */
-static int tc2_enter_powerdown(struct cpuidle_device *dev,
- struct cpuidle_driver *drv, int idx)
-{
- struct timespec ts_preidle, ts_postidle, ts_idle;
- int ret;
-
- /* Used to keep track of the total time in idle */
- getnstimeofday(&ts_preidle);
-
- BUG_ON(!irqs_disabled());
-
- cpu_pm_enter();
-
- clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &dev->cpu);
-
- ret = cpu_suspend((unsigned long) dev, tc2_powerdown_finisher);
- if (ret)
- BUG();
-
- bL_cpu_powered_up();
-
- clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &dev->cpu);
-
- cpu_pm_exit();
-
- getnstimeofday(&ts_postidle);
- local_irq_enable();
- ts_idle = timespec_sub(ts_postidle, ts_preidle);
-
- dev->last_residency = ts_idle.tv_nsec / NSEC_PER_USEC +
- ts_idle.tv_sec * USEC_PER_SEC;
- return idx;
-}
-
-/*
- * tc2_idle_init
- *
- * Registers the TC2 specific cpuidle driver with the cpuidle
- * framework with the valid set of states.
- */
-int __init tc2_idle_init(void)
-{
- struct cpuidle_device *dev;
- int i, cpu_id;
- struct cpuidle_driver *drv = &tc2_idle_driver;
-
- if (!vexpress_spc_check_loaded()) {
- pr_info("TC2 CPUidle not registered because no SPC found\n");
- return -ENODEV;
- }
-
- drv->state_count = (sizeof(tc2_cpuidle_set) /
- sizeof(struct cpuidle_state));
-
- for (i = 0; i < drv->state_count; i++) {
- memcpy(&drv->states[i], &tc2_cpuidle_set[i],
- sizeof(struct cpuidle_state));
- }
-
- cpuidle_register_driver(drv);
-
- for_each_cpu(cpu_id, cpu_online_mask) {
- pr_err("CPUidle for CPU%d registered\n", cpu_id);
- dev = &per_cpu(tc2_idle_dev, cpu_id);
- dev->cpu = cpu_id;
-
- dev->state_count = drv->state_count;
-
- if (cpuidle_register_device(dev)) {
- printk(KERN_ERR "%s: Cpuidle register device failed\n",
- __func__);
- return -EIO;
- }
- }
-
- return 0;
-}
-
-late_initcall(tc2_idle_init);