diff options
-rw-r--r-- | arch/arm/include/asm/pmu.h | 2 | ||||
-rw-r--r-- | arch/arm/kernel/perf_event.c | 4 | ||||
-rw-r--r-- | arch/arm/kernel/pmu.c | 33 |
3 files changed, 22 insertions, 17 deletions
diff --git a/arch/arm/include/asm/pmu.h b/arch/arm/include/asm/pmu.h index 7544ce6b481a..67c70a31a1be 100644 --- a/arch/arm/include/asm/pmu.h +++ b/arch/arm/include/asm/pmu.h | |||
@@ -52,7 +52,7 @@ reserve_pmu(enum arm_pmu_type device); | |||
52 | * a cookie. | 52 | * a cookie. |
53 | */ | 53 | */ |
54 | extern int | 54 | extern int |
55 | release_pmu(struct platform_device *pdev); | 55 | release_pmu(enum arm_pmu_type type); |
56 | 56 | ||
57 | /** | 57 | /** |
58 | * init_pmu() - Initialise the PMU. | 58 | * init_pmu() - Initialise the PMU. |
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index d53c0abc4dd3..a6c643f2d2ca 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
@@ -435,7 +435,7 @@ armpmu_reserve_hardware(void) | |||
435 | if (irq >= 0) | 435 | if (irq >= 0) |
436 | free_irq(irq, NULL); | 436 | free_irq(irq, NULL); |
437 | } | 437 | } |
438 | release_pmu(pmu_device); | 438 | release_pmu(ARM_PMU_DEVICE_CPU); |
439 | pmu_device = NULL; | 439 | pmu_device = NULL; |
440 | } | 440 | } |
441 | 441 | ||
@@ -454,7 +454,7 @@ armpmu_release_hardware(void) | |||
454 | } | 454 | } |
455 | armpmu->stop(); | 455 | armpmu->stop(); |
456 | 456 | ||
457 | release_pmu(pmu_device); | 457 | release_pmu(ARM_PMU_DEVICE_CPU); |
458 | pmu_device = NULL; | 458 | pmu_device = NULL; |
459 | } | 459 | } |
460 | 460 | ||
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; | |||
25 | 25 | ||
26 | static struct platform_device *pmu_devices[ARM_NUM_PMU_DEVICES]; | 26 | static struct platform_device *pmu_devices[ARM_NUM_PMU_DEVICES]; |
27 | 27 | ||
28 | static int __devinit pmu_device_probe(struct platform_device *pdev) | 28 | static int __devinit pmu_register(struct platform_device *pdev, |
29 | enum arm_pmu_type type) | ||
29 | { | 30 | { |
30 | 31 | if (type < 0 || type >= ARM_NUM_PMU_DEVICES) { | |
31 | if (pdev->id < 0 || pdev->id >= ARM_NUM_PMU_DEVICES) { | ||
32 | pr_warning("received registration request for unknown " | 32 | pr_warning("received registration request for unknown " |
33 | "device %d\n", pdev->id); | 33 | "device %d\n", type); |
34 | return -EINVAL; | 34 | return -EINVAL; |
35 | } | 35 | } |
36 | 36 | ||
37 | if (pmu_devices[pdev->id]) | 37 | if (pmu_devices[type]) |
38 | pr_warning("registering new PMU device type %d overwrites " | 38 | pr_warning("registering new PMU device type %d overwrites " |
39 | "previous registration!\n", pdev->id); | 39 | "previous registration!\n", type); |
40 | else | 40 | else |
41 | pr_info("registered new PMU device of type %d\n", | 41 | pr_info("registered new PMU device of type %d\n", |
42 | pdev->id); | 42 | type); |
43 | 43 | ||
44 | pmu_devices[pdev->id] = pdev; | 44 | pmu_devices[type] = pdev; |
45 | return 0; | 45 | return 0; |
46 | } | 46 | } |
47 | 47 | ||
48 | static struct platform_driver pmu_driver = { | 48 | static int __devinit armpmu_device_probe(struct platform_device *pdev) |
49 | { | ||
50 | return pmu_register(pdev, ARM_PMU_DEVICE_CPU); | ||
51 | } | ||
52 | |||
53 | static struct platform_driver armpmu_driver = { | ||
49 | .driver = { | 54 | .driver = { |
50 | .name = "arm-pmu", | 55 | .name = "arm-pmu", |
51 | }, | 56 | }, |
52 | .probe = pmu_device_probe, | 57 | .probe = armpmu_device_probe, |
53 | }; | 58 | }; |
54 | 59 | ||
55 | static int __init register_pmu_driver(void) | 60 | static int __init register_pmu_driver(void) |
56 | { | 61 | { |
57 | return platform_driver_register(&pmu_driver); | 62 | return platform_driver_register(&armpmu_driver); |
58 | } | 63 | } |
59 | device_initcall(register_pmu_driver); | 64 | device_initcall(register_pmu_driver); |
60 | 65 | ||
@@ -77,11 +82,11 @@ reserve_pmu(enum arm_pmu_type device) | |||
77 | EXPORT_SYMBOL_GPL(reserve_pmu); | 82 | EXPORT_SYMBOL_GPL(reserve_pmu); |
78 | 83 | ||
79 | int | 84 | int |
80 | release_pmu(struct platform_device *pdev) | 85 | release_pmu(enum arm_pmu_type device) |
81 | { | 86 | { |
82 | if (WARN_ON(pdev != pmu_devices[pdev->id])) | 87 | if (WARN_ON(!pmu_devices[device])) |
83 | return -EINVAL; | 88 | return -EINVAL; |
84 | clear_bit_unlock(pdev->id, &pmu_lock); | 89 | clear_bit_unlock(device, &pmu_lock); |
85 | return 0; | 90 | return 0; |
86 | } | 91 | } |
87 | EXPORT_SYMBOL_GPL(release_pmu); | 92 | EXPORT_SYMBOL_GPL(release_pmu); |