[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAL_JsqJ9YUe6cy0YEMLvQhGTGmog6onTA9W5owQBP4q1viijug@mail.gmail.com>
Date: Tue, 2 Dec 2025 15:19:17 -0600
From: Rob Herring <robh@...nel.org>
To: Ioana Ciornei <ioana.ciornei@....com>
Cc: Geert Uytterhoeven <geert+renesas@...der.be>, Saravana Kannan <saravanak@...gle.com>,
Krzysztof Kozlowski <krzk+dt@...nel.org>, Conor Dooley <conor+dt@...nel.org>, Paul Walmsley <pjw@...nel.org>,
Palmer Dabbelt <palmer@...belt.com>, Albert Ou <aou@...s.berkeley.edu>,
Alexandre Ghiti <alex@...ti.fr>, Samuel Holland <samuel@...lland.org>, Marc Zyngier <maz@...nel.org>,
Lad Prabhakar <prabhakar.mahadev-lad.rj@...renesas.com>,
Magnus Damm <magnus.damm@...il.com>, devicetree@...r.kernel.org,
linux-renesas-soc@...r.kernel.org, linux-riscv@...ts.infradead.org,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2] of/irq: Ignore interrupt parent for nodes without interrupts
On Tue, Dec 2, 2025 at 10:36 AM Ioana Ciornei <ioana.ciornei@....com> wrote:
>
> On Mon, Dec 01, 2025 at 06:09:19AM -0600, Rob Herring wrote:
> > On Fri, Nov 28, 2025 at 10:43 AM Ioana Ciornei <ioana.ciornei@....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@...der.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.
> >
>
> I just tried converting ls-extirq to a proper platform driver and it's
> pretty straightforward. The problem is getting that driver to probe on
> the ls-extirq dt node since of_platform_populate() is not called on its
> parent node.
>
> I would avoid changing the DT and adding a "simple-bus" compatible to
> the parent nodes. The other option is to add another simple driver which
> just calls of_platform_populate() for all compatible strings defined in
> fsl,layerscape-scfg.yaml.
The simplest solution might be adding 'syscon' to the default match
list for of_platform_populate(). That's kind of a big hammer though
and could break something. Not sure, but I'm willing to stick that in
linux-next and see.
Another option is hijack the simple-pm-bus driver which already does
just what you said.
Rob
Powered by blists - more mailing lists