diff --git a/libplatsupport/src/plat/fvp/serial.c b/libplatsupport/src/plat/fvp/serial.c index 29a122a41..e70c8da21 100644 --- a/libplatsupport/src/plat/fvp/serial.c +++ b/libplatsupport/src/plat/fvp/serial.c @@ -34,13 +34,15 @@ int uart_getchar(ps_chardevice_t *d) int uart_putchar(ps_chardevice_t *d, int c) { - while ((*REG_PTR(d->vaddr, UARTFR) & PL011_UARTFR_TXFF) != 0); - - *REG_PTR(d->vaddr, UARTDR) = c; if (c == '\n' && (d->flags & SERIAL_AUTO_CR)) { uart_putchar(d, '\r'); } + while ((*REG_PTR(d->vaddr, UARTFR) & PL011_UARTFR_TXFF) != 0) { + /* busy loop */ + } + *REG_PTR(d->vaddr, UARTDR) = c; + return c; } diff --git a/libplatsupport/src/plat/hikey/serial.c b/libplatsupport/src/plat/hikey/serial.c index 6518cf511..99d6619ab 100644 --- a/libplatsupport/src/plat/hikey/serial.c +++ b/libplatsupport/src/plat/hikey/serial.c @@ -31,13 +31,15 @@ int uart_getchar(ps_chardevice_t *d) int uart_putchar(ps_chardevice_t *d, int c) { - while ((*REG_PTR(d->vaddr, UARTFR) & PL011_UARTFR_TXFF) != 0); - - *REG_PTR(d->vaddr, UARTDR) = c; if (c == '\n' && (d->flags & SERIAL_AUTO_CR)) { uart_putchar(d, '\r'); } + while ((*REG_PTR(d->vaddr, UARTFR) & PL011_UARTFR_TXFF) != 0) { + /* busy loop */ + } + *REG_PTR(d->vaddr, UARTDR) = c; + return c; } diff --git a/libplatsupport/src/plat/qemu-arm-virt/serial.c b/libplatsupport/src/plat/qemu-arm-virt/serial.c index 47b665e16..a18914d02 100644 --- a/libplatsupport/src/plat/qemu-arm-virt/serial.c +++ b/libplatsupport/src/plat/qemu-arm-virt/serial.c @@ -34,13 +34,15 @@ int uart_getchar(ps_chardevice_t *d) int uart_putchar(ps_chardevice_t *d, int c) { - while ((*REG_PTR(d->vaddr, UARTFR) & PL011_UARTFR_TXFF) != 0); - - *REG_PTR(d->vaddr, UARTDR) = c; if (c == '\n' && (d->flags & SERIAL_AUTO_CR)) { uart_putchar(d, '\r'); } + while ((*REG_PTR(d->vaddr, UARTFR) & PL011_UARTFR_TXFF) != 0) + /* busy loop */ + } + *REG_PTR(d->vaddr, UARTDR) = c; + return c; }