[tip: irq/drivers] irqchip/imx-irqsteer: Dispose of parent IRQ mappings in remove()

From: tip-bot2 for Zhipeng Wang

Date: Sun Nov 08 2026 - 16:51:08 EST


The following commit has been merged into the irq/drivers branch of tip:

Commit-ID: d2803ccf1334b8efbbeef704cc8b6b2a62d42d76
Gitweb: https://git.kernel.org/tip/d2803ccf1334b8efbbeef704cc8b6b2a62d42d76
Author: Zhipeng Wang <zhipeng.wang_1@xxxxxxx>
AuthorDate: Wed, 04 Nov 2026 16:37:51 +09:00
Committer: Thomas Gleixner <tglx@xxxxxxxxxx>
CommitterDate: Sun, 08 Nov 2026 22:43:43 +01:00

irqchip/imx-irqsteer: Dispose of parent IRQ mappings in remove()

probe() maps the parent output interrupts with irq_of_parse_and_map(),
but remove() only unchains the handlers and never disposes of those
mappings, leaking them on unbind. The child mappings handed out by the
domain are freed by their consumers and, together with the domain, are
now torn down by devres, so remove() only has to dispose of the parent
mappings it created itself.

Dispose of the parent mappings alongside the chained-handler teardown.

Fixes: 0136afa08967 ("irqchip: Add driver for imx-irqsteer controller")
Signed-off-by: Zhipeng Wang <zhipeng.wang_1@xxxxxxx>
Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxx>
Reviewed-by: Frank Li <Frank.Li@xxxxxxx>
Reviewed-by: Radu Rendec <radu@xxxxxxxxxx>
Link: https://patch.msgid.link/20261104073759.386777-4-Zhipeng.wang_1@xxxxxxxxxxx
---
drivers/irqchip/irq-imx-irqsteer.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/irqchip/irq-imx-irqsteer.c b/drivers/irqchip/irq-imx-irqsteer.c
index 766756e..b9ea1e8 100644
--- a/drivers/irqchip/irq-imx-irqsteer.c
+++ b/drivers/irqchip/irq-imx-irqsteer.c
@@ -272,14 +272,13 @@ out:
static void imx_irqsteer_remove(struct platform_device *pdev)
{
struct irqsteer_data *irqsteer_data = platform_get_drvdata(pdev);
- int i;

- for (i = 0; i < irqsteer_data->irq_count; i++) {
+ for (int i = 0; i < irqsteer_data->irq_count; i++) {
if (!irqsteer_data->irq[i])
break;

- irq_set_chained_handler_and_data(irqsteer_data->irq[i],
- NULL, NULL);
+ irq_set_chained_handler_and_data(irqsteer_data->irq[i], NULL, NULL);
+ irq_dispose_mapping(irqsteer_data->irq[i]);
}

irq_domain_remove(irqsteer_data->domain);