aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorMark Rutland <mark.rutland@arm.com>2011-06-22 10:33:55 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2011-06-29 05:27:08 -0400
commite73c34c3d522a60d9f7b38a7683076362bad98f5 (patch)
tree0852513718796e98925b7afb43cdf35a2854352f /arch/arm
parentae0c3751ab08d3fe039d48935e9ad2c46711b23b (diff)
ARM: 6976/1: pmu: add OF probing support
This is based on an earlier patch from Rob Herring <rob.herring@calxeda.com> > Add OF match table to enable OF style driver binding. The dts entry is like > this: > > pmu { > compatible = "arm,cortex-a9-pmu"; > interrupts = <100 101>; > }; > > The use of pdev->id as an index breaks with OF device binding, so set the type > based on the OF compatible string. This modification sets the PMU hardware type based on data embedded in the binding, allowing easy addition of new PMU types in future. Support for new PMU types not provided by devicetree can be added later using platform_device_id tables in a similar fashion. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Acked-by: Jamie Iles <jamie@jamieiles.com> Acked-by: Rob Herring <rob.herring@calxeda.com> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/kernel/pmu.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/arch/arm/kernel/pmu.c b/arch/arm/kernel/pmu.c
index de6b1b0860c2..2ce00be697ea 100644
--- a/arch/arm/kernel/pmu.c
+++ b/arch/arm/kernel/pmu.c
@@ -17,6 +17,7 @@
17#include <linux/interrupt.h> 17#include <linux/interrupt.h>
18#include <linux/kernel.h> 18#include <linux/kernel.h>
19#include <linux/module.h> 19#include <linux/module.h>
20#include <linux/of_device.h>
20#include <linux/platform_device.h> 21#include <linux/platform_device.h>
21 22
22#include <asm/pmu.h> 23#include <asm/pmu.h>
@@ -45,14 +46,45 @@ static int __devinit pmu_register(struct platform_device *pdev,
45 return 0; 46 return 0;
46} 47}
47 48
49#define OF_MATCH_PMU(_name, _type) { \
50 .compatible = _name, \
51 .data = (void *)_type, \
52}
53
54#define OF_MATCH_CPU(name) OF_MATCH_PMU(name, ARM_PMU_DEVICE_CPU)
55
56static struct of_device_id armpmu_of_device_ids[] = {
57 OF_MATCH_CPU("arm,cortex-a9-pmu"),
58 OF_MATCH_CPU("arm,cortex-a8-pmu"),
59 OF_MATCH_CPU("arm,arm1136-pmu"),
60 OF_MATCH_CPU("arm,arm1176-pmu"),
61 {},
62};
63
64enum arm_pmu_type armpmu_device_type(struct platform_device *pdev)
65{
66 const struct of_device_id *of_id;
67
68 /* provided by of_device_id table */
69 if (pdev->dev.of_node) {
70 of_id = of_match_device(armpmu_of_device_ids, &pdev->dev);
71 BUG_ON(!of_id);
72 return (enum arm_pmu_type)of_id->data;
73 }
74
75 /* Provided by a 'legacy' platform_device */
76 return ARM_PMU_DEVICE_CPU;
77}
78
48static int __devinit armpmu_device_probe(struct platform_device *pdev) 79static int __devinit armpmu_device_probe(struct platform_device *pdev)
49{ 80{
50 return pmu_register(pdev, ARM_PMU_DEVICE_CPU); 81 return pmu_register(pdev, armpmu_device_type(pdev));
51} 82}
52 83
53static struct platform_driver armpmu_driver = { 84static struct platform_driver armpmu_driver = {
54 .driver = { 85 .driver = {
55 .name = "arm-pmu", 86 .name = "arm-pmu",
87 .of_match_table = armpmu_of_device_ids,
56 }, 88 },
57 .probe = armpmu_device_probe, 89 .probe = armpmu_device_probe,
58}; 90};