tty: serial: fsl_lpuart: make rx_watermark configurable for different platforms
authorSherry Sun <sherry.sun@nxp.com>
Mon, 30 Jan 2023 06:44:44 +0000 (14:44 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 28 Jun 2023 09:12:17 +0000 (11:12 +0200)
[ Upstream commit 34ebb26f12a84b744f43c5c4869516f122a2dfaa ]

Add rx_watermark parameter for struct lpuart_port to make the receive
watermark configurable for different platforms.
No function changed.

Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
Link: https://lore.kernel.org/r/20230130064449.9564-2-sherry.sun@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Stable-dep-of: a82c3df955f8 ("tty: serial: fsl_lpuart: reduce RX watermark to 0 on LS1028A")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/tty/serial/fsl_lpuart.c

index dc7ac1d..82066f1 100644 (file)
@@ -257,6 +257,7 @@ struct lpuart_port {
        unsigned int            txfifo_size;
        unsigned int            rxfifo_size;
 
+       u8                      rx_watermark;
        bool                    lpuart_dma_tx_use;
        bool                    lpuart_dma_rx_use;
        struct dma_chan         *dma_tx_chan;
@@ -283,38 +284,45 @@ struct lpuart_soc_data {
        enum lpuart_type devtype;
        char iotype;
        u8 reg_off;
+       u8 rx_watermark;
 };
 
 static const struct lpuart_soc_data vf_data = {
        .devtype = VF610_LPUART,
        .iotype = UPIO_MEM,
+       .rx_watermark = 1,
 };
 
 static const struct lpuart_soc_data ls1021a_data = {
        .devtype = LS1021A_LPUART,
        .iotype = UPIO_MEM32BE,
+       .rx_watermark = 1,
 };
 
 static const struct lpuart_soc_data ls1028a_data = {
        .devtype = LS1028A_LPUART,
        .iotype = UPIO_MEM32,
+       .rx_watermark = 1,
 };
 
 static struct lpuart_soc_data imx7ulp_data = {
        .devtype = IMX7ULP_LPUART,
        .iotype = UPIO_MEM32,
        .reg_off = IMX_REG_OFF,
+       .rx_watermark = 1,
 };
 
 static struct lpuart_soc_data imx8qxp_data = {
        .devtype = IMX8QXP_LPUART,
        .iotype = UPIO_MEM32,
        .reg_off = IMX_REG_OFF,
+       .rx_watermark = 1,
 };
 static struct lpuart_soc_data imxrt1050_data = {
        .devtype = IMXRT1050_LPUART,
        .iotype = UPIO_MEM32,
        .reg_off = IMX_REG_OFF,
+       .rx_watermark = 1,
 };
 
 static const struct of_device_id lpuart_dt_ids[] = {
@@ -1533,7 +1541,7 @@ static void lpuart_setup_watermark(struct lpuart_port *sport)
        }
 
        writeb(0, sport->port.membase + UARTTWFIFO);
-       writeb(1, sport->port.membase + UARTRWFIFO);
+       writeb(sport->rx_watermark, sport->port.membase + UARTRWFIFO);
 
        /* Restore cr2 */
        writeb(cr2_saved, sport->port.membase + UARTCR2);
@@ -1568,7 +1576,8 @@ static void lpuart32_setup_watermark(struct lpuart_port *sport)
        lpuart32_write(&sport->port, val, UARTFIFO);
 
        /* set the watermark */
-       val = (0x1 << UARTWATER_RXWATER_OFF) | (0x0 << UARTWATER_TXWATER_OFF);
+       val = (sport->rx_watermark << UARTWATER_RXWATER_OFF) |
+             (0x0 << UARTWATER_TXWATER_OFF);
        lpuart32_write(&sport->port, val, UARTWATER);
 
        /* Restore cr2 */
@@ -2714,6 +2723,7 @@ static int lpuart_probe(struct platform_device *pdev)
        sport->port.dev = &pdev->dev;
        sport->port.type = PORT_LPUART;
        sport->devtype = sdata->devtype;
+       sport->rx_watermark = sdata->rx_watermark;
        ret = platform_get_irq(pdev, 0);
        if (ret < 0)
                return ret;