All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rob Herring <robh@kernel.org>
To: Herve Codina <herve.codina@bootlin.com>
Cc: Hoan Tran <hoan@os.amperecomputing.com>,
	Linus Walleij <linus.walleij@linaro.org>,
	Bartosz Golaszewski <brgl@bgdev.pl>,
	Krzysztof Kozlowski <krzk+dt@kernel.org>,
	Conor Dooley <conor+dt@kernel.org>,
	Geert Uytterhoeven <geert+renesas@glider.be>,
	Magnus Damm <magnus.damm@gmail.com>,
	Saravana Kannan <saravanak@google.com>,
	Serge Semin <fancer.lancer@gmail.com>,
	Phil Edworthy <phil.edworthy@renesas.com>,
	linux-gpio@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
	Miquel Raynal <miquel.raynal@bootlin.com>,
	Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Subject: Re: [PATCH 5/6] soc: renesas: Add support for Renesas RZ/N1 GPIO Interrupt Multiplexer
Date: Wed, 30 Jul 2025 15:47:33 -0500	[thread overview]
Message-ID: <20250730204733.GA1717453-robh@kernel.org> (raw)
In-Reply-To: <20250730115421.770d99bf@bootlin.com>

On Wed, Jul 30, 2025 at 11:54:21AM +0200, Herve Codina wrote:
> Hi Rob,
> 
> On Tue, 29 Jul 2025 14:51:37 -0500
> Rob Herring <robh@kernel.org> wrote:
> 
> > On Fri, Jul 25, 2025 at 05:26:14PM +0200, Herve Codina wrote:
> > > On the Renesas RZ/N1 SoC, GPIOs can generate interruptions. Those
> > > interruption lines are multiplexed by the GPIO Interrupt Multiplexer in
> > > order to map 32 * 3 GPIO interrupt lines to 8 GIC interrupt lines.
> > > 
> > > The GPIO interrupt multiplexer IP does nothing but select 8 GPIO
> > > IRQ lines out of the 96 available to wire them to the GIC input lines.
> > > 
> > > Signed-off-by: Herve Codina <herve.codina@bootlin.com>
> > > ---
> > >  drivers/soc/renesas/Kconfig       |   4 +
> > >  drivers/soc/renesas/Makefile      |   1 +
> > >  drivers/soc/renesas/rzn1_irqmux.c | 169 ++++++++++++++++++++++++++++++
> > >  3 files changed, 174 insertions(+)
> > >  create mode 100644 drivers/soc/renesas/rzn1_irqmux.c
> > > 
> > > diff --git a/drivers/soc/renesas/Kconfig b/drivers/soc/renesas/Kconfig
> > > index fbc3b69d21a7..9e8ac33052fb 100644
> > > --- a/drivers/soc/renesas/Kconfig
> > > +++ b/drivers/soc/renesas/Kconfig
> > > @@ -58,6 +58,7 @@ config ARCH_RZN1
> > >  	select PM
> > >  	select PM_GENERIC_DOMAINS
> > >  	select ARM_AMBA
> > > +	select RZN1_IRQMUX
> > >  
> > >  if ARM && ARCH_RENESAS
> > >  
> > > @@ -435,6 +436,9 @@ config PWC_RZV2M
> > >  config RST_RCAR
> > >  	bool "Reset Controller support for R-Car" if COMPILE_TEST
> > >  
> > > +config RZN1_IRQMUX
> > > +	bool "Renesas RZ/N1 GPIO IRQ multiplexer support" if COMPILE_TEST
> > > +
> > >  config SYSC_RZ
> > >  	bool "System controller for RZ SoCs" if COMPILE_TEST
> > >  
> > > diff --git a/drivers/soc/renesas/Makefile b/drivers/soc/renesas/Makefile
> > > index 3bdcc6a395d5..daa932c7698d 100644
> > > --- a/drivers/soc/renesas/Makefile
> > > +++ b/drivers/soc/renesas/Makefile
> > > @@ -14,4 +14,5 @@ obj-$(CONFIG_SYS_R9A09G057)	+= r9a09g057-sys.o
> > >  # Family
> > >  obj-$(CONFIG_PWC_RZV2M)		+= pwc-rzv2m.o
> > >  obj-$(CONFIG_RST_RCAR)		+= rcar-rst.o
> > > +obj-$(CONFIG_RZN1_IRQMUX)		+= rzn1_irqmux.o
> > >  obj-$(CONFIG_SYSC_RZ)		+= rz-sysc.o
> > > diff --git a/drivers/soc/renesas/rzn1_irqmux.c b/drivers/soc/renesas/rzn1_irqmux.c
> > > new file mode 100644
> > > index 000000000000..37e41c2b9104
> > > --- /dev/null
> > > +++ b/drivers/soc/renesas/rzn1_irqmux.c
> > > @@ -0,0 +1,169 @@
> > > +// SPDX-License-Identifier: GPL-2.0-only
> > > +/*
> > > + * RZ/N1 GPIO Interrupt Multiplexer
> > > + *
> > > + * Copyright 2025 Schneider Electric
> > > + * Author: Herve Codina <herve.codina@bootlin.com>
> > > + */
> > > +
> > > +#include <linux/mod_devicetable.h>
> > > +#include <linux/module.h>
> > > +#include <linux/of.h>
> > > +#include <linux/of_irq.h>
> > > +#include <linux/platform_device.h>
> > > +
> > > +#define IRQMUX_MAX_IRQS 8
> > > +
> > > +static int irqmux_is_phandle_args_equal(const struct of_phandle_args *a,
> > > +					const struct of_phandle_args *b)
> > > +{
> > > +	int i;
> > > +
> > > +	if (a->np != b->np)
> > > +		return false;
> > > +
> > > +	if (a->args_count != b->args_count)
> > > +		return false;
> > > +
> > > +	for (i = 0; i < a->args_count; i++) {
> > > +		if (a->args[i] != b->args[i])
> > > +			return false;
> > > +	}
> > > +
> > > +	return true;
> > > +}
> > > +
> > > +static int irqmux_find_interrupt_index(struct device *dev, struct device_node *np,
> > > +				       const struct of_phandle_args *expected_irq)
> > > +{
> > > +	struct of_phandle_args out_irq;
> > > +	bool is_equal;
> > > +	int ret;
> > > +	int i;
> > > +
> > > +	for (i = 0; i < IRQMUX_MAX_IRQS; i++) {
> > > +		ret = of_irq_parse_one(np, i, &out_irq);  
> > 
> > I don't really want more users of this... More below.
> > 
> > > +		if (ret)
> > > +			return ret;
> > > +
> > > +		is_equal = irqmux_is_phandle_args_equal(expected_irq, &out_irq);
> > > +		of_node_put(out_irq.np);
> > > +		if (is_equal)
> > > +			return i;
> > > +	}
> > > +
> > > +	return -ENOENT;
> > > +}
> > > +
> > > +struct irqmux_cb_data {
> > > +	struct device_node *np;
> > > +	struct device *dev;
> > > +	u32 __iomem *regs;
> > > +};
> > > +
> > > +static int irqmux_imap_cb(void *data, const __be32 *imap,
> > > +			  const struct of_phandle_args *parent_args)
> > > +{
> > > +	struct irqmux_cb_data *priv = data;
> > > +	u32 src_hwirq;
> > > +	int index;
> > > +
> > > +	/*
> > > +	 * The child #address-cells is 0. Already checked in irqmux_setup().
> > > +	 * The first value in imap is the src_hwirq
> > > +	 */
> > > +	src_hwirq = be32_to_cpu(*imap);  
> > 
> > The iterator should take care of the endianness conversion.
> 
> Ok, it will take care.
> 
> > 
> > > +
> > > +	/*
> > > +	 * Get the index in our interrupt array that matches the parent in the
> > > +	 * interrupt-map
> > > +	 */
> > > +	index = irqmux_find_interrupt_index(priv->dev, priv->np, parent_args);
> > > +	if (index < 0)
> > > +		return dev_err_probe(priv->dev, index, "output interrupt not found\n");
> > > +
> > > +	dev_info(priv->dev, "interrupt %u mapped to output interrupt[%u]\n",
> > > +		 src_hwirq, index);  
> > 
> > Do you even need "interrupts"? Just make the "interrupt-map" index 
> > important and correspond to the hw index. That would greatly simplify 
> > all this.
> 
> I would like to avoid to be based on the interrupt-map index.
> 
> Indeed, IMHO, it is less robust. I don't thing that we can enforce the
> interrupt-map items order. Based on interrupt-map index, we need to ensure
> that the first item is related to GIC 103, the second one to GIC 104 and so
> on.

How exactly are you enforcing that order for "interrupts"? You can't. 

Aren't you just duplicating the information in "interrupts" in the 
interrupt-map.

Rob

  reply	other threads:[~2025-07-30 20:47 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-07-25 15:26 [PATCH 0/6] gpio: renesas: Add support for GPIO and related interrupts in RZ/N1 SoC Herve Codina
2025-07-25 15:26 ` [PATCH 1/6] dt-bindings: gpio: snps,dw-apb: Add support for Renesas RZ/N1 Herve Codina
2025-07-29 18:11   ` Rob Herring
2025-07-30  9:17     ` Herve Codina
2025-07-25 15:26 ` [PATCH 2/6] ARM: dts: r9a06g032: Add GPIO controllers Herve Codina
2025-07-25 15:26 ` [PATCH 3/6] dt-bindings: soc: renesas: Add the Renesas RZ/N1 GPIO Interrupt Multiplexer Herve Codina
2025-07-25 15:26 ` [PATCH 4/6] of/irq: Introduce of_irq_foreach_imap Herve Codina
2025-07-29 19:51   ` Rob Herring
2025-07-30  9:43     ` Herve Codina
2025-07-25 15:26 ` [PATCH 5/6] soc: renesas: Add support for Renesas RZ/N1 GPIO Interrupt Multiplexer Herve Codina
2025-07-29 19:51   ` Rob Herring
2025-07-30  9:54     ` Herve Codina
2025-07-30 20:47       ` Rob Herring [this message]
2025-08-01  9:17         ` Herve Codina
2025-07-25 15:26 ` [PATCH 6/6] ARM: dts: r9a06g032: Add support for GPIO interrupts Herve Codina
2025-07-25 20:17 ` [PATCH 0/6] gpio: renesas: Add support for GPIO and related interrupts in RZ/N1 SoC Rob Herring (Arm)
2025-07-27 11:01 ` Wolfram Sang
2025-07-30  8:10   ` Herve Codina
2025-08-06 18:51     ` Wolfram Sang

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=20250730204733.GA1717453-robh@kernel.org \
    --to=robh@kernel.org \
    --cc=brgl@bgdev.pl \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=fancer.lancer@gmail.com \
    --cc=geert+renesas@glider.be \
    --cc=herve.codina@bootlin.com \
    --cc=hoan@os.amperecomputing.com \
    --cc=krzk+dt@kernel.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=magnus.damm@gmail.com \
    --cc=miquel.raynal@bootlin.com \
    --cc=phil.edworthy@renesas.com \
    --cc=saravanak@google.com \
    --cc=thomas.petazzoni@bootlin.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.