Skip to content

Commit

Permalink
irqchip: xilinx: Enable generic irq multi handler
Browse files Browse the repository at this point in the history
Register default arch handler via driver instead of directly pointing to
xilinx intc controller. This patch makes architecture code more generic.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Stefan Asserhall <stefan.asserhall@xilinx.com>
  • Loading branch information
Michal Simek committed Feb 27, 2020
1 parent 8279859 commit 731d1aa
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 19 deletions.
2 changes: 2 additions & 0 deletions arch/microblaze/Kconfig
Expand Up @@ -48,6 +48,8 @@ config MICROBLAZE
select CPU_NO_EFFICIENT_FFS
select MMU_GATHER_NO_RANGE if MMU
select SPARSE_IRQ
select GENERIC_IRQ_MULTI_HANDLER
select HANDLE_DOMAIN_IRQ

# Endianness selection
choice
Expand Down
3 changes: 0 additions & 3 deletions arch/microblaze/include/asm/irq.h
Expand Up @@ -11,7 +11,4 @@
struct pt_regs;
extern void do_IRQ(struct pt_regs *regs);

/* should be defined in each interrupt controller driver */
extern unsigned int xintc_get_irq(void);

#endif /* _ASM_MICROBLAZE_IRQ_H */
16 changes: 1 addition & 15 deletions arch/microblaze/kernel/irq.c
Expand Up @@ -20,27 +20,13 @@
#include <linux/irqchip.h>
#include <linux/of_irq.h>

static u32 concurrent_irq;

void __irq_entry do_IRQ(struct pt_regs *regs)
{
unsigned int irq;
struct pt_regs *old_regs = set_irq_regs(regs);
trace_hardirqs_off();

irq_enter();
irq = xintc_get_irq();
next_irq:
BUG_ON(!irq);
generic_handle_irq(irq);

irq = xintc_get_irq();
if (irq != -1U) {
pr_debug("next irq: %d\n", irq);
++concurrent_irq;
goto next_irq;
}

handle_arch_irq(regs);
irq_exit();
set_irq_regs(old_regs);
trace_hardirqs_on();
Expand Down
22 changes: 21 additions & 1 deletion drivers/irqchip/irq-xilinx-intc.c
Expand Up @@ -119,7 +119,7 @@ static unsigned int xintc_get_irq_local(struct xintc_irq_chip *local_intc)
return irq;
}

unsigned int xintc_get_irq(void)
static unsigned int xintc_get_irq(void)
{
int hwirq, irq = -1;
unsigned int cpu_id = smp_processor_id();
Expand Down Expand Up @@ -173,6 +173,25 @@ static void xil_intc_irq_handler(struct irq_desc *desc)
chained_irq_exit(chip, desc);
}

static u32 concurrent_irq;

static void xil_intc_handle_irq(struct pt_regs *regs)
{
unsigned int irq;

irq = xintc_get_irq();
next_irq:
BUG_ON(!irq);
generic_handle_irq(irq);

irq = xintc_get_irq();
if (irq != -1U) {
pr_debug("next irq: %d\n", irq);
++concurrent_irq;
goto next_irq;
}
}

static int __init xilinx_intc_of_init(struct device_node *intc,
struct device_node *parent)
{
Expand Down Expand Up @@ -273,6 +292,7 @@ static int __init xilinx_intc_of_init(struct device_node *intc,
}
} else {
irq_set_default_host(irqc->root_domain);
set_handle_irq(xil_intc_handle_irq);
}

return 0;
Expand Down

0 comments on commit 731d1aa

Please sign in to comment.