The RZ SCI/ RZ/A1 SCIF has only 4 interrupts. The fourth interrupt is transmit end interrupt, so shuffle the interrupts to fix the transmit end interrupt handler for these IPs. Fixes: 392fb8df528b ("serial: sh-sci: Use platform_get_irq_optional() for optional interrupts") Suggested-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx> Signed-off-by: Biju Das <biju.das.jz@xxxxxxxxxxxxxx> --- Tested the SCI0 interface on RZ/G2UL by connecting to PMOD USBUART. 39: 0 GICv3 437 Level 1004d000.serial:rx err 40: 12 GICv3 438 Edge 1004d000.serial:rx full 41: 70 GICv3 439 Edge 1004d000.serial:tx empty 42: 18 GICv3 440 Level 1004d000.serial:tx end --- drivers/tty/serial/sh-sci.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index 7bd080720929..9b07b45a6948 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c @@ -31,6 +31,7 @@ #include <linux/ioport.h> #include <linux/ktime.h> #include <linux/major.h> +#include <linux/minmax.h> #include <linux/module.h> #include <linux/mm.h> #include <linux/of.h> @@ -2841,6 +2842,7 @@ static int sci_init_single(struct platform_device *dev, struct uart_port *port = &sci_port->port; const struct resource *res; unsigned int i; + int irq_cnt; int ret; sci_port->cfg = p; @@ -2864,6 +2866,14 @@ static int sci_init_single(struct platform_device *dev, sci_port->irqs[i] = platform_get_irq(dev, i); } + /* + * RZ SCI/ RZ/A1 SCIF has only 4 interrupts. The fourth interrupt + * is transmit end interrupt, so shuffle the interrupts. + */ + irq_cnt = platform_irq_count(dev); + if (irq_cnt == 4) + swap(sci_port->irqs[SCIx_BRI_IRQ], sci_port->irqs[SCIx_TEI_IRQ]); + /* The SCI generates several interrupts. They can be muxed together or * connected to different interrupt lines. In the muxed case only one * interrupt resource is specified as there is only one interrupt ID. -- 2.25.1