hw/char/pl011: Extract pl011_write_txdata() from pl011_write()

When implementing FIFO, this code will become more complex.
Start by factoring it out to a new pl011_write_txdata() function.
No functional change intended.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20240719181041.49545-7-philmd@linaro.org>
This commit is contained in:
Philippe Mathieu-Daudé 2023-05-22 10:41:04 +02:00
parent 02b1f7f619
commit bd6051b7cf

View File

@ -221,6 +221,20 @@ static void pl011_loopback_tx(PL011State *s, uint32_t value)
pl011_put_fifo(s, value);
}
static void pl011_write_txdata(PL011State *s, uint8_t data)
{
/* ??? Check if transmitter is enabled. */
/*
* XXX this blocks entire thread. Rewrite to use
* qemu_chr_fe_write and background I/O callbacks
*/
qemu_chr_fe_write_all(&s->chr, &data, 1);
pl011_loopback_tx(s, data);
s->int_level |= INT_TX;
pl011_update(s);
}
static uint64_t pl011_read(void *opaque, hwaddr offset,
unsigned size)
{
@ -388,14 +402,8 @@ static void pl011_write(void *opaque, hwaddr offset,
switch (offset >> 2) {
case 0: /* UARTDR */
/* ??? Check if transmitter is enabled. */
ch = value;
/* XXX this blocks entire thread. Rewrite to use
* qemu_chr_fe_write and background I/O callbacks */
qemu_chr_fe_write_all(&s->chr, &ch, 1);
pl011_loopback_tx(s, ch);
s->int_level |= INT_TX;
pl011_update(s);
pl011_write_txdata(s, ch);
break;
case 1: /* UARTRSR/UARTECR */
s->rsr = 0;