mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Peng Fan <peng.fan@linux.dev>
To: Thomas Gleixner <tglx@kernel.org>, Radu Rendec <radu@rendec.net>,
	 Krzysztof Kozlowski <krzk@kernel.org>,
	 Peter Griffin <peter.griffin@linaro.org>,
	 Alim Akhtar <alim.akhtar@samsung.com>,
	Andrew Lunn <andrew@lunn.ch>,
	 Gregory Clement <gregory.clement@bootlin.com>,
	 Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>,
	 Ryan Chen <ryan_chen@aspeedtech.com>,
	 Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	 Joel Stanley <joel@jms.id.au>,
	Andrew Jeffery <andrew@codeconstruct.com.au>,
	 Billy Tsai <billy_tsai@aspeedtech.com>,
	 Tan Siewert <tan.siewert@9elements.com>,
	 Eddie James <eajames@linux.ibm.com>,
	 Florian Fainelli <florian.fainelli@broadcom.com>,
	 Ray Jui <rjui@broadcom.com>,
	Scott Branden <sbranden@broadcom.com>,
	 Broadcom internal kernel review list
	<bcm-kernel-feedback-list@broadcom.com>,
	 Caleb James DeLisle <cjd@cjdns.fr>,
	Marc Zyngier <maz@kernel.org>,
	 Miodrag Dinic <miodrag.dinic@mips.com>,
	Frank Li <Frank.Li@nxp.com>,
	 Sascha Hauer <s.hauer@pengutronix.de>,
	 Pengutronix Kernel Team <kernel@pengutronix.de>,
	 Fabio Estevam <festevam@gmail.com>,
	Herve Codina <herve.codina@bootlin.com>,
	 Huacai Chen <chenhuacai@kernel.org>,
	WANG Xuerui <kernel@xen0n.name>,
	 Jiaxun Yang <jiaxun.yang@flygoat.com>,
	Vladimir Zapolskiy <vz@mleia.com>,
	 Piotr Wojtaszczyk <piotr.wojtaszczyk@timesys.com>,
	 Anup Patel <anup@brainfault.org>, Paul Walmsley <pjw@kernel.org>,
	 Palmer Dabbelt <palmer@dabbelt.com>,
	Albert Ou <aou@eecs.berkeley.edu>,
	 Alexandre Ghiti <alex@ghiti.fr>,
	Samuel Holland <samuel.holland@sifive.com>,
	 Qin Jian <qinjian@cqplus1.com>,
	 Changhuang Liang <changhuang.liang@starfivetech.com>,
	 Maxime Coquelin <mcoquelin.stm32@gmail.com>,
	 Alexandre Torgue <alexandre.torgue@foss.st.com>,
	 Chen-Yu Tsai <wens@kernel.org>,
	Jernej Skrabec <jernej.skrabec@gmail.com>,
	 Nishanth Menon <nm@ti.com>, Tero Kristo <kristo@kernel.org>,
	 Santosh Shilimkar <ssantosh@kernel.org>,
	Linus Walleij <linusw@kernel.org>,
	 Michal Simek <michal.simek@amd.com>,
	 Anirudha Sarangi <anirudha.sarangi@amd.com>,
	 Tushar Nimkar <tushar.nimkar@amd.com>
Cc: linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	 linux-samsung-soc@vger.kernel.org, linux-i2c@vger.kernel.org,
	 openbmc@lists.ozlabs.org, linux-aspeed@lists.ozlabs.org,
	 linux-rpi-kernel@lists.infradead.org,
	linux-mips@vger.kernel.org,  imx@lists.linux.dev,
	loongarch@lists.linux.dev,  linux-riscv@lists.infradead.org,
	linux-stm32@st-md-mailman.stormreply.com,
	 linux-sunxi@lists.linux.dev, git@amd.com,
	linux-arm-msm@vger.kernel.org,  Peng Fan <peng.fan@nxp.com>
Subject: [PATCH] irqchip: Convert chained handlers to guard_chained_irq()
Date: Sat, 14 Nov 2026 23:06:15 +0800	[thread overview]
Message-ID: <20261114-irqchip-cleanup-api-v1-1-4a9d598b0bdb@nxp.com> (raw)

From: Peng Fan <peng.fan@nxp.com>

Use the scope-based guard_chained_irq() helper in all chained handlers
under drivers/irqchip/ so that chained_irq_exit() is always invoked when
the handler returns. Handlers that duplicated the exit call on an error
path or jumped to a common exit label simply return now and rely on the
guard.

No functional changes.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
With [1] now merged in irq/drivers, convert the chained IRQ handlers in
drivers/irqchip/ to use guard_chained_irq(). This removes the explicit
chained_irq_exit() calls and the gotos that only existed to reach them,
reducing boilerplate.

I use a script to do the job, and after that, do mannual checking.

No functional changes.

[1] https://lore.kernel.org/all/179417458323.2093942.14330197609841896598.tip-bot2@tip-bot2/#t
---
 drivers/irqchip/exynos-combiner.c          | 7 ++-----
 drivers/irqchip/irq-aclint-sswi.c          | 4 +---
 drivers/irqchip/irq-armada-370-xp.c        | 4 +---
 drivers/irqchip/irq-aspeed-i2c-ic.c        | 4 +---
 drivers/irqchip/irq-aspeed-scu-ic.c        | 8 ++------
 drivers/irqchip/irq-ast2700-intc1.c        | 4 +---
 drivers/irqchip/irq-ath79-misc.c           | 5 +----
 drivers/irqchip/irq-bcm2836.c              | 4 +---
 drivers/irqchip/irq-bcm6345-l1.c           | 4 +---
 drivers/irqchip/irq-bcm7038-l1.c           | 4 +---
 drivers/irqchip/irq-bcm7120-l2.c           | 4 +---
 drivers/irqchip/irq-brcmstb-l2.c           | 4 +---
 drivers/irqchip/irq-dw-apb-ictl.c          | 4 +---
 drivers/irqchip/irq-econet-en751221.c      | 4 +---
 drivers/irqchip/irq-gic.c                  | 6 ++----
 drivers/irqchip/irq-goldfish-pic.c         | 4 +---
 drivers/irqchip/irq-idt3243x.c             | 4 +---
 drivers/irqchip/irq-imx-intmux.c           | 4 +---
 drivers/irqchip/irq-imx-irqsteer.c         | 7 ++-----
 drivers/irqchip/irq-imx-mu-msi.c           | 3 +--
 drivers/irqchip/irq-ingenic-tcu.c          | 4 +---
 drivers/irqchip/irq-lan966x-oic.c          | 3 +--
 drivers/irqchip/irq-loongarch-avec.c       | 4 +---
 drivers/irqchip/irq-loongson-eiointc.c     | 4 +---
 drivers/irqchip/irq-loongson-htpic.c       | 3 +--
 drivers/irqchip/irq-loongson-htvec.c       | 4 +---
 drivers/irqchip/irq-loongson-liointc.c     | 4 +---
 drivers/irqchip/irq-loongson-pch-lpc.c     | 3 +--
 drivers/irqchip/irq-lpc32xx.c              | 4 +---
 drivers/irqchip/irq-ls-scfg-msi.c          | 4 +---
 drivers/irqchip/irq-ls1x.c                 | 4 +---
 drivers/irqchip/irq-mmp.c                  | 7 ++-----
 drivers/irqchip/irq-mscc-ocelot.c          | 4 +---
 drivers/irqchip/irq-mvebu-pic.c            | 4 +---
 drivers/irqchip/irq-mvebu-sei.c            | 4 +---
 drivers/irqchip/irq-pruss-intc.c           | 4 +---
 drivers/irqchip/irq-realtek-rtl.c          | 7 ++-----
 drivers/irqchip/irq-riscv-aplic-direct.c   | 4 +---
 drivers/irqchip/irq-riscv-imsic-early.c    | 4 +---
 drivers/irqchip/irq-sifive-plic.c          | 8 ++------
 drivers/irqchip/irq-sp7021-intc.c          | 4 +---
 drivers/irqchip/irq-starfive-jhb100-intc.c | 4 +---
 drivers/irqchip/irq-stm32-exti.c           | 4 +---
 drivers/irqchip/irq-sunxi-nmi.c            | 3 +--
 drivers/irqchip/irq-ti-sci-inta.c          | 4 +---
 drivers/irqchip/irq-ts4800.c               | 7 ++-----
 drivers/irqchip/irq-versatile-fpga.c       | 7 ++-----
 drivers/irqchip/irq-vic.c                  | 4 +---
 drivers/irqchip/irq-vt8500.c               | 3 +--
 drivers/irqchip/irq-xilinx-intc.c          | 3 +--
 drivers/irqchip/irq-xilinx-smmu-csr.c      | 4 +---
 drivers/irqchip/qcom-irq-combiner.c        | 4 +---
 52 files changed, 61 insertions(+), 169 deletions(-)

diff --git a/drivers/irqchip/exynos-combiner.c b/drivers/irqchip/exynos-combiner.c
index d9d408cb4711..992711639ba7 100644
--- a/drivers/irqchip/exynos-combiner.c
+++ b/drivers/irqchip/exynos-combiner.c
@@ -68,21 +68,18 @@ static void combiner_handle_cascade_irq(struct irq_desc *desc)
 	unsigned long status;
 	int ret;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	status = readl_relaxed(chip_data->base + COMBINER_INT_STATUS);
 	status &= chip_data->irq_mask;
 
 	if (status == 0)
-		goto out;
+		return;
 
 	combiner_irq = chip_data->hwirq_offset + __ffs(status);
 	ret = generic_handle_domain_irq(combiner_irq_domain, combiner_irq);
 	if (unlikely(ret))
 		handle_bad_irq(desc);
-
- out:
-	chained_irq_exit(chip, desc);
 }
 
 #ifdef CONFIG_SMP
diff --git a/drivers/irqchip/irq-aclint-sswi.c b/drivers/irqchip/irq-aclint-sswi.c
index 34572db94f3d..db3d1c642a48 100644
--- a/drivers/irqchip/irq-aclint-sswi.c
+++ b/drivers/irqchip/irq-aclint-sswi.c
@@ -33,14 +33,12 @@ static void aclint_sswi_ipi_handle(struct irq_desc *desc)
 {
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	csr_clear(CSR_IP, IE_SIE);
 	aclint_sswi_ipi_clear();
 
 	ipi_mux_process();
-
-	chained_irq_exit(chip, desc);
 }
 
 static int aclint_sswi_starting_cpu(unsigned int cpu)
diff --git a/drivers/irqchip/irq-armada-370-xp.c b/drivers/irqchip/irq-armada-370-xp.c
index 1ba82ac0c26b..c643ce1f4d93 100644
--- a/drivers/irqchip/irq-armada-370-xp.c
+++ b/drivers/irqchip/irq-armada-370-xp.c
@@ -675,7 +675,7 @@ static void mpic_handle_cascade_irq(struct irq_desc *desc)
 	u32 irqsrc, cpuid;
 	irq_hw_number_t i;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	cause = readl_relaxed(mpic->per_cpu + MPIC_PPI_CAUSE);
 	cpuid = cpu_logical_map(smp_processor_id());
@@ -696,8 +696,6 @@ static void mpic_handle_cascade_irq(struct irq_desc *desc)
 
 		generic_handle_domain_irq(mpic->domain, i);
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static void __exception_irq_entry mpic_handle_irq(struct pt_regs *regs)
diff --git a/drivers/irqchip/irq-aspeed-i2c-ic.c b/drivers/irqchip/irq-aspeed-i2c-ic.c
index 7996fd5cbae6..0598d352f543 100644
--- a/drivers/irqchip/irq-aspeed-i2c-ic.c
+++ b/drivers/irqchip/irq-aspeed-i2c-ic.c
@@ -35,12 +35,10 @@ static void aspeed_i2c_ic_irq_handler(struct irq_desc *desc)
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	unsigned long bit, status;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 	status = readl(i2c_ic->base);
 	for_each_set_bit(bit, &status, ASPEED_I2C_IC_NUM_BUS)
 		generic_handle_domain_irq(i2c_ic->irq_domain, bit);
-
-	chained_irq_exit(chip, desc);
 }
 
 /*
diff --git a/drivers/irqchip/irq-aspeed-scu-ic.c b/drivers/irqchip/irq-aspeed-scu-ic.c
index 097cf45b2126..44b51f1102ef 100644
--- a/drivers/irqchip/irq-aspeed-scu-ic.c
+++ b/drivers/irqchip/irq-aspeed-scu-ic.c
@@ -70,7 +70,7 @@ static void aspeed_scu_ic_irq_handler_combined(struct irq_desc *desc)
 	unsigned long bit, enabled, max, status;
 	unsigned int sts, mask;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	mask = scu_ic->irq_enable << ASPEED_SCU_IC_STATUS_SHIFT;
 	/*
@@ -95,8 +95,6 @@ static void aspeed_scu_ic_irq_handler_combined(struct irq_desc *desc)
 		writel((readl(scu_ic->base) & ~mask) | BIT(bit + ASPEED_SCU_IC_STATUS_SHIFT),
 		       scu_ic->base);
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static void aspeed_scu_ic_irq_handler_split(struct irq_desc *desc)
@@ -106,7 +104,7 @@ static void aspeed_scu_ic_irq_handler_split(struct irq_desc *desc)
 	unsigned long bit, enabled, max, status;
 	unsigned int sts;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	sts = readl(scu_ic->base + scu_ic->isr);
 	enabled = sts & scu_ic->irq_enable;
@@ -121,8 +119,6 @@ static void aspeed_scu_ic_irq_handler_split(struct irq_desc *desc)
 		/* Clear interrupt */
 		writel(BIT(bit), scu_ic->base + scu_ic->isr);
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static void aspeed_scu_ic_irq_mask_combined(struct irq_data *data)
diff --git a/drivers/irqchip/irq-ast2700-intc1.c b/drivers/irqchip/irq-ast2700-intc1.c
index aa5240ce1c57..75d731dd55a5 100644
--- a/drivers/irqchip/irq-ast2700-intc1.c
+++ b/drivers/irqchip/irq-ast2700-intc1.c
@@ -54,7 +54,7 @@ static void aspeed_intc1_irq_handler(struct irq_desc *desc)
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	unsigned long bit, status;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	for (int bank = 0; bank < INTC1_BANK_NUM; bank++) {
 		status = readl(intc1->base + INTC1_ISR + (INTC1_BANK_SIZE * bank));
@@ -66,8 +66,6 @@ static void aspeed_intc1_irq_handler(struct irq_desc *desc)
 			writel(BIT(bit), intc1->base + INTC1_ISR + (INTC1_BANK_SIZE * bank));
 		}
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static void aspeed_intc1_irq_mask(struct irq_data *data)
diff --git a/drivers/irqchip/irq-ath79-misc.c b/drivers/irqchip/irq-ath79-misc.c
index 258b8e9a2d57..dac0c69da64b 100644
--- a/drivers/irqchip/irq-ath79-misc.c
+++ b/drivers/irqchip/irq-ath79-misc.c
@@ -38,14 +38,13 @@ static void ath79_misc_irq_handler(struct irq_desc *desc)
 	void __iomem *base = domain->host_data;
 	u32 pending;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	pending = __raw_readl(base + AR71XX_RESET_REG_MISC_INT_STATUS) &
 		  __raw_readl(base + AR71XX_RESET_REG_MISC_INT_ENABLE);
 
 	if (!pending) {
 		spurious_interrupt();
-		chained_irq_exit(chip, desc);
 		return;
 	}
 
@@ -55,8 +54,6 @@ static void ath79_misc_irq_handler(struct irq_desc *desc)
 		generic_handle_domain_irq(domain, bit);
 		pending &= ~BIT(bit);
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static void ar71xx_misc_irq_unmask(struct irq_data *d)
diff --git a/drivers/irqchip/irq-bcm2836.c b/drivers/irqchip/irq-bcm2836.c
index fafd1f71348e..2837ce0e4de8 100644
--- a/drivers/irqchip/irq-bcm2836.c
+++ b/drivers/irqchip/irq-bcm2836.c
@@ -159,15 +159,13 @@ static void bcm2836_arm_irqchip_handle_ipi(struct irq_desc *desc)
 	int cpu = smp_processor_id();
 	u32 mbox_val;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	mbox_val = readl_relaxed(intc.base + LOCAL_MAILBOX0_CLR0 + 16 * cpu);
 	if (mbox_val) {
 		int hwirq = ffs(mbox_val) - 1;
 		generic_handle_domain_irq(ipi_domain, hwirq);
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static void bcm2836_arm_irqchip_ipi_ack(struct irq_data *d)
diff --git a/drivers/irqchip/irq-bcm6345-l1.c b/drivers/irqchip/irq-bcm6345-l1.c
index d446d8124a8b..e9a337ced1b1 100644
--- a/drivers/irqchip/irq-bcm6345-l1.c
+++ b/drivers/irqchip/irq-bcm6345-l1.c
@@ -120,7 +120,7 @@ static void bcm6345_l1_irq_handle(struct irq_desc *desc)
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	unsigned int idx;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	for (idx = 0; idx < intc->n_words; idx++) {
 		int base = idx * IRQS_PER_WORD;
@@ -135,8 +135,6 @@ static void bcm6345_l1_irq_handle(struct irq_desc *desc)
 				spurious_interrupt();
 		}
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static inline void __bcm6345_l1_unmask(struct irq_data *d)
diff --git a/drivers/irqchip/irq-bcm7038-l1.c b/drivers/irqchip/irq-bcm7038-l1.c
index 54a8557ef557..3b24a258e75b 100644
--- a/drivers/irqchip/irq-bcm7038-l1.c
+++ b/drivers/irqchip/irq-bcm7038-l1.c
@@ -123,7 +123,7 @@ static void bcm7038_l1_irq_handle(struct irq_desc *desc)
 	cpu = intc->cpus[0];
 #endif
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	for (idx = 0; idx < intc->n_words; idx++) {
 		int base = idx * IRQS_PER_WORD;
@@ -138,8 +138,6 @@ static void bcm7038_l1_irq_handle(struct irq_desc *desc)
 		for_each_set_bit(hwirq, &pending, IRQS_PER_WORD)
 			generic_handle_domain_irq(intc->domain, base + hwirq);
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static void __bcm7038_l1_unmask(struct irq_data *d, unsigned int cpu_idx)
diff --git a/drivers/irqchip/irq-bcm7120-l2.c b/drivers/irqchip/irq-bcm7120-l2.c
index a98f0ee46b6c..3428b5fd29dc 100644
--- a/drivers/irqchip/irq-bcm7120-l2.c
+++ b/drivers/irqchip/irq-bcm7120-l2.c
@@ -59,7 +59,7 @@ static void bcm7120_l2_intc_irq_handle(struct irq_desc *desc)
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	unsigned int idx;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	for (idx = 0; idx < b->n_words; idx++) {
 		int base = idx * IRQS_PER_WORD;
@@ -76,8 +76,6 @@ static void bcm7120_l2_intc_irq_handle(struct irq_desc *desc)
 		for_each_set_bit(hwirq, &pending, IRQS_PER_WORD)
 			generic_handle_domain_irq(b->domain, base + hwirq);
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static void bcm7120_l2_intc_suspend(struct irq_chip_generic *gc)
diff --git a/drivers/irqchip/irq-brcmstb-l2.c b/drivers/irqchip/irq-brcmstb-l2.c
index d336ac822ea0..cb5365356841 100644
--- a/drivers/irqchip/irq-brcmstb-l2.c
+++ b/drivers/irqchip/irq-brcmstb-l2.c
@@ -68,7 +68,7 @@ static void brcmstb_l2_intc_irq_handle(struct irq_desc *desc)
 	unsigned int irq;
 	u32 status;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	status = irq_reg_readl(b->gc, b->status_offset) &
 		~(irq_reg_readl(b->gc, b->mask_offset));
@@ -88,8 +88,6 @@ static void brcmstb_l2_intc_irq_handle(struct irq_desc *desc)
 out:
 	/* Don't ack parent before all device writes are done */
 	wmb();
-
-	chained_irq_exit(chip, desc);
 }
 
 static void __brcmstb_l2_intc_suspend(struct irq_data *d, bool save)
diff --git a/drivers/irqchip/irq-dw-apb-ictl.c b/drivers/irqchip/irq-dw-apb-ictl.c
index 4240a0dbf627..b3673bc1205c 100644
--- a/drivers/irqchip/irq-dw-apb-ictl.c
+++ b/drivers/irqchip/irq-dw-apb-ictl.c
@@ -54,7 +54,7 @@ static void dw_apb_ictl_handle_irq_cascaded(struct irq_desc *desc)
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	int n;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	for (n = 0; n < d->revmap_size; n += 32) {
 		struct irq_chip_generic *gc = irq_get_domain_generic_chip(d, n);
@@ -67,8 +67,6 @@ static void dw_apb_ictl_handle_irq_cascaded(struct irq_desc *desc)
 			stat &= ~BIT(hwirq);
 		}
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static int dw_apb_ictl_irq_domain_alloc(struct irq_domain *domain, unsigned int virq,
diff --git a/drivers/irqchip/irq-econet-en751221.c b/drivers/irqchip/irq-econet-en751221.c
index 2ca5d901866f..33726762d269 100644
--- a/drivers/irqchip/irq-econet-en751221.c
+++ b/drivers/irqchip/irq-econet-en751221.c
@@ -140,7 +140,7 @@ static void econet_intc_from_parent(struct irq_desc *desc)
 	struct irq_domain *domain;
 	u32 pending0, pending1;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	pending0 = ioread32(econet_intc.membase + REG_PENDING0);
 	pending1 = ioread32(econet_intc.membase + REG_PENDING1);
@@ -152,8 +152,6 @@ static void econet_intc_from_parent(struct irq_desc *desc)
 		econet_intc_handle_pending(domain, pending0, 0);
 		econet_intc_handle_pending(domain, pending1, 32);
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 /*
diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c
index 420261208cd0..a66aec6776d4 100644
--- a/drivers/irqchip/irq-gic.c
+++ b/drivers/irqchip/irq-gic.c
@@ -379,20 +379,18 @@ static void gic_handle_cascade_irq(struct irq_desc *desc)
 	unsigned long status;
 	int ret;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	status = readl_relaxed(gic_data_cpu_base(chip_data) + GIC_CPU_INTACK);
 
 	gic_irq = (status & GICC_IAR_INT_ID_MASK);
 	if (gic_irq == GICC_INT_SPURIOUS)
-		goto out;
+		return;
 
 	isb();
 	ret = generic_handle_domain_irq(chip_data->domain, gic_irq);
 	if (unlikely(ret))
 		handle_bad_irq(desc);
- out:
-	chained_irq_exit(chip, desc);
 }
 
 static void gic_irq_print_chip(struct irq_data *d, struct seq_file *p)
diff --git a/drivers/irqchip/irq-goldfish-pic.c b/drivers/irqchip/irq-goldfish-pic.c
index d458cf898f8e..6aa4acd8ab02 100644
--- a/drivers/irqchip/irq-goldfish-pic.c
+++ b/drivers/irqchip/irq-goldfish-pic.c
@@ -36,7 +36,7 @@ static void goldfish_pic_cascade(struct irq_desc *desc)
 	struct irq_chip *host_chip = irq_desc_get_chip(desc);
 	u32 pending, hwirq;
 
-	chained_irq_enter(host_chip, desc);
+	guard_chained_irq(host_chip, desc);
 
 	pending = readl(gfpic->base + GFPIC_REG_IRQ_PENDING);
 	while (pending) {
@@ -44,8 +44,6 @@ static void goldfish_pic_cascade(struct irq_desc *desc)
 		generic_handle_domain_irq(gfpic->irq_domain, hwirq);
 		pending &= ~(1 << hwirq);
 	}
-
-	chained_irq_exit(host_chip, desc);
 }
 
 static const struct irq_domain_ops goldfish_irq_domain_ops = {
diff --git a/drivers/irqchip/irq-idt3243x.c b/drivers/irqchip/irq-idt3243x.c
index 8b150c7f7e46..6af1ddfc0e64 100644
--- a/drivers/irqchip/irq-idt3243x.c
+++ b/drivers/irqchip/irq-idt3243x.c
@@ -30,7 +30,7 @@ static void idt_irq_dispatch(struct irq_desc *desc)
 	struct irq_chip *host_chip = irq_desc_get_chip(desc);
 	u32 pending, hwirq;
 
-	chained_irq_enter(host_chip, desc);
+	guard_chained_irq(host_chip, desc);
 
 	pending = irq_reg_readl(idtpic->gc, IDT_PIC_IRQ_PEND);
 	pending &= ~idtpic->gc->mask_cache;
@@ -39,8 +39,6 @@ static void idt_irq_dispatch(struct irq_desc *desc)
 		generic_handle_domain_irq(idtpic->irq_domain, hwirq);
 		pending &= ~(1 << hwirq);
 	}
-
-	chained_irq_exit(host_chip, desc);
 }
 
 static int idt_pic_init(struct device_node *of_node, struct device_node *parent)
diff --git a/drivers/irqchip/irq-imx-intmux.c b/drivers/irqchip/irq-imx-intmux.c
index c7914fea3d1f..73926dec52ab 100644
--- a/drivers/irqchip/irq-imx-intmux.c
+++ b/drivers/irqchip/irq-imx-intmux.c
@@ -187,15 +187,13 @@ static void imx_intmux_irq_handler(struct irq_desc *desc)
 	unsigned long irqstat;
 	int pos;
 
-	chained_irq_enter(irq_desc_get_chip(desc), desc);
+	guard_chained_irq(irq_desc_get_chip(desc), desc);
 
 	/* read the interrupt source pending status of this channel */
 	irqstat = readl_relaxed(data->regs + CHANIPR(idx));
 
 	for_each_set_bit(pos, &irqstat, 32)
 		generic_handle_domain_irq(irqchip_data->domain, pos);
-
-	chained_irq_exit(irq_desc_get_chip(desc), desc);
 }
 
 static int imx_intmux_probe(struct platform_device *pdev)
diff --git a/drivers/irqchip/irq-imx-irqsteer.c b/drivers/irqchip/irq-imx-irqsteer.c
index 4e0f7eac0c8b..e117c8a1102d 100644
--- a/drivers/irqchip/irq-imx-irqsteer.c
+++ b/drivers/irqchip/irq-imx-irqsteer.c
@@ -148,14 +148,14 @@ static void imx_irqsteer_irq_handler(struct irq_desc *desc)
 	int hwirq;
 	int irq, i;
 
-	chained_irq_enter(irq_desc_get_chip(desc), desc);
+	guard_chained_irq(irq_desc_get_chip(desc), desc);
 
 	irq = irq_desc_get_irq(desc);
 	hwirq = imx_irqsteer_get_hwirq_base(data, irq);
 	if (hwirq < 0) {
 		pr_warn("%s: unable to get hwirq base for irq %d\n",
 			__func__, irq);
-		goto out;
+		return;
 	}
 
 	for (i = 0; i < 2; i++, hwirq += 32) {
@@ -172,9 +172,6 @@ static void imx_irqsteer_irq_handler(struct irq_desc *desc)
 		for_each_set_bit(pos, &irqmap, 32)
 			generic_handle_domain_irq(data->domain, pos + hwirq);
 	}
-
-out:
-	chained_irq_exit(irq_desc_get_chip(desc), desc);
 }
 
 static int imx_irqsteer_probe(struct platform_device *pdev)
diff --git a/drivers/irqchip/irq-imx-mu-msi.c b/drivers/irqchip/irq-imx-mu-msi.c
index 6d7baeeb2bc8..7b69cba4ba76 100644
--- a/drivers/irqchip/irq-imx-mu-msi.c
+++ b/drivers/irqchip/irq-imx-mu-msi.c
@@ -197,12 +197,11 @@ static void imx_mu_msi_irq_handler(struct irq_desc *desc)
 
 	status = imx_mu_read(msi_data, msi_data->cfg->xSR[IMX_MU_RSR]);
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 	for (i = 0; i < IMX_MU_CHANS; i++) {
 		if (status & IMX_MU_xSR_RFn(msi_data, i))
 			generic_handle_domain_irq(msi_data->msi_domain, i);
 	}
-	chained_irq_exit(chip, desc);
 }
 
 #define IMX_MU_MSI_FLAGS_REQUIRED	(MSI_FLAG_USE_DEF_DOM_OPS |	\
diff --git a/drivers/irqchip/irq-ingenic-tcu.c b/drivers/irqchip/irq-ingenic-tcu.c
index eebfdf107bd9..0cd0c74e2fc2 100644
--- a/drivers/irqchip/irq-ingenic-tcu.c
+++ b/drivers/irqchip/irq-ingenic-tcu.c
@@ -34,15 +34,13 @@ static void ingenic_tcu_intc_cascade(struct irq_desc *desc)
 	regmap_read(map, TCU_REG_TFR, &irq_reg);
 	regmap_read(map, TCU_REG_TMR, &irq_mask);
 
-	chained_irq_enter(irq_chip, desc);
+	guard_chained_irq(irq_chip, desc);
 
 	irq_reg &= ~irq_mask;
 	bits = irq_reg;
 
 	for_each_set_bit(i, &bits, 32)
 		generic_handle_domain_irq(domain, i);
-
-	chained_irq_exit(irq_chip, desc);
 }
 
 static void ingenic_tcu_gc_unmask_enable_reg(struct irq_data *d)
diff --git a/drivers/irqchip/irq-lan966x-oic.c b/drivers/irqchip/irq-lan966x-oic.c
index 40e1f26201da..5b9e2b8d7387 100644
--- a/drivers/irqchip/irq-lan966x-oic.c
+++ b/drivers/irqchip/irq-lan966x-oic.c
@@ -131,11 +131,10 @@ static void lan966x_oic_irq_handler(struct irq_desc *desc)
 	struct irq_domain *d = irq_desc_get_handler_data(desc);
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 	lan966x_oic_irq_handler_domain(d, 0);
 	lan966x_oic_irq_handler_domain(d, 32);
 	lan966x_oic_irq_handler_domain(d, 64);
-	chained_irq_exit(chip, desc);
 }
 
 static struct lan966x_oic_chip_regs lan966x_oic_chip_regs[3] = {
diff --git a/drivers/irqchip/irq-loongarch-avec.c b/drivers/irqchip/irq-loongarch-avec.c
index 53d7d23af9bb..8c7316f70930 100644
--- a/drivers/irqchip/irq-loongarch-avec.c
+++ b/drivers/irqchip/irq-loongarch-avec.c
@@ -224,7 +224,7 @@ static void avecintc_irq_dispatch(struct irq_desc *desc)
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	struct irq_desc *d;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	while (true) {
 		unsigned long vector = csr_read(LOONGARCH_CSR_IRR);
@@ -241,8 +241,6 @@ static void avecintc_irq_dispatch(struct irq_desc *desc)
 			pr_warn("Unexpected IRQ occurs on CPU#%d [vector %ld]\n", smp_processor_id(), vector);
 		}
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static int avecintc_alloc_vector(struct irq_data *irqd, struct avecintc_data *adata)
diff --git a/drivers/irqchip/irq-loongson-eiointc.c b/drivers/irqchip/irq-loongson-eiointc.c
index ba6e8480e383..93f5aba1473d 100644
--- a/drivers/irqchip/irq-loongson-eiointc.c
+++ b/drivers/irqchip/irq-loongson-eiointc.c
@@ -313,7 +313,7 @@ static void eiointc_irq_dispatch(struct irq_desc *desc)
 	bool handled = false;
 	int i;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	/*
 	 * If EIOINTC_ROUTE_MULT_IP is set, every 64 interrupt vectors in
@@ -343,8 +343,6 @@ static void eiointc_irq_dispatch(struct irq_desc *desc)
 
 	if (!handled)
 		spurious_interrupt();
-
-	chained_irq_exit(chip, desc);
 }
 
 static void eiointc_ack_irq(struct irq_data *d)
diff --git a/drivers/irqchip/irq-loongson-htpic.c b/drivers/irqchip/irq-loongson-htpic.c
index 2d78112f7fc7..896fa1daea26 100644
--- a/drivers/irqchip/irq-loongson-htpic.c
+++ b/drivers/irqchip/irq-loongson-htpic.c
@@ -32,7 +32,7 @@ static void htpic_irq_dispatch(struct irq_desc *desc)
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	uint32_t pending;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 	pending = readl(priv->base);
 	/* Ack all IRQs at once, otherwise IRQ flood might happen */
 	writel(pending, priv->base);
@@ -51,7 +51,6 @@ static void htpic_irq_dispatch(struct irq_desc *desc)
 		generic_handle_domain_irq(priv->domain, bit);
 		pending &= ~BIT(bit);
 	}
-	chained_irq_exit(chip, desc);
 }
 
 static void htpic_reg_init(void)
diff --git a/drivers/irqchip/irq-loongson-htvec.c b/drivers/irqchip/irq-loongson-htvec.c
index 75e40ba6069d..9c23ab234d25 100644
--- a/drivers/irqchip/irq-loongson-htvec.c
+++ b/drivers/irqchip/irq-loongson-htvec.c
@@ -44,7 +44,7 @@ static void htvec_irq_dispatch(struct irq_desc *desc)
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	struct htvec *priv = irq_desc_get_handler_data(desc);
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	for (i = 0; i < priv->num_parents; i++) {
 		pending = readl(priv->base + 4 * i);
@@ -60,8 +60,6 @@ static void htvec_irq_dispatch(struct irq_desc *desc)
 
 	if (!handled)
 		spurious_interrupt();
-
-	chained_irq_exit(chip, desc);
 }
 
 static void htvec_ack_irq(struct irq_data *d)
diff --git a/drivers/irqchip/irq-loongson-liointc.c b/drivers/irqchip/irq-loongson-liointc.c
index cf44a333b9c8..a8eac6d53f9b 100644
--- a/drivers/irqchip/irq-loongson-liointc.c
+++ b/drivers/irqchip/irq-loongson-liointc.c
@@ -76,7 +76,7 @@ static void liointc_chained_handle_irq(struct irq_desc *desc)
 	int core = liointc_core_id % LIOINTC_NUM_CORES;
 	u32 pending;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	pending = readl(handler->priv->core_isr[core]);
 
@@ -96,8 +96,6 @@ static void liointc_chained_handle_irq(struct irq_desc *desc)
 		generic_handle_domain_irq(gc->domain, bit);
 		pending &= ~BIT(bit);
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static void liointc_set_bit(struct irq_chip_generic *gc,
diff --git a/drivers/irqchip/irq-loongson-pch-lpc.c b/drivers/irqchip/irq-loongson-pch-lpc.c
index 7117ca6fc2f0..9bcd106de33a 100644
--- a/drivers/irqchip/irq-loongson-pch-lpc.c
+++ b/drivers/irqchip/irq-loongson-pch-lpc.c
@@ -110,7 +110,7 @@ static void lpc_irq_dispatch(struct irq_desc *desc)
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	struct pch_lpc *priv = irq_desc_get_handler_data(desc);
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	pending = readl(priv->base + LPC_INT_ENA);
 	pending &= readl(priv->base + LPC_INT_STS);
@@ -123,7 +123,6 @@ static void lpc_irq_dispatch(struct irq_desc *desc)
 		generic_handle_domain_irq(priv->lpc_domain, bit);
 		pending &= ~BIT(bit);
 	}
-	chained_irq_exit(chip, desc);
 }
 
 static int pch_lpc_map(struct irq_domain *d, unsigned int irq,
diff --git a/drivers/irqchip/irq-lpc32xx.c b/drivers/irqchip/irq-lpc32xx.c
index 6ff93df614f8..52e790af00f9 100644
--- a/drivers/irqchip/irq-lpc32xx.c
+++ b/drivers/irqchip/irq-lpc32xx.c
@@ -155,15 +155,13 @@ static void lpc32xx_sic_handler(struct irq_desc *desc)
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	u32 hwirq = lpc32xx_ic_read(ic, LPC32XX_INTC_STAT), irq;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	while (hwirq) {
 		irq = __ffs(hwirq);
 		hwirq &= ~BIT(irq);
 		generic_handle_domain_irq(ic->domain, irq);
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static int lpc32xx_irq_domain_map(struct irq_domain *id, unsigned int virq,
diff --git a/drivers/irqchip/irq-ls-scfg-msi.c b/drivers/irqchip/irq-ls-scfg-msi.c
index 50ce01c9cd2d..e94be9d056c4 100644
--- a/drivers/irqchip/irq-ls-scfg-msi.c
+++ b/drivers/irqchip/irq-ls-scfg-msi.c
@@ -198,7 +198,7 @@ static void ls_scfg_msi_irq_handler(struct irq_desc *desc)
 	unsigned long val;
 	int pos, size, hwirq;
 
-	chained_irq_enter(irq_desc_get_chip(desc), desc);
+	guard_chained_irq(irq_desc_get_chip(desc), desc);
 
 	val = ioread32be(msir->reg);
 
@@ -210,8 +210,6 @@ static void ls_scfg_msi_irq_handler(struct irq_desc *desc)
 			msir->srs;
 		generic_handle_domain_irq(msi_data->parent, hwirq);
 	}
-
-	chained_irq_exit(irq_desc_get_chip(desc), desc);
 }
 
 static int ls_scfg_msi_domains_init(struct ls_scfg_msi *msi_data)
diff --git a/drivers/irqchip/irq-ls1x.c b/drivers/irqchip/irq-ls1x.c
index 208f9d4cd99f..9c3a8946674e 100644
--- a/drivers/irqchip/irq-ls1x.c
+++ b/drivers/irqchip/irq-ls1x.c
@@ -40,7 +40,7 @@ static void ls1x_chained_handle_irq(struct irq_desc *desc)
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	u32 pending;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 	pending = readl(priv->intc_base + LS_REG_INTC_STATUS) &
 			readl(priv->intc_base + LS_REG_INTC_EN);
 
@@ -53,8 +53,6 @@ static void ls1x_chained_handle_irq(struct irq_desc *desc)
 		generic_handle_domain_irq(priv->domain, bit);
 		pending &= ~BIT(bit);
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static void ls_intc_set_bit(struct irq_chip_generic *gc,
diff --git a/drivers/irqchip/irq-mmp.c b/drivers/irqchip/irq-mmp.c
index 8e210cb451be..9fe0085106eb 100644
--- a/drivers/irqchip/irq-mmp.c
+++ b/drivers/irqchip/irq-mmp.c
@@ -152,7 +152,7 @@ static void icu_mux_irq_demux(struct irq_desc *desc)
 	int i;
 	unsigned long mask, status, n;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	for (i = 1; i < max_icu_nr; i++) {
 		if (irq == icu_data[i].cascade_irq) {
@@ -163,7 +163,7 @@ static void icu_mux_irq_demux(struct irq_desc *desc)
 	}
 	if (i >= max_icu_nr) {
 		pr_err("Spurious irq %d in MMP INTC\n", irq);
-		goto out;
+		return;
 	}
 
 	mask = readl_relaxed(data->reg_mask);
@@ -175,9 +175,6 @@ static void icu_mux_irq_demux(struct irq_desc *desc)
 			generic_handle_irq(icu_data[i].virq_base + n);
 		}
 	}
-
-out:
-	chained_irq_exit(chip, desc);
 }
 
 static int mmp_irq_domain_map(struct irq_domain *d, unsigned int irq,
diff --git a/drivers/irqchip/irq-mscc-ocelot.c b/drivers/irqchip/irq-mscc-ocelot.c
index 8cbc191f750b..ced780012591 100644
--- a/drivers/irqchip/irq-mscc-ocelot.c
+++ b/drivers/irqchip/irq-mscc-ocelot.c
@@ -107,7 +107,7 @@ static void ocelot_irq_handler(struct irq_desc *desc)
 	struct irq_chip_generic *gc = irq_get_domain_generic_chip(d, 0);
 	u32 reg = irq_reg_readl(gc, ICPU_CFG_INTR_DST_INTR_IDENT(p, 0));
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	while (reg) {
 		u32 hwirq = __fls(reg);
@@ -115,8 +115,6 @@ static void ocelot_irq_handler(struct irq_desc *desc)
 		generic_handle_domain_irq(d, hwirq);
 		reg &= ~(BIT(hwirq));
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static int __init vcoreiii_irq_init(struct device_node *node,
diff --git a/drivers/irqchip/irq-mvebu-pic.c b/drivers/irqchip/irq-mvebu-pic.c
index 81ea0e79402d..b33f08eed98f 100644
--- a/drivers/irqchip/irq-mvebu-pic.c
+++ b/drivers/irqchip/irq-mvebu-pic.c
@@ -107,12 +107,10 @@ static void mvebu_pic_handle_cascade_irq(struct irq_desc *desc)
 	unsigned long irqmap, irqn;
 
 	irqmap = readl_relaxed(pic->base + PIC_CAUSE);
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	for_each_set_bit(irqn, &irqmap, BITS_PER_LONG)
 		generic_handle_domain_irq(pic->domain, irqn);
-
-	chained_irq_exit(chip, desc);
 }
 
 static void mvebu_pic_enable_percpu_irq(void *data)
diff --git a/drivers/irqchip/irq-mvebu-sei.c b/drivers/irqchip/irq-mvebu-sei.c
index 5a6b61b2fb1a..716ef764af6a 100644
--- a/drivers/irqchip/irq-mvebu-sei.c
+++ b/drivers/irqchip/irq-mvebu-sei.c
@@ -316,7 +316,7 @@ static void mvebu_sei_handle_cascade_irq(struct irq_desc *desc)
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	u32 idx;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	for (idx = 0; idx < SEI_IRQ_REG_COUNT; idx++) {
 		unsigned long irqmap;
@@ -333,8 +333,6 @@ static void mvebu_sei_handle_cascade_irq(struct irq_desc *desc)
 				dev_warn(sei->dev, "Spurious IRQ detected (hwirq %lu)\n", hwirq);
 		}
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static void mvebu_sei_reset(struct mvebu_sei *sei)
diff --git a/drivers/irqchip/irq-pruss-intc.c b/drivers/irqchip/irq-pruss-intc.c
index 9a3efd40790c..fca8e838ccfe 100644
--- a/drivers/irqchip/irq-pruss-intc.c
+++ b/drivers/irqchip/irq-pruss-intc.c
@@ -475,7 +475,7 @@ static void pruss_intc_irq_handler(struct irq_desc *desc)
 	struct pruss_intc *intc = host_irq_data->intc;
 	u8 host_irq = host_irq_data->host_irq + FIRST_PRU_HOST_INT;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	while (true) {
 		u32 hipir;
@@ -496,8 +496,6 @@ static void pruss_intc_irq_handler(struct irq_desc *desc)
 		if (WARN_ON_ONCE(err))
 			pruss_intc_write_reg(intc, PRU_INTC_SICR, hwirq);
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static const char * const irq_names[MAX_NUM_HOST_IRQS] = {
diff --git a/drivers/irqchip/irq-realtek-rtl.c b/drivers/irqchip/irq-realtek-rtl.c
index f1ab5a77dcef..556c87803313 100644
--- a/drivers/irqchip/irq-realtek-rtl.c
+++ b/drivers/irqchip/irq-realtek-rtl.c
@@ -163,20 +163,17 @@ static void realtek_irq_dispatch(struct irq_desc *desc)
 	unsigned long pending;
 	unsigned int hw_irq;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 	pending = readl_be(REG(cpu, RTL_ICTL_GIMR)) &
 		  readl_be(REG(cpu, RTL_ICTL_GISR)) & output->mask;
 
 	if (unlikely(!pending)) {
 		spurious_interrupt();
-		goto out;
+		return;
 	}
 
 	for_each_set_bit(hw_irq, &pending, RTL_ICTL_NUM_INPUTS)
 		generic_handle_domain_irq(output->domain, hw_irq);
-
-out:
-	chained_irq_exit(chip, desc);
 }
 
 static int __init realtek_setup_parents(struct device_node *node)
diff --git a/drivers/irqchip/irq-riscv-aplic-direct.c b/drivers/irqchip/irq-riscv-aplic-direct.c
index bfd11a884316..545155b0e27c 100644
--- a/drivers/irqchip/irq-riscv-aplic-direct.c
+++ b/drivers/irqchip/irq-riscv-aplic-direct.c
@@ -143,7 +143,7 @@ static void aplic_direct_handle_irq(struct irq_desc *desc)
 	irq_hw_number_t hw_irq;
 	int irq;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	while ((hw_irq = readl(idc->regs + APLIC_IDC_CLAIMI))) {
 		hw_irq = hw_irq >> APLIC_IDC_TOPI_ID_SHIFT;
@@ -156,8 +156,6 @@ static void aplic_direct_handle_irq(struct irq_desc *desc)
 			generic_handle_irq(irq);
 		}
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static void aplic_idc_set_delivery(struct aplic_idc *idc, bool en)
diff --git a/drivers/irqchip/irq-riscv-imsic-early.c b/drivers/irqchip/irq-riscv-imsic-early.c
index 06726a062b75..f16c8d41a90d 100644
--- a/drivers/irqchip/irq-riscv-imsic-early.c
+++ b/drivers/irqchip/irq-riscv-imsic-early.c
@@ -102,7 +102,7 @@ static void imsic_handle_irq(struct irq_desc *desc)
 	 */
 	imsic_local_sync_all(false);
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	while ((local_id = csr_swap(CSR_TOPEI, 0))) {
 		local_id >>= TOPEI_ID_SHIFT;
@@ -120,8 +120,6 @@ static void imsic_handle_irq(struct irq_desc *desc)
 
 		generic_handle_irq(lpriv->vectors[local_id].irq);
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static void imsic_hw_states_init(void)
diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c
index fdfbf1a9add9..ea7f916ba901 100644
--- a/drivers/irqchip/irq-sifive-plic.c
+++ b/drivers/irqchip/irq-sifive-plic.c
@@ -388,7 +388,7 @@ static void plic_handle_irq(struct irq_desc *desc)
 
 	WARN_ON_ONCE(!handler->present);
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	while ((hwirq = readl(claim))) {
 		int err = generic_handle_domain_irq(handler->priv->irqdomain,
@@ -398,8 +398,6 @@ static void plic_handle_irq(struct irq_desc *desc)
 					    handler->priv->fwnode, hwirq);
 		}
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static u32 cp100_isolate_pending_irq(int nr_irq_groups, struct plic_handler *handler)
@@ -480,7 +478,7 @@ static void plic_handle_irq_cp100(struct irq_desc *desc)
 
 	WARN_ON_ONCE(!handler->present);
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	while ((hwirq = cp100_get_hwirq(handler, claim))) {
 		int err = generic_handle_domain_irq(handler->priv->irqdomain, hwirq);
@@ -490,8 +488,6 @@ static void plic_handle_irq_cp100(struct irq_desc *desc)
 					    handler->priv->fwnode, hwirq);
 		}
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static void plic_set_threshold(struct plic_handler *handler, u32 threshold)
diff --git a/drivers/irqchip/irq-sp7021-intc.c b/drivers/irqchip/irq-sp7021-intc.c
index 2a6eda9ab62e..d6b271c2b901 100644
--- a/drivers/irqchip/irq-sp7021-intc.c
+++ b/drivers/irqchip/irq-sp7021-intc.c
@@ -170,7 +170,7 @@ static void sp_intc_handle_ext_cascaded(struct irq_desc *desc)
 	int ext_num = (uintptr_t)irq_desc_get_handler_data(desc);
 	int hwirq;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	while ((hwirq = sp_intc_get_ext_irq(ext_num)) >= 0) {
 		if (unlikely(IS_GPIO_INT(hwirq) && TEST_STATE(hwirq, _IS_ACTIVE))) { // WORKAROUND
@@ -180,8 +180,6 @@ static void sp_intc_handle_ext_cascaded(struct irq_desc *desc)
 			generic_handle_domain_irq(sp_intc.domain, hwirq);
 		}
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static struct irq_chip sp_intc_chip = {
diff --git a/drivers/irqchip/irq-starfive-jhb100-intc.c b/drivers/irqchip/irq-starfive-jhb100-intc.c
index 838885b02f34..f08247f57145 100644
--- a/drivers/irqchip/irq-starfive-jhb100-intc.c
+++ b/drivers/irqchip/irq-starfive-jhb100-intc.c
@@ -176,7 +176,7 @@ static void starfive_intc_irq_handler(struct irq_desc *desc)
 	unsigned long value;
 	int hwirq;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	for (int i = 0; i < STARFIVE_INTC_NUM; i++) {
 		value = ioread32(irqc->base + STARFIVE_INTC_SRC_INT(i));
@@ -192,8 +192,6 @@ static void starfive_intc_irq_handler(struct irq_desc *desc)
 			__clear_bit(hwirq, &value);
 		}
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static int starfive_intc_probe(struct platform_device *pdev, struct device_node *parent)
diff --git a/drivers/irqchip/irq-stm32-exti.c b/drivers/irqchip/irq-stm32-exti.c
index 5fdf335acb46..1a1d9fd67de4 100644
--- a/drivers/irqchip/irq-stm32-exti.c
+++ b/drivers/irqchip/irq-stm32-exti.c
@@ -122,7 +122,7 @@ static void stm32_irq_handler(struct irq_desc *desc)
 	unsigned long pending;
 	int n, i, irq_base = 0;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	for (i = 0; i < nbanks; i++, irq_base += IRQS_PER_BANK) {
 		gc = irq_get_domain_generic_chip(domain, irq_base);
@@ -132,8 +132,6 @@ static void stm32_irq_handler(struct irq_desc *desc)
 				generic_handle_domain_irq(domain, irq_base + n);
 		}
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static int stm32_exti_set_type(struct irq_data *d,
diff --git a/drivers/irqchip/irq-sunxi-nmi.c b/drivers/irqchip/irq-sunxi-nmi.c
index fe32dfdc2dd0..3a5e81ddcb7c 100644
--- a/drivers/irqchip/irq-sunxi-nmi.c
+++ b/drivers/irqchip/irq-sunxi-nmi.c
@@ -97,9 +97,8 @@ static void sunxi_sc_nmi_handle_irq(struct irq_desc *desc)
 	struct irq_domain *domain = irq_desc_get_handler_data(desc);
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 	generic_handle_domain_irq(domain, 0);
-	chained_irq_exit(chip, desc);
 }
 
 static int sunxi_sc_nmi_set_type(struct irq_data *data, unsigned int flow_type)
diff --git a/drivers/irqchip/irq-ti-sci-inta.c b/drivers/irqchip/irq-ti-sci-inta.c
index 0039d0a44154..c2d99c09359f 100644
--- a/drivers/irqchip/irq-ti-sci-inta.c
+++ b/drivers/irqchip/irq-ti-sci-inta.c
@@ -154,15 +154,13 @@ static void ti_sci_inta_irq_handler(struct irq_desc *desc)
 	domain = vint_desc->domain;
 	inta = domain->host_data;
 
-	chained_irq_enter(irq_desc_get_chip(desc), desc);
+	guard_chained_irq(irq_desc_get_chip(desc), desc);
 
 	val = readq_relaxed(inta->base + vint_desc->vint_id * 0x1000 +
 			    VINT_STATUS_MASKED_OFFSET);
 
 	for_each_set_bit(bit, &val, MAX_EVENTS_PER_VINT)
 		generic_handle_domain_irq(domain, vint_desc->events[bit].hwirq);
-
-	chained_irq_exit(irq_desc_get_chip(desc), desc);
 }
 
 /**
diff --git a/drivers/irqchip/irq-ts4800.c b/drivers/irqchip/irq-ts4800.c
index 6fc57d664df8..1698cd8a43a4 100644
--- a/drivers/irqchip/irq-ts4800.c
+++ b/drivers/irqchip/irq-ts4800.c
@@ -85,11 +85,11 @@ static void ts4800_ic_chained_handle_irq(struct irq_desc *desc)
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	u16 status = readw(data->base + IRQ_STATUS);
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	if (unlikely(status == 0)) {
 		handle_bad_irq(desc);
-		goto out;
+		return;
 	}
 
 	do {
@@ -98,9 +98,6 @@ static void ts4800_ic_chained_handle_irq(struct irq_desc *desc)
 		generic_handle_domain_irq(data->domain, bit);
 		status &= ~(1 << bit);
 	} while (status);
-
-out:
-	chained_irq_exit(chip, desc);
 }
 
 static int ts4800_ic_probe(struct platform_device *pdev)
diff --git a/drivers/irqchip/irq-versatile-fpga.c b/drivers/irqchip/irq-versatile-fpga.c
index 6eaad836d9ff..e78ac0fc602b 100644
--- a/drivers/irqchip/irq-versatile-fpga.c
+++ b/drivers/irqchip/irq-versatile-fpga.c
@@ -85,12 +85,12 @@ static void fpga_irq_handle(struct irq_desc *desc)
 	struct fpga_irq_data *f = irq_desc_get_handler_data(desc);
 	u32 status;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	status = readl(f->base + IRQ_STATUS);
 	if (status == 0) {
 		handle_bad_irq(desc);
-		goto out;
+		return;
 	}
 
 	do {
@@ -99,9 +99,6 @@ static void fpga_irq_handle(struct irq_desc *desc)
 		status &= ~(1 << irq);
 		generic_handle_domain_irq(f->domain, irq);
 	} while (status);
-
-out:
-	chained_irq_exit(chip, desc);
 }
 
 /*
diff --git a/drivers/irqchip/irq-vic.c b/drivers/irqchip/irq-vic.c
index 607e3284f700..78779b302050 100644
--- a/drivers/irqchip/irq-vic.c
+++ b/drivers/irqchip/irq-vic.c
@@ -224,14 +224,12 @@ static void vic_handle_irq_cascaded(struct irq_desc *desc)
 	struct irq_chip *host_chip = irq_desc_get_chip(desc);
 	struct vic_device *vic = irq_desc_get_handler_data(desc);
 
-	chained_irq_enter(host_chip, desc);
+	guard_chained_irq(host_chip, desc);
 
 	while ((stat = readl_relaxed(vic->base + VIC_IRQ_STATUS))) {
 		hwirq = ffs(stat) - 1;
 		generic_handle_domain_irq(vic->domain, hwirq);
 	}
-
-	chained_irq_exit(host_chip, desc);
 }
 
 /*
diff --git a/drivers/irqchip/irq-vt8500.c b/drivers/irqchip/irq-vt8500.c
index b159e17ed1df..ca548a3fdb7e 100644
--- a/drivers/irqchip/irq-vt8500.c
+++ b/drivers/irqchip/irq-vt8500.c
@@ -192,9 +192,8 @@ static void vt8500_handle_irq_chained(struct irq_desc *desc)
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	struct vt8500_irq_data *intc = d->host_data;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 	vt8500_handle_irq_common(intc);
-	chained_irq_exit(chip, desc);
 }
 
 static int __init vt8500_irq_init(struct device_node *node,
diff --git a/drivers/irqchip/irq-xilinx-intc.c b/drivers/irqchip/irq-xilinx-intc.c
index bba6f6dc405e..56246da62374 100644
--- a/drivers/irqchip/irq-xilinx-intc.c
+++ b/drivers/irqchip/irq-xilinx-intc.c
@@ -140,7 +140,7 @@ static void xil_intc_irq_handler(struct irq_desc *desc)
 	struct xintc_irq_chip *irqc;
 
 	irqc = irq_data_get_irq_handler_data(&desc->irq_data);
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 	do {
 		u32 hwirq = xintc_read(irqc, IVR);
 
@@ -149,7 +149,6 @@ static void xil_intc_irq_handler(struct irq_desc *desc)
 
 		generic_handle_domain_irq(irqc->root_domain, hwirq);
 	} while (true);
-	chained_irq_exit(chip, desc);
 }
 
 static void xil_intc_handle_irq(struct pt_regs *regs)
diff --git a/drivers/irqchip/irq-xilinx-smmu-csr.c b/drivers/irqchip/irq-xilinx-smmu-csr.c
index 58a1555699f5..b22cb191aad1 100644
--- a/drivers/irqchip/irq-xilinx-smmu-csr.c
+++ b/drivers/irqchip/irq-xilinx-smmu-csr.c
@@ -115,7 +115,7 @@ static void xilinx_smmu_csr_irq_handler(struct irq_desc *desc)
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	u32 status, mask, active, pending, spurious;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	/*
 	 * SMMU_CSR_ISR latches raw, pre-mask status, so gate it with the mask
@@ -152,8 +152,6 @@ static void xilinx_smmu_csr_irq_handler(struct irq_desc *desc)
 
 		pending &= ~BIT(hwirq);
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static int xilinx_smmu_csr_domain_map(struct irq_domain *d, unsigned int virq,
diff --git a/drivers/irqchip/qcom-irq-combiner.c b/drivers/irqchip/qcom-irq-combiner.c
index 57ff4177edb9..8fe2138c85ed 100644
--- a/drivers/irqchip/qcom-irq-combiner.c
+++ b/drivers/irqchip/qcom-irq-combiner.c
@@ -50,7 +50,7 @@ static void combiner_handle_irq(struct irq_desc *desc)
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	u32 reg;
 
-	chained_irq_enter(chip, desc);
+	guard_chained_irq(chip, desc);
 
 	for (reg = 0; reg < combiner->nregs; reg++) {
 		int hwirq;
@@ -72,8 +72,6 @@ static void combiner_handle_irq(struct irq_desc *desc)
 			generic_handle_domain_irq(combiner->domain, hwirq);
 		}
 	}
-
-	chained_irq_exit(chip, desc);
 }
 
 static void combiner_irq_chip_mask_irq(struct irq_data *data)

---
base-commit: 84abb955b1015477aa11a96e2f3ac1b938b77f48
change-id: 20261114-irqchip-cleanup-api-258c2081bd1e

Best regards,
-- 
Peng Fan <peng.fan@nxp.com>


                 reply	other threads:[~2026-11-14 15:06 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261114-irqchip-cleanup-api-v1-1-4a9d598b0bdb@nxp.com \
    --to=peng.fan@linux.dev \
    --cc=Frank.Li@nxp.com \
    --cc=alex@ghiti.fr \
    --cc=alexandre.torgue@foss.st.com \
    --cc=alim.akhtar@samsung.com \
    --cc=andrew@codeconstruct.com.au \
    --cc=andrew@lunn.ch \
    --cc=anirudha.sarangi@amd.com \
    --cc=anup@brainfault.org \
    --cc=aou@eecs.berkeley.edu \
    --cc=bcm-kernel-feedback-list@broadcom.com \
    --cc=benh@kernel.crashing.org \
    --cc=billy_tsai@aspeedtech.com \
    --cc=changhuang.liang@starfivetech.com \
    --cc=chenhuacai@kernel.org \
    --cc=cjd@cjdns.fr \
    --cc=eajames@linux.ibm.com \
    --cc=festevam@gmail.com \
    --cc=florian.fainelli@broadcom.com \
    --cc=git@amd.com \
    --cc=gregory.clement@bootlin.com \
    --cc=herve.codina@bootlin.com \
    --cc=imx@lists.linux.dev \
    --cc=jernej.skrabec@gmail.com \
    --cc=jiaxun.yang@flygoat.com \
    --cc=joel@jms.id.au \
    --cc=kernel@pengutronix.de \
    --cc=kernel@xen0n.name \
    --cc=kristo@kernel.org \
    --cc=krzk@kernel.org \
    --cc=linusw@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-aspeed@lists.ozlabs.org \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@vger.kernel.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=linux-rpi-kernel@lists.infradead.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=linux-stm32@st-md-mailman.stormreply.com \
    --cc=linux-sunxi@lists.linux.dev \
    --cc=loongarch@lists.linux.dev \
    --cc=maz@kernel.org \
    --cc=mcoquelin.stm32@gmail.com \
    --cc=michal.simek@amd.com \
    --cc=miodrag.dinic@mips.com \
    --cc=nm@ti.com \
    --cc=openbmc@lists.ozlabs.org \
    --cc=palmer@dabbelt.com \
    --cc=peng.fan@nxp.com \
    --cc=peter.griffin@linaro.org \
    --cc=piotr.wojtaszczyk@timesys.com \
    --cc=pjw@kernel.org \
    --cc=qinjian@cqplus1.com \
    --cc=radu@rendec.net \
    --cc=rjui@broadcom.com \
    --cc=ryan_chen@aspeedtech.com \
    --cc=s.hauer@pengutronix.de \
    --cc=samuel.holland@sifive.com \
    --cc=sbranden@broadcom.com \
    --cc=sebastian.hesselbarth@gmail.com \
    --cc=ssantosh@kernel.org \
    --cc=tan.siewert@9elements.com \
    --cc=tglx@kernel.org \
    --cc=tushar.nimkar@amd.com \
    --cc=vz@mleia.com \
    --cc=wens@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®