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

tty: serial: fsl_lpuart: correct the FIFO depth size

VF610/LS1021a/i.MX7ULP/i.MX8QXP reference manual describe the
TXFIFOSIZE/RXFIFOSIZE field as below.

000b - FIFO/Buffer depth = 1 dataword.
001b - FIFO/Buffer depth = 4 datawords.
010b - FIFO/Buffer depth = 8 datawords.
011b - FIFO/Buffer depth = 16 datawords.
100b - FIFO/Buffer depth = 32 datawords.
101b - FIFO/Buffer depth = 64 datawords.
110b - FIFO/Buffer depth = 128 datawords.
111b - FIFO/Buffer depth = 256 datawords. (Reserved for VF610)

So the FIFO depth should be: 0x1 << (val ? (val + 1) : 0)

Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
Link: https://lore.kernel.org/r/20190717051930.15514-6-fugang.duan@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Fugang Duan and committed by
Greg Kroah-Hartman
f77ebb24 638341d5

+9 -10
+9 -10
drivers/tty/serial/fsl_lpuart.c
··· 214 214 #define UARTFIFO_TXSIZE_OFF 4 215 215 #define UARTFIFO_RXFE 0x00000008 216 216 #define UARTFIFO_RXSIZE_OFF 0 217 + #define UARTFIFO_DEPTH(x) (0x1 << ((x) ? ((x) + 1) : 0)) 217 218 218 219 #define UARTWATER_COUNT_MASK 0xff 219 220 #define UARTWATER_TXCNT_OFF 8 ··· 1381 1380 /* determine FIFO size and enable FIFO mode */ 1382 1381 temp = readb(sport->port.membase + UARTPFIFO); 1383 1382 1384 - sport->txfifo_size = 0x1 << (((temp >> UARTPFIFO_TXSIZE_OFF) & 1385 - UARTPFIFO_FIFOSIZE_MASK) + 1); 1386 - 1383 + sport->txfifo_size = UARTFIFO_DEPTH((temp >> UARTPFIFO_TXSIZE_OFF) & 1384 + UARTPFIFO_FIFOSIZE_MASK); 1387 1385 sport->port.fifosize = sport->txfifo_size; 1388 1386 1389 - sport->rxfifo_size = 0x1 << (((temp >> UARTPFIFO_RXSIZE_OFF) & 1390 - UARTPFIFO_FIFOSIZE_MASK) + 1); 1387 + sport->rxfifo_size = UARTFIFO_DEPTH((temp >> UARTPFIFO_RXSIZE_OFF) & 1388 + UARTPFIFO_FIFOSIZE_MASK); 1391 1389 1392 1390 spin_lock_irqsave(&sport->port.lock, flags); 1393 1391 ··· 1431 1431 /* determine FIFO size */ 1432 1432 temp = lpuart32_read(&sport->port, UARTFIFO); 1433 1433 1434 - sport->txfifo_size = 0x1 << (((temp >> UARTFIFO_TXSIZE_OFF) & 1435 - UARTFIFO_FIFOSIZE_MASK) - 1); 1436 - 1434 + sport->txfifo_size = UARTFIFO_DEPTH((temp >> UARTFIFO_TXSIZE_OFF) & 1435 + UARTFIFO_FIFOSIZE_MASK); 1437 1436 sport->port.fifosize = sport->txfifo_size; 1438 1437 1439 - sport->rxfifo_size = 0x1 << (((temp >> UARTFIFO_RXSIZE_OFF) & 1440 - UARTFIFO_FIFOSIZE_MASK) - 1); 1438 + sport->rxfifo_size = UARTFIFO_DEPTH((temp >> UARTFIFO_RXSIZE_OFF) & 1439 + UARTFIFO_FIFOSIZE_MASK); 1441 1440 1442 1441 spin_lock_irqsave(&sport->port.lock, flags); 1443 1442