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

irqchip/renesas-rzv2h: Add RZ/G3E support

The ICU block on the RZ/G3E SoC is almost identical to the one found on
the RZ/V2H SoC, with the following differences:

- The TINT register base offset is 0x800 instead of zero.
- The number of GPIO interrupts for TINT selection is 141 instead of 86.
- The pin index and TINT selection index are not in the 1:1 map.
- The number of TSSR registers is 16 instead of 8.
- Each TSSR register can program 2 TINTs instead of 4 TINTs.

Add support for the RZ/G3E driver by filling the rzv2h_hw_info table and
adding LUT for mapping between pin index and TINT selection index.

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Fabrizio Castro <fabrizio.castro.jz@renesas.com>
Reviewed-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/all/20250224131253.134199-13-biju.das.jz@bp.renesas.com

authored by

Biju Das and committed by
Thomas Gleixner
399b2799 e3a16c33

+46
+46
drivers/irqchip/irq-renesas-rzv2h.c
··· 85 85 86 86 #define ICU_TINT_EXTRACT_HWIRQ(x) FIELD_GET(GENMASK(15, 0), (x)) 87 87 #define ICU_TINT_EXTRACT_GPIOINT(x) FIELD_GET(GENMASK(31, 16), (x)) 88 + #define ICU_RZG3E_TINT_OFFSET 0x800 89 + #define ICU_RZG3E_TSSEL_MAX_VAL 0x8c 88 90 #define ICU_RZV2H_TSSEL_MAX_VAL 0x55 89 91 90 92 /** 91 93 * struct rzv2h_hw_info - Interrupt Control Unit controller hardware info structure. 94 + * @tssel_lut: TINT lookup table 92 95 * @t_offs: TINT offset 93 96 * @max_tssel: TSSEL max value 94 97 * @field_width: TSSR field width 95 98 */ 96 99 struct rzv2h_hw_info { 100 + const u8 *tssel_lut; 97 101 u16 t_offs; 98 102 u8 max_tssel; 99 103 u8 field_width; ··· 321 317 if (tint > priv->info->max_tssel) 322 318 return -EINVAL; 323 319 320 + if (priv->info->tssel_lut) 321 + tint = priv->info->tssel_lut[tint]; 322 + 324 323 hwirq = irqd_to_hwirq(d); 325 324 tint_nr = hwirq - ICU_TINT_START; 326 325 ··· 536 529 return ret; 537 530 } 538 531 532 + /* Mapping based on port index on Table 4.2-6 and TSSEL bits on Table 4.6-4 */ 533 + static const u8 rzg3e_tssel_lut[] = { 534 + 81, 82, 83, 84, 85, 86, 87, 88, /* P00-P07 */ 535 + 89, 90, 91, 92, 93, 94, 95, 96, /* P10-P17 */ 536 + 111, 112, /* P20-P21 */ 537 + 97, 98, 99, 100, 101, 102, 103, 104, /* P30-P37 */ 538 + 105, 106, 107, 108, 109, 110, /* P40-P45 */ 539 + 113, 114, 115, 116, 117, 118, 119, /* P50-P56 */ 540 + 120, 121, 122, 123, 124, 125, 126, /* P60-P66 */ 541 + 127, 128, 129, 130, 131, 132, 133, 134, /* P70-P77 */ 542 + 135, 136, 137, 138, 139, 140, /* P80-P85 */ 543 + 43, 44, 45, 46, 47, 48, 49, 50, /* PA0-PA7 */ 544 + 51, 52, 53, 54, 55, 56, 57, 58, /* PB0-PB7 */ 545 + 59, 60, 61, /* PC0-PC2 */ 546 + 62, 63, 64, 65, 66, 67, 68, 69, /* PD0-PD7 */ 547 + 70, 71, 72, 73, 74, 75, 76, 77, /* PE0-PE7 */ 548 + 78, 79, 80, /* PF0-PF2 */ 549 + 25, 26, 27, 28, 29, 30, 31, 32, /* PG0-PG7 */ 550 + 33, 34, 35, 36, 37, 38, /* PH0-PH5 */ 551 + 4, 5, 6, 7, 8, /* PJ0-PJ4 */ 552 + 39, 40, 41, 42, /* PK0-PK3 */ 553 + 9, 10, 11, 12, 21, 22, 23, 24, /* PL0-PL7 */ 554 + 13, 14, 15, 16, 17, 18, 19, 20, /* PM0-PM7 */ 555 + 0, 1, 2, 3 /* PS0-PS3 */ 556 + }; 557 + 558 + static const struct rzv2h_hw_info rzg3e_hw_params = { 559 + .tssel_lut = rzg3e_tssel_lut, 560 + .t_offs = ICU_RZG3E_TINT_OFFSET, 561 + .max_tssel = ICU_RZG3E_TSSEL_MAX_VAL, 562 + .field_width = 16, 563 + }; 564 + 539 565 static const struct rzv2h_hw_info rzv2h_hw_params = { 540 566 .t_offs = 0, 541 567 .max_tssel = ICU_RZV2H_TSSEL_MAX_VAL, 542 568 .field_width = 8, 543 569 }; 570 + 571 + static int rzg3e_icu_init(struct device_node *node, struct device_node *parent) 572 + { 573 + return rzv2h_icu_init_common(node, parent, &rzg3e_hw_params); 574 + } 544 575 545 576 static int rzv2h_icu_init(struct device_node *node, struct device_node *parent) 546 577 { ··· 586 541 } 587 542 588 543 IRQCHIP_PLATFORM_DRIVER_BEGIN(rzv2h_icu) 544 + IRQCHIP_MATCH("renesas,r9a09g047-icu", rzg3e_icu_init) 589 545 IRQCHIP_MATCH("renesas,r9a09g057-icu", rzv2h_icu_init) 590 546 IRQCHIP_PLATFORM_DRIVER_END(rzv2h_icu) 591 547 MODULE_AUTHOR("Fabrizio Castro <fabrizio.castro.jz@renesas.com>");