Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

i2c: riic: Pass IRQ desc array as part of OF data

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

authored by

Lad Prabhakar and committed by
Andi Shyti
11db6a53 13aa792c

+16 -6
+16 -6
drivers/i2c/busses/i2c-riic.c
··· 102 102 103 103 struct riic_of_data { 104 104 const u8 *regs; 105 + const struct riic_irq_desc *irqs; 106 + u8 num_irqs; 105 107 bool fast_mode_plus; 106 108 }; 107 109 ··· 522 520 return dev_err_probe(dev, PTR_ERR(riic->rstc), 523 521 "failed to acquire deasserted reset\n"); 524 522 525 - for (i = 0; i < ARRAY_SIZE(riic_irqs); i++) { 523 + riic->info = of_device_get_match_data(dev); 524 + 525 + for (i = 0; i < riic->info->num_irqs; i++) { 526 + const struct riic_irq_desc *irq_desc; 526 527 int irq; 527 528 528 - irq = platform_get_irq(pdev, riic_irqs[i].res_num); 529 + irq_desc = &riic->info->irqs[i]; 530 + irq = platform_get_irq(pdev, irq_desc->res_num); 529 531 if (irq < 0) 530 532 return irq; 531 533 532 - ret = devm_request_irq(dev, irq, riic_irqs[i].isr, 533 - 0, riic_irqs[i].name, riic); 534 + ret = devm_request_irq(dev, irq, irq_desc->isr, 0, irq_desc->name, riic); 534 535 if (ret) 535 536 return dev_err_probe(dev, ret, "failed to request irq %s\n", 536 - riic_irqs[i].name); 537 + irq_desc->name); 537 538 } 538 539 539 - riic->info = of_device_get_match_data(dev); 540 540 541 541 adap = &riic->adapter; 542 542 i2c_set_adapdata(adap, riic); ··· 610 606 611 607 static const struct riic_of_data riic_rz_a_info = { 612 608 .regs = riic_rz_a_regs, 609 + .irqs = riic_irqs, 610 + .num_irqs = ARRAY_SIZE(riic_irqs), 613 611 .fast_mode_plus = true, 614 612 }; 615 613 616 614 static const struct riic_of_data riic_rz_a1h_info = { 617 615 .regs = riic_rz_a_regs, 616 + .irqs = riic_irqs, 617 + .num_irqs = ARRAY_SIZE(riic_irqs), 618 618 }; 619 619 620 620 static const u8 riic_rz_v2h_regs[RIIC_REG_END] = { ··· 638 630 639 631 static const struct riic_of_data riic_rz_v2h_info = { 640 632 .regs = riic_rz_v2h_regs, 633 + .irqs = riic_irqs, 634 + .num_irqs = ARRAY_SIZE(riic_irqs), 641 635 .fast_mode_plus = true, 642 636 }; 643 637