Commit 9b8cf779 authored by Ezequiel Garcia's avatar Ezequiel Garcia Committed by Jason Cooper

irqchip: armada-370-xp: Add helper for the MSI IRQ handling

Introduce a helper function to handle the MSI interrupts. This makes
the code more readable. In addition, this will allow to introduce a
chained IRQ handler mechanism, which is needed in situations where the
MPIC is used as a slave to another interrupt controller.
Reviewed-by: default avatarGregory CLEMENT <gregory.clement@free-electrons.com>
Signed-off-by: default avatarEzequiel Garcia <ezequiel.garcia@free-electrons.com>
Signed-off-by: default avatarJason Cooper <jason@lakedaemon.net>
parent 3efca1d1
...@@ -352,29 +352,9 @@ static struct irq_domain_ops armada_370_xp_mpic_irq_ops = { ...@@ -352,29 +352,9 @@ static struct irq_domain_ops armada_370_xp_mpic_irq_ops = {
.xlate = irq_domain_xlate_onecell, .xlate = irq_domain_xlate_onecell,
}; };
static asmlinkage void __exception_irq_entry
armada_370_xp_handle_irq(struct pt_regs *regs)
{
u32 irqstat, irqnr;
do {
irqstat = readl_relaxed(per_cpu_int_base +
ARMADA_370_XP_CPU_INTACK_OFFS);
irqnr = irqstat & 0x3FF;
if (irqnr > 1022)
break;
if (irqnr > 1) {
irqnr = irq_find_mapping(armada_370_xp_mpic_domain,
irqnr);
handle_IRQ(irqnr, regs);
continue;
}
#ifdef CONFIG_PCI_MSI #ifdef CONFIG_PCI_MSI
/* MSI handling */ static void armada_370_xp_handle_msi_irq(struct pt_regs *regs)
if (irqnr == 1) { {
u32 msimask, msinr; u32 msimask, msinr;
msimask = readl_relaxed(per_cpu_int_base + msimask = readl_relaxed(per_cpu_int_base +
...@@ -395,9 +375,35 @@ armada_370_xp_handle_irq(struct pt_regs *regs) ...@@ -395,9 +375,35 @@ armada_370_xp_handle_irq(struct pt_regs *regs)
msinr - 16); msinr - 16);
handle_IRQ(irq, regs); handle_IRQ(irq, regs);
} }
} }
#else
static void armada_370_xp_handle_msi_irq(struct pt_regs *r) {}
#endif #endif
static asmlinkage void __exception_irq_entry
armada_370_xp_handle_irq(struct pt_regs *regs)
{
u32 irqstat, irqnr;
do {
irqstat = readl_relaxed(per_cpu_int_base +
ARMADA_370_XP_CPU_INTACK_OFFS);
irqnr = irqstat & 0x3FF;
if (irqnr > 1022)
break;
if (irqnr > 1) {
irqnr = irq_find_mapping(armada_370_xp_mpic_domain,
irqnr);
handle_IRQ(irqnr, regs);
continue;
}
/* MSI handling */
if (irqnr == 1)
armada_370_xp_handle_msi_irq(regs);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
/* IPI Handling */ /* IPI Handling */
if (irqnr == 0) { if (irqnr == 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment