From: Michael Walle <mich...@walle.cc>

commit c2f448cff22a7ed09281f02bde084b0ce3bc61ed upstream.

The LS1028A uses little endian register access and has a different FIFO
size encoding.

Signed-off-by: Michael Walle <mich...@walle.cc>
Link: https://lore.kernel.org/r/20200306214433.23215-4-mich...@walle.cc
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 drivers/tty/serial/fsl_lpuart.c |   27 +++++++++++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

--- a/drivers/tty/serial/fsl_lpuart.c
+++ b/drivers/tty/serial/fsl_lpuart.c
@@ -238,6 +238,7 @@ static DEFINE_IDA(fsl_lpuart_ida);
 enum lpuart_type {
        VF610_LPUART,
        LS1021A_LPUART,
+       LS1028A_LPUART,
        IMX7ULP_LPUART,
        IMX8QXP_LPUART,
 };
@@ -282,11 +283,16 @@ static const struct lpuart_soc_data vf_d
        .iotype = UPIO_MEM,
 };
 
-static const struct lpuart_soc_data ls_data = {
+static const struct lpuart_soc_data ls1021a_data = {
        .devtype = LS1021A_LPUART,
        .iotype = UPIO_MEM32BE,
 };
 
+static const struct lpuart_soc_data ls1028a_data = {
+       .devtype = LS1028A_LPUART,
+       .iotype = UPIO_MEM32,
+};
+
 static struct lpuart_soc_data imx7ulp_data = {
        .devtype = IMX7ULP_LPUART,
        .iotype = UPIO_MEM32,
@@ -301,7 +307,8 @@ static struct lpuart_soc_data imx8qxp_da
 
 static const struct of_device_id lpuart_dt_ids[] = {
        { .compatible = "fsl,vf610-lpuart",     .data = &vf_data, },
-       { .compatible = "fsl,ls1021a-lpuart",   .data = &ls_data, },
+       { .compatible = "fsl,ls1021a-lpuart",   .data = &ls1021a_data, },
+       { .compatible = "fsl,ls1028a-lpuart",   .data = &ls1028a_data, },
        { .compatible = "fsl,imx7ulp-lpuart",   .data = &imx7ulp_data, },
        { .compatible = "fsl,imx8qxp-lpuart",   .data = &imx8qxp_data, },
        { /* sentinel */ }
@@ -311,6 +318,11 @@ MODULE_DEVICE_TABLE(of, lpuart_dt_ids);
 /* Forward declare this for the dma callbacks*/
 static void lpuart_dma_tx_complete(void *arg);
 
+static inline bool is_ls1028a_lpuart(struct lpuart_port *sport)
+{
+       return sport->devtype == LS1028A_LPUART;
+}
+
 static inline bool is_imx8qxp_lpuart(struct lpuart_port *sport)
 {
        return sport->devtype == IMX8QXP_LPUART;
@@ -1553,6 +1565,17 @@ static int lpuart32_startup(struct uart_
        sport->rxfifo_size = UARTFIFO_DEPTH((temp >> UARTFIFO_RXSIZE_OFF) &
                                            UARTFIFO_FIFOSIZE_MASK);
 
+       /*
+        * The LS1028A has a fixed length of 16 words. Although it supports the
+        * RX/TXSIZE fields their encoding is different. Eg the reference manual
+        * states 0b101 is 16 words.
+        */
+       if (is_ls1028a_lpuart(sport)) {
+               sport->rxfifo_size = 16;
+               sport->txfifo_size = 16;
+               sport->port.fifosize = sport->txfifo_size;
+       }
+
        spin_lock_irqsave(&sport->port.lock, flags);
 
        lpuart32_setup_watermark_enable(sport);


Reply via email to