tty: serial: qcom-geni-serial: split out the FIFO tx code
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Thu, 29 Dec 2022 15:50:25 +0000 (16:50 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 19 Jan 2023 14:08:25 +0000 (15:08 +0100)
qcom_geni_serial_handle_tx() is pretty big, let's move the code that
handles the actual writing of data to a separate function which makes
sense in preparation for introducing a dma variant of handle_tx().

Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Link: https://lore.kernel.org/r/20221229155030.418800-10-brgl@bgdev.pl
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/qcom_geni_serial.c

index e34fe56247d98d33a9c63d5d489ea5d6eddec8d9..bd91a6a5ad373cce2a4f73833f6262ed04b7311c 100644 (file)
@@ -704,19 +704,48 @@ static void qcom_geni_serial_start_rx(struct uart_port *uport)
        writel(irq_en, uport->membase + SE_GENI_M_IRQ_EN);
 }
 
+static int qcom_geni_serial_send_chunk_fifo(struct uart_port *uport,
+                                           unsigned int chunk)
+{
+       struct qcom_geni_serial_port *port = to_dev_port(uport);
+       struct circ_buf *xmit = &uport->state->xmit;
+       size_t remaining = chunk;
+       int i, tail = xmit->tail;
+
+       for (i = 0; i < chunk; ) {
+               unsigned int tx_bytes;
+               u8 buf[sizeof(u32)];
+               int c;
+
+               memset(buf, 0, sizeof(buf));
+               tx_bytes = min_t(size_t, remaining, BYTES_PER_FIFO_WORD);
+
+               for (c = 0; c < tx_bytes ; c++) {
+                       buf[c] = xmit->buf[tail++];
+                       tail &= UART_XMIT_SIZE - 1;
+               }
+
+               iowrite32_rep(uport->membase + SE_GENI_TX_FIFOn, buf, 1);
+
+               i += tx_bytes;
+               uport->icount.tx += tx_bytes;
+               remaining -= tx_bytes;
+               port->tx_remaining -= tx_bytes;
+       }
+
+       return tail;
+}
+
 static void qcom_geni_serial_handle_tx(struct uart_port *uport, bool done,
                bool active)
 {
        struct qcom_geni_serial_port *port = to_dev_port(uport);
        struct circ_buf *xmit = &uport->state->xmit;
        size_t avail;
-       size_t remaining;
        size_t pending;
-       int i;
        u32 status;
        u32 irq_en;
        unsigned int chunk;
-       int tail;
 
        status = readl(uport->membase + SE_GENI_TX_FIFO_STATUS);
 
@@ -735,7 +764,6 @@ static void qcom_geni_serial_handle_tx(struct uart_port *uport, bool done,
        avail = port->tx_fifo_depth - (status & TX_FIFO_WC);
        avail *= BYTES_PER_FIFO_WORD;
 
-       tail = xmit->tail;
        chunk = min(avail, pending);
        if (!chunk)
                goto out_write_wakeup;
@@ -750,29 +778,7 @@ static void qcom_geni_serial_handle_tx(struct uart_port *uport, bool done,
                                        uport->membase + SE_GENI_M_IRQ_EN);
        }
 
-       remaining = chunk;
-       for (i = 0; i < chunk; ) {
-               unsigned int tx_bytes;
-               u8 buf[sizeof(u32)];
-               int c;
-
-               memset(buf, 0, sizeof(buf));
-               tx_bytes = min_t(size_t, remaining, BYTES_PER_FIFO_WORD);
-
-               for (c = 0; c < tx_bytes ; c++) {
-                       buf[c] = xmit->buf[tail++];
-                       tail &= UART_XMIT_SIZE - 1;
-               }
-
-               iowrite32_rep(uport->membase + SE_GENI_TX_FIFOn, buf, 1);
-
-               i += tx_bytes;
-               uport->icount.tx += tx_bytes;
-               remaining -= tx_bytes;
-               port->tx_remaining -= tx_bytes;
-       }
-
-       xmit->tail = tail;
+       xmit->tail = qcom_geni_serial_send_chunk_fifo(uport, chunk);
 
        /*
         * The tx fifo watermark is level triggered and latched. Though we had