tty: serial: uartps: Relocate cdns_uart_tx_empty to facilitate rs485
authorManikanta Guntupalli <manikanta.guntupalli@amd.com>
Tue, 23 Jan 2024 06:16:54 +0000 (11:46 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 28 Jan 2024 03:07:08 +0000 (19:07 -0800)
Relocate cdns_uart_tx_empty function to avoid prototype statement in
rs485 changes.
Update return check with uart_tx_stopped() in cdns_uart_handle_tx().

Signed-off-by: Manikanta Guntupalli <manikanta.guntupalli@amd.com>
Link: https://lore.kernel.org/r/20240123061655.2150946-3-manikanta.guntupalli@amd.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/xilinx_uartps.c

index 920762d7b4a4b2607f6ec9b2b7981af803b65361..765a6e174052ae2aa117486cd74eb33dcaa0776e 100644 (file)
@@ -306,7 +306,22 @@ static void cdns_uart_handle_rx(void *dev_id, unsigned int isrstatus)
 }
 
 /**
- * cdns_uart_handle_tx - Handle the bytes to be Txed.
+ * cdns_uart_tx_empty -  Check whether TX is empty
+ * @port: Handle to the uart port structure
+ *
+ * Return: TIOCSER_TEMT on success, 0 otherwise
+ */
+static unsigned int cdns_uart_tx_empty(struct uart_port *port)
+{
+       unsigned int status;
+
+       status = readl(port->membase + CDNS_UART_SR);
+       status &= (CDNS_UART_SR_TXEMPTY | CDNS_UART_SR_TACTIVE);
+       return (status == CDNS_UART_SR_TXEMPTY) ? TIOCSER_TEMT : 0;
+}
+
+/**
+ * cdns_uart_handle_tx - Handle the bytes to be transmitted.
  * @dev_id: Id of the UART port
  * Return: None
  */
@@ -316,7 +331,8 @@ static void cdns_uart_handle_tx(void *dev_id)
        struct circ_buf *xmit = &port->state->xmit;
        unsigned int numbytes;
 
-       if (uart_circ_empty(xmit)) {
+       if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
+               /* Disable the TX Empty interrupt */
                writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_IDR);
                return;
        }
@@ -587,6 +603,7 @@ static void cdns_uart_start_tx(struct uart_port *port)
        if (uart_circ_empty(&port->state->xmit))
                return;
 
+       /* Clear the TX Empty interrupt */
        writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_ISR);
 
        cdns_uart_handle_tx(port);
@@ -626,21 +643,6 @@ static void cdns_uart_stop_rx(struct uart_port *port)
        writel(regval, port->membase + CDNS_UART_CR);
 }
 
-/**
- * cdns_uart_tx_empty -  Check whether TX is empty
- * @port: Handle to the uart port structure
- *
- * Return: TIOCSER_TEMT on success, 0 otherwise
- */
-static unsigned int cdns_uart_tx_empty(struct uart_port *port)
-{
-       unsigned int status;
-
-       status = readl(port->membase + CDNS_UART_SR) &
-                      (CDNS_UART_SR_TXEMPTY | CDNS_UART_SR_TACTIVE);
-       return (status == CDNS_UART_SR_TXEMPTY) ? TIOCSER_TEMT : 0;
-}
-
 /**
  * cdns_uart_break_ctl - Based on the input ctl we have to start or stop
  *                     transmitting char breaks