]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
i2c: riic: Pass IRQ desc array as part of OF data
authorLad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Wed, 25 Jun 2025 10:45:24 +0000 (11:45 +0100)
committerAndi Shyti <andi.shyti@kernel.org>
Wed, 23 Jul 2025 22:37:59 +0000 (00:37 +0200)
In preparation for adding support for Renesas RZ/T2H and RZ/N2H SoCs,
which feature a combined error interrupt instead of individual error
interrupts per condition, update the driver to support configurable IRQ
layouts via OF data.

Introduce a new `irqs` field and `num_irqs` count in `riic_of_data` to
allow future SoCs to provide a custom IRQ layout. This patch is a
non-functional change for existing SoCs and maintains compatibility with
the current `riic_irqs` array.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com> # on RZ/A1
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Link: https://lore.kernel.org/r/20250625104526.101004-4-prabhakar.mahadev-lad.rj@bp.renesas.com
drivers/i2c/busses/i2c-riic.c

index 23375f7fe3ad3726f61957dabf68ba57bf6a19d1..ecd1c78eecfd542494fbe78428c1ab7e52eed353 100644 (file)
@@ -102,6 +102,8 @@ enum riic_reg_list {
 
 struct riic_of_data {
        const u8 *regs;
+       const struct riic_irq_desc *irqs;
+       u8 num_irqs;
        bool fast_mode_plus;
 };
 
@@ -520,21 +522,23 @@ static int riic_i2c_probe(struct platform_device *pdev)
                return dev_err_probe(dev, PTR_ERR(riic->rstc),
                                     "failed to acquire deasserted reset\n");
 
-       for (i = 0; i < ARRAY_SIZE(riic_irqs); i++) {
+       riic->info = of_device_get_match_data(dev);
+
+       for (i = 0; i < riic->info->num_irqs; i++) {
+               const struct riic_irq_desc *irq_desc;
                int irq;
 
-               irq = platform_get_irq(pdev, riic_irqs[i].res_num);
+               irq_desc = &riic->info->irqs[i];
+               irq = platform_get_irq(pdev, irq_desc->res_num);
                if (irq < 0)
                        return irq;
 
-               ret = devm_request_irq(dev, irq, riic_irqs[i].isr,
-                                      0, riic_irqs[i].name, riic);
+               ret = devm_request_irq(dev, irq, irq_desc->isr, 0, irq_desc->name, riic);
                if (ret)
                        return dev_err_probe(dev, ret, "failed to request irq %s\n",
-                                            riic_irqs[i].name);
+                                            irq_desc->name);
        }
 
-       riic->info = of_device_get_match_data(dev);
 
        adap = &riic->adapter;
        i2c_set_adapdata(adap, riic);
@@ -606,11 +610,15 @@ static const u8 riic_rz_a_regs[RIIC_REG_END] = {
 
 static const struct riic_of_data riic_rz_a_info = {
        .regs = riic_rz_a_regs,
+       .irqs = riic_irqs,
+       .num_irqs = ARRAY_SIZE(riic_irqs),
        .fast_mode_plus = true,
 };
 
 static const struct riic_of_data riic_rz_a1h_info = {
        .regs = riic_rz_a_regs,
+       .irqs = riic_irqs,
+       .num_irqs = ARRAY_SIZE(riic_irqs),
 };
 
 static const u8 riic_rz_v2h_regs[RIIC_REG_END] = {
@@ -630,6 +638,8 @@ static const u8 riic_rz_v2h_regs[RIIC_REG_END] = {
 
 static const struct riic_of_data riic_rz_v2h_info = {
        .regs = riic_rz_v2h_regs,
+       .irqs = riic_irqs,
+       .num_irqs = ARRAY_SIZE(riic_irqs),
        .fast_mode_plus = true,
 };