Commit c64638d5 authored by Marc Zyngier's avatar Marc Zyngier
Browse files

Merge branch irq/generic_handle_domain_irq-core into irq/irqchip-next

Simplify the handling of interrupts that require an IRQ domain
resolution:
- domains now cache the irqdata instead of the irq number
- consistent behaviour wrt RCU
- single lookup for architectures using sparse IRQs
- reduced boilerplate code in drivers.

* irq/generic_handle_domain_irq-core: (26 commits)
  irqchip: Bulk conversion to generic_handle_domain_irq()
  genirq: Move non-irqdomain handle_domain_irq() handling into ARM's handle_IRQ()
  genirq: Add generic_handle_domain_irq() helper
  irqchip/nvic: Convert from handle_IRQ() to handle_domain_irq()
  irqdesc: Fix __handle_domain_irq() comment
  genirq: Use irq_resolve_mapping() to implement __handle_domain_irq() and co
  irqdomain: Introduce irq_resolve_mapping()
  irqdomain: Protect the linear revmap with RCU
  irqdomain: Cache irq_data instead of a virq number in the revmap
  irqdomain: Use struct_size() helper when allocating irqdomain
  irqdomain: Make normal and nomap irqdomains exclusive
  powerpc: Move the use of irq_domain_add_nomap() behind a config option
  irqdomain: Reimplement irq_linear_revmap() with irq_find_mapping()
  irqdomain: Kill irq_domain_add_legacy_isa
  powerpc: Drop dependency between asm/irq.h and linux/irqdomain.h
  powerpc: Convert irq_domain_add_legacy_isa use to irq_domain_add_legacy
  scsi/ibmvscsi: Directly include linux/{of.h,irqdomain.h}
  powerpc: Add missing linux/{of.h,irqdomain.h} include directives
  MIPS: Do not include linux/irqdomain.h from asm/irq.h
  MIPS: Add missing linux/irqdomain.h includes
  ...
parents cd273da3 046a6ee2
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -146,7 +146,6 @@ Legacy

	irq_domain_add_simple()
	irq_domain_add_legacy()
	irq_domain_add_legacy_isa()
	irq_domain_create_simple()
	irq_domain_create_legacy()

+21 −1
Original line number Diff line number Diff line
@@ -63,7 +63,27 @@ int arch_show_interrupts(struct seq_file *p, int prec)
 */
void handle_IRQ(unsigned int irq, struct pt_regs *regs)
{
	__handle_domain_irq(NULL, irq, false, regs);
	struct pt_regs *old_regs = set_irq_regs(regs);
	struct irq_desc *desc;

	irq_enter();

	/*
	 * Some hardware gives randomly wrong interrupts.  Rather
	 * than crashing, do something sensible.
	 */
	if (unlikely(!irq || irq >= nr_irqs))
		desc = NULL;
	else
		desc = irq_to_desc(irq);

	if (likely(desc))
		handle_irq_desc(desc);
	else
		ack_bad_irq(irq);

	irq_exit();
	set_irq_regs(old_regs);
}

/*
+0 −1
Original line number Diff line number Diff line
@@ -11,7 +11,6 @@

#include <linux/linkage.h>
#include <linux/smp.h>
#include <linux/irqdomain.h>

#include <asm/mipsmtregs.h>

+1 −0
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@
#include <linux/spinlock.h>
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/of.h>

#include <lantiq_soc.h>
#include <xway_dma.h>
+1 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/irqdomain.h>
#include <linux/of.h>
#include <linux/of_irq.h>
#include <linux/of_pci.h>
Loading