+Shubhrajyoti On 7/23/21 11:52 PM, Sean Anderson wrote: > This uses read_poll_timeout_atomic to spin while waiting on uart_in32. > > Signed-off-by: Sean Anderson <sean.anderson@xxxxxxxx> > --- > > drivers/tty/serial/uartlite.c | 18 +++++------------- > 1 file changed, 5 insertions(+), 13 deletions(-) > > diff --git a/drivers/tty/serial/uartlite.c b/drivers/tty/serial/uartlite.c > index f42ccc40ffa6..106bbbc86c87 100644 > --- a/drivers/tty/serial/uartlite.c > +++ b/drivers/tty/serial/uartlite.c > @@ -17,6 +17,7 @@ > #include <linux/interrupt.h> > #include <linux/init.h> > #include <linux/io.h> > +#include <linux/iopoll.h> > #include <linux/of.h> > #include <linux/of_address.h> > #include <linux/of_device.h> > @@ -448,24 +449,15 @@ static const struct uart_ops ulite_ops = { > static void ulite_console_wait_tx(struct uart_port *port) > { > u8 val; > - unsigned long timeout; > > /* > * Spin waiting for TX fifo to have space available. > * When using the Microblaze Debug Module this can take up to 1s > */ > - timeout = jiffies + msecs_to_jiffies(1000); > - while (1) { > - val = uart_in32(ULITE_STATUS, port); > - if ((val & ULITE_STATUS_TXFULL) == 0) > - break; > - if (time_after(jiffies, timeout)) { > - dev_warn(port->dev, > - "timeout waiting for TX buffer empty\n"); > - break; > - } > - cpu_relax(); > - } > + if (read_poll_timeout_atomic(uart_in32, val, !(val & ULITE_STATUS_TXFULL), > + 0, 1000000, false, ULITE_STATUS, port)) > + dev_warn(port->dev, > + "timeout waiting for TX buffer empty\n"); > } > > static void ulite_console_putchar(struct uart_port *port, int ch) >