summaryrefslogtreecommitdiffstats
path: root/drivers/irqchip
diff options
context:
space:
mode:
authorMarek Behún <kabel@kernel.org>2024-07-11 13:57:48 +0200
committerThomas Gleixner <tglx@linutronix.de>2024-07-30 13:35:47 +0200
commitbaf01c726b7f99b72f2abfa54e249d766cbd59a5 (patch)
treef49f0547121387ccd48a7720b427077b3a52f25b /drivers/irqchip
parentirqchip/armada-370-xp: Refactor mpic_handle_msi_irq() code (diff)
downloadlinux-baf01c726b7f99b72f2abfa54e249d766cbd59a5.tar.xz
linux-baf01c726b7f99b72f2abfa54e249d766cbd59a5.zip
irqchip/armada-370-xp: Refactor handling IPI interrupts
Refactor the handling of IPI interrupts - put into own function mpic_handle_ipi_irq(), similar to mpic_handle_msi_irq() - rename the variable holding the doorbell cause register to "cause" - retype and rename the variable holding the IPI HW IRQ number to "irq_hw_number_t i" Signed-off-by: Marek Behún <kabel@kernel.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Link: https://lore.kernel.org/all/20240711115748.30268-11-kabel@kernel.org
Diffstat (limited to 'drivers/irqchip')
-rw-r--r--drivers/irqchip/irq-armada-370-xp.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/drivers/irqchip/irq-armada-370-xp.c b/drivers/irqchip/irq-armada-370-xp.c
index 5c2631f6f7b0..d42c7a1750ac 100644
--- a/drivers/irqchip/irq-armada-370-xp.c
+++ b/drivers/irqchip/irq-armada-370-xp.c
@@ -619,6 +619,22 @@ static void mpic_handle_msi_irq(void)
static void mpic_handle_msi_irq(void) {}
#endif
+#ifdef CONFIG_SMP
+static void mpic_handle_ipi_irq(void)
+{
+ unsigned long cause;
+ irq_hw_number_t i;
+
+ cause = readl_relaxed(per_cpu_int_base + MPIC_IN_DRBEL_CAUSE);
+ cause &= IPI_DOORBELL_MASK;
+
+ for_each_set_bit(i, &cause, IPI_DOORBELL_END)
+ generic_handle_domain_irq(mpic_ipi_domain, i);
+}
+#else
+static inline void mpic_handle_ipi_irq(void) {}
+#endif
+
static void mpic_handle_cascade_irq(struct irq_desc *desc)
{
struct irq_chip *chip = irq_desc_get_chip(desc);
@@ -669,19 +685,9 @@ static void __exception_irq_entry mpic_handle_irq(struct pt_regs *regs)
if (irqnr == 1)
mpic_handle_msi_irq();
-#ifdef CONFIG_SMP
/* IPI Handling */
- if (irqnr == 0) {
- unsigned long ipimask;
- int ipi;
-
- ipimask = readl_relaxed(per_cpu_int_base + MPIC_IN_DRBEL_CAUSE) &
- IPI_DOORBELL_MASK;
-
- for_each_set_bit(ipi, &ipimask, IPI_DOORBELL_END)
- generic_handle_domain_irq(mpic_ipi_domain, ipi);
- }
-#endif
+ if (irqnr == 0)
+ mpic_handle_ipi_irq();
} while (1);
}