[PATCH v2] of/irq: Ignore interrupt parent for nodes without interrupts

Rob Herring robh at kernel.org
Mon Dec 1 04:09:19 PST 2025


On Fri, Nov 28, 2025 at 10:43 AM Ioana Ciornei <ioana.ciornei at nxp.com> wrote:
>
> On Fri, Nov 14, 2025 at 11:47:54AM +0100, Geert Uytterhoeven wrote:
> > The Devicetree Specification states:
> >
> >     The root of the interrupt tree is determined when traversal of the
> >     interrupt tree reaches an interrupt controller node without an
> >     interrupts property and thus no explicit interrupt parent.
> >
> > However, of_irq_init() gratuitously assumes that a node without
> > interrupts has an actual interrupt parent if it finds an
> > interrupt-parent property higher up in the device tree.  Hence when such
> > a property is present (e.g. in the root node), the root interrupt
> > controller may not be detected as such, causing a panic:
> >
> >     OF: of_irq_init: children remain, but no parents
> >     Kernel panic - not syncing: No interrupt controller found.
> >
> > Commit e91033621d56e055 ("of/irq: Use interrupts-extended to find
> > parent") already fixed a first part, by checking for the presence of an
> > interrupts-extended property.  Fix the second part by only calling
> > of_irq_find_parent() when an interrupts property is present.
> >
> > Signed-off-by: Geert Uytterhoeven <geert+renesas at glider.be>
> > v2:
> >   - Split off from series "[PATCH/RFC 0/2] of/irq: Fix root interrupt
> >     controller handling"[1] to relax dependencies,
> >   - Drop RFC.
> >
> > [1] https://lore.kernel.org/all/cover.1759485668.git.geert+renesas@glider.be
> > ---
> >  drivers/of/irq.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/of/irq.c b/drivers/of/irq.c
> > index b174ec29648955c6..5cb1ca89c1d8725d 100644
> > --- a/drivers/of/irq.c
> > +++ b/drivers/of/irq.c
> > @@ -613,7 +613,7 @@ void __init of_irq_init(const struct of_device_id *matches)
> >                * are the same distance away from the root irq controller.
> >                */
> >               desc->interrupt_parent = of_parse_phandle(np, "interrupts-extended", 0);
> > -             if (!desc->interrupt_parent)
> > +             if (!desc->interrupt_parent && of_property_present(np, "interrupts"))
> >                       desc->interrupt_parent = of_irq_find_parent(np);
> >               if (desc->interrupt_parent == np) {
> >                       of_node_put(desc->interrupt_parent);
> > --
> > 2.43.0
> >
> >
>
> This change irq-ls-extirq and commit 6ba51b7b34ca ("of/irq: Handle
> explicit interrupt parent") does not help with the issue.
>
> This is how the DT node in lx2160a.dtsi looks like:

ls-extirq strikes again!

I think something like this should fix it:

diff --git a/drivers/of/irq.c b/drivers/of/irq.c
index 2271110b5f7c..c06c74aef801 100644
--- a/drivers/of/irq.c
+++ b/drivers/of/irq.c
@@ -593,7 +593,8 @@ void __init of_irq_init(const struct of_device_id *matches)
                 * are the same distance away from the root irq controller.
                 */
                desc->interrupt_parent = of_parse_phandle(np,
"interrupts-extended", 0);
-               if (!desc->interrupt_parent && of_property_present(np,
"interrupts"))
+               if (!desc->interrupt_parent &&
+                   (of_property_present(np, "interrupts") ||
of_property_present(np, "interrupt-map"))
                        desc->interrupt_parent = of_irq_find_parent(np);
                else if (!desc->interrupt_parent)
                        desc->interrupt_parent = of_parse_phandle(np,
"interrupt-parent", 0);


But really, at some point it should be converted to a proper driver as
there's no reason extirq needs to be initialized early.

Rob



More information about the linux-riscv mailing list