diff options
Diffstat (limited to 'drivers/serial/serial_sifive.c')
-rw-r--r-- | drivers/serial/serial_sifive.c | 23 |
1 files changed, 7 insertions, 16 deletions
diff --git a/drivers/serial/serial_sifive.c b/drivers/serial/serial_sifive.c index fdfef69aaa..c142ccdf3d 100644 --- a/drivers/serial/serial_sifive.c +++ b/drivers/serial/serial_sifive.c @@ -22,6 +22,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 +37,6 @@ struct uart_sifive { struct sifive_uart_platdata { unsigned long clock; - int saved_input_char; struct uart_sifive *regs; }; @@ -94,7 +96,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 +135,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 +146,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 +166,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(®s->ip) & UART_IP_RXWM); + else return !!(readl(®s->txfifo) & UART_TXFIFO_FULL); - } } static int sifive_serial_ofdata_to_platdata(struct udevice *dev) |