Re: [PATCH 09/16] irqchip/econet: clean up VEIC initialization

Caleb James DeLisle <[email protected]> Thu, 23 Jul 2026 03:09:41 +0200
Newsgroups org.kernel.vger.linux-mips,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On 14/07/2026 15:24, Haofeng Li wrote:
> From: Haofeng Li <[email protected]>
>
> When cpu_has_veic is set, econet_cpu_init() failure returns without
> tearing down the already created IRQ domain, ioremap, memory region,
> or parent IRQ mapping. The parent interrupt-controller node obtained
> while finding the IPI domain also retains an OF node reference on both
> success and failure.
>
> Drop the parent node reference after the domain lookup and route VEIC
> initialization failures through the existing resource cleanup labels
> after removing the IRQ domain.
>
> Fixes: 2ee2a685ee83 ("irqchip/econet-en751221: Support MIPS 34Kc VEIC mode")
>
> Signed-off-by: Haofeng Li <[email protected]>
Tested-by: Caleb James DeLisle <[email protected]>
> ---
>   drivers/irqchip/irq-econet-en751221.c | 5 ++++-
>   1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/irqchip/irq-econet-en751221.c b/drivers/irqchip/irq-econet-en751221.c
> index 2ca5d901866f..f6f890b3f881 100644
> --- a/drivers/irqchip/irq-econet-en751221.c
> +++ b/drivers/irqchip/irq-econet-en751221.c
> @@ -378,6 +378,7 @@ static int __init econet_cpu_init(struct device_node *node)
>   	}
>   
>   	econet_intc.ipi_domain = irq_find_matching_host(parent_intc, DOMAIN_BUS_IPI);
> +	of_node_put(parent_intc);
>   	if (!econet_intc.ipi_domain) {
>   		pr_err("%pOF: Failed to find parent %s\n", node, "IPI domain");
>   		return -ENODEV;
> @@ -459,7 +460,7 @@ static int __init econet_intc_of_init(struct device_node *node, struct device_no
>   		ret = econet_cpu_init(node);
>   
>   		if (ret)
> -			return ret;
> +			goto err_remove_domain;
>   	} else {
>   		irq_set_chained_handler_and_data(irq, econet_intc_from_parent, domain);
>   	}
> @@ -468,6 +469,8 @@ static int __init econet_intc_of_init(struct device_node *node, struct device_no
>   
>   	return 0;
>   
> +err_remove_domain:
> +	irq_domain_remove(domain);
>   err_unmap:
>   	iounmap(econet_intc.membase);
>   err_release: