X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=drivers%2Fserial%2Fserial_sifive.c;h=5a02f0c8feb5b5e46b010cee702791716d8055ff;hb=61b29b82683863a970fd4609a7c58512872616bc;hp=fdfef69aaae9132a7a0a662c673c8996512890f2;hpb=f30f268a07b0c9e4418366debc9ad0100a47cea4;p=oweals%2Fu-boot.git diff --git a/drivers/serial/serial_sifive.c b/drivers/serial/serial_sifive.c index fdfef69aaa..5a02f0c8fe 100644 --- a/drivers/serial/serial_sifive.c +++ b/drivers/serial/serial_sifive.c @@ -13,6 +13,7 @@ #include #include #include +#include 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(®s->ip) & UART_IP_RXWM); + else return !!(readl(®s->txfifo) & UART_TXFIFO_FULL); - } } static int sifive_serial_ofdata_to_platdata(struct udevice *dev)