serial: a3720: Implement pending method for output direction
authorPali Rohár <pali@kernel.org>
Thu, 14 Jan 2021 14:46:35 +0000 (15:46 +0100)
committerStefan Roese <sr@denx.de>
Wed, 27 Jan 2021 12:12:51 +0000 (13:12 +0100)
To check if some output characters are waiting either in Transmitter
Holding Register or Transmitter Shift Register we need to look at
TX_EMPTY bit of UART Status Register.

Signed-off-by: Pali Rohár <pali@kernel.org>
Reviewed-by: Stefan Roese <sr@denx.de>
drivers/serial/serial_mvebu_a3700.c

index 5a1d40e..8f40487 100644 (file)
@@ -23,6 +23,7 @@ struct mvebu_plat {
 #define UART_POSSR_REG         0x14
 
 #define UART_STATUS_RX_RDY     0x10
+#define UART_STATUS_TX_EMPTY   0x40
 #define UART_STATUS_TXFIFO_FULL        0x800
 
 #define UART_CTRL_RXFIFO_RESET 0x4000
@@ -59,8 +60,13 @@ static int mvebu_serial_pending(struct udevice *dev, bool input)
        struct mvebu_plat *plat = dev_get_plat(dev);
        void __iomem *base = plat->base;
 
-       if (readl(base + UART_STATUS_REG) & UART_STATUS_RX_RDY)
-               return 1;
+       if (input) {
+               if (readl(base + UART_STATUS_REG) & UART_STATUS_RX_RDY)
+                       return 1;
+       } else {
+               if (!(readl(base + UART_STATUS_REG) & UART_STATUS_TX_EMPTY))
+                       return 1;
+       }
 
        return 0;
 }