serial: atmel: cleanup atmel_start+stop_tx()
authorJiri Slaby (SUSE) <jirislaby@kernel.org>
Wed, 23 Nov 2022 08:27:35 +0000 (09:27 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 23 Nov 2022 08:39:24 +0000 (09:39 +0100)
Define local variables holding information about whether pdc or dma is
used in the HW. These are retested several times by calls to
atmel_use_pdc_tx() and atmel_use_dma_tx(). So to make the code more
readable, simply cache the values.

This is also a preparatory patch for the next one (where is_pdc is used
once more in atmel_stop_tx()).

Cc: Richard Genoud <richard.genoud@gmail.com>
Cc: Nicolas Ferre <nicolas.ferre@microchip.com>
Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>
Cc: Claudiu Beznea <claudiu.beznea@microchip.com>
Cc: linux-arm-kernel@lists.infradead.org
Reported-by: Michael Walle <michael@walle.cc>
Signed-off-by: Jiri Slaby (SUSE) <jirislaby@kernel.org>
Link: https://lore.kernel.org/r/20221123082736.24566-1-jirislaby@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/atmel_serial.c

index 4ca04676c40660846d54407c4557d22f42dcba8a..65f63dccfd728b22452f269324c235cd68bc1732 100644 (file)
@@ -552,8 +552,9 @@ static u_int atmel_get_mctrl(struct uart_port *port)
 static void atmel_stop_tx(struct uart_port *port)
 {
        struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
+       bool is_pdc = atmel_use_pdc_tx(port);
 
-       if (atmel_use_pdc_tx(port)) {
+       if (is_pdc) {
                /* disable PDC transmit */
                atmel_uart_writel(port, ATMEL_PDC_PTCR, ATMEL_PDC_TXTDIS);
        }
@@ -572,7 +573,6 @@ static void atmel_stop_tx(struct uart_port *port)
        if (atmel_uart_is_half_duplex(port))
                if (!atomic_read(&atmel_port->tasklet_shutdown))
                        atmel_start_rx(port);
-
 }
 
 /*
@@ -581,20 +581,22 @@ static void atmel_stop_tx(struct uart_port *port)
 static void atmel_start_tx(struct uart_port *port)
 {
        struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
+       bool is_pdc = atmel_use_pdc_tx(port);
+       bool is_dma = is_pdc || atmel_use_dma_tx(port);
 
-       if (atmel_use_pdc_tx(port) && (atmel_uart_readl(port, ATMEL_PDC_PTSR)
+       if (is_pdc && (atmel_uart_readl(port, ATMEL_PDC_PTSR)
                                       & ATMEL_PDC_TXTEN))
                /* The transmitter is already running.  Yes, we
                   really need this.*/
                return;
 
-       if (atmel_use_pdc_tx(port) || atmel_use_dma_tx(port))
-               if (atmel_uart_is_half_duplex(port))
-                       atmel_stop_rx(port);
+       if (is_dma && atmel_uart_is_half_duplex(port))
+               atmel_stop_rx(port);
 
-       if (atmel_use_pdc_tx(port))
+       if (is_pdc) {
                /* re-enable PDC transmit */
                atmel_uart_writel(port, ATMEL_PDC_PTCR, ATMEL_PDC_TXTEN);
+       }
 
        /* Enable interrupts */
        atmel_uart_writel(port, ATMEL_US_IER, atmel_port->tx_done_mask);