* [PATCH v5 0/8] Initial support for the Realtek interrupt controller
@ 2026-10-18 16:06 Yu-Chun Lin
2026-10-18 16:06 ` [PATCH v5 1/8] dt-bindings: interrupt-controller: Add support for Realtek DHC SoCs Yu-Chun Lin
` (7 more replies)
0 siblings, 8 replies; 12+ messages in thread
From: Yu-Chun Lin @ 2026-10-18 16:06 UTC (permalink / raw)
To: tglx, radu, robh, krzk+dt, conor+dt, lee, afaerber
Cc: linux-kernel, devicetree, mfd, linux-arm-kernel,
linux-realtek-soc, james.tai, cy.huang, stanley_chang,
eleanor.lin
I am taking over this patch series from James Tai, who originally
submitted v4 in 2023.
This patch series introduces the initial driver support for the interrupt
controller found on Realtek DHC (Digital Home Center) SoCs.
---
The major updates in this v5 series are:
1. Add support for RTD1625 SoCs.
2. Drop the RTD1325 interrupt controller driver, as the hardware is identical
to RTD1319D.
3. Refactored register access to use the regmap API. Since the interrupt
registers are scattered, the interrupt controller is now modeled as a
child of a "syscon", "simple-mfd" node. The driver retrieves the regmap
from its parent for register operations.
4. Reworked the intc-common architecture to properly accommodate the
specific hardware design and routing of the RTD1625 SoC.
v4: https://lore.kernel.org/lkml/20231228060825.1380439-1-james.tai@realtek.com/
v3: https://lore.kernel.org/lkml/20231129054339.3054202-1-james.tai@realtek.com/
v2: https://lore.kernel.org/lkml/20231117162709.1096585-1-james.tai@realtek.com/
v1: https://lore.kernel.org/lkml/20231102142731.2087245-1-james.tai@realtek.com/
James Tai (6):
dt-bindings: interrupt-controller: Add support for Realtek DHC SoCs
irqchip/realtek-intc-common: Add basic support for Realtek DHC SoCs
irqchip/realtek-rtd1319: Add driver for Realtek DHC RTD1319 SoC
irqchip/realtek-rtd1319d: Add driver for Realtek RTD1319D and RTD1325
SoCs
irqchip/realtek-rtd1619b: Add driver for Realtek DHC RTD1619B SoC
irqchip/realtek-rtd1625: Add driver for Realtek DHC rtd1625 SoC
Yu-Chun Lin (2):
dt-bindings: mfd: realtek,rtd1xxx: Add new SoCs
dt-bindings: mfd: realtek,rtd1xxx: Add interrupt controller child node
.../realtek,rtd1319-intc-iso.yaml | 170 +++++++++
.../bindings/mfd/realtek,rtd1xxx.yaml | 37 ++
MAINTAINERS | 2 +
drivers/irqchip/Kconfig | 50 +++
drivers/irqchip/Makefile | 5 +
drivers/irqchip/irq-realtek-intc-common.c | 353 ++++++++++++++++++
drivers/irqchip/irq-realtek-intc-common.h | 93 +++++
drivers/irqchip/irq-realtek-rtd1319.c | 188 ++++++++++
drivers/irqchip/irq-realtek-rtd1319d.c | 197 ++++++++++
drivers/irqchip/irq-realtek-rtd1619b.c | 187 ++++++++++
drivers/irqchip/irq-realtek-rtd1625.c | 261 +++++++++++++
11 files changed, 1543 insertions(+)
create mode 100644 Documentation/devicetree/bindings/interrupt-controller/realtek,rtd1319-intc-iso.yaml
create mode 100644 drivers/irqchip/irq-realtek-intc-common.c
create mode 100644 drivers/irqchip/irq-realtek-intc-common.h
create mode 100644 drivers/irqchip/irq-realtek-rtd1319.c
create mode 100644 drivers/irqchip/irq-realtek-rtd1319d.c
create mode 100644 drivers/irqchip/irq-realtek-rtd1619b.c
create mode 100644 drivers/irqchip/irq-realtek-rtd1625.c
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v5 1/8] dt-bindings: interrupt-controller: Add support for Realtek DHC SoCs
2026-10-18 16:06 [PATCH v5 0/8] Initial support for the Realtek interrupt controller Yu-Chun Lin
@ 2026-10-18 16:06 ` Yu-Chun Lin
2026-10-18 16:06 ` [PATCH v5 2/8] dt-bindings: mfd: realtek,rtd1xxx: Add new SoCs Yu-Chun Lin
` (6 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Yu-Chun Lin @ 2026-10-18 16:06 UTC (permalink / raw)
To: tglx, radu, robh, krzk+dt, conor+dt, lee, afaerber
Cc: linux-kernel, devicetree, mfd, linux-arm-kernel,
linux-realtek-soc, james.tai, cy.huang, stanley_chang,
eleanor.lin
From: James Tai <james.tai@realtek.com>
Add DT binding schema for Realtek DHC (Digital Home Center) SoCs interrupt
controllers.
Signed-off-by: James Tai <james.tai@realtek.com>
Co-developed-by: Yu-Chun Lin <eleanor.lin@realtek.com>
Signed-off-by: Yu-Chun Lin <eleanor.lin@realtek.com>
---
.../realtek,rtd1319-intc-iso.yaml | 170 ++++++++++++++++++
1 file changed, 170 insertions(+)
create mode 100644 Documentation/devicetree/bindings/interrupt-controller/realtek,rtd1319-intc-iso.yaml
diff --git a/Documentation/devicetree/bindings/interrupt-controller/realtek,rtd1319-intc-iso.yaml b/Documentation/devicetree/bindings/interrupt-controller/realtek,rtd1319-intc-iso.yaml
new file mode 100644
index 000000000000..5540f6304795
--- /dev/null
+++ b/Documentation/devicetree/bindings/interrupt-controller/realtek,rtd1319-intc-iso.yaml
@@ -0,0 +1,170 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/interrupt-controller/realtek,rtd1319-intc-iso.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Realtek DHC (Digital Home Center) SoCs Interrupt Controller
+
+maintainers:
+ - James Tai <james.tai@realtek.com>
+ - Yu-Chun Lin <eleanor.lin@realtek.com>
+
+description:
+ This interrupt controller is a component of Realtek DHC SoCs and is designed
+ to receive interrupts from peripheral devices.
+
+properties:
+ compatible:
+ enum:
+ - realtek,rtd1319-intc-iso
+ - realtek,rtd1319-intc-misc
+ - realtek,rtd1319d-intc-iso
+ - realtek,rtd1319d-intc-misc
+ - realtek,rtd1619b-intc-iso
+ - realtek,rtd1619b-intc-misc
+ - realtek,rtd1625-intc-iso
+ - realtek,rtd1625-intc-isom
+ - realtek,rtd1625-intc-misc
+
+ interrupt-controller: true
+
+ '#address-cells':
+ const: 0
+
+ interrupts:
+ minItems: 1
+ maxItems: 4
+ description:
+ Contains the GIC SPI interrupts mapped to the external interrupt lines.
+
+ "#interrupt-cells":
+ description:
+ Specifies the number of cells in an interrupt specifier.
+ For realtek,rtd1625-intc-misc, the first cell specifies the interrupt
+ bank and the second cell specifies the interrupt ID within that bank.
+ Other variants use one cell to specify the interrupt ID.
+
+required:
+ - compatible
+ - interrupt-controller
+ - '#interrupt-cells'
+ - '#address-cells'
+ - interrupts
+
+allOf:
+ - if:
+ properties:
+ compatible:
+ enum:
+ - realtek,rtd1319-intc-iso
+ then:
+ properties:
+ interrupts:
+ items:
+ - description: Miscellaneous interrupts
+ - description: RTC interrupt
+ - if:
+ properties:
+ compatible:
+ enum:
+ - realtek,rtd1319d-intc-iso
+ - realtek,rtd1619b-intc-iso
+ then:
+ properties:
+ interrupts:
+ items:
+ - description: Miscellaneous interrupts
+ - description: Watchdog interrupt
+ - if:
+ properties:
+ compatible:
+ enum:
+ - realtek,rtd1319-intc-misc
+ then:
+ properties:
+ interrupts:
+ items:
+ - description: Miscellaneous interrupts
+ - description: Watchdog interrupt
+ - description: Uart1 interrupt
+ - description: Uart2 interrupt
+ - if:
+ properties:
+ compatible:
+ enum:
+ - realtek,rtd1319d-intc-misc
+ - realtek,rtd1619b-intc-misc
+ then:
+ properties:
+ interrupts:
+ items:
+ - description: Miscellaneous interrupts
+ - description: Uart1 interrupt
+ - description: Uart2 interrupt
+ - if:
+ properties:
+ compatible:
+ enum:
+ - realtek,rtd1625-intc-iso
+ then:
+ properties:
+ interrupts:
+ items:
+ - description: Miscellaneous interrupts
+ - description: Uart9 interrupt
+ - description: RTC interrupt
+ - if:
+ properties:
+ compatible:
+ enum:
+ - realtek,rtd1625-intc-isom
+ then:
+ properties:
+ interrupts:
+ items:
+ - description: Miscellaneous interrupts
+ - if:
+ properties:
+ compatible:
+ enum:
+ - realtek,rtd1625-intc-misc
+ then:
+ properties:
+ interrupts:
+ items:
+ - description: Miscellaneous interrupts
+ - description: Uart3 interrupts
+ - description: Uart1 interrupt
+ - description: Uart2 interrupt
+ - if:
+ properties:
+ compatible:
+ enum:
+ - realtek,rtd1625-intc-misc
+ then:
+ properties:
+ "#interrupt-cells":
+ const: 2
+ else:
+ properties:
+ "#interrupt-cells":
+ const: 1
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/interrupt-controller/irq.h>
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+ interrupt-controller {
+ compatible = "realtek,rtd1319-intc-iso";
+ interrupt-parent = <&gic>;
+ interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-controller;
+ #address-cells = <0>;
+ #interrupt-cells = <1>;
+ };
+...
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v5 2/8] dt-bindings: mfd: realtek,rtd1xxx: Add new SoCs
2026-10-18 16:06 [PATCH v5 0/8] Initial support for the Realtek interrupt controller Yu-Chun Lin
2026-10-18 16:06 ` [PATCH v5 1/8] dt-bindings: interrupt-controller: Add support for Realtek DHC SoCs Yu-Chun Lin
@ 2026-10-18 16:06 ` Yu-Chun Lin
2026-10-19 9:11 ` Krzysztof Kozlowski
2026-10-18 16:06 ` [PATCH v5 3/8] dt-bindings: mfd: realtek,rtd1xxx: Add interrupt controller child node Yu-Chun Lin
` (5 subsequent siblings)
7 siblings, 1 reply; 12+ messages in thread
From: Yu-Chun Lin @ 2026-10-18 16:06 UTC (permalink / raw)
To: tglx, radu, robh, krzk+dt, conor+dt, lee, afaerber
Cc: linux-kernel, devicetree, mfd, linux-arm-kernel,
linux-realtek-soc, james.tai, cy.huang, stanley_chang,
eleanor.lin
Add compatible strings for Realtek RTD1619B, RTD1319D, RTD1325, and
RTD1625 syscon registers
Signed-off-by: Yu-Chun Lin <eleanor.lin@realtek.com>
---
.../devicetree/bindings/mfd/realtek,rtd1xxx.yaml | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/Documentation/devicetree/bindings/mfd/realtek,rtd1xxx.yaml b/Documentation/devicetree/bindings/mfd/realtek,rtd1xxx.yaml
index b0342df0e32a..717e29c37b36 100644
--- a/Documentation/devicetree/bindings/mfd/realtek,rtd1xxx.yaml
+++ b/Documentation/devicetree/bindings/mfd/realtek,rtd1xxx.yaml
@@ -28,6 +28,10 @@ properties:
- realtek,rtd1296-misc
- realtek,rtd1296-sb2
- realtek,rtd1296-scpu-wrapper
+ - realtek,rtd1319d-iso
+ - realtek,rtd1319d-misc
+ - realtek,rtd1325-iso
+ - realtek,rtd1325-misc
- realtek,rtd1395-crt
- realtek,rtd1395-iso
- realtek,rtd1395-misc
@@ -38,6 +42,11 @@ properties:
- realtek,rtd1619-misc
- realtek,rtd1619-sb2
- realtek,rtd1619-scpu-wrapper
+ - realtek,rtd1619b-iso
+ - realtek,rtd1619b-misc
+ - realtek,rtd1625-iso
+ - realtek,rtd1625-isom
+ - realtek,rtd1625-misc
- const: syscon
- const: simple-mfd
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v5 3/8] dt-bindings: mfd: realtek,rtd1xxx: Add interrupt controller child node
2026-10-18 16:06 [PATCH v5 0/8] Initial support for the Realtek interrupt controller Yu-Chun Lin
2026-10-18 16:06 ` [PATCH v5 1/8] dt-bindings: interrupt-controller: Add support for Realtek DHC SoCs Yu-Chun Lin
2026-10-18 16:06 ` [PATCH v5 2/8] dt-bindings: mfd: realtek,rtd1xxx: Add new SoCs Yu-Chun Lin
@ 2026-10-18 16:06 ` Yu-Chun Lin
2026-10-19 9:13 ` Krzysztof Kozlowski
2026-10-18 16:06 ` [PATCH v5 4/8] irqchip/realtek-intc-common: Add basic support for Realtek DHC SoCs Yu-Chun Lin
` (4 subsequent siblings)
7 siblings, 1 reply; 12+ messages in thread
From: Yu-Chun Lin @ 2026-10-18 16:06 UTC (permalink / raw)
To: tglx, radu, robh, krzk+dt, conor+dt, lee, afaerber
Cc: linux-kernel, devicetree, mfd, linux-arm-kernel,
linux-realtek-soc, james.tai, cy.huang, stanley_chang,
eleanor.lin
Allow an interrupt controller as a child node by referencing the
rtd1319-intc-iso schema, update additionalProperties to
unevaluatedProperties, and append a usage example.
Signed-off-by: Yu-Chun Lin <eleanor.lin@realtek.com>
---
.../bindings/mfd/realtek,rtd1xxx.yaml | 28 +++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/Documentation/devicetree/bindings/mfd/realtek,rtd1xxx.yaml b/Documentation/devicetree/bindings/mfd/realtek,rtd1xxx.yaml
index 717e29c37b36..b21e14df2879 100644
--- a/Documentation/devicetree/bindings/mfd/realtek,rtd1xxx.yaml
+++ b/Documentation/devicetree/bindings/mfd/realtek,rtd1xxx.yaml
@@ -65,6 +65,10 @@ properties:
const: 1
patternProperties:
+ "^interrupt-controller":
+ $ref: /schemas/interrupt-controller/realtek,rtd1319-intc-iso.yaml
+ unevaluatedProperties: false
+
'@[0-9a-f]+$':
type: object
@@ -76,3 +80,27 @@ required:
- reg
additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/interrupt-controller/irq.h>
+
+ syscon@7000 {
+ compatible = "realtek,rtd1625-iso", "syscon", "simple-mfd";
+ reg = <0x7000 0x1000>;
+ ranges = <0x0 0x7000 0x1000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ interrupt-controller {
+ compatible = "realtek,rtd1625-intc-iso";
+ interrupt-controller;
+ interrupt-parent = <&gic>;
+ interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <0>;
+ #interrupt-cells = <1>;
+ };
+ };
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v5 4/8] irqchip/realtek-intc-common: Add basic support for Realtek DHC SoCs
2026-10-18 16:06 [PATCH v5 0/8] Initial support for the Realtek interrupt controller Yu-Chun Lin
` (2 preceding siblings ...)
2026-10-18 16:06 ` [PATCH v5 3/8] dt-bindings: mfd: realtek,rtd1xxx: Add interrupt controller child node Yu-Chun Lin
@ 2026-10-18 16:06 ` Yu-Chun Lin
2026-10-18 16:06 ` [PATCH v5 5/8] irqchip/realtek-rtd1319: Add driver for Realtek DHC RTD1319 SoC Yu-Chun Lin
` (3 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Yu-Chun Lin @ 2026-10-18 16:06 UTC (permalink / raw)
To: tglx, radu, robh, krzk+dt, conor+dt, lee, afaerber
Cc: linux-kernel, devicetree, mfd, linux-arm-kernel,
linux-realtek-soc, james.tai, cy.huang, stanley_chang,
eleanor.lin
From: James Tai <james.tai@realtek.com>
Realtek DHC (Digital Home Center) SoCs share a common interrupt controller
design. Introduce a universal interrupt controller driver to provide
support for various variants within the Realtek DHC SoC family.
The common code introduces 'struct realtek_intc_desc' to describe one or
more sets of interrupt status and enable registers and allow the common
code to support both single- and multi-bank interrupt controllers.
There is a unique hardware routing quirk:
Some peripherals have their interrupt lines routed directly to the GIC but
still share the same status register within this IRQ MUX. To prevent the
MUX handler from clearing and stealing these interrupts from the direct
GIC handler, the driver employs a mask mapping array
('isr_to_scpu_int_en_mask').
In addition, to handle Wire-OR shared interrupts, this driver introduces a
'shared_irq_mask' in 'struct realtek_intc_desc'. It allows the driver to
dynamically register shared lines using devm_request_irq() with
'IRQF_SHARED | IRQF_NO_THREAD'.
Signed-off-by: James Tai <james.tai@realtek.com>
Co-developed-by: Yu-Chun Lin <eleanor.lin@realtek.com>
Signed-off-by: Yu-Chun Lin <eleanor.lin@realtek.com>
---
MAINTAINERS | 1 +
drivers/irqchip/Kconfig | 5 +
drivers/irqchip/Makefile | 1 +
drivers/irqchip/irq-realtek-intc-common.c | 353 ++++++++++++++++++++++
drivers/irqchip/irq-realtek-intc-common.h | 93 ++++++
5 files changed, 453 insertions(+)
create mode 100644 drivers/irqchip/irq-realtek-intc-common.c
create mode 100644 drivers/irqchip/irq-realtek-intc-common.h
diff --git a/MAINTAINERS b/MAINTAINERS
index 782389bd5cd3..aae6d91fe39e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3485,6 +3485,7 @@ F: Documentation/devicetree/bindings/arm/realtek.yaml
F: arch/arm/boot/dts/realtek/
F: arch/arm/mach-realtek/
F: arch/arm64/boot/dts/realtek/
+F: drivers/irqchip/irq-realtek-intc-common.*
F: drivers/pinctrl/realtek/
ARM/RISC-V/RENESAS ARCHITECTURE
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index 20b77fbc51ee..cddbf9915510 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -282,6 +282,11 @@ config RDA_INTC
bool
select IRQ_DOMAIN
+config REALTEK_DHC_INTC
+ tristate
+ select IRQ_DOMAIN
+ select MFD_SYSCON
+
config RENESAS_INTC_IRQPIN
bool "Renesas INTC External IRQ Pin Support" if COMPILE_TEST
select IRQ_DOMAIN
diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
index ab33cccd8471..bc8f5c534a4a 100644
--- a/drivers/irqchip/Makefile
+++ b/drivers/irqchip/Makefile
@@ -48,6 +48,7 @@ obj-$(CONFIG_IRQ_MIPS_CPU) += irq-mips-cpu.o
obj-$(CONFIG_IXP4XX_IRQ) += irq-ixp4xx.o
obj-$(CONFIG_JCORE_AIC) += irq-jcore-aic.o
obj-$(CONFIG_RDA_INTC) += irq-rda-intc.o
+obj-$(CONFIG_REALTEK_DHC_INTC) += irq-realtek-intc-common.o
obj-$(CONFIG_RENESAS_INTC_IRQPIN) += irq-renesas-intc-irqpin.o
obj-$(CONFIG_RENESAS_IRQC) += irq-renesas-irqc.o
obj-$(CONFIG_RENESAS_RZA1_IRQC) += irq-renesas-rza1.o
diff --git a/drivers/irqchip/irq-realtek-intc-common.c b/drivers/irqchip/irq-realtek-intc-common.c
new file mode 100644
index 000000000000..cc08535217bd
--- /dev/null
+++ b/drivers/irqchip/irq-realtek-intc-common.c
@@ -0,0 +1,353 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Realtek DHC SoCs interrupt controller driver
+ *
+ * Copyright (c) 2023-2026 Realtek Semiconductor Corporation
+ */
+
+#include <linux/interrupt.h>
+#include <linux/irqdomain.h>
+#include <linux/irqchip/chained_irq.h>
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+#include <linux/slab.h>
+
+#include "irq-realtek-intc-common.h"
+
+static bool realtek_intc_dispatch(struct realtek_intc_subset_data *subset_data)
+{
+ const struct realtek_intc_info *bank_info = subset_data->bank_info;
+ struct realtek_intc_data *data = subset_data->common;
+ u32 ints, inte, mask, val;
+ irq_hw_number_t hwirq;
+ bool handled = false;
+ int irq;
+
+ if (regmap_read(data->base, bank_info->isr_offset, &val))
+ return false;
+
+ ints = val & subset_data->subset_mask->ints_mask;
+
+ if (!ints)
+ return false;
+
+ if (regmap_read(data->base, bank_info->scpu_int_en_offset, &inte))
+ return false;
+
+ while (ints) {
+ irq = __ffs(ints);
+ ints &= ~BIT(irq);
+
+ mask = bank_info->isr_to_scpu_int_en_mask[irq];
+ if (mask != IRQ_ALWAYS_ENABLED && !(inte & mask))
+ continue;
+
+ hwirq = (subset_data->bank_idx * 32) + irq;
+
+ if (!generic_handle_domain_irq(data->domain, hwirq))
+ handled = true;
+
+ regmap_write(data->base, bank_info->isr_offset, BIT(irq) & CLEAN_INTC_STATUS);
+ }
+
+ return handled;
+}
+
+static void realtek_intc_handler(struct irq_desc *desc)
+{
+ struct realtek_intc_subset_data *subset_data = irq_desc_get_handler_data(desc);
+ struct irq_chip *chip = irq_desc_get_chip(desc);
+
+ chained_irq_enter(chip, desc);
+
+ realtek_intc_dispatch(subset_data);
+
+ chained_irq_exit(chip, desc);
+}
+
+static irqreturn_t realtek_intc_shared_handler(int irq, void *dev_id)
+{
+ struct realtek_intc_subset_data *subset_data = dev_id;
+
+ if (realtek_intc_dispatch(subset_data))
+ return IRQ_HANDLED;
+
+ return IRQ_NONE;
+}
+
+static void realtek_intc_mask_irq(struct irq_data *data)
+{
+ struct realtek_intc_data *intc_data = irq_data_get_irq_chip_data(data);
+ const struct realtek_intc_desc *desc = intc_data->desc;
+ const struct realtek_intc_info *bank_info;
+ int bank_idx, bit_idx;
+ u32 mask;
+
+ bank_idx = data->hwirq / 32;
+ bit_idx = data->hwirq % 32;
+
+ bank_info = &desc->banks[bank_idx];
+
+ mask = bank_info->isr_to_scpu_int_en_mask[bit_idx];
+ if (!mask || mask == IRQ_ALWAYS_ENABLED)
+ return;
+
+ regmap_assign_bits(intc_data->base, bank_info->scpu_int_en_offset, mask, false);
+}
+
+static void realtek_intc_unmask_irq(struct irq_data *data)
+{
+ struct realtek_intc_data *intc_data = irq_data_get_irq_chip_data(data);
+ const struct realtek_intc_desc *desc = intc_data->desc;
+ const struct realtek_intc_info *bank_info;
+ int bank_idx, bit_idx;
+ u32 mask;
+
+ bank_idx = data->hwirq / 32;
+ bit_idx = data->hwirq % 32;
+
+ bank_info = &desc->banks[bank_idx];
+ mask = bank_info->isr_to_scpu_int_en_mask[bit_idx];
+ if (!mask || mask == IRQ_ALWAYS_ENABLED)
+ return;
+
+ regmap_set_bits(intc_data->base, bank_info->scpu_int_en_offset, mask);
+}
+
+static const struct irq_chip realtek_intc_chip = {
+ .name = "realtek-intc",
+ .irq_mask = realtek_intc_mask_irq,
+ .irq_unmask = realtek_intc_unmask_irq,
+};
+
+static int realtek_intc_domain_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw)
+{
+ struct realtek_intc_data *data = d->host_data;
+
+ irq_set_chip_and_handler(irq, &realtek_intc_chip, handle_level_irq);
+ irq_set_chip_data(irq, data);
+
+ return 0;
+}
+
+static int realtek_intc_xlate(struct irq_domain *d, struct device_node *ctrlr,
+ const u32 *intspec, unsigned int intsize,
+ unsigned long *out_hwirq, unsigned int *out_type)
+{
+ if (intsize < 1) {
+ return -EINVAL;
+ } else if (intsize < 2) {
+ *out_hwirq = intspec[0];
+ } else {
+ if (intspec[1] >= 32)
+ return -EINVAL;
+
+ *out_hwirq = (intspec[0] * 32) + intspec[1];
+ }
+
+ *out_type = IRQ_TYPE_NONE;
+
+ return 0;
+}
+
+static const struct irq_domain_ops realtek_intc_domain_ops = {
+ .xlate = realtek_intc_xlate,
+ .map = realtek_intc_domain_map,
+};
+
+static int realtek_intc_subset(struct platform_device *dev, struct realtek_intc_data *data,
+ unsigned int bank_idx, unsigned int subset_idx,
+ unsigned int parent_irq_idx)
+{
+ struct realtek_intc_subset_data *subset_data = &data->subset_data[parent_irq_idx];
+ const struct realtek_intc_info *bank_info = &data->desc->banks[bank_idx];
+ const struct realtek_intc_mask *mask = &bank_info->subset_mask[subset_idx];
+ int irq, ret;
+ bool is_shared;
+
+ irq = platform_get_irq(dev, parent_irq_idx);
+ if (irq < 0)
+ return irq;
+
+ subset_data->common = data;
+ subset_data->subset_mask = mask;
+ subset_data->bank_info = bank_info;
+ subset_data->bank_idx = bank_idx;
+ subset_data->parent_irq = irq;
+
+ is_shared = !!(data->desc->shared_irq_mask & BIT(parent_irq_idx));
+
+ if (is_shared) {
+ ret = devm_request_irq(&dev->dev, irq, realtek_intc_shared_handler,
+ IRQF_SHARED | IRQF_NO_THREAD, dev_name(&dev->dev),
+ subset_data);
+ if (ret)
+ dev_err(&dev->dev, "failed to request shared irq %d\n", irq);
+
+ return ret;
+ }
+
+ irq_set_chained_handler_and_data(irq, realtek_intc_handler, subset_data);
+
+ return 0;
+}
+
+int realtek_intc_suspend(struct device *dev)
+{
+ struct realtek_intc_data *data = dev_get_drvdata(dev);
+ const struct realtek_intc_desc *desc = data->desc;
+ unsigned int i = 0;
+ int ret;
+
+ for (; i < desc->bank_num; i++) {
+ const struct realtek_intc_info *info = &desc->banks[i];
+
+ ret = regmap_read(data->base, info->scpu_int_en_offset, &data->saved_en[i]);
+ if (ret)
+ goto err;
+
+ ret = regmap_write(data->base, info->scpu_int_en_offset, DISABLE_INTC);
+ if (ret)
+ goto err;
+
+ ret = regmap_write(data->base, info->isr_offset, CLEAN_INTC_STATUS);
+ if (ret)
+ goto err;
+ }
+
+ return 0;
+
+err:
+ dev_err(dev, "Failed to suspend bank %u (ret = %d)\n", i, ret);
+
+ while (i--) {
+ const struct realtek_intc_info *info = &desc->banks[i];
+
+ regmap_write(data->base, info->scpu_int_en_offset, data->saved_en[i]);
+ }
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(realtek_intc_suspend);
+
+int realtek_intc_resume(struct device *dev)
+{
+ struct realtek_intc_data *data = dev_get_drvdata(dev);
+ const struct realtek_intc_desc *desc = data->desc;
+ unsigned int i = 0;
+ int ret;
+
+ for (; i < desc->bank_num; i++) {
+ const struct realtek_intc_info *info = &desc->banks[i];
+
+ ret = regmap_write(data->base, info->isr_offset, CLEAN_INTC_STATUS);
+ if (ret)
+ goto err;
+
+ ret = regmap_write(data->base, info->scpu_int_en_offset, data->saved_en[i]);
+ if (ret)
+ goto err;
+ }
+
+ return 0;
+
+err:
+ dev_err(dev, "Failed to resume bank %u (ret = %d)\n", i, ret);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(realtek_intc_resume);
+
+static void realtek_intc_teardown_irqs(struct realtek_intc_data *data,
+ struct device *dev,
+ unsigned int count)
+{
+ for (unsigned int i = 0; i < count; i++) {
+ if (data->desc->shared_irq_mask & BIT(i)) {
+ devm_free_irq(dev, data->subset_data[i].parent_irq,
+ &data->subset_data[i]);
+ } else {
+ irq_set_chained_handler_and_data(data->subset_data[i].parent_irq,
+ NULL, NULL);
+ }
+ }
+}
+
+int realtek_intc_probe(struct platform_device *pdev, const struct realtek_intc_desc *desc)
+{
+ struct realtek_intc_data *data;
+ struct device *dev = &pdev->dev;
+ struct device_node *node = dev->of_node;
+ unsigned int total_subset_num = 0;
+ int ret, parent_irq = 0;
+
+ for (unsigned int i = 0; i < desc->bank_num; i++)
+ total_subset_num += desc->banks[i].subset_num;
+
+ data = devm_kzalloc(dev, struct_size(data, subset_data, total_subset_num),
+ GFP_KERNEL);
+ if (!data)
+ return -ENOMEM;
+
+ data->saved_en = devm_kcalloc(dev, desc->bank_num, sizeof(*data->saved_en), GFP_KERNEL);
+ if (!data->saved_en)
+ return -ENOMEM;
+
+ data->base = syscon_node_to_regmap(node->parent);
+ if (IS_ERR(data->base))
+ return PTR_ERR(data->base);
+
+ data->desc = desc;
+
+ data->domain = irq_domain_create_linear(of_fwnode_handle(node),
+ 32 * desc->bank_num,
+ &realtek_intc_domain_ops, data);
+ if (!data->domain)
+ return -ENOMEM;
+
+ for (unsigned int i = 0; i < desc->bank_num; i++) {
+ const struct realtek_intc_info *info = &desc->banks[i];
+
+ for (unsigned int j = 0; j < info->subset_num; j++) {
+ ret = realtek_intc_subset(pdev, data, i, j, parent_irq);
+ if (ret < 0) {
+ dev_err(dev, "failed to init bank %u subset %u: %d\n",
+ i, j, ret);
+ goto irq_domain_cleanup;
+ }
+
+ parent_irq++;
+ }
+ }
+
+ platform_set_drvdata(pdev, data);
+
+ return 0;
+
+irq_domain_cleanup:
+ realtek_intc_teardown_irqs(data, dev, parent_irq);
+ irq_domain_remove(data->domain);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(realtek_intc_probe);
+
+void realtek_intc_remove(struct platform_device *pdev)
+{
+ struct realtek_intc_data *data = platform_get_drvdata(pdev);
+ const struct realtek_intc_desc *desc = data->desc;
+ struct device *dev = &pdev->dev;
+ unsigned int count = 0;
+
+ for (unsigned int i = 0; i < desc->bank_num; i++)
+ count += desc->banks[i].subset_num;
+
+ realtek_intc_teardown_irqs(data, dev, count);
+ irq_domain_remove(data->domain);
+}
+EXPORT_SYMBOL_GPL(realtek_intc_remove);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Realtek DHC SoC Interrupt Controller Driver");
diff --git a/drivers/irqchip/irq-realtek-intc-common.h b/drivers/irqchip/irq-realtek-intc-common.h
new file mode 100644
index 000000000000..8ea34416d036
--- /dev/null
+++ b/drivers/irqchip/irq-realtek-intc-common.h
@@ -0,0 +1,93 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2023-2026 Realtek Semiconductor Corporation
+ */
+
+#ifndef _IRQ_REALTEK_INTC_COMMON_H
+#define _IRQ_REALTEK_INTC_COMMON_H
+
+#include <linux/bits.h>
+#include <linux/limits.h>
+#include <linux/types.h>
+
+/**
+ * struct realtek_intc_mask - The mask of an interrupt subset.
+ * @ints_mask: The interrupt mask.
+ */
+struct realtek_intc_mask {
+ u32 ints_mask;
+};
+
+/**
+ * struct realtek_intc_info - Configuration information for a single interrupt bank.
+ * @subset_mask: The masks of the interrupt subsets.
+ * @subset_num: The number of interrupt subsets.
+ * @isr_offset: The offset of the interrupt status register.
+ * @scpu_int_en_offset: The offset of the interrupt enable register.
+ * @isr_to_scpu_int_en_mask: The array mapping ISR bit indices to the SCPU interrupt
+ * enable masks. Use IRQ_ALWAYS_ENABLED for interrupt
+ * that do not require an enable check.
+ */
+struct realtek_intc_info {
+ const struct realtek_intc_mask *subset_mask;
+ int subset_num;
+ unsigned int isr_offset;
+ unsigned int scpu_int_en_offset;
+ const u32 *isr_to_scpu_int_en_mask;
+};
+
+/**
+ * struct realtek_intc_subset_data - The data of interrupt subset.
+ * @parent_irq: The upstream interrupt source number.
+ * @bank_idx: The index of the interrupt bank this subset belongs to.
+ * @bank_info: The configuration information of the specific interrupt bank.
+ * @subset_mask: The subset interrupt masks.
+ * @common: The configuration data of the main interrupt controller.
+ */
+struct realtek_intc_subset_data {
+ int parent_irq;
+ unsigned int bank_idx;
+ const struct realtek_intc_info *bank_info;
+ const struct realtek_intc_mask *subset_mask;
+ struct realtek_intc_data *common;
+};
+
+/**
+ * struct realtek_intc_desc - Hardware description.
+ * @banks: Array of interrupt bank configurations.
+ * @bank_num: The number of interrupt banks.
+ * @shared_irq_mask: Bitmask indicating which parent interrupts are shared.
+ * (e.g., BIT(0) means parent IRQ index 0 is shared)
+ */
+struct realtek_intc_desc {
+ const struct realtek_intc_info *banks;
+ unsigned int bank_num;
+ u32 shared_irq_mask;
+};
+
+/**
+ * struct realtek_intc_data - The configuration data for interrupt controller driver.
+ * @base: Regmap for the interrupt registers.
+ * @desc: The hardware description of this interrupt controller instance.
+ * @domain: Interrupt domain of the interrupt controller.
+ * @saved_en: Array storing the state of the interrupt enable registers for each bank.
+ * @subset_data: The data for the interrupt subset.
+ */
+struct realtek_intc_data {
+ struct regmap *base;
+ const struct realtek_intc_desc *desc;
+ struct irq_domain *domain;
+ unsigned int *saved_en;
+ struct realtek_intc_subset_data subset_data[];
+};
+
+#define IRQ_ALWAYS_ENABLED U32_MAX
+#define DISABLE_INTC 0
+#define CLEAN_INTC_STATUS GENMASK(31, 1)
+
+int realtek_intc_probe(struct platform_device *pdev, const struct realtek_intc_desc *desc);
+void realtek_intc_remove(struct platform_device *pdev);
+int realtek_intc_suspend(struct device *dev);
+int realtek_intc_resume(struct device *dev);
+
+#endif /* _IRQ_REALTEK_INTC_COMMON_H */
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v5 5/8] irqchip/realtek-rtd1319: Add driver for Realtek DHC RTD1319 SoC
2026-10-18 16:06 [PATCH v5 0/8] Initial support for the Realtek interrupt controller Yu-Chun Lin
` (3 preceding siblings ...)
2026-10-18 16:06 ` [PATCH v5 4/8] irqchip/realtek-intc-common: Add basic support for Realtek DHC SoCs Yu-Chun Lin
@ 2026-10-18 16:06 ` Yu-Chun Lin
2026-10-18 16:06 ` [PATCH v5 6/8] irqchip/realtek-rtd1319d: Add driver for Realtek RTD1319D and RTD1325 SoCs Yu-Chun Lin
` (2 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Yu-Chun Lin @ 2026-10-18 16:06 UTC (permalink / raw)
To: tglx, radu, robh, krzk+dt, conor+dt, lee, afaerber
Cc: linux-kernel, devicetree, mfd, linux-arm-kernel,
linux-realtek-soc, james.tai, cy.huang, stanley_chang,
eleanor.lin
From: James Tai <james.tai@realtek.com>
Add support for interrupt controller driver found on Realtek DHC RTD1319
SoCs.
Signed-off-by: James Tai <james.tai@realtek.com>
Signed-off-by: Yu-Chun Lin <eleanor.lin@realtek.com>
---
MAINTAINERS | 1 +
drivers/irqchip/Kconfig | 11 ++
drivers/irqchip/Makefile | 1 +
drivers/irqchip/irq-realtek-rtd1319.c | 188 ++++++++++++++++++++++++++
4 files changed, 201 insertions(+)
create mode 100644 drivers/irqchip/irq-realtek-rtd1319.c
diff --git a/MAINTAINERS b/MAINTAINERS
index aae6d91fe39e..1ff7cd959ea3 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3486,6 +3486,7 @@ F: arch/arm/boot/dts/realtek/
F: arch/arm/mach-realtek/
F: arch/arm64/boot/dts/realtek/
F: drivers/irqchip/irq-realtek-intc-common.*
+F: drivers/irqchip/irq-realtek-rtd*
F: drivers/pinctrl/realtek/
ARM/RISC-V/RENESAS ARCHITECTURE
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index cddbf9915510..3c0c04330640 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -287,6 +287,17 @@ config REALTEK_DHC_INTC
select IRQ_DOMAIN
select MFD_SYSCON
+config REALTEK_RTD1319_INTC
+ tristate "Realtek RTD1319 interrupt controller"
+ depends on ARCH_REALTEK || COMPILE_TEST
+ select REALTEK_DHC_INTC
+ help
+ Enable support for the Realtek RTD1319 SoC Interrupt Controller.
+ Each Realtek DHC SoC has two sets of interrupt controllers, each
+ capable of handling up to 32 interrupts.
+
+ If unsure, say N.
+
config RENESAS_INTC_IRQPIN
bool "Renesas INTC External IRQ Pin Support" if COMPILE_TEST
select IRQ_DOMAIN
diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
index bc8f5c534a4a..ba3e6b68c085 100644
--- a/drivers/irqchip/Makefile
+++ b/drivers/irqchip/Makefile
@@ -49,6 +49,7 @@ obj-$(CONFIG_IXP4XX_IRQ) += irq-ixp4xx.o
obj-$(CONFIG_JCORE_AIC) += irq-jcore-aic.o
obj-$(CONFIG_RDA_INTC) += irq-rda-intc.o
obj-$(CONFIG_REALTEK_DHC_INTC) += irq-realtek-intc-common.o
+obj-$(CONFIG_REALTEK_RTD1319_INTC) += irq-realtek-rtd1319.o
obj-$(CONFIG_RENESAS_INTC_IRQPIN) += irq-renesas-intc-irqpin.o
obj-$(CONFIG_RENESAS_IRQC) += irq-renesas-irqc.o
obj-$(CONFIG_RENESAS_RZA1_IRQC) += irq-renesas-rza1.o
diff --git a/drivers/irqchip/irq-realtek-rtd1319.c b/drivers/irqchip/irq-realtek-rtd1319.c
new file mode 100644
index 000000000000..b5f32f3b5912
--- /dev/null
+++ b/drivers/irqchip/irq-realtek-rtd1319.c
@@ -0,0 +1,188 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Realtek RTD1319 interrupt controller driver
+ *
+ * Copyright (c) 2023-2026 Realtek Semiconductor Corporation
+ */
+
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pm.h>
+#include "irq-realtek-intc-common.h"
+
+#define ISO_NORMAL_MASK 0xffffcffe
+#define ISO_RTC_MASK 0x00003001
+#define MISC_NMI_WDT_MASK 0x00000004
+#define MISC_NORMAL_MASK 0xffffc0d2
+#define MISC_UART1_MASK 0x00000028
+#define MISC_UART2_MASK 0x00002100
+
+#define ISO_ISR_EN_OFFSET 0x40
+#define ISO_ISR_OFFSET 0
+#define MISC_ISR_EN_OFFSET 0x80
+#define MISC_ISR_OFFSET 0xc
+
+enum rtd1319_iso_isr_bits {
+ RTD1319_ISO_ISR_TC3_SHIFT = 1,
+ RTD1319_ISO_ISR_UR0_SHIFT = 2,
+ RTD1319_ISO_ISR_LSADC0_SHIFT = 3,
+ RTD1319_ISO_ISR_IRDA_SHIFT = 5,
+ RTD1319_ISO_ISR_SPI1_SHIFT = 6,
+ RTD1319_ISO_ISR_WDOG_NMI_SHIFT = 7,
+ RTD1319_ISO_ISR_I2C0_SHIFT = 8,
+ RTD1319_ISO_ISR_TC4_SHIFT = 9,
+ RTD1319_ISO_ISR_TC7_SHIFT = 10,
+ RTD1319_ISO_ISR_I2C1_SHIFT = 11,
+ RTD1319_ISO_ISR_RTC_HSEC_SHIFT = 12,
+ RTD1319_ISO_ISR_RTC_ALARM_SHIFT = 13,
+ RTD1319_ISO_ISR_GPIOA_SHIFT = 19,
+ RTD1319_ISO_ISR_GPIODA_SHIFT = 20,
+ RTD1319_ISO_ISR_ISO_MISC_SHIFT = 21,
+ RTD1319_ISO_ISR_CBUS_SHIFT = 22,
+ RTD1319_ISO_ISR_ETN_SHIFT = 23,
+ RTD1319_ISO_ISR_USB_HOST_SHIFT = 24,
+ RTD1319_ISO_ISR_USB_U3_DRD_SHIFT = 25,
+ RTD1319_ISO_ISR_USB_U2_DRD_SHIFT = 26,
+ RTD1319_ISO_ISR_PORB_HV_SHIFT = 28,
+ RTD1319_ISO_ISR_PORB_DV_SHIFT = 29,
+ RTD1319_ISO_ISR_PORB_AV_SHIFT = 30,
+ RTD1319_ISO_ISR_I2C1_REQ_SHIFT = 31,
+};
+
+static const u32 rtd1319_iso_isr_to_scpu_int_en_mask[32] = {
+ [RTD1319_ISO_ISR_SPI1_SHIFT] = BIT(1),
+ [RTD1319_ISO_ISR_UR0_SHIFT] = BIT(2),
+ [RTD1319_ISO_ISR_LSADC0_SHIFT] = BIT(3),
+ [RTD1319_ISO_ISR_IRDA_SHIFT] = BIT(5),
+ [RTD1319_ISO_ISR_I2C0_SHIFT] = BIT(8),
+ [RTD1319_ISO_ISR_I2C1_SHIFT] = BIT(11),
+ [RTD1319_ISO_ISR_RTC_HSEC_SHIFT] = BIT(12),
+ [RTD1319_ISO_ISR_RTC_ALARM_SHIFT] = BIT(13),
+ [RTD1319_ISO_ISR_GPIOA_SHIFT] = BIT(19),
+ [RTD1319_ISO_ISR_GPIODA_SHIFT] = BIT(20),
+ [RTD1319_ISO_ISR_PORB_HV_SHIFT] = BIT(28),
+ [RTD1319_ISO_ISR_PORB_DV_SHIFT] = BIT(29),
+ [RTD1319_ISO_ISR_PORB_AV_SHIFT] = BIT(30),
+ [RTD1319_ISO_ISR_I2C1_REQ_SHIFT] = BIT(31),
+};
+
+enum rtd1319_misc_isr_bits {
+ RTD1319_MISC_ISR_WDOG_NMI_SHIFT = 2,
+ RTD1319_MISC_ISR_UR1_SHIFT = 3,
+ RTD1319_MISC_ISR_TC5_SHIFT = 4,
+ RTD1319_MISC_ISR_UR1_TO_SHIFT = 5,
+ RTD1319_MISC_ISR_TC0_SHIFT = 6,
+ RTD1319_MISC_ISR_TC1_SHIFT = 7,
+ RTD1319_MISC_ISR_UR2_SHIFT = 8,
+ RTD1319_MISC_ISR_RTC_HSEC_SHIFT = 9,
+ RTD1319_MISC_ISR_RTC_MIN_SHIFT = 10,
+ RTD1319_MISC_ISR_RTC_HOUR_SHIFT = 11,
+ RTD1319_MISC_ISR_RTC_DATE_SHIFT = 12,
+ RTD1319_MISC_ISR_UR2_TO_SHIFT = 13,
+ RTD1319_MISC_ISR_I2C5_SHIFT = 14,
+ RTD1319_MISC_ISR_I2C3_SHIFT = 23,
+ RTD1319_MISC_ISR_SC0_SHIFT = 24,
+ RTD1319_MISC_ISR_SC1_SHIFT = 25,
+ RTD1319_MISC_ISR_SPI_SHIFT = 27,
+ RTD1319_MISC_ISR_FAN_SHIFT = 29,
+};
+
+static const u32 rtd1319_misc_isr_to_scpu_int_en_mask[32] = {
+ [RTD1319_MISC_ISR_UR1_SHIFT] = BIT(3),
+ [RTD1319_MISC_ISR_UR1_TO_SHIFT] = BIT(5),
+ [RTD1319_MISC_ISR_UR2_TO_SHIFT] = BIT(6),
+ [RTD1319_MISC_ISR_UR2_SHIFT] = BIT(7),
+ [RTD1319_MISC_ISR_RTC_MIN_SHIFT] = BIT(10),
+ [RTD1319_MISC_ISR_RTC_HOUR_SHIFT] = BIT(11),
+ [RTD1319_MISC_ISR_RTC_DATE_SHIFT] = BIT(12),
+ [RTD1319_MISC_ISR_I2C5_SHIFT] = BIT(14),
+ [RTD1319_MISC_ISR_SC0_SHIFT] = BIT(24),
+ [RTD1319_MISC_ISR_SC1_SHIFT] = BIT(25),
+ [RTD1319_MISC_ISR_SPI_SHIFT] = BIT(27),
+ [RTD1319_MISC_ISR_I2C3_SHIFT] = BIT(28),
+ [RTD1319_MISC_ISR_FAN_SHIFT] = BIT(29),
+ [RTD1319_MISC_ISR_WDOG_NMI_SHIFT] = IRQ_ALWAYS_ENABLED,
+};
+
+static const struct realtek_intc_mask rtd1319_intc_iso_cfgs[] = {
+ { ISO_NORMAL_MASK, },
+ { ISO_RTC_MASK, },
+};
+
+static const struct realtek_intc_info rtd1319_intc_iso_info[] = {
+ {
+ .isr_offset = ISO_ISR_OFFSET,
+ .scpu_int_en_offset = ISO_ISR_EN_OFFSET,
+ .isr_to_scpu_int_en_mask = rtd1319_iso_isr_to_scpu_int_en_mask,
+ .subset_mask = rtd1319_intc_iso_cfgs,
+ .subset_num = ARRAY_SIZE(rtd1319_intc_iso_cfgs),
+ }
+};
+
+static const struct realtek_intc_desc rtd1319_intc_iso_desc = {
+ .banks = rtd1319_intc_iso_info,
+ .bank_num = ARRAY_SIZE(rtd1319_intc_iso_info),
+};
+
+static const struct realtek_intc_mask rtd1319_intc_misc_cfgs[] = {
+ { MISC_NORMAL_MASK, },
+ { MISC_NMI_WDT_MASK, },
+ { MISC_UART1_MASK, },
+ { MISC_UART2_MASK, },
+};
+
+static const struct realtek_intc_info rtd1319_intc_misc_info[] = {
+ {
+ .isr_offset = MISC_ISR_OFFSET,
+ .scpu_int_en_offset = MISC_ISR_EN_OFFSET,
+ .isr_to_scpu_int_en_mask = rtd1319_misc_isr_to_scpu_int_en_mask,
+ .subset_mask = rtd1319_intc_misc_cfgs,
+ .subset_num = ARRAY_SIZE(rtd1319_intc_misc_cfgs),
+ }
+};
+
+static const struct realtek_intc_desc rtd1319_intc_misc_desc = {
+ .banks = rtd1319_intc_misc_info,
+ .bank_num = ARRAY_SIZE(rtd1319_intc_misc_info),
+};
+
+static const struct of_device_id realtek_intc_rtd1319_dt_matches[] = {
+ {
+ .compatible = "realtek,rtd1319-intc-iso",
+ .data = &rtd1319_intc_iso_desc,
+ }, {
+ .compatible = "realtek,rtd1319-intc-misc",
+ .data = &rtd1319_intc_misc_desc,
+ },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, realtek_intc_rtd1319_dt_matches);
+
+static int rtd1319_intc_probe(struct platform_device *pdev)
+{
+ const struct realtek_intc_desc *desc;
+
+ desc = of_device_get_match_data(&pdev->dev);
+ if (!desc)
+ return -EINVAL;
+
+ return realtek_intc_probe(pdev, desc);
+}
+
+static DEFINE_NOIRQ_DEV_PM_OPS(realtek_intc_rtd1319_pm_ops, realtek_intc_suspend,
+ realtek_intc_resume);
+
+static struct platform_driver realtek_intc_rtd1319_driver = {
+ .probe = rtd1319_intc_probe,
+ .remove = realtek_intc_remove,
+ .driver = {
+ .name = "realtek_intc_rtd1319",
+ .of_match_table = realtek_intc_rtd1319_dt_matches,
+ .pm = pm_sleep_ptr(&realtek_intc_rtd1319_pm_ops),
+ },
+};
+module_platform_driver(realtek_intc_rtd1319_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Realtek RTD1319 Interrupt Controller Driver");
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v5 6/8] irqchip/realtek-rtd1319d: Add driver for Realtek RTD1319D and RTD1325 SoCs
2026-10-18 16:06 [PATCH v5 0/8] Initial support for the Realtek interrupt controller Yu-Chun Lin
` (4 preceding siblings ...)
2026-10-18 16:06 ` [PATCH v5 5/8] irqchip/realtek-rtd1319: Add driver for Realtek DHC RTD1319 SoC Yu-Chun Lin
@ 2026-10-18 16:06 ` Yu-Chun Lin
2026-10-18 16:06 ` [PATCH v5 7/8] irqchip/realtek-rtd1619b: Add driver for Realtek DHC RTD1619B SoC Yu-Chun Lin
2026-10-18 16:06 ` [PATCH v5 8/8] irqchip/realtek-rtd1625: Add driver for Realtek DHC rtd1625 SoC Yu-Chun Lin
7 siblings, 0 replies; 12+ messages in thread
From: Yu-Chun Lin @ 2026-10-18 16:06 UTC (permalink / raw)
To: tglx, radu, robh, krzk+dt, conor+dt, lee, afaerber
Cc: linux-kernel, devicetree, mfd, linux-arm-kernel,
linux-realtek-soc, james.tai, cy.huang, stanley_chang,
eleanor.lin
From: James Tai <james.tai@realtek.com>
Add support for interrupt controller driver found on Realtek DHC RTD1319D
and RTD1325 SoCs.
Signed-off-by: James Tai <james.tai@realtek.com>
Signed-off-by: Yu-Chun Lin <eleanor.lin@realtek.com>
---
drivers/irqchip/Kconfig | 11 ++
drivers/irqchip/Makefile | 1 +
drivers/irqchip/irq-realtek-rtd1319d.c | 197 +++++++++++++++++++++++++
3 files changed, 209 insertions(+)
create mode 100644 drivers/irqchip/irq-realtek-rtd1319d.c
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index 3c0c04330640..8f4bfd3d5ec1 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -298,6 +298,17 @@ config REALTEK_RTD1319_INTC
If unsure, say N.
+config REALTEK_RTD1319D_INTC
+ tristate "Realtek RTD1319D and RTD1325 interrupt controller"
+ depends on ARCH_REALTEK || COMPILE_TEST
+ select REALTEK_DHC_INTC
+ help
+ Enable support for the Realtek RTD1319D and RTD1325 SoCs Interrupt
+ Controller. Each Realtek DHC SoC has two sets of interrupt
+ controllers, each capable of handling up to 32 interrupts.
+
+ If unsure, say N.
+
config RENESAS_INTC_IRQPIN
bool "Renesas INTC External IRQ Pin Support" if COMPILE_TEST
select IRQ_DOMAIN
diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
index ba3e6b68c085..32a2e2d8a79c 100644
--- a/drivers/irqchip/Makefile
+++ b/drivers/irqchip/Makefile
@@ -50,6 +50,7 @@ obj-$(CONFIG_JCORE_AIC) += irq-jcore-aic.o
obj-$(CONFIG_RDA_INTC) += irq-rda-intc.o
obj-$(CONFIG_REALTEK_DHC_INTC) += irq-realtek-intc-common.o
obj-$(CONFIG_REALTEK_RTD1319_INTC) += irq-realtek-rtd1319.o
+obj-$(CONFIG_REALTEK_RTD1319D_INTC) += irq-realtek-rtd1319d.o
obj-$(CONFIG_RENESAS_INTC_IRQPIN) += irq-renesas-intc-irqpin.o
obj-$(CONFIG_RENESAS_IRQC) += irq-renesas-irqc.o
obj-$(CONFIG_RENESAS_RZA1_IRQC) += irq-renesas-rza1.o
diff --git a/drivers/irqchip/irq-realtek-rtd1319d.c b/drivers/irqchip/irq-realtek-rtd1319d.c
new file mode 100644
index 000000000000..4bac12c02cbe
--- /dev/null
+++ b/drivers/irqchip/irq-realtek-rtd1319d.c
@@ -0,0 +1,197 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Realtek RTD1319D and RTD1325 interrupt controller driver
+ *
+ * Copyright (c) 2023-2026 Realtek Semiconductor Corporation
+ */
+
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pm.h>
+#include "irq-realtek-intc-common.h"
+
+#define ISO_NMI_WDT_MASK 0x08008090
+#define ISO_NORMAL_MASK 0xf7ff7f6e
+#define MISC_NORMAL_MASK 0xffe0ded6
+#define MISC_UART1_MASK 0x00000028
+#define MISC_UART2_MASK 0x00002100
+
+#define ISO_ISR_EN_OFFSET 0x40
+#define ISO_ISR_OFFSET 0
+#define MISC_ISR_EN_OFFSET 0x80
+#define MISC_ISR_OFFSET 0xc
+
+enum rtd1319d_iso_isr_bits {
+ RTD1319D_ISO_ISR_TC3_SHIFT = 1,
+ RTD1319D_ISO_ISR_UR0_SHIFT = 2,
+ RTD1319D_ISO_ISR_LSADC0_SHIFT = 3,
+ RTD1319D_ISO_ISR_WDOG1_NMI_SHIFT = 4,
+ RTD1319D_ISO_ISR_IRDA_SHIFT = 5,
+ RTD1319D_ISO_ISR_SPI1_SHIFT = 6,
+ RTD1319D_ISO_ISR_WDOG2_NMI_SHIFT = 7,
+ RTD1319D_ISO_ISR_I2C0_SHIFT = 8,
+ RTD1319D_ISO_ISR_TC4_SHIFT = 9,
+ RTD1319D_ISO_ISR_TC7_SHIFT = 10,
+ RTD1319D_ISO_ISR_I2C1_SHIFT = 11,
+ RTD1319D_ISO_ISR_HIFI_WAKEUP_SHIFT = 14,
+ RTD1319D_ISO_ISR_WDOG4_NMI_SHIFT = 15,
+ RTD1319D_ISO_ISR_TC8_SHIFT = 16,
+ RTD1319D_ISO_ISR_VFD_SHIFT = 17,
+ RTD1319D_ISO_ISR_VTC_SHIFT = 18,
+ RTD1319D_ISO_ISR_GPIOA_SHIFT = 19,
+ RTD1319D_ISO_ISR_GPIODA_SHIFT = 20,
+ RTD1319D_ISO_ISR_ISO_MISC_SHIFT = 21,
+ RTD1319D_ISO_ISR_CBUS_SHIFT = 22,
+ RTD1319D_ISO_ISR_ETN_SHIFT = 23,
+ RTD1319D_ISO_ISR_USB_HOST_SHIFT = 24,
+ RTD1319D_ISO_ISR_USB_U3_DRD_SHIFT = 25,
+ RTD1319D_ISO_ISR_USB_U2_DRD_SHIFT = 26,
+ RTD1319D_ISO_ISR_WDOG3_NMI_SHIFT = 27,
+ RTD1319D_ISO_ISR_PORB_HV_CEN_SHIFT = 28,
+ RTD1319D_ISO_ISR_PORB_DV_CEN_SHIFT = 29,
+ RTD1319D_ISO_ISR_PORB_AV_CEN_SHIFT = 30,
+ RTD1319D_ISO_ISR_I2C1_REQ_SHIFT = 31,
+};
+
+static const u32 rtd1319d_iso_isr_to_scpu_int_en_mask[32] = {
+ [RTD1319D_ISO_ISR_SPI1_SHIFT] = BIT(1),
+ [RTD1319D_ISO_ISR_UR0_SHIFT] = BIT(2),
+ [RTD1319D_ISO_ISR_LSADC0_SHIFT] = BIT(3),
+ [RTD1319D_ISO_ISR_IRDA_SHIFT] = BIT(5),
+ [RTD1319D_ISO_ISR_I2C0_SHIFT] = BIT(8),
+ [RTD1319D_ISO_ISR_I2C1_SHIFT] = BIT(11),
+ [RTD1319D_ISO_ISR_VFD_SHIFT] = BIT(17),
+ [RTD1319D_ISO_ISR_GPIOA_SHIFT] = BIT(19),
+ [RTD1319D_ISO_ISR_GPIODA_SHIFT] = BIT(20),
+ [RTD1319D_ISO_ISR_PORB_HV_CEN_SHIFT] = BIT(28),
+ [RTD1319D_ISO_ISR_PORB_DV_CEN_SHIFT] = BIT(29),
+ [RTD1319D_ISO_ISR_PORB_AV_CEN_SHIFT] = BIT(30),
+ [RTD1319D_ISO_ISR_I2C1_REQ_SHIFT] = BIT(31),
+ [RTD1319D_ISO_ISR_WDOG1_NMI_SHIFT] = IRQ_ALWAYS_ENABLED,
+ [RTD1319D_ISO_ISR_WDOG2_NMI_SHIFT] = IRQ_ALWAYS_ENABLED,
+ [RTD1319D_ISO_ISR_WDOG3_NMI_SHIFT] = IRQ_ALWAYS_ENABLED,
+ [RTD1319D_ISO_ISR_WDOG4_NMI_SHIFT] = IRQ_ALWAYS_ENABLED,
+};
+
+enum rtd1319d_misc_isr_bits {
+ RTD1319D_MISC_ISR_UR1_SHIFT = 3,
+ RTD1319D_MISC_ISR_TC5_SHIFT = 4,
+ RTD1319D_MISC_ISR_UR1_TO_SHIFT = 5,
+ RTD1319D_MISC_ISR_TC0_SHIFT = 6,
+ RTD1319D_MISC_ISR_TC1_SHIFT = 7,
+ RTD1319D_MISC_ISR_UR2_SHIFT = 8,
+ RTD1319D_MISC_ISR_UR2_TO_SHIFT = 13,
+ RTD1319D_MISC_ISR_I2C5_SHIFT = 14,
+ RTD1319D_MISC_ISR_I2C4_SHIFT = 15,
+ RTD1319D_MISC_ISR_DRTC_HSEC_SHIFT = 16,
+ RTD1319D_MISC_ISR_DRTC_MIN_SHIFT = 17,
+ RTD1319D_MISC_ISR_DRTC_HOUR_SHIFT = 18,
+ RTD1319D_MISC_ISR_DRTC_DATE_SHIFT = 19,
+ RTD1319D_MISC_ISR_DRTC_ALARM_SHIFT = 20,
+ RTD1319D_MISC_ISR_I2C3_SHIFT = 23,
+ RTD1319D_MISC_ISR_SC0_SHIFT = 24,
+ RTD1319D_MISC_ISR_SC1_SHIFT = 25,
+ RTD1319D_MISC_ISR_SPI_SHIFT = 27,
+ RTD1319D_MISC_ISR_FAN_SHIFT = 29,
+};
+
+static const u32 rtd1319d_misc_isr_to_scpu_int_en_mask[32] = {
+ [RTD1319D_MISC_ISR_UR1_SHIFT] = BIT(3),
+ [RTD1319D_MISC_ISR_UR1_TO_SHIFT] = BIT(5),
+ [RTD1319D_MISC_ISR_UR2_TO_SHIFT] = BIT(6),
+ [RTD1319D_MISC_ISR_UR2_SHIFT] = BIT(7),
+ [RTD1319D_MISC_ISR_I2C5_SHIFT] = BIT(14),
+ [RTD1319D_MISC_ISR_I2C4_SHIFT] = BIT(15),
+ [RTD1319D_MISC_ISR_DRTC_HSEC_SHIFT] = BIT(16),
+ [RTD1319D_MISC_ISR_DRTC_MIN_SHIFT] = BIT(17),
+ [RTD1319D_MISC_ISR_DRTC_HOUR_SHIFT] = BIT(18),
+ [RTD1319D_MISC_ISR_DRTC_DATE_SHIFT] = BIT(19),
+ [RTD1319D_MISC_ISR_DRTC_ALARM_SHIFT] = BIT(20),
+ [RTD1319D_MISC_ISR_SC0_SHIFT] = BIT(24),
+ [RTD1319D_MISC_ISR_SC1_SHIFT] = BIT(25),
+ [RTD1319D_MISC_ISR_SPI_SHIFT] = BIT(27),
+ [RTD1319D_MISC_ISR_I2C3_SHIFT] = BIT(28),
+ [RTD1319D_MISC_ISR_FAN_SHIFT] = BIT(29),
+};
+
+static const struct realtek_intc_mask rtd1319d_intc_iso_cfgs[] = {
+ { ISO_NORMAL_MASK, },
+ { ISO_NMI_WDT_MASK, },
+};
+
+static const struct realtek_intc_info rtd1319d_intc_iso_info[] = {
+ {
+ .isr_offset = ISO_ISR_OFFSET,
+ .scpu_int_en_offset = ISO_ISR_EN_OFFSET,
+ .isr_to_scpu_int_en_mask = rtd1319d_iso_isr_to_scpu_int_en_mask,
+ .subset_mask = rtd1319d_intc_iso_cfgs,
+ .subset_num = ARRAY_SIZE(rtd1319d_intc_iso_cfgs),
+ },
+};
+
+static const struct realtek_intc_desc rtd1319d_intc_iso_desc = {
+ .banks = rtd1319d_intc_iso_info,
+ .bank_num = ARRAY_SIZE(rtd1319d_intc_iso_info),
+};
+
+static const struct realtek_intc_mask rtd1319d_intc_misc_cfgs[] = {
+ { MISC_NORMAL_MASK, },
+ { MISC_UART1_MASK, },
+ { MISC_UART2_MASK, },
+};
+
+static const struct realtek_intc_info rtd1319d_intc_misc_info[] = {
+ {
+ .isr_offset = MISC_ISR_OFFSET,
+ .scpu_int_en_offset = MISC_ISR_EN_OFFSET,
+ .isr_to_scpu_int_en_mask = rtd1319d_misc_isr_to_scpu_int_en_mask,
+ .subset_mask = rtd1319d_intc_misc_cfgs,
+ .subset_num = ARRAY_SIZE(rtd1319d_intc_misc_cfgs),
+ },
+};
+
+static const struct realtek_intc_desc rtd1319d_intc_misc_desc = {
+ .banks = rtd1319d_intc_misc_info,
+ .bank_num = ARRAY_SIZE(rtd1319d_intc_misc_info),
+};
+
+static const struct of_device_id realtek_intc_rtd1319d_dt_matches[] = {
+ {
+ .compatible = "realtek,rtd1319d-intc-iso",
+ .data = &rtd1319d_intc_iso_desc,
+ }, {
+ .compatible = "realtek,rtd1319d-intc-misc",
+ .data = &rtd1319d_intc_misc_desc,
+ },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, realtek_intc_rtd1319d_dt_matches);
+
+static DEFINE_NOIRQ_DEV_PM_OPS(realtek_intc_rtd1319d_pm_ops, realtek_intc_suspend,
+ realtek_intc_resume);
+
+static int rtd1319d_intc_probe(struct platform_device *pdev)
+{
+ const struct realtek_intc_desc *desc;
+
+ desc = of_device_get_match_data(&pdev->dev);
+ if (!desc)
+ return -EINVAL;
+
+ return realtek_intc_probe(pdev, desc);
+}
+
+static struct platform_driver realtek_intc_rtd1319d_driver = {
+ .probe = rtd1319d_intc_probe,
+ .remove = realtek_intc_remove,
+ .driver = {
+ .name = "realtek_intc_rtd1319d",
+ .of_match_table = realtek_intc_rtd1319d_dt_matches,
+ .pm = pm_sleep_ptr(&realtek_intc_rtd1319d_pm_ops),
+ },
+};
+module_platform_driver(realtek_intc_rtd1319d_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Realtek RTD1319D and RTD1325 Interrupt Controller Driver");
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v5 7/8] irqchip/realtek-rtd1619b: Add driver for Realtek DHC RTD1619B SoC
2026-10-18 16:06 [PATCH v5 0/8] Initial support for the Realtek interrupt controller Yu-Chun Lin
` (5 preceding siblings ...)
2026-10-18 16:06 ` [PATCH v5 6/8] irqchip/realtek-rtd1319d: Add driver for Realtek RTD1319D and RTD1325 SoCs Yu-Chun Lin
@ 2026-10-18 16:06 ` Yu-Chun Lin
2026-10-18 16:06 ` [PATCH v5 8/8] irqchip/realtek-rtd1625: Add driver for Realtek DHC rtd1625 SoC Yu-Chun Lin
7 siblings, 0 replies; 12+ messages in thread
From: Yu-Chun Lin @ 2026-10-18 16:06 UTC (permalink / raw)
To: tglx, radu, robh, krzk+dt, conor+dt, lee, afaerber
Cc: linux-kernel, devicetree, mfd, linux-arm-kernel,
linux-realtek-soc, james.tai, cy.huang, stanley_chang,
eleanor.lin
From: James Tai <james.tai@realtek.com>
Add support for interrupt controller driver found on Realtek DHC RTD1619B
SoCs.
Signed-off-by: James Tai <james.tai@realtek.com>
Signed-off-by: Yu-Chun Lin <eleanor.lin@realtek.com>
---
drivers/irqchip/Kconfig | 11 ++
drivers/irqchip/Makefile | 1 +
drivers/irqchip/irq-realtek-rtd1619b.c | 187 +++++++++++++++++++++++++
3 files changed, 199 insertions(+)
create mode 100644 drivers/irqchip/irq-realtek-rtd1619b.c
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index 8f4bfd3d5ec1..2598f6a82cc2 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -309,6 +309,17 @@ config REALTEK_RTD1319D_INTC
If unsure, say N.
+config REALTEK_RTD1619B_INTC
+ tristate "Realtek RTD1619B interrupt controller"
+ depends on ARCH_REALTEK || COMPILE_TEST
+ select REALTEK_DHC_INTC
+ help
+ Enable support for the Realtek RTD1619B SoC Interrupt Controller.
+ Each Realtek DHC SoC has two sets of interrupt controllers, each
+ capable of handling up to 32 interrupts.
+
+ If unsure, say N.
+
config RENESAS_INTC_IRQPIN
bool "Renesas INTC External IRQ Pin Support" if COMPILE_TEST
select IRQ_DOMAIN
diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
index 32a2e2d8a79c..acc515fc6f9a 100644
--- a/drivers/irqchip/Makefile
+++ b/drivers/irqchip/Makefile
@@ -51,6 +51,7 @@ obj-$(CONFIG_RDA_INTC) += irq-rda-intc.o
obj-$(CONFIG_REALTEK_DHC_INTC) += irq-realtek-intc-common.o
obj-$(CONFIG_REALTEK_RTD1319_INTC) += irq-realtek-rtd1319.o
obj-$(CONFIG_REALTEK_RTD1319D_INTC) += irq-realtek-rtd1319d.o
+obj-$(CONFIG_REALTEK_RTD1619B_INTC) += irq-realtek-rtd1619b.o
obj-$(CONFIG_RENESAS_INTC_IRQPIN) += irq-renesas-intc-irqpin.o
obj-$(CONFIG_RENESAS_IRQC) += irq-renesas-irqc.o
obj-$(CONFIG_RENESAS_RZA1_IRQC) += irq-renesas-rza1.o
diff --git a/drivers/irqchip/irq-realtek-rtd1619b.c b/drivers/irqchip/irq-realtek-rtd1619b.c
new file mode 100644
index 000000000000..689e7f517a76
--- /dev/null
+++ b/drivers/irqchip/irq-realtek-rtd1619b.c
@@ -0,0 +1,187 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Realtek RTD1619B interrupt controller driver
+ *
+ * Copyright (c) 2023-2026 Realtek Semiconductor Corporation
+ */
+
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pm.h>
+#include "irq-realtek-intc-common.h"
+
+#define ISO_NMI_WDT_MASK 0x08008090
+#define ISO_NORMAL_MASK 0xf7ff7f6e
+#define MISC_NORMAL_MASK 0xffffded6
+#define MISC_UART1_MASK 0x00000028
+#define MISC_UART2_MASK 0x00002100
+
+#define ISO_ISR_EN_OFFSET 0x40
+#define ISO_ISR_OFFSET 0
+#define MISC_ISR_EN_OFFSET 0x80
+#define MISC_ISR_OFFSET 0xc
+
+enum rtd1619b_iso_isr_bits {
+ RTD1619B_ISO_ISR_TC3_SHIFT = 1,
+ RTD1619B_ISO_ISR_UR0_SHIFT = 2,
+ RTD1619B_ISO_ISR_LSADC0_SHIFT = 3,
+ RTD1619B_ISO_ISR_WDOG1_NMI_SHIFT = 4,
+ RTD1619B_ISO_ISR_IRDA_SHIFT = 5,
+ RTD1619B_ISO_ISR_SPI1_SHIFT = 6,
+ RTD1619B_ISO_ISR_WDOG2_NMI_SHIFT = 7,
+ RTD1619B_ISO_ISR_I2C0_SHIFT = 8,
+ RTD1619B_ISO_ISR_TC4_SHIFT = 9,
+ RTD1619B_ISO_ISR_TC7_SHIFT = 10,
+ RTD1619B_ISO_ISR_I2C1_SHIFT = 11,
+ RTD1619B_ISO_ISR_HIFI_WAKEUP_SHIFT = 14,
+ RTD1619B_ISO_ISR_WDOG4_NMI_SHIFT = 15,
+ RTD1619B_ISO_ISR_TC8_SHIFT = 16,
+ RTD1619B_ISO_ISR_VFD_SHIFT = 17,
+ RTD1619B_ISO_ISR_VTC_SHIFT = 18,
+ RTD1619B_ISO_ISR_GPIOA_SHIFT = 19,
+ RTD1619B_ISO_ISR_GPIODA_SHIFT = 20,
+ RTD1619B_ISO_ISR_ISO_MISC_SHIFT = 21,
+ RTD1619B_ISO_ISR_CBUS_SHIFT = 22,
+ RTD1619B_ISO_ISR_ETN_SHIFT = 23,
+ RTD1619B_ISO_ISR_USB_HOST_SHIFT = 24,
+ RTD1619B_ISO_ISR_USB_U3_DRD_SHIFT = 25,
+ RTD1619B_ISO_ISR_USB_U2_DRD_SHIFT = 26,
+ RTD1619B_ISO_ISR_WDOG3_NMI_SHIFT = 27,
+ RTD1619B_ISO_ISR_PORB_HV_CEN_SHIFT = 28,
+ RTD1619B_ISO_ISR_PORB_DV_CEN_SHIFT = 29,
+ RTD1619B_ISO_ISR_PORB_AV_CEN_SHIFT = 30,
+ RTD1619B_ISO_ISR_I2C1_REQ_SHIFT = 31,
+};
+
+static const u32 rtd1619b_iso_isr_to_scpu_int_en_mask[32] = {
+ [RTD1619B_ISO_ISR_SPI1_SHIFT] = BIT(1),
+ [RTD1619B_ISO_ISR_UR0_SHIFT] = BIT(2),
+ [RTD1619B_ISO_ISR_LSADC0_SHIFT] = BIT(3),
+ [RTD1619B_ISO_ISR_IRDA_SHIFT] = BIT(5),
+ [RTD1619B_ISO_ISR_I2C0_SHIFT] = BIT(8),
+ [RTD1619B_ISO_ISR_I2C1_SHIFT] = BIT(11),
+ [RTD1619B_ISO_ISR_VFD_SHIFT] = BIT(17),
+ [RTD1619B_ISO_ISR_GPIOA_SHIFT] = BIT(19),
+ [RTD1619B_ISO_ISR_GPIODA_SHIFT] = BIT(20),
+ [RTD1619B_ISO_ISR_PORB_HV_CEN_SHIFT] = BIT(28),
+ [RTD1619B_ISO_ISR_PORB_DV_CEN_SHIFT] = BIT(29),
+ [RTD1619B_ISO_ISR_PORB_AV_CEN_SHIFT] = BIT(30),
+ [RTD1619B_ISO_ISR_I2C1_REQ_SHIFT] = BIT(31),
+ [RTD1619B_ISO_ISR_WDOG1_NMI_SHIFT] = IRQ_ALWAYS_ENABLED,
+ [RTD1619B_ISO_ISR_WDOG2_NMI_SHIFT] = IRQ_ALWAYS_ENABLED,
+ [RTD1619B_ISO_ISR_WDOG3_NMI_SHIFT] = IRQ_ALWAYS_ENABLED,
+ [RTD1619B_ISO_ISR_WDOG4_NMI_SHIFT] = IRQ_ALWAYS_ENABLED,
+};
+
+enum rtd1619b_misc_isr_bits {
+ RTD1619B_MISC_ISR_UR1_SHIFT = 3,
+ RTD1619B_MISC_ISR_TC5_SHIFT = 4,
+ RTD1619B_MISC_ISR_UR1_TO_SHIFT = 5,
+ RTD1619B_MISC_ISR_TC0_SHIFT = 6,
+ RTD1619B_MISC_ISR_TC1_SHIFT = 7,
+ RTD1619B_MISC_ISR_UR2_SHIFT = 8,
+ RTD1619B_MISC_ISR_UR2_TO_SHIFT = 13,
+ RTD1619B_MISC_ISR_I2C5_SHIFT = 14,
+ RTD1619B_MISC_ISR_I2C4_SHIFT = 15,
+ RTD1619B_MISC_ISR_I2C3_SHIFT = 23,
+ RTD1619B_MISC_ISR_SC0_SHIFT = 24,
+ RTD1619B_MISC_ISR_SC1_SHIFT = 25,
+ RTD1619B_MISC_ISR_SPI_SHIFT = 27,
+ RTD1619B_MISC_ISR_FAN_SHIFT = 29,
+};
+
+static const u32 rtd1619b_misc_isr_to_scpu_int_en_mask[32] = {
+ [RTD1619B_MISC_ISR_UR1_SHIFT] = BIT(3),
+ [RTD1619B_MISC_ISR_UR1_TO_SHIFT] = BIT(5),
+ [RTD1619B_MISC_ISR_UR2_TO_SHIFT] = BIT(6),
+ [RTD1619B_MISC_ISR_UR2_SHIFT] = BIT(7),
+ [RTD1619B_MISC_ISR_I2C5_SHIFT] = BIT(14),
+ [RTD1619B_MISC_ISR_I2C4_SHIFT] = BIT(15),
+ [RTD1619B_MISC_ISR_SC0_SHIFT] = BIT(24),
+ [RTD1619B_MISC_ISR_SC1_SHIFT] = BIT(25),
+ [RTD1619B_MISC_ISR_SPI_SHIFT] = BIT(27),
+ [RTD1619B_MISC_ISR_I2C3_SHIFT] = BIT(28),
+ [RTD1619B_MISC_ISR_FAN_SHIFT] = BIT(29),
+};
+
+static const struct realtek_intc_mask rtd1619b_intc_iso_cfgs[] = {
+ { ISO_NORMAL_MASK, },
+ { ISO_NMI_WDT_MASK, },
+};
+
+static const struct realtek_intc_info rtd1619b_intc_iso_info[] = {
+ {
+ .isr_offset = ISO_ISR_OFFSET,
+ .scpu_int_en_offset = ISO_ISR_EN_OFFSET,
+ .isr_to_scpu_int_en_mask = rtd1619b_iso_isr_to_scpu_int_en_mask,
+ .subset_mask = rtd1619b_intc_iso_cfgs,
+ .subset_num = ARRAY_SIZE(rtd1619b_intc_iso_cfgs),
+ }
+};
+
+static const struct realtek_intc_desc rtd1619b_intc_iso_desc = {
+ .banks = rtd1619b_intc_iso_info,
+ .bank_num = ARRAY_SIZE(rtd1619b_intc_iso_info),
+};
+
+static const struct realtek_intc_mask rtd1619b_intc_misc_cfgs[] = {
+ { MISC_NORMAL_MASK, },
+ { MISC_UART1_MASK, },
+ { MISC_UART2_MASK, },
+};
+
+static const struct realtek_intc_info rtd1619b_intc_misc_info[] = {
+ {
+ .isr_offset = MISC_ISR_OFFSET,
+ .scpu_int_en_offset = MISC_ISR_EN_OFFSET,
+ .isr_to_scpu_int_en_mask = rtd1619b_misc_isr_to_scpu_int_en_mask,
+ .subset_mask = rtd1619b_intc_misc_cfgs,
+ .subset_num = ARRAY_SIZE(rtd1619b_intc_misc_cfgs),
+ }
+};
+
+static const struct realtek_intc_desc rtd1619b_intc_misc_desc = {
+ .banks = rtd1619b_intc_misc_info,
+ .bank_num = ARRAY_SIZE(rtd1619b_intc_misc_info),
+};
+
+static const struct of_device_id realtek_intc_rtd1619b_dt_matches[] = {
+ {
+ .compatible = "realtek,rtd1619b-intc-iso",
+ .data = &rtd1619b_intc_iso_desc,
+ }, {
+ .compatible = "realtek,rtd1619b-intc-misc",
+ .data = &rtd1619b_intc_misc_desc,
+ },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, realtek_intc_rtd1619b_dt_matches);
+
+static DEFINE_NOIRQ_DEV_PM_OPS(realtek_intc_rtd1619b_pm_ops, realtek_intc_suspend,
+ realtek_intc_resume);
+
+static int rtd1619b_intc_probe(struct platform_device *pdev)
+{
+ const struct realtek_intc_desc *desc;
+
+ desc = of_device_get_match_data(&pdev->dev);
+ if (!desc)
+ return -EINVAL;
+
+ return realtek_intc_probe(pdev, desc);
+}
+
+static struct platform_driver realtek_intc_rtd1619b_driver = {
+ .probe = rtd1619b_intc_probe,
+ .remove = realtek_intc_remove,
+ .driver = {
+ .name = "realtek_intc_rtd1619b",
+ .of_match_table = realtek_intc_rtd1619b_dt_matches,
+ .pm = pm_sleep_ptr(&realtek_intc_rtd1619b_pm_ops),
+ },
+};
+module_platform_driver(realtek_intc_rtd1619b_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Realtek RTD1619B Interrupt Controller Driver");
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v5 8/8] irqchip/realtek-rtd1625: Add driver for Realtek DHC rtd1625 SoC
2026-10-18 16:06 [PATCH v5 0/8] Initial support for the Realtek interrupt controller Yu-Chun Lin
` (6 preceding siblings ...)
2026-10-18 16:06 ` [PATCH v5 7/8] irqchip/realtek-rtd1619b: Add driver for Realtek DHC RTD1619B SoC Yu-Chun Lin
@ 2026-10-18 16:06 ` Yu-Chun Lin
7 siblings, 0 replies; 12+ messages in thread
From: Yu-Chun Lin @ 2026-10-18 16:06 UTC (permalink / raw)
To: tglx, radu, robh, krzk+dt, conor+dt, lee, afaerber
Cc: linux-kernel, devicetree, mfd, linux-arm-kernel,
linux-realtek-soc, james.tai, cy.huang, stanley_chang,
eleanor.lin
From: James Tai <james.tai@realtek.com>
Add support for interrupt controller driver found on Realtek DHC rtd1625
SoCs.
Signed-off-by: James Tai <james.tai@realtek.com>
Co-developed-by: Yu-Chun Lin <eleanor.lin@realtek.com>
Signed-off-by: Yu-Chun Lin <eleanor.lin@realtek.com>
---
drivers/irqchip/Kconfig | 12 ++
drivers/irqchip/Makefile | 1 +
drivers/irqchip/irq-realtek-rtd1625.c | 261 ++++++++++++++++++++++++++
3 files changed, 274 insertions(+)
create mode 100644 drivers/irqchip/irq-realtek-rtd1625.c
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index 2598f6a82cc2..c97c32f3f0a8 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -320,6 +320,18 @@ config REALTEK_RTD1619B_INTC
If unsure, say N.
+config REALTEK_RTD1625_INTC
+ tristate "Realtek RTD1625 interrupt controller"
+ depends on ARCH_REALTEK || COMPILE_TEST
+ select REALTEK_DHC_INTC
+ help
+ Enable support for the Realtek RTD1625 SoC interrupt controller.
+ The RTD1625 SoC features complex interrupt routing with multiple
+ interrupt banks. For example, its misc interrupt controller region
+ contains two register sets.
+
+ If unsure, say N.
+
config RENESAS_INTC_IRQPIN
bool "Renesas INTC External IRQ Pin Support" if COMPILE_TEST
select IRQ_DOMAIN
diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
index acc515fc6f9a..6fec774cfb2c 100644
--- a/drivers/irqchip/Makefile
+++ b/drivers/irqchip/Makefile
@@ -52,6 +52,7 @@ obj-$(CONFIG_REALTEK_DHC_INTC) += irq-realtek-intc-common.o
obj-$(CONFIG_REALTEK_RTD1319_INTC) += irq-realtek-rtd1319.o
obj-$(CONFIG_REALTEK_RTD1319D_INTC) += irq-realtek-rtd1319d.o
obj-$(CONFIG_REALTEK_RTD1619B_INTC) += irq-realtek-rtd1619b.o
+obj-$(CONFIG_REALTEK_RTD1625_INTC) += irq-realtek-rtd1625.o
obj-$(CONFIG_RENESAS_INTC_IRQPIN) += irq-renesas-intc-irqpin.o
obj-$(CONFIG_RENESAS_IRQC) += irq-renesas-irqc.o
obj-$(CONFIG_RENESAS_RZA1_IRQC) += irq-renesas-rza1.o
diff --git a/drivers/irqchip/irq-realtek-rtd1625.c b/drivers/irqchip/irq-realtek-rtd1625.c
new file mode 100644
index 000000000000..4cca66c8ff70
--- /dev/null
+++ b/drivers/irqchip/irq-realtek-rtd1625.c
@@ -0,0 +1,261 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Realtek RTD1625 interrupt controller driver
+ *
+ * Copyright (c) 2026 Realtek Semiconductor Corporation
+ */
+
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pm.h>
+#include "irq-realtek-intc-common.h"
+
+#define ISO_NORMAL_MASK 0xfffe0ff6
+#define ISO_UART9_MASK 0x00000008
+#define ISO_RTC_MASK 0x0001f000
+#define ISOM_NORMAL_MASK 0x00000037
+#define MISC_NORMAL_MASK 0xfffffffe
+#define MISC2_NORMAL_MASK 0xfffffff8
+#define MISC2_UART1_MASK 0x00000002
+#define MISC2_UART2_MASK 0x00000004
+
+#define ISO_ISR_EN_OFFSET 0x40
+#define ISO_ISR_OFFSET 0
+#define ISOM_ISR_EN_OFFSET 0x10
+#define ISOM_ISR_OFFSET 0
+#define MISC_ISR_EN_OFFSET 0x80
+#define MISC_ISR_OFFSET 0xc
+#define MISC2_ISR_EN_OFFSET 0x88
+#define MISC2_ISR_OFFSET 0x4
+
+enum rtd1625_iso_isr_bits {
+ RTD1625_ISO_ISR_UR0_SHIFT = 2,
+ RTD1625_ISO_ISR_UR9_SHIFT = 3,
+ RTD1625_ISO_ISR_SPI0_SHIFT = 4,
+ RTD1625_ISO_ISR_SPI1_SHIFT = 5,
+ RTD1625_ISO_ISR_SPI2_SHIFT = 6,
+ RTD1625_ISO_ISR_I2C0_SHIFT = 8,
+ RTD1625_ISO_ISR_I2C7_SHIFT = 10,
+ RTD1625_ISO_ISR_I2C1_SHIFT = 11,
+ RTD1625_ISO_ISR_DRTC_HSEC_SHIFT = 12,
+ RTD1625_ISO_ISR_DRTC_MIN_SHIFT = 13,
+ RTD1625_ISO_ISR_DRTC_HOUR_SHIFT = 14,
+ RTD1625_ISO_ISR_DRTC_DATE_SHIFT = 15,
+ RTD1625_ISO_ISR_DRTC_ALARM_SHIFT = 16,
+ RTD1625_ISO_ISR_VFD_SHIFT = 17,
+ RTD1625_ISO_ISR_GPIOA_SHIFT = 19,
+ RTD1625_ISO_ISR_GPIODA_SHIFT = 20,
+ RTD1625_ISO_ISR_LSADC0_SHIFT = 21,
+ RTD1625_ISO_ISR_LSADC1_SHIFT = 22,
+ RTD1625_ISO_ISR_PORB_HV_CEN_SHIFT = 28,
+ RTD1625_ISO_ISR_PORB_DV_CEN_SHIFT = 29,
+ RTD1625_ISO_ISR_PORB_AV_CEN_SHIFT = 30,
+ RTD1625_ISO_ISR_I2C1_REQ_SHIFT = 31,
+};
+
+static const u32 rtd1625_iso_isr_to_scpu_int_en_mask[32] = {
+ [RTD1625_ISO_ISR_UR0_SHIFT] = BIT(2),
+ [RTD1625_ISO_ISR_UR9_SHIFT] = BIT(3),
+ [RTD1625_ISO_ISR_SPI0_SHIFT] = BIT(4),
+ [RTD1625_ISO_ISR_SPI1_SHIFT] = BIT(5),
+ [RTD1625_ISO_ISR_SPI2_SHIFT] = BIT(6),
+ [RTD1625_ISO_ISR_I2C0_SHIFT] = BIT(8),
+ [RTD1625_ISO_ISR_I2C7_SHIFT] = BIT(10),
+ [RTD1625_ISO_ISR_I2C1_SHIFT] = BIT(11),
+ [RTD1625_ISO_ISR_DRTC_HSEC_SHIFT] = BIT(12),
+ [RTD1625_ISO_ISR_DRTC_MIN_SHIFT] = BIT(13),
+ [RTD1625_ISO_ISR_DRTC_HOUR_SHIFT] = BIT(14),
+ [RTD1625_ISO_ISR_DRTC_DATE_SHIFT] = BIT(15),
+ [RTD1625_ISO_ISR_DRTC_ALARM_SHIFT] = BIT(16),
+ [RTD1625_ISO_ISR_VFD_SHIFT] = BIT(17),
+ [RTD1625_ISO_ISR_GPIOA_SHIFT] = BIT(19),
+ [RTD1625_ISO_ISR_GPIODA_SHIFT] = BIT(20),
+ [RTD1625_ISO_ISR_LSADC0_SHIFT] = BIT(21),
+ [RTD1625_ISO_ISR_LSADC1_SHIFT] = BIT(22),
+ [RTD1625_ISO_ISR_PORB_HV_CEN_SHIFT] = BIT(28),
+ [RTD1625_ISO_ISR_PORB_DV_CEN_SHIFT] = BIT(29),
+ [RTD1625_ISO_ISR_PORB_AV_CEN_SHIFT] = BIT(30),
+ [RTD1625_ISO_ISR_I2C1_REQ_SHIFT] = BIT(31),
+};
+
+enum rtd1625_misc_isr_bits {
+ RTD1625_MISC_ISR_TC8_SHIFT = 1,
+ RTD1625_MISC_ISR_TC9_SHIFT = 2,
+ RTD1625_MISC_ISR_TC5_SHIFT = 4,
+ RTD1625_MISC_ISR_TC0_SHIFT = 6,
+ RTD1625_MISC_ISR_TC1_SHIFT = 7,
+ RTD1625_MISC_ISR_I2C5_SHIFT = 14,
+ RTD1625_MISC_ISR_I2C4_SHIFT = 15,
+ RTD1625_MISC_ISR_I2C6_SHIFT = 22,
+ RTD1625_MISC_ISR_I2C3_SHIFT = 23,
+ RTD1625_MISC_ISR_SC0_SHIFT = 24,
+ RTD1625_MISC_ISR_SC1_SHIFT = 25,
+ RTD1625_MISC_ISR_FAN_SHIFT = 29,
+};
+
+static const u32 rtd1625_misc_isr_to_scpu_int_en_mask[32] = {
+ [RTD1625_MISC_ISR_I2C6_SHIFT] = BIT(13),
+ [RTD1625_MISC_ISR_I2C5_SHIFT] = BIT(14),
+ [RTD1625_MISC_ISR_I2C4_SHIFT] = BIT(15),
+ [RTD1625_MISC_ISR_SC0_SHIFT] = BIT(24),
+ [RTD1625_MISC_ISR_SC1_SHIFT] = BIT(25),
+ [RTD1625_MISC_ISR_I2C3_SHIFT] = BIT(28),
+ [RTD1625_MISC_ISR_FAN_SHIFT] = BIT(29),
+};
+
+enum rtd1625_misc_isr2_bits {
+ RTD1625_MISC_ISR_UR1_SHIFT = 1,
+ RTD1625_MISC_ISR_UR2_SHIFT = 2,
+ RTD1625_MISC_ISR_UR3_SHIFT = 3,
+ RTD1625_MISC_ISR_UR4_SHIFT = 4,
+ RTD1625_MISC_ISR_UR5_SHIFT = 5,
+ RTD1625_MISC_ISR_UR6_SHIFT = 6,
+ RTD1625_MISC_ISR_UR7_SHIFT = 7,
+ RTD1625_MISC_ISR_UR8_SHIFT = 8,
+};
+
+static const u32 rtd1625_misc_isr2_to_scpu_int_en_mask[32] = {
+ [RTD1625_MISC_ISR_UR1_SHIFT] = BIT(0),
+ [RTD1625_MISC_ISR_UR2_SHIFT] = IRQ_ALWAYS_ENABLED,
+ [RTD1625_MISC_ISR_UR3_SHIFT] = BIT(4),
+ [RTD1625_MISC_ISR_UR4_SHIFT] = BIT(6),
+ [RTD1625_MISC_ISR_UR5_SHIFT] = BIT(8),
+ [RTD1625_MISC_ISR_UR6_SHIFT] = BIT(10),
+ [RTD1625_MISC_ISR_UR7_SHIFT] = BIT(12),
+ [RTD1625_MISC_ISR_UR8_SHIFT] = BIT(14),
+};
+
+enum rtd1625_isom_isr_bits {
+ RTD1625_ISOM_ISR_GPIOA_SHIFT = 0,
+ RTD1625_ISOM_ISR_GPIODA_SHIFT = 1,
+ RTD1625_ISOM_ISR_GPIO_LEVEL_SHIFT = 2,
+ RTD1625_ISOM_ISR_UR10_SHIFT = 4,
+ RTD1625_ISOM_ISR_IRDA_SHIFT = 5,
+};
+
+static const u32 rtd1625_isom_isr_to_scpu_int_en_mask[32] = {
+ [RTD1625_ISOM_ISR_GPIOA_SHIFT] = BIT(0),
+ [RTD1625_ISOM_ISR_GPIODA_SHIFT] = BIT(1),
+ [RTD1625_ISOM_ISR_GPIO_LEVEL_SHIFT] = BIT(2),
+ [RTD1625_ISOM_ISR_UR10_SHIFT] = BIT(4),
+ [RTD1625_ISOM_ISR_IRDA_SHIFT] = BIT(5),
+};
+
+static const struct realtek_intc_mask rtd1625_intc_iso_cfgs[] = {
+ { ISO_NORMAL_MASK, },
+ { ISO_UART9_MASK, },
+ { ISO_RTC_MASK, },
+};
+
+static const struct realtek_intc_info rtd1625_intc_iso_info[] = {
+ {
+ .isr_offset = ISO_ISR_OFFSET,
+ .scpu_int_en_offset = ISO_ISR_EN_OFFSET,
+ .isr_to_scpu_int_en_mask = rtd1625_iso_isr_to_scpu_int_en_mask,
+ .subset_mask = rtd1625_intc_iso_cfgs,
+ .subset_num = ARRAY_SIZE(rtd1625_intc_iso_cfgs),
+ },
+};
+
+static const struct realtek_intc_desc rtd1625_intc_iso_desc = {
+ .banks = rtd1625_intc_iso_info,
+ .bank_num = ARRAY_SIZE(rtd1625_intc_iso_info),
+ .shared_irq_mask = BIT(0),
+};
+
+static const struct realtek_intc_mask rtd1625_intc_isom_cfgs[] = {
+ { ISOM_NORMAL_MASK, },
+};
+
+static const struct realtek_intc_info rtd1625_intc_isom_info[] = {
+ {
+ .isr_offset = ISOM_ISR_OFFSET,
+ .scpu_int_en_offset = ISOM_ISR_EN_OFFSET,
+ .isr_to_scpu_int_en_mask = rtd1625_isom_isr_to_scpu_int_en_mask,
+ .subset_mask = rtd1625_intc_isom_cfgs,
+ .subset_num = ARRAY_SIZE(rtd1625_intc_isom_cfgs),
+ },
+};
+
+static const struct realtek_intc_desc rtd1625_intc_isom_desc = {
+ .banks = rtd1625_intc_isom_info,
+ .bank_num = ARRAY_SIZE(rtd1625_intc_isom_info),
+ .shared_irq_mask = BIT(0),
+};
+
+static const struct realtek_intc_mask rtd1625_intc_misc_cfgs[] = {
+ { MISC_NORMAL_MASK, },
+};
+
+static const struct realtek_intc_mask rtd1625_intc_misc2_cfgs[] = {
+ { MISC2_NORMAL_MASK, },
+ { MISC2_UART1_MASK, }, /* ur1 */
+ { MISC2_UART2_MASK, }, /* ur2 */
+};
+
+static const struct realtek_intc_info rtd1625_intc_misc_info[] = {
+ {
+ .isr_offset = MISC_ISR_OFFSET,
+ .scpu_int_en_offset = MISC_ISR_EN_OFFSET,
+ .isr_to_scpu_int_en_mask = rtd1625_misc_isr_to_scpu_int_en_mask,
+ .subset_mask = rtd1625_intc_misc_cfgs,
+ .subset_num = ARRAY_SIZE(rtd1625_intc_misc_cfgs),
+ },
+ {
+ .isr_offset = MISC2_ISR_OFFSET,
+ .scpu_int_en_offset = MISC2_ISR_EN_OFFSET,
+ .isr_to_scpu_int_en_mask = rtd1625_misc_isr2_to_scpu_int_en_mask,
+ .subset_mask = rtd1625_intc_misc2_cfgs,
+ .subset_num = ARRAY_SIZE(rtd1625_intc_misc2_cfgs),
+ },
+};
+
+static const struct realtek_intc_desc rtd1625_intc_misc_desc = {
+ .banks = rtd1625_intc_misc_info,
+ .bank_num = ARRAY_SIZE(rtd1625_intc_misc_info),
+ .shared_irq_mask = 0,
+};
+
+static const struct of_device_id realtek_intc_rtd1625_dt_matches[] = {
+ {
+ .compatible = "realtek,rtd1625-intc-iso",
+ .data = &rtd1625_intc_iso_desc,
+ }, {
+ .compatible = "realtek,rtd1625-intc-isom",
+ .data = &rtd1625_intc_isom_desc,
+ }, {
+ .compatible = "realtek,rtd1625-intc-misc",
+ .data = &rtd1625_intc_misc_desc,
+ },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, realtek_intc_rtd1625_dt_matches);
+
+static int rtd1625_intc_probe(struct platform_device *pdev)
+{
+ const struct realtek_intc_desc *desc;
+
+ desc = of_device_get_match_data(&pdev->dev);
+ if (!desc)
+ return -EINVAL;
+
+ return realtek_intc_probe(pdev, desc);
+}
+
+static DEFINE_NOIRQ_DEV_PM_OPS(realtek_intc_rtd1625_pm_ops, realtek_intc_suspend,
+ realtek_intc_resume);
+
+static struct platform_driver realtek_intc_rtd1625_driver = {
+ .probe = rtd1625_intc_probe,
+ .remove = realtek_intc_remove,
+ .driver = {
+ .name = "realtek_intc_rtd1625",
+ .of_match_table = realtek_intc_rtd1625_dt_matches,
+ .pm = pm_sleep_ptr(&realtek_intc_rtd1625_pm_ops),
+ },
+};
+module_platform_driver(realtek_intc_rtd1625_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Realtek RTD1625 Interrupt Controller Driver");
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 2/8] dt-bindings: mfd: realtek,rtd1xxx: Add new SoCs
2026-10-18 16:06 ` [PATCH v5 2/8] dt-bindings: mfd: realtek,rtd1xxx: Add new SoCs Yu-Chun Lin
@ 2026-10-19 9:11 ` Krzysztof Kozlowski
0 siblings, 0 replies; 12+ messages in thread
From: Krzysztof Kozlowski @ 2026-10-19 9:11 UTC (permalink / raw)
To: Yu-Chun Lin
Cc: tglx, radu, robh, krzk+dt, conor+dt, lee, afaerber, linux-kernel,
devicetree, mfd, linux-arm-kernel, linux-realtek-soc, james.tai,
cy.huang, stanley_chang
On Mon, Oct 19, 2026 at 12:06:47AM +0800, Yu-Chun Lin wrote:
> Add compatible strings for Realtek RTD1619B, RTD1319D, RTD1325, and
> RTD1625 syscon registers
>
> Signed-off-by: Yu-Chun Lin <eleanor.lin@realtek.com>
> ---
> .../devicetree/bindings/mfd/realtek,rtd1xxx.yaml | 9 +++++++++
> 1 file changed, 9 insertions(+)
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 3/8] dt-bindings: mfd: realtek,rtd1xxx: Add interrupt controller child node
2026-10-18 16:06 ` [PATCH v5 3/8] dt-bindings: mfd: realtek,rtd1xxx: Add interrupt controller child node Yu-Chun Lin
@ 2026-10-19 9:13 ` Krzysztof Kozlowski
2026-10-19 11:19 ` Yu-Chun Lin [林祐君]
0 siblings, 1 reply; 12+ messages in thread
From: Krzysztof Kozlowski @ 2026-10-19 9:13 UTC (permalink / raw)
To: Yu-Chun Lin
Cc: tglx, radu, robh, krzk+dt, conor+dt, lee, afaerber, linux-kernel,
devicetree, mfd, linux-arm-kernel, linux-realtek-soc, james.tai,
cy.huang, stanley_chang
On Mon, Oct 19, 2026 at 12:06:48AM +0800, Yu-Chun Lin wrote:
> Allow an interrupt controller as a child node by referencing the
> rtd1319-intc-iso schema, update additionalProperties to
> unevaluatedProperties, and append a usage example.
I do not see that "update".
>
> Signed-off-by: Yu-Chun Lin <eleanor.lin@realtek.com>
> ---
> .../bindings/mfd/realtek,rtd1xxx.yaml | 28 +++++++++++++++++++
> 1 file changed, 28 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/mfd/realtek,rtd1xxx.yaml b/Documentation/devicetree/bindings/mfd/realtek,rtd1xxx.yaml
> index 717e29c37b36..b21e14df2879 100644
> --- a/Documentation/devicetree/bindings/mfd/realtek,rtd1xxx.yaml
> +++ b/Documentation/devicetree/bindings/mfd/realtek,rtd1xxx.yaml
> @@ -65,6 +65,10 @@ properties:
> const: 1
>
> patternProperties:
> + "^interrupt-controller":
> + $ref: /schemas/interrupt-controller/realtek,rtd1319-intc-iso.yaml
> + unevaluatedProperties: false
> +
> '@[0-9a-f]+$':
> type: object
What is this for then? Should it be removed?
>
> @@ -76,3 +80,27 @@ required:
> - reg
>
> additionalProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/interrupt-controller/arm-gic.h>
> + #include <dt-bindings/interrupt-controller/irq.h>
> +
> + syscon@7000 {
> + compatible = "realtek,rtd1625-iso", "syscon", "simple-mfd";
> + reg = <0x7000 0x1000>;
> + ranges = <0x0 0x7000 0x1000>;
> + #address-cells = <1>;
> + #size-cells = <1>;
Why do you have cells it your child has no addressing?
> +
> + interrupt-controller {
So the binding requires children with unit address, yes?
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 12+ messages in thread
* RE: [PATCH v5 3/8] dt-bindings: mfd: realtek,rtd1xxx: Add interrupt controller child node
2026-10-19 9:13 ` Krzysztof Kozlowski
@ 2026-10-19 11:19 ` Yu-Chun Lin [林祐君]
0 siblings, 0 replies; 12+ messages in thread
From: Yu-Chun Lin [林祐君] @ 2026-10-19 11:19 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: tglx, radu, robh, krzk+dt, conor+dt, lee, afaerber, linux-kernel,
devicetree, mfd, linux-arm-kernel, linux-realtek-soc,
James Tai [戴志峰],
CY_Huang[黃鉦晏],
Stanley Chang[昌育德]
Hi Krzysztof,
> On Mon, Oct 19, 2026 at 12:06:48AM +0800, Yu-Chun Lin wrote:
> > Allow an interrupt controller as a child node by referencing the
> > rtd1319-intc-iso schema, update additionalProperties to
> > unevaluatedProperties, and append a usage example.
>
> I do not see that "update".
>
Sorry about this. I updated the diff but missed updating the commit
message. Will fix.
> >
> > Signed-off-by: Yu-Chun Lin <eleanor.lin@realtek.com>
> > ---
> > .../bindings/mfd/realtek,rtd1xxx.yaml | 28
> +++++++++++++++++++
> > 1 file changed, 28 insertions(+)
> >
> > diff --git
> > a/Documentation/devicetree/bindings/mfd/realtek,rtd1xxx.yaml
> > b/Documentation/devicetree/bindings/mfd/realtek,rtd1xxx.yaml
> > index 717e29c37b36..b21e14df2879 100644
> > --- a/Documentation/devicetree/bindings/mfd/realtek,rtd1xxx.yaml
> > +++ b/Documentation/devicetree/bindings/mfd/realtek,rtd1xxx.yaml
> > @@ -65,6 +65,10 @@ properties:
> > const: 1
> >
> > patternProperties:
> > + "^interrupt-controller":
> > + $ref: /schemas/interrupt-controller/realtek,rtd1319-intc-iso.yaml
> > + unevaluatedProperties: false
> > +
> > '@[0-9a-f]+$':
> > type: object
>
> What is this for then? Should it be removed?
>
The original syscon compatible has other child nodes that do have 'reg'
properties and unit addresses, so this pattern is still needed for them.
> >
> > @@ -76,3 +80,27 @@ required:
> > - reg
> >
> > additionalProperties: false
> > +
> > +examples:
> > + - |
> > + #include <dt-bindings/interrupt-controller/arm-gic.h>
> > + #include <dt-bindings/interrupt-controller/irq.h>
> > +
> > + syscon@7000 {
> > + compatible = "realtek,rtd1625-iso", "syscon", "simple-mfd";
> > + reg = <0x7000 0x1000>;
> > + ranges = <0x0 0x7000 0x1000>;
> > + #address-cells = <1>;
> > + #size-cells = <1>;
>
> Why do you have cells it your child has no addressing?
>
> > +
> > + interrupt-controller {
>
> So the binding requires children with unit address, yes?
>
The interrupt-controller does not need a unit address because it accesses
the registers via the parent's regmap.
Will update the example to remove the unnecessary properties from the
parent as follows:
syscon@7000 {
compatible = "realtek,rtd1625-iso", "syscon", "simple-mfd";
reg = <0x7000 0x1000>;
interrupt-controller {
compatible = "realtek,rtd1625-intc-iso";
interrupt-controller;
interrupt-parent = <&gic>;
interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <0>;
#interrupt-cells = <1>;
};
};
Best regards,
Yu-Chun
> Best regards,
> Krzysztof
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2026-10-19 11:20 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-18 16:06 [PATCH v5 0/8] Initial support for the Realtek interrupt controller Yu-Chun Lin
2026-10-18 16:06 ` [PATCH v5 1/8] dt-bindings: interrupt-controller: Add support for Realtek DHC SoCs Yu-Chun Lin
2026-10-18 16:06 ` [PATCH v5 2/8] dt-bindings: mfd: realtek,rtd1xxx: Add new SoCs Yu-Chun Lin
2026-10-19 9:11 ` Krzysztof Kozlowski
2026-10-18 16:06 ` [PATCH v5 3/8] dt-bindings: mfd: realtek,rtd1xxx: Add interrupt controller child node Yu-Chun Lin
2026-10-19 9:13 ` Krzysztof Kozlowski
2026-10-19 11:19 ` Yu-Chun Lin [林祐君]
2026-10-18 16:06 ` [PATCH v5 4/8] irqchip/realtek-intc-common: Add basic support for Realtek DHC SoCs Yu-Chun Lin
2026-10-18 16:06 ` [PATCH v5 5/8] irqchip/realtek-rtd1319: Add driver for Realtek DHC RTD1319 SoC Yu-Chun Lin
2026-10-18 16:06 ` [PATCH v5 6/8] irqchip/realtek-rtd1319d: Add driver for Realtek RTD1319D and RTD1325 SoCs Yu-Chun Lin
2026-10-18 16:06 ` [PATCH v5 7/8] irqchip/realtek-rtd1619b: Add driver for Realtek DHC RTD1619B SoC Yu-Chun Lin
2026-10-18 16:06 ` [PATCH v5 8/8] irqchip/realtek-rtd1625: Add driver for Realtek DHC rtd1625 SoC Yu-Chun Lin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®