|
115 | 115 | /* RX FIFO occupancy indicator */
|
116 | 116 | #define UART_OMAP_RX_LVL 0x19
|
117 | 117 |
|
| 118 | +/* Timeout low and High */ |
| 119 | +#define UART_OMAP_TO_L 0x26 |
| 120 | +#define UART_OMAP_TO_H 0x27 |
| 121 | + |
118 | 122 | /*
|
119 | 123 | * Copy of the genpd flags for the console.
|
120 | 124 | * Only used if console suspend is disabled
|
@@ -663,13 +667,24 @@ static irqreturn_t omap8250_irq(int irq, void *dev_id)
|
663 | 667 |
|
664 | 668 | /*
|
665 | 669 | * On K3 SoCs, it is observed that RX TIMEOUT is signalled after
|
666 |
| - * FIFO has been drained, in which case a dummy read of RX FIFO |
667 |
| - * is required to clear RX TIMEOUT condition. |
| 670 | + * FIFO has been drained or erroneously. |
| 671 | + * So apply solution of Errata i2310 as mentioned in |
| 672 | + * https://www.ti.com/lit/pdf/sprz536 |
668 | 673 | */
|
669 | 674 | if (priv->habit & UART_RX_TIMEOUT_QUIRK &&
|
670 |
| - (iir & UART_IIR_RX_TIMEOUT) == UART_IIR_RX_TIMEOUT && |
671 |
| - serial_port_in(port, UART_OMAP_RX_LVL) == 0) { |
672 |
| - serial_port_in(port, UART_RX); |
| 675 | + (iir & UART_IIR_RX_TIMEOUT) == UART_IIR_RX_TIMEOUT) { |
| 676 | + unsigned char efr2, timeout_h, timeout_l; |
| 677 | + |
| 678 | + efr2 = serial_in(up, UART_OMAP_EFR2); |
| 679 | + timeout_h = serial_in(up, UART_OMAP_TO_H); |
| 680 | + timeout_l = serial_in(up, UART_OMAP_TO_L); |
| 681 | + serial_out(up, UART_OMAP_TO_H, 0xFF); |
| 682 | + serial_out(up, UART_OMAP_TO_L, 0xFF); |
| 683 | + serial_out(up, UART_OMAP_EFR2, UART_OMAP_EFR2_TIMEOUT_BEHAVE); |
| 684 | + serial_in(up, UART_IIR); |
| 685 | + serial_out(up, UART_OMAP_EFR2, efr2); |
| 686 | + serial_out(up, UART_OMAP_TO_H, timeout_h); |
| 687 | + serial_out(up, UART_OMAP_TO_L, timeout_l); |
673 | 688 | }
|
674 | 689 |
|
675 | 690 | /* Stop processing interrupts on input overrun */
|
|
0 commit comments