From: Jan Kiszka <jan.kiszka@xxxxxxxxxxx> This associates a status word with every IRQ descriptor. Drivers can obtain its content via get_irq_status(irq). First use case will be propagating the interrupt sharing state. Signed-off-by: Jan Kiszka <jan.kiszka@xxxxxxxxxxx> --- include/linux/interrupt.h | 2 ++ include/linux/irq.h | 2 ++ kernel/irq/manage.c | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 0 deletions(-) diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 79d0c4f..4c1aa72 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -126,6 +126,8 @@ struct irqaction { extern irqreturn_t no_action(int cpl, void *dev_id); +extern unsigned long get_irq_status(unsigned int irq); + #ifdef CONFIG_GENERIC_HARDIRQS extern int __must_check request_threaded_irq(unsigned int irq, irq_handler_t handler, diff --git a/include/linux/irq.h b/include/linux/irq.h index abde252..8bdb421 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -96,6 +96,7 @@ struct msi_desc; * methods, to allow shared chip implementations * @msi_desc: MSI descriptor * @affinity: IRQ affinity on SMP + * @drv_status: driver-readable status flags (IRQS_*) * * The fields here need to overlay the ones in irq_desc until we * cleaned up the direct references and switched everything over to @@ -111,6 +112,7 @@ struct irq_data { #ifdef CONFIG_SMP cpumask_var_t affinity; #endif + unsigned long drv_status; }; /** diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 5f92acc..2ea0d30 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -1157,3 +1157,18 @@ int request_any_context_irq(unsigned int irq, irq_handler_t handler, return !ret ? IRQC_IS_HARDIRQ : ret; } EXPORT_SYMBOL_GPL(request_any_context_irq); + +/** + * get_irq_status - read interrupt line status word + * @irq: Interrupt line of the status word + * + * This returns the current content of the status word associated with + * the given interrupt line. See IRQS_* flags for details. + */ +unsigned long get_irq_status(unsigned int irq) +{ + struct irq_desc *desc = irq_to_desc(irq); + + return desc ? desc->irq_data.drv_status : 0; +} +EXPORT_SYMBOL_GPL(get_irq_status); -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html