mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-27 14:02:25 -05:00
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
This commit is contained in:
committed by
Andi Shyti
parent
13aa792c10
commit
11db6a53b2
@@ -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,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user