linux-gpio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/8] Add support for GPIO IRQs for RZ/T2H and RZ/N2H
@ 2025-11-21 11:26 Cosmin Tanislav
  2025-11-21 11:26 ` [PATCH 1/8] pinctrl: renesas: rzt2h: move GPIO enable/disable into separate function Cosmin Tanislav
                   ` (7 more replies)
  0 siblings, 8 replies; 14+ messages in thread
From: Cosmin Tanislav @ 2025-11-21 11:26 UTC (permalink / raw)
  To: Geert Uytterhoeven, Linus Walleij, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Magnus Damm, Lad Prabhakar
  Cc: linux-renesas-soc, linux-gpio, devicetree, linux-kernel,
	Cosmin Tanislav

The Renesas RZ/T2H and RZ/N2H SoCs have IRQ-capable pins handled by the
ICU, which forwards them to the GIC.

The ICU supports 16 IRQ lines, the pins map to these lines arbitrarily,
and the mapping is not configurable.

Add a GPIO IRQ chip that can be used to configure these pins as IRQ
lines, and add the user switches present on the board.

The ICU driver has been submitted as part of a separate series [1].

[1]: https://lore.kernel.org/lkml/20251121111423.1379395-1-cosmin-gabriel.tanislav.xa@renesas.com/

Cosmin Tanislav (8):
  pinctrl: renesas: rzt2h: move GPIO enable/disable into separate
    function
  pinctrl: renesas: rzt2h: allow .get_direction() for IRQ function GPIOs
  dt-bindings: pinctrl: renesas,r9a09g077-pinctrl: Document GPIO IRQ
  pinctrl: renesas: rzt2h: add GPIO IRQ chip to handle interrupts
  arm64: dts: renesas: r9a09g077: add GPIO IRQ support
  arm64: dts: renesas: r9a09g087: add GPIO IRQ support
  arm64: dts: renesas: r9a09g077m44-rzt2h-evk: add GPIO keys
  arm64: dts: renesas: r9a09g087m44-rzn2h-evk: add GPIO keys

 .../pinctrl/renesas,r9a09g077-pinctrl.yaml    |  15 ++
 arch/arm64/boot/dts/renesas/r9a09g077.dtsi    |   3 +
 .../dts/renesas/r9a09g077m44-rzt2h-evk.dts    |  33 +++
 arch/arm64/boot/dts/renesas/r9a09g087.dtsi    |   3 +
 .../dts/renesas/r9a09g087m44-rzn2h-evk.dts    |  30 +++
 drivers/pinctrl/renesas/pinctrl-rzt2h.c       | 241 +++++++++++++++++-
 6 files changed, 316 insertions(+), 9 deletions(-)

-- 
2.52.0


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 1/8] pinctrl: renesas: rzt2h: move GPIO enable/disable into separate function
  2025-11-21 11:26 [PATCH 0/8] Add support for GPIO IRQs for RZ/T2H and RZ/N2H Cosmin Tanislav
@ 2025-11-21 11:26 ` Cosmin Tanislav
  2025-11-21 11:26 ` [PATCH 2/8] pinctrl: renesas: rzt2h: allow .get_direction() for IRQ function GPIOs Cosmin Tanislav
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 14+ messages in thread
From: Cosmin Tanislav @ 2025-11-21 11:26 UTC (permalink / raw)
  To: Geert Uytterhoeven, Linus Walleij, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Magnus Damm, Lad Prabhakar
  Cc: linux-renesas-soc, linux-gpio, devicetree, linux-kernel,
	Cosmin Tanislav

GPIO is enabled or disabled in multiple places, simplify code by moving
this logic into a separate function.

Signed-off-by: Cosmin Tanislav <cosmin-gabriel.tanislav.xa@renesas.com>
---
 drivers/pinctrl/renesas/pinctrl-rzt2h.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/drivers/pinctrl/renesas/pinctrl-rzt2h.c b/drivers/pinctrl/renesas/pinctrl-rzt2h.c
index 4826ff91cd90..c8ca5e13bba7 100644
--- a/drivers/pinctrl/renesas/pinctrl-rzt2h.c
+++ b/drivers/pinctrl/renesas/pinctrl-rzt2h.c
@@ -119,6 +119,19 @@ static int rzt2h_validate_pin(struct rzt2h_pinctrl *pctrl, unsigned int offset)
 	return (pincfg & BIT(pin)) ? 0 : -EINVAL;
 }
 
+static void rzt2h_pinctrl_set_gpio_en(struct rzt2h_pinctrl *pctrl,
+				      u8 port, u8 pin, bool en)
+{
+	u8 reg = rzt2h_pinctrl_readb(pctrl, port, PMC(port));
+
+	if (en)
+		reg &= ~BIT(pin);
+	else
+		reg |= BIT(pin);
+
+	rzt2h_pinctrl_writeb(pctrl, port, reg, PMC(port));
+}
+
 static void rzt2h_pinctrl_set_pfc_mode(struct rzt2h_pinctrl *pctrl,
 				       u8 port, u8 pin, u8 func)
 {
@@ -133,8 +146,7 @@ static void rzt2h_pinctrl_set_pfc_mode(struct rzt2h_pinctrl *pctrl,
 	rzt2h_pinctrl_writew(pctrl, port, reg16, PM(port));
 
 	/* Temporarily switch to GPIO mode with PMC register */
-	reg16 = rzt2h_pinctrl_readb(pctrl, port, PMC(port));
-	rzt2h_pinctrl_writeb(pctrl, port, reg16 & ~BIT(pin), PMC(port));
+	rzt2h_pinctrl_set_gpio_en(pctrl, port, pin, true);
 
 	/* Select Pin function mode with PFC register */
 	reg64 = rzt2h_pinctrl_readq(pctrl, port, PFC(port));
@@ -142,8 +154,7 @@ static void rzt2h_pinctrl_set_pfc_mode(struct rzt2h_pinctrl *pctrl,
 	rzt2h_pinctrl_writeq(pctrl, port, reg64 | ((u64)func << (pin * 8)), PFC(port));
 
 	/* Switch to Peripheral pin function with PMC register */
-	reg16 = rzt2h_pinctrl_readb(pctrl, port, PMC(port));
-	rzt2h_pinctrl_writeb(pctrl, port, reg16 | BIT(pin), PMC(port));
+	rzt2h_pinctrl_set_gpio_en(pctrl, port, pin, false);
 }
 
 static int rzt2h_pinctrl_set_mux(struct pinctrl_dev *pctldev,
@@ -447,7 +458,6 @@ static int rzt2h_gpio_request(struct gpio_chip *chip, unsigned int offset)
 	u8 port = RZT2H_PIN_ID_TO_PORT(offset);
 	u8 bit = RZT2H_PIN_ID_TO_PIN(offset);
 	int ret;
-	u8 reg;
 
 	ret = rzt2h_validate_pin(pctrl, offset);
 	if (ret)
@@ -460,9 +470,7 @@ static int rzt2h_gpio_request(struct gpio_chip *chip, unsigned int offset)
 	guard(spinlock_irqsave)(&pctrl->lock);
 
 	/* Select GPIO mode in PMC Register */
-	reg = rzt2h_pinctrl_readb(pctrl, port, PMC(port));
-	reg &= ~BIT(bit);
-	rzt2h_pinctrl_writeb(pctrl, port, reg, PMC(port));
+	rzt2h_pinctrl_set_gpio_en(pctrl, port, bit, true);
 
 	return 0;
 }
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 2/8] pinctrl: renesas: rzt2h: allow .get_direction() for IRQ function GPIOs
  2025-11-21 11:26 [PATCH 0/8] Add support for GPIO IRQs for RZ/T2H and RZ/N2H Cosmin Tanislav
  2025-11-21 11:26 ` [PATCH 1/8] pinctrl: renesas: rzt2h: move GPIO enable/disable into separate function Cosmin Tanislav
@ 2025-11-21 11:26 ` Cosmin Tanislav
  2025-11-21 11:26 ` [PATCH 3/8] dt-bindings: pinctrl: renesas,r9a09g077-pinctrl: Document GPIO IRQ Cosmin Tanislav
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 14+ messages in thread
From: Cosmin Tanislav @ 2025-11-21 11:26 UTC (permalink / raw)
  To: Geert Uytterhoeven, Linus Walleij, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Magnus Damm, Lad Prabhakar
  Cc: linux-renesas-soc, linux-gpio, devicetree, linux-kernel,
	Cosmin Tanislav

Setting up an IRQ would normally be done in the .activate() and
.deactivate() ops of the IRQ domain, but for hierarchical IRQ domains
the .activate() and .deactivate() ops are overridden in the
gpiochip_hierarchy_setup_domain_ops() function.

As such, activating and deactivating need to be done in the .translate()
and .free() ops of the IRQ domain.

For RZ/T2H and RZ/N2H, interrupts go through the pin controller, into
the ICU, which level-translates them and forwards them to the GIC.

To use a GPIO as an interrupt it needs to be put into peripheral
function mode 0, which will connect it to the IRQ lines of the ICU.

The IRQ chip .child_to_parent_hwirq() callback is called as part of the
IRQ fwspec parsing logic (as part of irq_create_of_mapping()) which
happens before the IRQ is requested (as part of gpiochip_lock_as_irq()).

gpiochip_lock_as_irq() calls gpiod_get_direction() if the
.get_direction() callback is provided to ensure that the GPIO line is
set up as input.

In our case, IRQ function is separate from GPIO, and both cannot be true
at the same time.

Return GPIO_LINE_DIRECTION_IN even if pin is in IRQ function to allow
this setup to work.

Hold the spinlock to ensure atomicity between reading the PMC register
(which determines whether the pin is in GPIO mode or not) and reading
the function of the pin when it is not in GPIO mode.

Signed-off-by: Cosmin Tanislav <cosmin-gabriel.tanislav.xa@renesas.com>
---

Question for reviewers:

Is this the correct approach to handle this situation? I'm open to
suggestions about how to handle this more properly, but I have seen
similar approaches in other drivers where non-GPIO functions return
input direction. To make sure we don't affect other functions, since we
only need this to work for IRQ, I have added a check to make sure we're
in IRQ functions, which actually makes sense to have an input direction,
from a hardware perspective.

 drivers/pinctrl/renesas/pinctrl-rzt2h.c | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/drivers/pinctrl/renesas/pinctrl-rzt2h.c b/drivers/pinctrl/renesas/pinctrl-rzt2h.c
index c8ca5e13bba7..722551723e06 100644
--- a/drivers/pinctrl/renesas/pinctrl-rzt2h.c
+++ b/drivers/pinctrl/renesas/pinctrl-rzt2h.c
@@ -51,6 +51,7 @@
 
 #define PFC_MASK		GENMASK_ULL(5, 0)
 #define PFC_PIN_MASK(pin)	(PFC_MASK << ((pin) * 8))
+#define PFC_FUNC_INTERRUPT	0
 
 /*
  * Use 16 lower bits [15:0] for pin identifier
@@ -494,6 +495,7 @@ static int rzt2h_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
 	struct rzt2h_pinctrl *pctrl = gpiochip_get_data(chip);
 	u8 port = RZT2H_PIN_ID_TO_PORT(offset);
 	u8 bit = RZT2H_PIN_ID_TO_PIN(offset);
+	u64 reg64;
 	u16 reg;
 	int ret;
 
@@ -501,8 +503,25 @@ static int rzt2h_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
 	if (ret)
 		return ret;
 
-	if (rzt2h_pinctrl_readb(pctrl, port, PMC(port)) & BIT(bit))
+	guard(spinlock_irqsave)(&pctrl->lock);
+
+	if (rzt2h_pinctrl_readb(pctrl, port, PMC(port)) & BIT(bit)) {
+		/*
+		 * When a GPIO is being requested as an IRQ, the pinctrl
+		 * framework expects to be able to read the GPIO's direction.
+		 * IRQ function is separate from GPIO, and enabling it takes the
+		 * pin out of GPIO mode.
+		 * At this point, .child_to_parent_hwirq() has already been
+		 * called to enable the IRQ function.
+		 * Default to input direction for IRQ function.
+		 */
+		reg64 = rzt2h_pinctrl_readq(pctrl, port, PFC(port));
+		reg64 = (reg64 >> (bit * 8)) & PFC_MASK;
+		if (reg64 == PFC_FUNC_INTERRUPT)
+			return GPIO_LINE_DIRECTION_IN;
+
 		return -EINVAL;
+	}
 
 	reg = rzt2h_pinctrl_readw(pctrl, port, PM(port));
 	reg = (reg >> (bit * 2)) & PM_MASK;
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 3/8] dt-bindings: pinctrl: renesas,r9a09g077-pinctrl: Document GPIO IRQ
  2025-11-21 11:26 [PATCH 0/8] Add support for GPIO IRQs for RZ/T2H and RZ/N2H Cosmin Tanislav
  2025-11-21 11:26 ` [PATCH 1/8] pinctrl: renesas: rzt2h: move GPIO enable/disable into separate function Cosmin Tanislav
  2025-11-21 11:26 ` [PATCH 2/8] pinctrl: renesas: rzt2h: allow .get_direction() for IRQ function GPIOs Cosmin Tanislav
@ 2025-11-21 11:26 ` Cosmin Tanislav
  2025-12-03  8:03   ` Krzysztof Kozlowski
  2025-11-21 11:26 ` [PATCH 4/8] pinctrl: renesas: rzt2h: add GPIO IRQ chip to handle interrupts Cosmin Tanislav
                   ` (4 subsequent siblings)
  7 siblings, 1 reply; 14+ messages in thread
From: Cosmin Tanislav @ 2025-11-21 11:26 UTC (permalink / raw)
  To: Geert Uytterhoeven, Linus Walleij, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Magnus Damm, Lad Prabhakar
  Cc: linux-renesas-soc, linux-gpio, devicetree, linux-kernel,
	Cosmin Tanislav

The Renesas RZ/T2H (R9A09G077) and Renesas RZ/N2H (R9A09G087) SoCs have
IRQ-capable pins handled by the ICU, which forwards them to the GIC.

The ICU supports 16 IRQ lines, the pins map to these lines arbitrarily,
and the mapping is not configurable.

Document the required properties to handle GPIO IRQ.

Signed-off-by: Cosmin Tanislav <cosmin-gabriel.tanislav.xa@renesas.com>
---
 .../pinctrl/renesas,r9a09g077-pinctrl.yaml        | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/Documentation/devicetree/bindings/pinctrl/renesas,r9a09g077-pinctrl.yaml b/Documentation/devicetree/bindings/pinctrl/renesas,r9a09g077-pinctrl.yaml
index 36d665971484..1e171b443da1 100644
--- a/Documentation/devicetree/bindings/pinctrl/renesas,r9a09g077-pinctrl.yaml
+++ b/Documentation/devicetree/bindings/pinctrl/renesas,r9a09g077-pinctrl.yaml
@@ -49,6 +49,17 @@ properties:
   gpio-ranges:
     maxItems: 1
 
+  interrupt-controller: true
+
+  '#interrupt-cells':
+    const: 2
+    description:
+      The first cell contains the global GPIO port index, constructed using the
+      RZT2H_GPIO() helper macro from <dt-bindings/pinctrl/renesas,r9a09g077-pinctrl.h>
+      and the second cell is used to specify the flag.
+      E.g. "interrupts = <RZT2H_GPIO(8, 6) IRQ_TYPE_EDGE_FALLING>;" if P08_6 is
+      being used as an interrupt.
+
   clocks:
     maxItems: 1
 
@@ -119,6 +130,8 @@ required:
   - gpio-controller
   - '#gpio-cells'
   - gpio-ranges
+  - interrupt-controller
+  - '#interrupt-cells'
   - clocks
   - power-domains
 
@@ -139,6 +152,8 @@ examples:
         gpio-controller;
         #gpio-cells = <2>;
         gpio-ranges = <&pinctrl 0 0 288>;
+        interrupt-controller;
+        #interrupt-cells = <2>;
         power-domains = <&cpg>;
 
         serial0-pins {
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 4/8] pinctrl: renesas: rzt2h: add GPIO IRQ chip to handle interrupts
  2025-11-21 11:26 [PATCH 0/8] Add support for GPIO IRQs for RZ/T2H and RZ/N2H Cosmin Tanislav
                   ` (2 preceding siblings ...)
  2025-11-21 11:26 ` [PATCH 3/8] dt-bindings: pinctrl: renesas,r9a09g077-pinctrl: Document GPIO IRQ Cosmin Tanislav
@ 2025-11-21 11:26 ` Cosmin Tanislav
  2025-12-03 23:34   ` Linus Walleij
  2025-11-21 11:26 ` [PATCH 5/8] arm64: dts: renesas: r9a09g077: add GPIO IRQ support Cosmin Tanislav
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 14+ messages in thread
From: Cosmin Tanislav @ 2025-11-21 11:26 UTC (permalink / raw)
  To: Geert Uytterhoeven, Linus Walleij, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Magnus Damm, Lad Prabhakar
  Cc: linux-renesas-soc, linux-gpio, devicetree, linux-kernel,
	Cosmin Tanislav

The Renesas RZ/T2H (R9A09G077) and Renesas RZ/N2H (R9A09G087) SoCs have
IRQ-capable pins handled by the ICU, which forwards them to the GIC.

The ICU supports 16 IRQ lines, the pins map to these lines arbitrarily,
and the mapping is not configurable.

Add a GPIO IRQ chip that can be used to configure these pins as IRQ
lines.

Signed-off-by: Cosmin Tanislav <cosmin-gabriel.tanislav.xa@renesas.com>
---
 drivers/pinctrl/renesas/pinctrl-rzt2h.c | 196 ++++++++++++++++++++++++
 1 file changed, 196 insertions(+)

diff --git a/drivers/pinctrl/renesas/pinctrl-rzt2h.c b/drivers/pinctrl/renesas/pinctrl-rzt2h.c
index 722551723e06..8b4f0f048ee9 100644
--- a/drivers/pinctrl/renesas/pinctrl-rzt2h.c
+++ b/drivers/pinctrl/renesas/pinctrl-rzt2h.c
@@ -18,6 +18,7 @@
 #include <linux/module.h>
 #include <linux/mutex.h>
 #include <linux/of_device.h>
+#include <linux/of_irq.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/spinlock.h>
@@ -65,6 +66,9 @@
 
 #define RZT2H_MAX_SAFETY_PORTS		12
 
+#define RZT2H_INTERRUPTS_START		16
+#define RZT2H_INTERRUPTS_NUM		17
+
 struct rzt2h_pinctrl_data {
 	unsigned int n_port_pins;
 	const u8 *port_pin_configs;
@@ -80,9 +84,11 @@ struct rzt2h_pinctrl {
 	struct device			*dev;
 	struct gpio_chip		gpio_chip;
 	struct pinctrl_gpio_range	gpio_range;
+	DECLARE_BITMAP(used_irqs, RZT2H_INTERRUPTS_NUM);
 	spinlock_t			lock; /* lock read/write registers */
 	struct mutex			mutex; /* serialize adding groups and functions */
 	bool				safety_port_enabled;
+	atomic_t			wakeup_path;
 };
 
 #define RZT2H_GET_BASE(pctrl, port) \
@@ -644,14 +650,190 @@ static const char * const rzt2h_gpio_names[] = {
 	"P35_0", "P35_1", "P35_2", "P35_3", "P35_4", "P35_5", "P35_6", "P35_7",
 };
 
+/*
+ * Interrupts 0-15 are for INTCPUn, which are not exposed externally.
+ * Interrupts 16-31 are for IRQn. SEI is 32.
+ * This table matches the information found in User Manual's Table 17.2,
+ * List of multiplexed pin configurations (5 of 51).
+ * RZ/N2H has the same GPIO to IRQ mapping, except for the pins which
+ * are not present.
+ */
+static const u8 rzt2h_gpio_irq_map[] = {
+	32, 16, 17, 18, 19,  0, 20, 21,
+	22,  0,  0,  0,  0,  0,  0,  0,
+	23, 24, 25, 26, 27,  0,  0,  0,
+	 0,  0, 28, 29, 30, 31,  0,  0,
+	 0,  0,  0,  0,  0, 32, 16, 17,
+	18, 19, 20, 21, 22,  0,  0,  0,
+	 0,  0, 24, 25, 26, 27,  0, 28,
+	29, 30, 31,  0,  0,  0,  0,  0,
+	 0,  0,  0,  0,  0, 24, 32, 16,
+	 0,  0,  0,  0,  0,  0,  0,  0,
+	20, 23, 17, 18, 19,  0, 16, 25,
+	29, 20, 21, 22, 23,  0,  0,  0,
+	 0,  0,  0,  0, 17,  0,  0, 18,
+	 0,  0, 19,  0,  0, 20,  0, 30,
+	21,  0,  0, 22,  0,  0, 24, 25,
+	 0,  0,  0,  0,  0, 16, 17,  0,
+	18,  0,  0, 26, 27,  0,  0,  0,
+	28, 29, 30, 31,  0,  0,  0,  0,
+	23, 31, 32, 16, 17, 18, 19, 20,
+	 0,  0,  0,  0,  0,  0,  0,  0,
+	 0,  0,  0,  0,  0,  0,  0,  0,
+	 0,  0,  0,  0,  0,  0,  0,  0,
+	27,  0,  0, 21, 22, 23, 24, 25,
+	26,  0,  0,  0,  0,  0,  0,  0,
+	27, 28, 29, 30, 31,  0,  0,  0,
+	 0,  0,  0,  0,  0,  0,  0,  0,
+	 0,  0,  0,  0,  0, 28, 32, 16,
+	17, 18, 19,  0,  0,  0,  0, 20,
+	21, 22, 23,  0,  0,  0,  0,  0,
+	 0,  0,  0,  0, 24, 25,  0,  0,
+	 0,  0, 26, 27,  0,  0,  0, 30,
+	 0, 29,  0,  0,  0,  0,  0,  0,
+	 0,  0,  0,  0,  0,  0,  0,  0,
+	 0,  0,  0, 28, 29, 30, 31,  0,
+	 0,  0,  0,  0,  0,  0,  0, 30,
+	 0,  0,  0,  0,  0,  0,  0,  0,
+};
+
+static void rzt2h_gpio_irq_disable(struct irq_data *d)
+{
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+	unsigned int hwirq = irqd_to_hwirq(d);
+
+	irq_chip_disable_parent(d);
+	gpiochip_disable_irq(gc, hwirq);
+}
+
+static void rzt2h_gpio_irq_enable(struct irq_data *d)
+{
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+	unsigned int hwirq = irqd_to_hwirq(d);
+
+	gpiochip_enable_irq(gc, hwirq);
+	irq_chip_enable_parent(d);
+}
+
+static int rzt2h_gpio_irq_set_wake(struct irq_data *d, unsigned int on)
+{
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+	struct rzt2h_pinctrl *pctrl = container_of(gc, struct rzt2h_pinctrl, gpio_chip);
+	int ret;
+
+	ret = irq_chip_set_wake_parent(d, on);
+	if (ret)
+		return ret;
+
+	if (on)
+		atomic_inc(&pctrl->wakeup_path);
+	else
+		atomic_dec(&pctrl->wakeup_path);
+
+	return 0;
+}
+
+static const struct irq_chip rzt2h_gpio_irqchip = {
+	.name = "rzt2h-gpio",
+	.irq_disable = rzt2h_gpio_irq_disable,
+	.irq_enable = rzt2h_gpio_irq_enable,
+	.irq_mask = irq_chip_mask_parent,
+	.irq_unmask = irq_chip_unmask_parent,
+	.irq_set_type = irq_chip_set_type_parent,
+	.irq_set_wake = rzt2h_gpio_irq_set_wake,
+	.irq_eoi = irq_chip_eoi_parent,
+	.irq_set_affinity = irq_chip_set_affinity_parent,
+	.flags = IRQCHIP_IMMUTABLE,
+	GPIOCHIP_IRQ_RESOURCE_HELPERS,
+};
+
+static int rzt2h_pinctrl_suspend_noirq(struct device *dev)
+{
+	struct rzt2h_pinctrl *pctrl = dev_get_drvdata(dev);
+
+	if (atomic_read(&pctrl->wakeup_path))
+		device_set_wakeup_path(dev);
+
+	return 0;
+}
+
+static int rzt2h_gpio_child_to_parent_hwirq(struct gpio_chip *gc,
+					    unsigned int child,
+					    unsigned int child_type,
+					    unsigned int *parent,
+					    unsigned int *parent_type)
+{
+	struct rzt2h_pinctrl *pctrl = gpiochip_get_data(gc);
+	u8 port = RZT2H_PIN_ID_TO_PORT(child);
+	u8 pin = RZT2H_PIN_ID_TO_PIN(child);
+	u8 parent_irq;
+
+	parent_irq = rzt2h_gpio_irq_map[child];
+	if (parent_irq < RZT2H_INTERRUPTS_START)
+		return -EINVAL;
+
+	if (test_and_set_bit(parent_irq - RZT2H_INTERRUPTS_START,
+			     pctrl->used_irqs))
+		return -EBUSY;
+
+	rzt2h_pinctrl_set_pfc_mode(pctrl, port, pin, PFC_FUNC_INTERRUPT);
+
+	*parent = parent_irq;
+	*parent_type = child_type;
+
+	return 0;
+}
+
+static void rzt2h_gpio_irq_domain_free(struct irq_domain *domain, unsigned int virq,
+				       unsigned int nr_irqs)
+{
+	struct irq_data *d = irq_domain_get_irq_data(domain, virq);
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+	struct rzt2h_pinctrl *pctrl = container_of(gc, struct rzt2h_pinctrl, gpio_chip);
+	irq_hw_number_t hwirq = irqd_to_hwirq(d);
+	u8 port = RZT2H_PIN_ID_TO_PORT(hwirq);
+	u8 pin = RZT2H_PIN_ID_TO_PIN(hwirq);
+
+	if (test_and_clear_bit(hwirq - RZT2H_INTERRUPTS_START, pctrl->used_irqs))
+		rzt2h_pinctrl_set_gpio_en(pctrl, port, pin, false);
+
+	irq_domain_free_irqs_common(domain, virq, nr_irqs);
+}
+
+static void rzt2h_gpio_init_irq_valid_mask(struct gpio_chip *gc,
+					   unsigned long *valid_mask,
+					   unsigned int ngpios)
+{
+	struct rzt2h_pinctrl *pctrl = gpiochip_get_data(gc);
+	unsigned int offset;
+
+	for (offset = 0; offset < ngpios; offset++) {
+		if (!rzt2h_gpio_irq_map[offset] || rzt2h_validate_pin(pctrl, offset))
+			clear_bit(offset, valid_mask);
+	}
+}
+
 static int rzt2h_gpio_register(struct rzt2h_pinctrl *pctrl)
 {
 	struct pinctrl_gpio_range *range = &pctrl->gpio_range;
 	struct gpio_chip *chip = &pctrl->gpio_chip;
+	struct device_node *np = pctrl->dev->of_node;
+	struct irq_domain *parent_domain;
 	struct device *dev = pctrl->dev;
 	struct of_phandle_args of_args;
+	struct device_node *parent_np;
+	struct gpio_irq_chip *girq;
 	int ret;
 
+	parent_np = of_irq_find_parent(np);
+	if (!parent_np)
+		return -ENXIO;
+
+	parent_domain = irq_find_host(parent_np);
+	of_node_put(parent_np);
+	if (!parent_domain)
+		return -EPROBE_DEFER;
+
 	ret = of_parse_phandle_with_fixed_args(dev->of_node, "gpio-ranges", 3, 0, &of_args);
 	if (ret)
 		return dev_err_probe(dev, ret, "Unable to parse gpio-ranges\n");
@@ -675,6 +857,15 @@ static int rzt2h_gpio_register(struct rzt2h_pinctrl *pctrl)
 	chip->set = rzt2h_gpio_set;
 	chip->label = dev_name(dev);
 
+	girq = &chip->irq;
+	gpio_irq_chip_set_chip(girq, &rzt2h_gpio_irqchip);
+	girq->fwnode = dev_fwnode(pctrl->dev);
+	girq->parent_domain = parent_domain;
+	girq->child_to_parent_hwirq = rzt2h_gpio_child_to_parent_hwirq;
+	girq->populate_parent_alloc_arg = gpiochip_populate_parent_fwspec_twocell;
+	girq->child_irq_domain_ops.free = rzt2h_gpio_irq_domain_free;
+	girq->init_valid_mask = rzt2h_gpio_init_irq_valid_mask;
+
 	range->id = 0;
 	range->pin_base = 0;
 	range->base = 0;
@@ -819,10 +1010,15 @@ static const struct of_device_id rzt2h_pinctrl_of_table[] = {
 	{ /* sentinel */ }
 };
 
+static const struct dev_pm_ops rzt2h_pinctrl_pm_ops = {
+	NOIRQ_SYSTEM_SLEEP_PM_OPS(rzt2h_pinctrl_suspend_noirq, NULL)
+};
+
 static struct platform_driver rzt2h_pinctrl_driver = {
 	.driver = {
 		.name = DRV_NAME,
 		.of_match_table = of_match_ptr(rzt2h_pinctrl_of_table),
+		.pm = pm_sleep_ptr(&rzt2h_pinctrl_pm_ops),
 		.suppress_bind_attrs = true,
 	},
 	.probe = rzt2h_pinctrl_probe,
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 5/8] arm64: dts: renesas: r9a09g077: add GPIO IRQ support
  2025-11-21 11:26 [PATCH 0/8] Add support for GPIO IRQs for RZ/T2H and RZ/N2H Cosmin Tanislav
                   ` (3 preceding siblings ...)
  2025-11-21 11:26 ` [PATCH 4/8] pinctrl: renesas: rzt2h: add GPIO IRQ chip to handle interrupts Cosmin Tanislav
@ 2025-11-21 11:26 ` Cosmin Tanislav
  2025-11-21 11:26 ` [PATCH 6/8] arm64: dts: renesas: r9a09g087: " Cosmin Tanislav
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 14+ messages in thread
From: Cosmin Tanislav @ 2025-11-21 11:26 UTC (permalink / raw)
  To: Geert Uytterhoeven, Linus Walleij, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Magnus Damm, Lad Prabhakar
  Cc: linux-renesas-soc, linux-gpio, devicetree, linux-kernel,
	Cosmin Tanislav

The Renesas RZ/T2H (R9A09G077) SoC includes pins which can be routed via
the ICU to generate interrupts.

Add support for using the pin controller as an interrupt chip.

Signed-off-by: Cosmin Tanislav <cosmin-gabriel.tanislav.xa@renesas.com>
---
 arch/arm64/boot/dts/renesas/r9a09g077.dtsi | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/arm64/boot/dts/renesas/r9a09g077.dtsi b/arch/arm64/boot/dts/renesas/r9a09g077.dtsi
index 0af41287e6a8..6812af127684 100644
--- a/arch/arm64/boot/dts/renesas/r9a09g077.dtsi
+++ b/arch/arm64/boot/dts/renesas/r9a09g077.dtsi
@@ -945,6 +945,9 @@ pinctrl: pinctrl@802c0000 {
 			gpio-controller;
 			#gpio-cells = <2>;
 			gpio-ranges = <&pinctrl 0 0 288>;
+			#interrupt-cells = <2>;
+			interrupt-controller;
+			interrupt-parent = <&icu>;
 			power-domains = <&cpg>;
 		};
 
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 6/8] arm64: dts: renesas: r9a09g087: add GPIO IRQ support
  2025-11-21 11:26 [PATCH 0/8] Add support for GPIO IRQs for RZ/T2H and RZ/N2H Cosmin Tanislav
                   ` (4 preceding siblings ...)
  2025-11-21 11:26 ` [PATCH 5/8] arm64: dts: renesas: r9a09g077: add GPIO IRQ support Cosmin Tanislav
@ 2025-11-21 11:26 ` Cosmin Tanislav
  2025-11-21 11:26 ` [PATCH 7/8] arm64: dts: renesas: r9a09g077m44-rzt2h-evk: add GPIO keys Cosmin Tanislav
  2025-11-21 11:26 ` [PATCH 8/8] arm64: dts: renesas: r9a09g087m44-rzn2h-evk: " Cosmin Tanislav
  7 siblings, 0 replies; 14+ messages in thread
From: Cosmin Tanislav @ 2025-11-21 11:26 UTC (permalink / raw)
  To: Geert Uytterhoeven, Linus Walleij, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Magnus Damm, Lad Prabhakar
  Cc: linux-renesas-soc, linux-gpio, devicetree, linux-kernel,
	Cosmin Tanislav

The Renesas RZ/N2H (R9A09G087) SoC includes pins which can be routed via
the ICU to generate interrupts.

Add support for using the pin controller as an interrupt chip.

Signed-off-by: Cosmin Tanislav <cosmin-gabriel.tanislav.xa@renesas.com>
---
 arch/arm64/boot/dts/renesas/r9a09g087.dtsi | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/arm64/boot/dts/renesas/r9a09g087.dtsi b/arch/arm64/boot/dts/renesas/r9a09g087.dtsi
index 6b5693e5c1f9..19475c72017f 100644
--- a/arch/arm64/boot/dts/renesas/r9a09g087.dtsi
+++ b/arch/arm64/boot/dts/renesas/r9a09g087.dtsi
@@ -948,6 +948,9 @@ pinctrl: pinctrl@802c0000 {
 			gpio-controller;
 			#gpio-cells = <2>;
 			gpio-ranges = <&pinctrl 0 0 280>;
+			#interrupt-cells = <2>;
+			interrupt-controller;
+			interrupt-parent = <&icu>;
 			power-domains = <&cpg>;
 		};
 
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 7/8] arm64: dts: renesas: r9a09g077m44-rzt2h-evk: add GPIO keys
  2025-11-21 11:26 [PATCH 0/8] Add support for GPIO IRQs for RZ/T2H and RZ/N2H Cosmin Tanislav
                   ` (5 preceding siblings ...)
  2025-11-21 11:26 ` [PATCH 6/8] arm64: dts: renesas: r9a09g087: " Cosmin Tanislav
@ 2025-11-21 11:26 ` Cosmin Tanislav
  2025-11-21 11:26 ` [PATCH 8/8] arm64: dts: renesas: r9a09g087m44-rzn2h-evk: " Cosmin Tanislav
  7 siblings, 0 replies; 14+ messages in thread
From: Cosmin Tanislav @ 2025-11-21 11:26 UTC (permalink / raw)
  To: Geert Uytterhoeven, Linus Walleij, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Magnus Damm, Lad Prabhakar
  Cc: linux-renesas-soc, linux-gpio, devicetree, linux-kernel,
	Cosmin Tanislav

The Renesas RZ/T2H Evaluation Kit has three user buttons connected to
GPIOs that can be used as input keys.

Add support for them.

Signed-off-by: Cosmin Tanislav <cosmin-gabriel.tanislav.xa@renesas.com>
---
 .../dts/renesas/r9a09g077m44-rzt2h-evk.dts    | 33 +++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/arch/arm64/boot/dts/renesas/r9a09g077m44-rzt2h-evk.dts b/arch/arm64/boot/dts/renesas/r9a09g077m44-rzt2h-evk.dts
index d1474f1bd523..a2584a3afb01 100644
--- a/arch/arm64/boot/dts/renesas/r9a09g077m44-rzt2h-evk.dts
+++ b/arch/arm64/boot/dts/renesas/r9a09g077m44-rzt2h-evk.dts
@@ -7,6 +7,8 @@
 
 /dts-v1/;
 
+#include <dt-bindings/input/input.h>
+
 #include "r9a09g077m44.dtsi"
 
 /*
@@ -60,6 +62,37 @@ / {
 	model = "Renesas RZ/T2H EVK Board based on r9a09g077m44";
 	compatible = "renesas,rzt2h-evk", "renesas,r9a09g077m44", "renesas,r9a09g077";
 
+	keys {
+		compatible = "gpio-keys";
+
+#if (!SD1_MICRO_SD)
+		/* SW2-3: ON */
+		key-1 {
+			interrupts-extended = <&pinctrl RZT2H_GPIO(8, 6) IRQ_TYPE_EDGE_FALLING>;
+			linux,code = <KEY_1>;
+			label = "SW9";
+			wakeup-source;
+			debounce-interval = <20>;
+		};
+#endif
+
+		key-2 {
+			interrupts-extended = <&pinctrl RZT2H_GPIO(0, 3) IRQ_TYPE_EDGE_FALLING>;
+			linux,code = <KEY_2>;
+			label = "SW10";
+			wakeup-source;
+			debounce-interval = <20>;
+		};
+
+		key-3 {
+			interrupts-extended = <&pinctrl RZT2H_GPIO(8, 7) IRQ_TYPE_EDGE_FALLING>;
+			linux,code = <KEY_3>;
+			label = "SW11";
+			wakeup-source;
+			debounce-interval = <20>;
+		};
+	};
+
 	leds {
 		compatible = "gpio-leds";
 
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 8/8] arm64: dts: renesas: r9a09g087m44-rzn2h-evk: add GPIO keys
  2025-11-21 11:26 [PATCH 0/8] Add support for GPIO IRQs for RZ/T2H and RZ/N2H Cosmin Tanislav
                   ` (6 preceding siblings ...)
  2025-11-21 11:26 ` [PATCH 7/8] arm64: dts: renesas: r9a09g077m44-rzt2h-evk: add GPIO keys Cosmin Tanislav
@ 2025-11-21 11:26 ` Cosmin Tanislav
  7 siblings, 0 replies; 14+ messages in thread
From: Cosmin Tanislav @ 2025-11-21 11:26 UTC (permalink / raw)
  To: Geert Uytterhoeven, Linus Walleij, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Magnus Damm, Lad Prabhakar
  Cc: linux-renesas-soc, linux-gpio, devicetree, linux-kernel,
	Cosmin Tanislav

The Renesas RZ/N2H Evaluation Kit has three user buttons connected to
GPIOs that can be used as input keys.

Add support for them.

Signed-off-by: Cosmin Tanislav <cosmin-gabriel.tanislav.xa@renesas.com>
---
 .../dts/renesas/r9a09g087m44-rzn2h-evk.dts    | 30 +++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/arch/arm64/boot/dts/renesas/r9a09g087m44-rzn2h-evk.dts b/arch/arm64/boot/dts/renesas/r9a09g087m44-rzn2h-evk.dts
index eaf73868783b..252f1c21ff90 100644
--- a/arch/arm64/boot/dts/renesas/r9a09g087m44-rzn2h-evk.dts
+++ b/arch/arm64/boot/dts/renesas/r9a09g087m44-rzn2h-evk.dts
@@ -7,6 +7,8 @@
 
 /dts-v1/;
 
+#include <dt-bindings/input/input.h>
+
 #include "r9a09g087m44.dtsi"
 
 /*
@@ -77,6 +79,34 @@ / {
 	model = "Renesas RZ/N2H EVK Board based on r9a09g087m44";
 	compatible = "renesas,rzn2h-evk", "renesas,r9a09g087m44", "renesas,r9a09g087";
 
+	keys {
+		compatible = "gpio-keys";
+
+		key-1 {
+			interrupts-extended = <&pinctrl RZT2H_GPIO(18, 2) IRQ_TYPE_EDGE_FALLING>;
+			linux,code = <KEY_1>;
+			label = "SW2";
+			wakeup-source;
+			debounce-interval = <20>;
+		};
+
+		key-2 {
+			interrupts-extended = <&pinctrl RZT2H_GPIO(0, 4) IRQ_TYPE_EDGE_FALLING>;
+			linux,code = <KEY_2>;
+			label = "SW3";
+			wakeup-source;
+			debounce-interval = <20>;
+		};
+
+		key-3 {
+			interrupts-extended = <&pinctrl RZT2H_GPIO(18, 7) IRQ_TYPE_EDGE_FALLING>;
+			linux,code = <KEY_3>;
+			label = "SW4";
+			wakeup-source;
+			debounce-interval = <20>;
+		};
+	};
+
 	leds {
 		compatible = "gpio-leds";
 
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH 3/8] dt-bindings: pinctrl: renesas,r9a09g077-pinctrl: Document GPIO IRQ
  2025-11-21 11:26 ` [PATCH 3/8] dt-bindings: pinctrl: renesas,r9a09g077-pinctrl: Document GPIO IRQ Cosmin Tanislav
@ 2025-12-03  8:03   ` Krzysztof Kozlowski
  2025-12-04  9:30     ` Cosmin-Gabriel Tanislav
  0 siblings, 1 reply; 14+ messages in thread
From: Krzysztof Kozlowski @ 2025-12-03  8:03 UTC (permalink / raw)
  To: Cosmin Tanislav
  Cc: Geert Uytterhoeven, Linus Walleij, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Magnus Damm, Lad Prabhakar,
	linux-renesas-soc, linux-gpio, devicetree, linux-kernel

On Fri, Nov 21, 2025 at 01:26:21PM +0200, Cosmin Tanislav wrote:
> The Renesas RZ/T2H (R9A09G077) and Renesas RZ/N2H (R9A09G087) SoCs have
> IRQ-capable pins handled by the ICU, which forwards them to the GIC.
> 
> The ICU supports 16 IRQ lines, the pins map to these lines arbitrarily,
> and the mapping is not configurable.
> 
> Document the required properties to handle GPIO IRQ.
> 
> Signed-off-by: Cosmin Tanislav <cosmin-gabriel.tanislav.xa@renesas.com>
> ---
>  .../pinctrl/renesas,r9a09g077-pinctrl.yaml        | 15 +++++++++++++++
>  1 file changed, 15 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/pinctrl/renesas,r9a09g077-pinctrl.yaml b/Documentation/devicetree/bindings/pinctrl/renesas,r9a09g077-pinctrl.yaml
> index 36d665971484..1e171b443da1 100644
> --- a/Documentation/devicetree/bindings/pinctrl/renesas,r9a09g077-pinctrl.yaml
> +++ b/Documentation/devicetree/bindings/pinctrl/renesas,r9a09g077-pinctrl.yaml
> @@ -49,6 +49,17 @@ properties:
>    gpio-ranges:
>      maxItems: 1
>  
> +  interrupt-controller: true
> +
> +  '#interrupt-cells':
> +    const: 2
> +    description:
> +      The first cell contains the global GPIO port index, constructed using the
> +      RZT2H_GPIO() helper macro from <dt-bindings/pinctrl/renesas,r9a09g077-pinctrl.h>
> +      and the second cell is used to specify the flag.
> +      E.g. "interrupts = <RZT2H_GPIO(8, 6) IRQ_TYPE_EDGE_FALLING>;" if P08_6 is
> +      being used as an interrupt.
> +
>    clocks:
>      maxItems: 1
>  
> @@ -119,6 +130,8 @@ required:
>    - gpio-controller
>    - '#gpio-cells'
>    - gpio-ranges
> +  - interrupt-controller
> +  - '#interrupt-cells'

This is technically an ABI break thus commit msg must explain WHY
breaking ABI is necessary and what is the impact on users.

If your driver keeps things backwards compatible, then briefly mention
it in the commit msg that you require it only for complete hardware
picture. Or for whatever other reason.

Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 4/8] pinctrl: renesas: rzt2h: add GPIO IRQ chip to handle interrupts
  2025-11-21 11:26 ` [PATCH 4/8] pinctrl: renesas: rzt2h: add GPIO IRQ chip to handle interrupts Cosmin Tanislav
@ 2025-12-03 23:34   ` Linus Walleij
  2025-12-04 15:36     ` Cosmin-Gabriel Tanislav
  0 siblings, 1 reply; 14+ messages in thread
From: Linus Walleij @ 2025-12-03 23:34 UTC (permalink / raw)
  To: Cosmin Tanislav
  Cc: Geert Uytterhoeven, Linus Walleij, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Magnus Damm, Lad Prabhakar,
	linux-renesas-soc, linux-gpio, devicetree, linux-kernel

Hi Cosmin,

thanks for your patch!

On Fri, Nov 21, 2025 at 12:27 PM Cosmin Tanislav
<cosmin-gabriel.tanislav.xa@renesas.com> wrote:

> The Renesas RZ/T2H (R9A09G077) and Renesas RZ/N2H (R9A09G087) SoCs have
> IRQ-capable pins handled by the ICU, which forwards them to the GIC.
>
> The ICU supports 16 IRQ lines, the pins map to these lines arbitrarily,
> and the mapping is not configurable.
>
> Add a GPIO IRQ chip that can be used to configure these pins as IRQ
> lines.
>
> Signed-off-by: Cosmin Tanislav <cosmin-gabriel.tanislav.xa@renesas.com>

Mention in the commit that this is achieved with a
hierarchical IRQ domain please. (I really like how this
was done!) Also mention that wakeup capability is
also implemented as part of the patch.

You probably need a:

select IRQ_DOMAIN_HIERARCHY

In the rzt2h Kconfig entry?

> +static int rzt2h_gpio_irq_set_wake(struct irq_data *d, unsigned int on)
> +{
> +       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
> +       struct rzt2h_pinctrl *pctrl = container_of(gc, struct rzt2h_pinctrl, gpio_chip);
> +       int ret;
> +
> +       ret = irq_chip_set_wake_parent(d, on);
> +       if (ret)
> +               return ret;
> +

Add a comment here:

/*
 * If any of the IRQs are in use, then put the entire pin controller
 * on the device wakeup path.
 */

> +       if (on)
> +               atomic_inc(&pctrl->wakeup_path);
> +       else
> +               atomic_dec(&pctrl->wakeup_path);

BTW this is an elegant piece of code I think a lot of other drivers
need...

> +static int rzt2h_gpio_child_to_parent_hwirq(struct gpio_chip *gc,
> +                                           unsigned int child,
> +                                           unsigned int child_type,
> +                                           unsigned int *parent,
> +                                           unsigned int *parent_type)
> +{
> +       struct rzt2h_pinctrl *pctrl = gpiochip_get_data(gc);
> +       u8 port = RZT2H_PIN_ID_TO_PORT(child);
> +       u8 pin = RZT2H_PIN_ID_TO_PIN(child);
> +       u8 parent_irq;
> +
> +       parent_irq = rzt2h_gpio_irq_map[child];
> +       if (parent_irq < RZT2H_INTERRUPTS_START)
> +               return -EINVAL;
> +
> +       if (test_and_set_bit(parent_irq - RZT2H_INTERRUPTS_START,
> +                            pctrl->used_irqs))
> +               return -EBUSY;
> +
> +       rzt2h_pinctrl_set_pfc_mode(pctrl, port, pin, PFC_FUNC_INTERRUPT);
> +
> +       *parent = parent_irq;
> +       *parent_type = child_type;
> +
> +       return 0;
> +}

Complex, but easy to follow, understand and debug.
Good job here!

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 14+ messages in thread

* RE: [PATCH 3/8] dt-bindings: pinctrl: renesas,r9a09g077-pinctrl: Document GPIO IRQ
  2025-12-03  8:03   ` Krzysztof Kozlowski
@ 2025-12-04  9:30     ` Cosmin-Gabriel Tanislav
  2025-12-04 16:00       ` Krzysztof Kozlowski
  0 siblings, 1 reply; 14+ messages in thread
From: Cosmin-Gabriel Tanislav @ 2025-12-04  9:30 UTC (permalink / raw)
  To: Krzysztof Kozlowski
  Cc: Geert Uytterhoeven, Linus Walleij, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, magnus.damm,
	Prabhakar Mahadev Lad, linux-renesas-soc@vger.kernel.org,
	linux-gpio@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org

> -----Original Message-----
> From: Krzysztof Kozlowski <krzk@kernel.org>
> Sent: Wednesday, December 3, 2025 10:04 AM
> To: Cosmin-Gabriel Tanislav <cosmin-gabriel.tanislav.xa@renesas.com>
> Cc: Geert Uytterhoeven <geert+renesas@glider.be>; Linus Walleij <linus.walleij@linaro.org>; Rob
> Herring <robh@kernel.org>; Krzysztof Kozlowski <krzk+dt@kernel.org>; Conor Dooley
> <conor+dt@kernel.org>; magnus.damm <magnus.damm@gmail.com>; Prabhakar Mahadev Lad <prabhakar.mahadev-
> lad.rj@bp.renesas.com>; linux-renesas-soc@vger.kernel.org; linux-gpio@vger.kernel.org;
> devicetree@vger.kernel.org; linux-kernel@vger.kernel.org
> Subject: Re: [PATCH 3/8] dt-bindings: pinctrl: renesas,r9a09g077-pinctrl: Document GPIO IRQ
> 
> On Fri, Nov 21, 2025 at 01:26:21PM +0200, Cosmin Tanislav wrote:
> > The Renesas RZ/T2H (R9A09G077) and Renesas RZ/N2H (R9A09G087) SoCs have
> > IRQ-capable pins handled by the ICU, which forwards them to the GIC.
> >
> > The ICU supports 16 IRQ lines, the pins map to these lines arbitrarily,
> > and the mapping is not configurable.
> >
> > Document the required properties to handle GPIO IRQ.
> >
> > Signed-off-by: Cosmin Tanislav <cosmin-gabriel.tanislav.xa@renesas.com>
> > ---
> >  .../pinctrl/renesas,r9a09g077-pinctrl.yaml        | 15 +++++++++++++++
> >  1 file changed, 15 insertions(+)
> >
> > diff --git a/Documentation/devicetree/bindings/pinctrl/renesas,r9a09g077-pinctrl.yaml
> b/Documentation/devicetree/bindings/pinctrl/renesas,r9a09g077-pinctrl.yaml
> > index 36d665971484..1e171b443da1 100644
> > --- a/Documentation/devicetree/bindings/pinctrl/renesas,r9a09g077-pinctrl.yaml
> > +++ b/Documentation/devicetree/bindings/pinctrl/renesas,r9a09g077-pinctrl.yaml
> > @@ -49,6 +49,17 @@ properties:
> >    gpio-ranges:
> >      maxItems: 1
> >
> > +  interrupt-controller: true
> > +
> > +  '#interrupt-cells':
> > +    const: 2
> > +    description:
> > +      The first cell contains the global GPIO port index, constructed using the
> > +      RZT2H_GPIO() helper macro from <dt-bindings/pinctrl/renesas,r9a09g077-pinctrl.h>
> > +      and the second cell is used to specify the flag.
> > +      E.g. "interrupts = <RZT2H_GPIO(8, 6) IRQ_TYPE_EDGE_FALLING>;" if P08_6 is
> > +      being used as an interrupt.
> > +
> >    clocks:
> >      maxItems: 1
> >
> > @@ -119,6 +130,8 @@ required:
> >    - gpio-controller
> >    - '#gpio-cells'
> >    - gpio-ranges
> > +  - interrupt-controller
> > +  - '#interrupt-cells'
> 
> This is technically an ABI break thus commit msg must explain WHY
> breaking ABI is necessary and what is the impact on users.
> 
> If your driver keeps things backwards compatible, then briefly mention
> it in the commit msg that you require it only for complete hardware
> picture. Or for whatever other reason.
>


It's not exactly required for the pinctrl to be defined as an interrupt
controller, only if you use the interrupt functionality of the pins...
I can remove them from required, that should keep compatibility.

Would that be fine?

> Best regards,
> Krzysztof


^ permalink raw reply	[flat|nested] 14+ messages in thread

* RE: [PATCH 4/8] pinctrl: renesas: rzt2h: add GPIO IRQ chip to handle interrupts
  2025-12-03 23:34   ` Linus Walleij
@ 2025-12-04 15:36     ` Cosmin-Gabriel Tanislav
  0 siblings, 0 replies; 14+ messages in thread
From: Cosmin-Gabriel Tanislav @ 2025-12-04 15:36 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Geert Uytterhoeven, Linus Walleij, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, magnus.damm,
	Prabhakar Mahadev Lad, linux-renesas-soc@vger.kernel.org,
	linux-gpio@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org

> From: Linus Walleij <linusw@kernel.org>
> Sent: Thursday, December 4, 2025 1:34 AM
> 
> Hi Cosmin,
> 
> thanks for your patch!
> 

Hi Linus, thank you for your feedback.

> On Fri, Nov 21, 2025 at 12:27 PM Cosmin Tanislav
> <cosmin-gabriel.tanislav.xa@renesas.com> wrote:
> 
> > The Renesas RZ/T2H (R9A09G077) and Renesas RZ/N2H (R9A09G087) SoCs have
> > IRQ-capable pins handled by the ICU, which forwards them to the GIC.
> >
> > The ICU supports 16 IRQ lines, the pins map to these lines arbitrarily,
> > and the mapping is not configurable.
> >
> > Add a GPIO IRQ chip that can be used to configure these pins as IRQ
> > lines.
> >
> > Signed-off-by: Cosmin Tanislav <cosmin-gabriel.tanislav.xa@renesas.com>
> 
> Mention in the commit that this is achieved with a
> hierarchical IRQ domain please. (I really like how this
> was done!) Also mention that wakeup capability is
> also implemented as part of the patch.
> 

Ack, I will reword the commit message and include your suggestions.

> You probably need a:
> 
> select IRQ_DOMAIN_HIERARCHY
> 
> In the rzt2h Kconfig entry?
> 

Yes, along with a select GPIOLIB_IRQCHIP.

I will add both in the next version.

> > +static int rzt2h_gpio_irq_set_wake(struct irq_data *d, unsigned int on)
> > +{
> > +       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
> > +       struct rzt2h_pinctrl *pctrl = container_of(gc, struct rzt2h_pinctrl, gpio_chip);
> > +       int ret;
> > +
> > +       ret = irq_chip_set_wake_parent(d, on);
> > +       if (ret)
> > +               return ret;
> > +
> 
> Add a comment here:
> 
> /*
>  * If any of the IRQs are in use, then put the entire pin controller
>  * on the device wakeup path.
>  */
> 

Ack.

> > +       if (on)
> > +               atomic_inc(&pctrl->wakeup_path);
> > +       else
> > +               atomic_dec(&pctrl->wakeup_path);
> 
> BTW this is an elegant piece of code I think a lot of other drivers
> need...
> 
> > +static int rzt2h_gpio_child_to_parent_hwirq(struct gpio_chip *gc,
> > +                                           unsigned int child,
> > +                                           unsigned int child_type,
> > +                                           unsigned int *parent,
> > +                                           unsigned int *parent_type)
> > +{
> > +       struct rzt2h_pinctrl *pctrl = gpiochip_get_data(gc);
> > +       u8 port = RZT2H_PIN_ID_TO_PORT(child);
> > +       u8 pin = RZT2H_PIN_ID_TO_PIN(child);
> > +       u8 parent_irq;
> > +
> > +       parent_irq = rzt2h_gpio_irq_map[child];
> > +       if (parent_irq < RZT2H_INTERRUPTS_START)
> > +               return -EINVAL;
> > +
> > +       if (test_and_set_bit(parent_irq - RZT2H_INTERRUPTS_START,
> > +                            pctrl->used_irqs))
> > +               return -EBUSY;
> > +
> > +       rzt2h_pinctrl_set_pfc_mode(pctrl, port, pin, PFC_FUNC_INTERRUPT);
> > +
> > +       *parent = parent_irq;
> > +       *parent_type = child_type;
> > +
> > +       return 0;
> > +}
> 
> Complex, but easy to follow, understand and debug.
> Good job here!
> 

Thank you!

> Yours,
> Linus Walleij

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 3/8] dt-bindings: pinctrl: renesas,r9a09g077-pinctrl: Document GPIO IRQ
  2025-12-04  9:30     ` Cosmin-Gabriel Tanislav
@ 2025-12-04 16:00       ` Krzysztof Kozlowski
  0 siblings, 0 replies; 14+ messages in thread
From: Krzysztof Kozlowski @ 2025-12-04 16:00 UTC (permalink / raw)
  To: Cosmin-Gabriel Tanislav
  Cc: Geert Uytterhoeven, Linus Walleij, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, magnus.damm,
	Prabhakar Mahadev Lad, linux-renesas-soc@vger.kernel.org,
	linux-gpio@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org

On 04/12/2025 10:30, Cosmin-Gabriel Tanislav wrote:
>>> @@ -119,6 +130,8 @@ required:
>>>    - gpio-controller
>>>    - '#gpio-cells'
>>>    - gpio-ranges
>>> +  - interrupt-controller
>>> +  - '#interrupt-cells'
>>
>> This is technically an ABI break thus commit msg must explain WHY
>> breaking ABI is necessary and what is the impact on users.
>>
>> If your driver keeps things backwards compatible, then briefly mention
>> it in the commit msg that you require it only for complete hardware
>> picture. Or for whatever other reason.
>>
> 
> 
> It's not exactly required for the pinctrl to be defined as an interrupt
> controller, only if you use the interrupt functionality of the pins...
> I can remove them from required, that should keep compatibility.
> 
> Would that be fine?

Yes.

Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2025-12-04 16:00 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-21 11:26 [PATCH 0/8] Add support for GPIO IRQs for RZ/T2H and RZ/N2H Cosmin Tanislav
2025-11-21 11:26 ` [PATCH 1/8] pinctrl: renesas: rzt2h: move GPIO enable/disable into separate function Cosmin Tanislav
2025-11-21 11:26 ` [PATCH 2/8] pinctrl: renesas: rzt2h: allow .get_direction() for IRQ function GPIOs Cosmin Tanislav
2025-11-21 11:26 ` [PATCH 3/8] dt-bindings: pinctrl: renesas,r9a09g077-pinctrl: Document GPIO IRQ Cosmin Tanislav
2025-12-03  8:03   ` Krzysztof Kozlowski
2025-12-04  9:30     ` Cosmin-Gabriel Tanislav
2025-12-04 16:00       ` Krzysztof Kozlowski
2025-11-21 11:26 ` [PATCH 4/8] pinctrl: renesas: rzt2h: add GPIO IRQ chip to handle interrupts Cosmin Tanislav
2025-12-03 23:34   ` Linus Walleij
2025-12-04 15:36     ` Cosmin-Gabriel Tanislav
2025-11-21 11:26 ` [PATCH 5/8] arm64: dts: renesas: r9a09g077: add GPIO IRQ support Cosmin Tanislav
2025-11-21 11:26 ` [PATCH 6/8] arm64: dts: renesas: r9a09g087: " Cosmin Tanislav
2025-11-21 11:26 ` [PATCH 7/8] arm64: dts: renesas: r9a09g077m44-rzt2h-evk: add GPIO keys Cosmin Tanislav
2025-11-21 11:26 ` [PATCH 8/8] arm64: dts: renesas: r9a09g087m44-rzn2h-evk: " Cosmin Tanislav

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).