diff options
author | Ming Lei <ming.lei@canonical.com> | 2011-03-02 02:00:08 -0500 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2011-12-02 10:16:33 -0500 |
commit | e0516a64e7ea9d9522d98f9f5f47aa38f147779f (patch) | |
tree | cb03a94b84dcb764de9db1f6ff0285018a792c0a /arch/arm/kernel/perf_event.c | |
parent | 14eec97ff4635977b026a53b27915ab0dec51e94 (diff) |
arm: pmu: allow platform specific irq enable/disable handling
This patch introduces .enable_irq and .disable_irq into
struct arm_pmu_platdata, so platform specific irq enablement
can be handled after request_irq, and platform specific irq
disablement can be handled before free_irq.
This patch is for support of pmu irq routed from CTI on omap4.
Acked-by: Jean Pihet <j-pihet@ti.com>
Reviewed-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Ming Lei <ming.lei@canonical.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch/arm/kernel/perf_event.c')
-rw-r--r-- | arch/arm/kernel/perf_event.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index c475379199b1..daa1db84452e 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
@@ -380,6 +380,8 @@ armpmu_release_hardware(struct arm_pmu *armpmu) | |||
380 | { | 380 | { |
381 | int i, irq, irqs; | 381 | int i, irq, irqs; |
382 | struct platform_device *pmu_device = armpmu->plat_device; | 382 | struct platform_device *pmu_device = armpmu->plat_device; |
383 | struct arm_pmu_platdata *plat = | ||
384 | dev_get_platdata(&pmu_device->dev); | ||
383 | 385 | ||
384 | irqs = min(pmu_device->num_resources, num_possible_cpus()); | 386 | irqs = min(pmu_device->num_resources, num_possible_cpus()); |
385 | 387 | ||
@@ -387,8 +389,11 @@ armpmu_release_hardware(struct arm_pmu *armpmu) | |||
387 | if (!cpumask_test_and_clear_cpu(i, &armpmu->active_irqs)) | 389 | if (!cpumask_test_and_clear_cpu(i, &armpmu->active_irqs)) |
388 | continue; | 390 | continue; |
389 | irq = platform_get_irq(pmu_device, i); | 391 | irq = platform_get_irq(pmu_device, i); |
390 | if (irq >= 0) | 392 | if (irq >= 0) { |
393 | if (plat && plat->disable_irq) | ||
394 | plat->disable_irq(irq); | ||
391 | free_irq(irq, armpmu); | 395 | free_irq(irq, armpmu); |
396 | } | ||
392 | } | 397 | } |
393 | 398 | ||
394 | release_pmu(armpmu->type); | 399 | release_pmu(armpmu->type); |
@@ -448,7 +453,8 @@ armpmu_reserve_hardware(struct arm_pmu *armpmu) | |||
448 | irq); | 453 | irq); |
449 | armpmu_release_hardware(armpmu); | 454 | armpmu_release_hardware(armpmu); |
450 | return err; | 455 | return err; |
451 | } | 456 | } else if (plat && plat->enable_irq) |
457 | plat->enable_irq(irq); | ||
452 | 458 | ||
453 | cpumask_set_cpu(i, &armpmu->active_irqs); | 459 | cpumask_set_cpu(i, &armpmu->active_irqs); |
454 | } | 460 | } |