* [PATCH v3 0/2] ti-sci-intr: Support level+pulse interrupt sources together
@ 2026-01-22 17:19 Aniket Limaye
2026-01-22 17:19 ` [PATCH v3 1/2] dt-bindings: interrupt-controller: ti,sci-intr: Per-line interrupt-types Aniket Limaye
2026-01-22 17:19 ` [PATCH v3 2/2] irqchip/ti-sci-intr: Allow parsing interrupt-types per-line Aniket Limaye
0 siblings, 2 replies; 4+ messages in thread
From: Aniket Limaye @ 2026-01-22 17:19 UTC (permalink / raw)
To: Vignesh Raghavendra, u-kumar1, Nishanth Menon, Tero Kristo,
Santosh Shilimkar, Thomas Gleixner, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
Cc: j-mcarthur, linux-arm-kernel, linux-kernel, devicetree,
Aniket Limaye
The interrupt router does not support interrupt type conversion and
forwards both level and pulse interrupts to the parent (GIC) unchanged.
Hence update the INTR bindings and driver such that
1. If "ti,intr-trigger-type" is absent, parse the interrupt-type
declared by the source, per-line, and use that to allocate interrupt
from its interrupt-parent.
2. Else, the global setting specified for the property is used for all
output lines. This maintains compatibility with existing platform
DTs with no changes.
This change is needed because:
main_i2c4 on J722S is a level type interrupt source while the rest of
the interrupt sources for Main GPIOMUX INTR router are pulse interrupts.
main_i2c4 on J722S is not present in it's dts yet and will be added
through another patch series after this one gets merged.
Testing:
- Enable I2C4 (additional DT patch) on j722s-evm and run i2cdetect [0].
- Add testcode to ignore the NACK interrupt, which results in an irq
storm -> showing that GIC is actually receiving level interrupt from
the INTR [1].
[0]: https://gist.github.com/aniket-l/b5825cd8f2c1d11da4580e011c656ed7#file-j722s-evm-i2c4-working-logs-txt
[1]: https://gist.github.com/aniket-l/b5825cd8f2c1d11da4580e011c656ed7#file-j722s-evm-i2c4-irqstorm-logs-txt
Signed-off-by: Aniket Limaye <a-limaye@ti.com>
---
Changes in v3:
- Avoid new redundant value IRQ_TYPE_DEFAULT for "ti,intr-trigger-type"
when "#interrupt-cells"==2. Instead, make this property optional and
check for its absence to use the per-line interrupt-type setting.
- Link to v2: https://lore.kernel.org/r/20260120-ul-driver-i2c-j722s-v2-0-832097c6b64f@ti.com
Changes in v2:
- Use correct Patch Subject prefix
- Reword Commit msgs to better describe the patches
- Fix function argument alignment as per coding style
- Fix variable declaration ordering as per coding style
- Link to v1: https://lore.kernel.org/r/20260116-ul-driver-i2c-j722s-v1-0-c28e8ba38a9e@ti.com
---
Aniket Limaye (2):
dt-bindings: interrupt-controller: ti,sci-intr: Per-line interrupt-types
irqchip/ti-sci-intr: Allow parsing interrupt-types per-line
.../bindings/interrupt-controller/ti,sci-intr.yaml | 44 ++++++++++++++++---
drivers/irqchip/irq-ti-sci-intr.c | 49 ++++++++++++++++------
2 files changed, 74 insertions(+), 19 deletions(-)
---
base-commit: a66191c590b3b58eaff05d2277971f854772bd5b
change-id: 20260116-ul-driver-i2c-j722s-48f223899dbd
Best regards,
--
Aniket Limaye <a-limaye@ti.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v3 1/2] dt-bindings: interrupt-controller: ti,sci-intr: Per-line interrupt-types
2026-01-22 17:19 [PATCH v3 0/2] ti-sci-intr: Support level+pulse interrupt sources together Aniket Limaye
@ 2026-01-22 17:19 ` Aniket Limaye
2026-01-22 23:27 ` Rob Herring
2026-01-22 17:19 ` [PATCH v3 2/2] irqchip/ti-sci-intr: Allow parsing interrupt-types per-line Aniket Limaye
1 sibling, 1 reply; 4+ messages in thread
From: Aniket Limaye @ 2026-01-22 17:19 UTC (permalink / raw)
To: Vignesh Raghavendra, u-kumar1, Nishanth Menon, Tero Kristo,
Santosh Shilimkar, Thomas Gleixner, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
Cc: j-mcarthur, linux-arm-kernel, linux-kernel, devicetree,
Aniket Limaye
Update the bindings to allow setting per-line interrupt-types.
Some Interrupt Router instances can only work with a specific trigger
type (edge or level), while others act as simple passthroughs that
preserve the source interrupt type unchanged.
Make "ti,intr-trigger-type" property optional, with its absence
indicating that the router acts as a passthrough. When absent,
"#interrupt-cells" must be 2 to allow each interrupt source to specify
its trigger type per-line.
Signed-off-by: Aniket Limaye <a-limaye@ti.com>
---
Changes in v3:
- Avoid new redundant value IRQ_TYPE_DEFAULT for "ti,intr-trigger-type"
when "#interrupt-cells"==2. Instead, make this property optional and
check for its absence to use the per-line interrupt-type setting.
- Link to v2:
https://lore.kernel.org/r/20260120-ul-driver-i2c-j722s-v2-1-832097c6b64f@ti.com
Changes in v2:
- Reword Commit msg to better describe the patch
- Link to v1:
https://lore.kernel.org/r/20260116-ul-driver-i2c-j722s-v1-1-c28e8ba38a9e@ti.com
---
.../bindings/interrupt-controller/ti,sci-intr.yaml | 44 +++++++++++++++++++---
1 file changed, 38 insertions(+), 6 deletions(-)
diff --git a/Documentation/devicetree/bindings/interrupt-controller/ti,sci-intr.yaml b/Documentation/devicetree/bindings/interrupt-controller/ti,sci-intr.yaml
index c99cc7323c71..8156ce6d2ab4 100644
--- a/Documentation/devicetree/bindings/interrupt-controller/ti,sci-intr.yaml
+++ b/Documentation/devicetree/bindings/interrupt-controller/ti,sci-intr.yaml
@@ -15,8 +15,7 @@ allOf:
description: |
The Interrupt Router (INTR) module provides a mechanism to mux M
interrupt inputs to N interrupt outputs, where all M inputs are selectable
- to be driven per N output. An Interrupt Router can either handle edge
- triggered or level triggered interrupts and that is fixed in hardware.
+ to be driven per N output.
Interrupt Router
+----------------------+
@@ -54,19 +53,28 @@ properties:
$ref: /schemas/types.yaml#/definitions/uint32
enum: [1, 4]
description: |
- Should be one of the following.
+ Optional property - should be one of the following:
1 = If intr supports edge triggered interrupts.
4 = If intr supports level triggered interrupts.
+ If this property is present, #interrupt-cells must be 1.
+ If this property is absent, #interrupt-cells must be 2 and interrupt
+ source must specify the trigger type in the second cell.
+
reg:
maxItems: 1
interrupt-controller: true
'#interrupt-cells':
- const: 1
+ enum: [1, 2]
description: |
- The 1st cell should contain interrupt router input hw number.
+ Number of cells in interrupt specifier. Depends on ti,intr-trigger-type:
+ - If ti,intr-trigger-type is present: must be 1
+ The 1st cell should contain interrupt router input hw number.
+ - If ti,intr-trigger-type is absent: must be 2
+ The 1st cell should contain interrupt router input hw number.
+ The 2nd cell should contain interrupt trigger type (preserved by router).
ti,interrupt-ranges:
$ref: /schemas/types.yaml#/definitions/uint32-matrix
@@ -82,9 +90,22 @@ properties:
- description: |
"limit" specifies the limit for translation
+if:
+ required:
+ - ti,intr-trigger-type
+then:
+ properties:
+ '#interrupt-cells':
+ const: 1
+ description: Interrupt ID only. Interrupt type is specified globally
+else:
+ properties:
+ '#interrupt-cells':
+ const: 2
+ description: Interrupt ID and corresponding interrupt type
+
required:
- compatible
- - ti,intr-trigger-type
- interrupt-controller
- '#interrupt-cells'
- ti,sci
@@ -105,3 +126,14 @@ examples:
ti,sci-dev-id = <131>;
ti,interrupt-ranges = <0 360 32>;
};
+
+ - |
+ main_gpio_intr1: interrupt-controller1 {
+ compatible = "ti,sci-intr";
+ interrupt-controller;
+ interrupt-parent = <&gic500>;
+ #interrupt-cells = <2>;
+ ti,sci = <&dmsc>;
+ ti,sci-dev-id = <131>;
+ ti,interrupt-ranges = <0 360 32>;
+ };
--
2.52.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v3 2/2] irqchip/ti-sci-intr: Allow parsing interrupt-types per-line
2026-01-22 17:19 [PATCH v3 0/2] ti-sci-intr: Support level+pulse interrupt sources together Aniket Limaye
2026-01-22 17:19 ` [PATCH v3 1/2] dt-bindings: interrupt-controller: ti,sci-intr: Per-line interrupt-types Aniket Limaye
@ 2026-01-22 17:19 ` Aniket Limaye
1 sibling, 0 replies; 4+ messages in thread
From: Aniket Limaye @ 2026-01-22 17:19 UTC (permalink / raw)
To: Vignesh Raghavendra, u-kumar1, Nishanth Menon, Tero Kristo,
Santosh Shilimkar, Thomas Gleixner, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
Cc: j-mcarthur, linux-arm-kernel, linux-kernel, devicetree,
Aniket Limaye
Some INTR router instances act as simple passthroughs that preserve the
source interrupt type unchanged at the output line, rather than
converting all interrupts to a fixed type.
When interrupt sources are not homogeneous with respect to trigger type,
the driver needs to read each source's interrupt type from DT and pass
it unchanged to its interrupt parent.
Add support to check for absence of "ti,intr-trigger-type" to indicate
passthrough mode. When this property is absent, parse interrupt type
per-line from the DT fwspec provided by the interrupt source. Else, use
the global setting for all interrupt lines.
Signed-off-by: Aniket Limaye <a-limaye@ti.com>
---
Changes in v3:
- Avoid new redundant value IRQ_TYPE_DEFAULT for "ti,intr-trigger-type"
when "#interrupt-cells"==2. Instead, make this property optional and
check for its absence to use the per-line interrupt-type setting.
- Link to v2:
https://lore.kernel.org/r/20260120-ul-driver-i2c-j722s-v2-2-832097c6b64f@ti.com
Changes in v2:
- Use correct Patch Subject prefix
- Reword Commit msg to better describe the patch
- Fix function argument alignment as per coding style
- Fix variable declaration ordering as per coding style
- Link to v1:
https://lore.kernel.org/r/20260116-ul-driver-i2c-j722s-v1-2-c28e8ba38a9e@ti.com
---
drivers/irqchip/irq-ti-sci-intr.c | 49 ++++++++++++++++++++++++++++-----------
1 file changed, 36 insertions(+), 13 deletions(-)
diff --git a/drivers/irqchip/irq-ti-sci-intr.c b/drivers/irqchip/irq-ti-sci-intr.c
index 354613e74ad0..0c6065e66e6a 100644
--- a/drivers/irqchip/irq-ti-sci-intr.c
+++ b/drivers/irqchip/irq-ti-sci-intr.c
@@ -61,11 +61,22 @@ static int ti_sci_intr_irq_domain_translate(struct irq_domain *domain,
{
struct ti_sci_intr_irq_domain *intr = domain->host_data;
- if (fwspec->param_count != 1)
- return -EINVAL;
- *hwirq = fwspec->param[0];
- *type = intr->type;
+ if (intr->type) {
+ /* Global interrupt-type */
+ if (fwspec->param_count != 1)
+ return -EINVAL;
+
+ *hwirq = fwspec->param[0];
+ *type = intr->type;
+ } else {
+ /* Per-Line interrupt-type */
+ if (fwspec->param_count != 2)
+ return -EINVAL;
+
+ *hwirq = fwspec->param[0];
+ *type = fwspec->param[1];
+ }
return 0;
}
@@ -128,11 +139,12 @@ static void ti_sci_intr_irq_domain_free(struct irq_domain *domain,
* @domain: Pointer to the interrupt router IRQ domain
* @virq: Corresponding Linux virtual IRQ number
* @hwirq: Corresponding hwirq for the IRQ within this IRQ domain
+ * @hwirq_type: Corresponding hwirq trigger type for the IRQ within this IRQ domain
*
* Returns intr output irq if all went well else appropriate error pointer.
*/
static int ti_sci_intr_alloc_parent_irq(struct irq_domain *domain,
- unsigned int virq, u32 hwirq)
+ unsigned int virq, u32 hwirq, u32 hwirq_type)
{
struct ti_sci_intr_irq_domain *intr = domain->host_data;
struct device_node *parent_node;
@@ -156,11 +168,23 @@ static int ti_sci_intr_alloc_parent_irq(struct irq_domain *domain,
fwspec.param_count = 3;
fwspec.param[0] = 0; /* SPI */
fwspec.param[1] = p_hwirq - 32; /* SPI offset */
- fwspec.param[2] = intr->type;
+ fwspec.param[2] = hwirq_type;
} else {
/* Parent is Interrupt Router */
- fwspec.param_count = 1;
- fwspec.param[0] = p_hwirq;
+ u32 parent_trigger_type;
+
+ if (!of_property_read_u32(parent_node,
+ "ti,intr-trigger-type",
+ &parent_trigger_type)) {
+ /* Parent has global trigger type */
+ fwspec.param_count = 1;
+ fwspec.param[0] = p_hwirq;
+ } else {
+ /* Parent supports per-line trigger types */
+ fwspec.param_count = 2;
+ fwspec.param[0] = p_hwirq;
+ fwspec.param[1] = hwirq_type;
+ }
}
err = irq_domain_alloc_irqs_parent(domain, virq, 1, &fwspec);
@@ -196,15 +220,15 @@ static int ti_sci_intr_irq_domain_alloc(struct irq_domain *domain,
void *data)
{
struct irq_fwspec *fwspec = data;
+ unsigned int hwirq_type;
unsigned long hwirq;
- unsigned int flags;
int err, out_irq;
- err = ti_sci_intr_irq_domain_translate(domain, fwspec, &hwirq, &flags);
+ err = ti_sci_intr_irq_domain_translate(domain, fwspec, &hwirq, &hwirq_type);
if (err)
return err;
- out_irq = ti_sci_intr_alloc_parent_irq(domain, virq, hwirq);
+ out_irq = ti_sci_intr_alloc_parent_irq(domain, virq, hwirq, hwirq_type);
if (out_irq < 0)
return out_irq;
@@ -250,8 +274,7 @@ static int ti_sci_intr_irq_domain_probe(struct platform_device *pdev)
ret = of_property_read_u32(dev_of_node(dev), "ti,intr-trigger-type",
&intr->type);
if (ret) {
- dev_err(dev, "missing ti,intr-trigger-type property\n");
- return -EINVAL;
+ intr->type = IRQ_TYPE_NONE;
}
intr->sci = devm_ti_sci_get_by_phandle(dev, "ti,sci");
--
2.52.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v3 1/2] dt-bindings: interrupt-controller: ti,sci-intr: Per-line interrupt-types
2026-01-22 17:19 ` [PATCH v3 1/2] dt-bindings: interrupt-controller: ti,sci-intr: Per-line interrupt-types Aniket Limaye
@ 2026-01-22 23:27 ` Rob Herring
0 siblings, 0 replies; 4+ messages in thread
From: Rob Herring @ 2026-01-22 23:27 UTC (permalink / raw)
To: Aniket Limaye
Cc: Vignesh Raghavendra, u-kumar1, Nishanth Menon, Tero Kristo,
Santosh Shilimkar, Thomas Gleixner, Krzysztof Kozlowski,
Conor Dooley, j-mcarthur, linux-arm-kernel, linux-kernel,
devicetree
On Thu, Jan 22, 2026 at 10:49:13PM +0530, Aniket Limaye wrote:
> Update the bindings to allow setting per-line interrupt-types.
>
> Some Interrupt Router instances can only work with a specific trigger
> type (edge or level), while others act as simple passthroughs that
> preserve the source interrupt type unchanged.
>
> Make "ti,intr-trigger-type" property optional, with its absence
> indicating that the router acts as a passthrough. When absent,
> "#interrupt-cells" must be 2 to allow each interrupt source to specify
> its trigger type per-line.
>
> Signed-off-by: Aniket Limaye <a-limaye@ti.com>
> ---
> Changes in v3:
> - Avoid new redundant value IRQ_TYPE_DEFAULT for "ti,intr-trigger-type"
> when "#interrupt-cells"==2. Instead, make this property optional and
> check for its absence to use the per-line interrupt-type setting.
> - Link to v2:
> https://lore.kernel.org/r/20260120-ul-driver-i2c-j722s-v2-1-832097c6b64f@ti.com
>
> Changes in v2:
> - Reword Commit msg to better describe the patch
> - Link to v1:
> https://lore.kernel.org/r/20260116-ul-driver-i2c-j722s-v1-1-c28e8ba38a9e@ti.com
> ---
> .../bindings/interrupt-controller/ti,sci-intr.yaml | 44 +++++++++++++++++++---
> 1 file changed, 38 insertions(+), 6 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/interrupt-controller/ti,sci-intr.yaml b/Documentation/devicetree/bindings/interrupt-controller/ti,sci-intr.yaml
> index c99cc7323c71..8156ce6d2ab4 100644
> --- a/Documentation/devicetree/bindings/interrupt-controller/ti,sci-intr.yaml
> +++ b/Documentation/devicetree/bindings/interrupt-controller/ti,sci-intr.yaml
> @@ -15,8 +15,7 @@ allOf:
> description: |
> The Interrupt Router (INTR) module provides a mechanism to mux M
> interrupt inputs to N interrupt outputs, where all M inputs are selectable
> - to be driven per N output. An Interrupt Router can either handle edge
> - triggered or level triggered interrupts and that is fixed in hardware.
> + to be driven per N output.
>
> Interrupt Router
> +----------------------+
> @@ -54,19 +53,28 @@ properties:
> $ref: /schemas/types.yaml#/definitions/uint32
> enum: [1, 4]
> description: |
> - Should be one of the following.
> + Optional property - should be one of the following:
optional or required is defined by the schema. No need to say it here.
> 1 = If intr supports edge triggered interrupts.
> 4 = If intr supports level triggered interrupts.
>
> + If this property is present, #interrupt-cells must be 1.
> + If this property is absent, #interrupt-cells must be 2 and interrupt
> + source must specify the trigger type in the second cell.
The schema says most of this too.
> +
> reg:
> maxItems: 1
>
> interrupt-controller: true
>
> '#interrupt-cells':
> - const: 1
> + enum: [1, 2]
> description: |
> - The 1st cell should contain interrupt router input hw number.
> + Number of cells in interrupt specifier. Depends on ti,intr-trigger-type:
> + - If ti,intr-trigger-type is present: must be 1
> + The 1st cell should contain interrupt router input hw number.
> + - If ti,intr-trigger-type is absent: must be 2
> + The 1st cell should contain interrupt router input hw number.
> + The 2nd cell should contain interrupt trigger type (preserved by router).
>
> ti,interrupt-ranges:
> $ref: /schemas/types.yaml#/definitions/uint32-matrix
> @@ -82,9 +90,22 @@ properties:
> - description: |
> "limit" specifies the limit for translation
>
> +if:
> + required:
> + - ti,intr-trigger-type
> +then:
> + properties:
> + '#interrupt-cells':
> + const: 1
> + description: Interrupt ID only. Interrupt type is specified globally
> +else:
> + properties:
> + '#interrupt-cells':
> + const: 2
> + description: Interrupt ID and corresponding interrupt type
> +
> required:
> - compatible
> - - ti,intr-trigger-type
> - interrupt-controller
> - '#interrupt-cells'
> - ti,sci
> @@ -105,3 +126,14 @@ examples:
> ti,sci-dev-id = <131>;
> ti,interrupt-ranges = <0 360 32>;
> };
> +
> + - |
> + main_gpio_intr1: interrupt-controller1 {
Drop unused label and node name should be 'interrupt-controller'.
With those fixed,
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
> + compatible = "ti,sci-intr";
> + interrupt-controller;
> + interrupt-parent = <&gic500>;
> + #interrupt-cells = <2>;
> + ti,sci = <&dmsc>;
> + ti,sci-dev-id = <131>;
> + ti,interrupt-ranges = <0 360 32>;
> + };
>
> --
> 2.52.0
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-01-22 23:27 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-22 17:19 [PATCH v3 0/2] ti-sci-intr: Support level+pulse interrupt sources together Aniket Limaye
2026-01-22 17:19 ` [PATCH v3 1/2] dt-bindings: interrupt-controller: ti,sci-intr: Per-line interrupt-types Aniket Limaye
2026-01-22 23:27 ` Rob Herring
2026-01-22 17:19 ` [PATCH v3 2/2] irqchip/ti-sci-intr: Allow parsing interrupt-types per-line Aniket Limaye
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox