dm: core: Require users of devres to include the header
[oweals/u-boot.git] / drivers / serial / serial_sifive.c
index fdfef69aaae9132a7a0a662c673c8996512890f2..5a02f0c8feb5b5e46b010cee702791716d8055ff 100644 (file)
@@ -13,6 +13,7 @@
 #include <asm/io.h>
 #include <linux/compiler.h>
 #include <serial.h>
+#include <linux/err.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -22,6 +23,9 @@ DECLARE_GLOBAL_DATA_PTR;
 #define UART_TXCTRL_TXEN       0x1
 #define UART_RXCTRL_RXEN       0x1
 
+/* IP register */
+#define UART_IP_RXWM            0x2
+
 struct uart_sifive {
        u32 txfifo;
        u32 rxfifo;
@@ -34,7 +38,6 @@ struct uart_sifive {
 
 struct sifive_uart_platdata {
        unsigned long clock;
-       int saved_input_char;
        struct uart_sifive *regs;
 };
 
@@ -94,7 +97,7 @@ static int _sifive_serial_getc(struct uart_sifive *regs)
                return -EAGAIN;
        ch &= UART_RXFIFO_DATA;
 
-       return (!ch) ? -EAGAIN : ch;
+       return ch;
 }
 
 static int sifive_serial_setbrg(struct udevice *dev, int baudrate)
@@ -133,7 +136,6 @@ static int sifive_serial_probe(struct udevice *dev)
        if (gd->flags & GD_FLG_RELOC)
                return 0;
 
-       platdata->saved_input_char = 0;
        _sifive_serial_init(platdata->regs);
 
        return 0;
@@ -145,12 +147,6 @@ static int sifive_serial_getc(struct udevice *dev)
        struct sifive_uart_platdata *platdata = dev_get_platdata(dev);
        struct uart_sifive *regs = platdata->regs;
 
-       if (platdata->saved_input_char > 0) {
-               c = platdata->saved_input_char;
-               platdata->saved_input_char = 0;
-               return c;
-       }
-
        while ((c = _sifive_serial_getc(regs)) == -EAGAIN) ;
 
        return c;
@@ -171,14 +167,10 @@ static int sifive_serial_pending(struct udevice *dev, bool input)
        struct sifive_uart_platdata *platdata = dev_get_platdata(dev);
        struct uart_sifive *regs = platdata->regs;
 
-       if (input) {
-               if (platdata->saved_input_char > 0)
-                       return 1;
-               platdata->saved_input_char = _sifive_serial_getc(regs);
-               return (platdata->saved_input_char > 0) ? 1 : 0;
-       } else {
+       if (input)
+               return (readl(&regs->ip) & UART_IP_RXWM);
+       else
                return !!(readl(&regs->txfifo) & UART_TXFIFO_FULL);
-       }
 }
 
 static int sifive_serial_ofdata_to_platdata(struct udevice *dev)