On Mon, 7 Nov 2022 at 17:15, Gabriel Somlo <gsomlo@xxxxxxxxx> wrote: > > Move the character-receive (RX) loop to its own dedicated function, > and (for now) call that from the poll timer, liteuart_timer(). > > This is in preparation for adding IRQ support to the receive path. > > Signed-off-by: Gabriel Somlo <gsomlo@xxxxxxxxx> > --- > drivers/tty/serial/liteuart.c | 25 +++++++++++++++---------- > 1 file changed, 15 insertions(+), 10 deletions(-) > > diff --git a/drivers/tty/serial/liteuart.c b/drivers/tty/serial/liteuart.c > index 4b9cca249828..90a29ed79bff 100644 > --- a/drivers/tty/serial/liteuart.c > +++ b/drivers/tty/serial/liteuart.c > @@ -69,29 +69,34 @@ static struct uart_driver liteuart_driver = { > #endif > }; > > -static void liteuart_timer(struct timer_list *t) > +static void liteuart_rx_chars(struct uart_port *port) > { > - struct liteuart_port *uart = from_timer(uart, t, timer); > - struct uart_port *port = &uart->port; > unsigned char __iomem *membase = port->membase; > - unsigned int flg = TTY_NORMAL; > - int ch; > - unsigned long status; > + unsigned int status; > + unsigned char ch; u32, u8, void __iomem * would be better kernel types to use here. You've also changed ch from a signed 32 to an unsigned 8. > > while ((status = !litex_read8(membase + OFF_RXEMPTY)) == 1) { > ch = litex_read8(membase + OFF_RXTX); > port->icount.rx++; > > /* necessary for RXEMPTY to refresh its value */ > - litex_write8(membase + OFF_EV_PENDING, EV_TX | EV_RX); > + litex_write8(membase + OFF_EV_PENDING, EV_RX); You're no longer clearing EV_TX, but don't mention why (I understand why with the context of the other changes, so perhaps add something to this commit message). > > /* no overflow bits in status */ > if (!(uart_handle_sysrq_char(port, ch))) > - uart_insert_char(port, status, 0, ch, flg); > - > - tty_flip_buffer_push(&port->state->port); > + uart_insert_char(port, status, 0, ch, TTY_NORMAL); > } > > + tty_flip_buffer_push(&port->state->port); > +} > + > +static void liteuart_timer(struct timer_list *t) > +{ > + struct liteuart_port *uart = from_timer(uart, t, timer); > + struct uart_port *port = &uart->port; > + > + liteuart_rx_chars(port); > + > mod_timer(&uart->timer, jiffies + uart_poll_timeout(port)); > } > > -- > 2.37.3 >