|
@@ -377,9 +377,18 @@ validate_group(struct perf_event *event)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static irqreturn_t armpmu_platform_irq(int irq, void *dev)
|
|
|
+{
|
|
|
+ struct arm_pmu_platdata *plat = dev_get_platdata(&pmu_device->dev);
|
|
|
+
|
|
|
+ return plat->handle_irq(irq, dev, armpmu->handle_irq);
|
|
|
+}
|
|
|
+
|
|
|
static int
|
|
|
armpmu_reserve_hardware(void)
|
|
|
{
|
|
|
+ struct arm_pmu_platdata *plat;
|
|
|
+ irq_handler_t handle_irq;
|
|
|
int i, err = -ENODEV, irq;
|
|
|
|
|
|
pmu_device = reserve_pmu(ARM_PMU_DEVICE_CPU);
|
|
@@ -390,6 +399,12 @@ armpmu_reserve_hardware(void)
|
|
|
|
|
|
init_pmu(ARM_PMU_DEVICE_CPU);
|
|
|
|
|
|
+ plat = dev_get_platdata(&pmu_device->dev);
|
|
|
+ if (plat && plat->handle_irq)
|
|
|
+ handle_irq = armpmu_platform_irq;
|
|
|
+ else
|
|
|
+ handle_irq = armpmu->handle_irq;
|
|
|
+
|
|
|
if (pmu_device->num_resources < 1) {
|
|
|
pr_err("no irqs for PMUs defined\n");
|
|
|
return -ENODEV;
|
|
@@ -400,7 +415,7 @@ armpmu_reserve_hardware(void)
|
|
|
if (irq < 0)
|
|
|
continue;
|
|
|
|
|
|
- err = request_irq(irq, armpmu->handle_irq,
|
|
|
+ err = request_irq(irq, handle_irq,
|
|
|
IRQF_DISABLED | IRQF_NOBALANCING,
|
|
|
"armpmu", NULL);
|
|
|
if (err) {
|