summaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/pmu.c
diff options
context:
space:
mode:
authorMark Rutland <mark.rutland@arm.com>2011-06-22 16:30:51 +0200
committerRussell King <rmk+kernel@arm.linux.org.uk>2011-06-29 11:27:08 +0200
commitf12482c9393da2c1f5cb3217f29aa79c653dd980 (patch)
tree3963f2607ea13feb1d384df5da7727148101d652 /arch/arm/kernel/pmu.c
parentARM: 6886/1: mmc, Add zboot from eSD support for SuperH Mobile ARM (diff)
downloadlinux-f12482c9393da2c1f5cb3217f29aa79c653dd980.tar.xz
linux-f12482c9393da2c1f5cb3217f29aa79c653dd980.zip
ARM: 6974/1: pmu: refactor reservation
Currently, PMU platform_device reservation relies on some minor abuse of the platform_device::id field for determining the type of PMU. This is problematic for device tree based probing, where the ID cannot be controlled. This patch removes reliance on the id field, and depends on each PMU's platform driver to figure out which type it is. As all PMUs handled by the current platform_driver name "arm-pmu" are CPU PMUs, this convention is hardcoded. New PMU types can be supported through the use of {of,platform}_device_id tables Signed-off-by: Mark Rutland <mark.rutland@arm.com> Acked-by: Jamie Iles <jamie@jamieiles.com> Acked-by: Will Deacon <will.deacon@arm.com> Cc: Rob Herring <rob.herring@calxeda.com> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/kernel/pmu.c')
-rw-r--r--arch/arm/kernel/pmu.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/arch/arm/kernel/pmu.c b/arch/arm/kernel/pmu.c
index 2c79eec19262..87942b931c62 100644
--- a/arch/arm/kernel/pmu.c
+++ b/arch/arm/kernel/pmu.c
@@ -25,36 +25,41 @@ static volatile long pmu_lock;
static struct platform_device *pmu_devices[ARM_NUM_PMU_DEVICES];
-static int __devinit pmu_device_probe(struct platform_device *pdev)
+static int __devinit pmu_register(struct platform_device *pdev,
+ enum arm_pmu_type type)
{
-
- if (pdev->id < 0 || pdev->id >= ARM_NUM_PMU_DEVICES) {
+ if (type < 0 || type >= ARM_NUM_PMU_DEVICES) {
pr_warning("received registration request for unknown "
- "device %d\n", pdev->id);
+ "device %d\n", type);
return -EINVAL;
}
- if (pmu_devices[pdev->id])
+ if (pmu_devices[type])
pr_warning("registering new PMU device type %d overwrites "
- "previous registration!\n", pdev->id);
+ "previous registration!\n", type);
else
pr_info("registered new PMU device of type %d\n",
- pdev->id);
+ type);
- pmu_devices[pdev->id] = pdev;
+ pmu_devices[type] = pdev;
return 0;
}
-static struct platform_driver pmu_driver = {
+static int __devinit armpmu_device_probe(struct platform_device *pdev)
+{
+ return pmu_register(pdev, ARM_PMU_DEVICE_CPU);
+}
+
+static struct platform_driver armpmu_driver = {
.driver = {
.name = "arm-pmu",
},
- .probe = pmu_device_probe,
+ .probe = armpmu_device_probe,
};
static int __init register_pmu_driver(void)
{
- return platform_driver_register(&pmu_driver);
+ return platform_driver_register(&armpmu_driver);
}
device_initcall(register_pmu_driver);
@@ -77,11 +82,11 @@ reserve_pmu(enum arm_pmu_type device)
EXPORT_SYMBOL_GPL(reserve_pmu);
int
-release_pmu(struct platform_device *pdev)
+release_pmu(enum arm_pmu_type device)
{
- if (WARN_ON(pdev != pmu_devices[pdev->id]))
+ if (WARN_ON(!pmu_devices[device]))
return -EINVAL;
- clear_bit_unlock(pdev->id, &pmu_lock);
+ clear_bit_unlock(device, &pmu_lock);
return 0;
}
EXPORT_SYMBOL_GPL(release_pmu);