Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e0516a64 authored by Ming Lei's avatar Ming Lei Committed by Will Deacon
Browse files

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: default avatarJean Pihet <j-pihet@ti.com>
Reviewed-by: default avatarWill Deacon <will.deacon@arm.com>
Signed-off-by: default avatarMing Lei <ming.lei@canonical.com>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent 14eec97f
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -27,13 +27,22 @@ enum arm_pmu_type {
/*
 * struct arm_pmu_platdata - ARM PMU platform data
 *
 * @handle_irq: an optional handler which will be called from the interrupt and
 * passed the address of the low level handler, and can be used to implement
 * any platform specific handling before or after calling it.
 * @handle_irq: an optional handler which will be called from the
 *	interrupt and passed the address of the low level handler,
 *	and can be used to implement any platform specific handling
 *	before or after calling it.
 * @enable_irq: an optional handler which will be called after
 *	request_irq and be used to handle some platform specific
 *	irq enablement
 * @disable_irq: an optional handler which will be called before
 *	free_irq and be used to handle some platform specific
 *	irq disablement
 */
struct arm_pmu_platdata {
	irqreturn_t (*handle_irq)(int irq, void *dev,
				  irq_handler_t pmu_handler);
	void (*enable_irq)(int irq);
	void (*disable_irq)(int irq);
};

#ifdef CONFIG_CPU_HAS_PMU
+8 −2
Original line number Diff line number Diff line
@@ -380,6 +380,8 @@ armpmu_release_hardware(struct arm_pmu *armpmu)
{
	int i, irq, irqs;
	struct platform_device *pmu_device = armpmu->plat_device;
	struct arm_pmu_platdata *plat =
		dev_get_platdata(&pmu_device->dev);

	irqs = min(pmu_device->num_resources, num_possible_cpus());

@@ -387,9 +389,12 @@ armpmu_release_hardware(struct arm_pmu *armpmu)
		if (!cpumask_test_and_clear_cpu(i, &armpmu->active_irqs))
			continue;
		irq = platform_get_irq(pmu_device, i);
		if (irq >= 0)
		if (irq >= 0) {
			if (plat && plat->disable_irq)
				plat->disable_irq(irq);
			free_irq(irq, armpmu);
		}
	}

	release_pmu(armpmu->type);
}
@@ -448,7 +453,8 @@ armpmu_reserve_hardware(struct arm_pmu *armpmu)
				irq);
			armpmu_release_hardware(armpmu);
			return err;
		}
		} else if (plat && plat->enable_irq)
			plat->enable_irq(irq);

		cpumask_set_cpu(i, &armpmu->active_irqs);
	}