]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
serial: 8250_mtk: Fix UART_EFR register address
authorAngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Wed, 27 Apr 2022 13:23:26 +0000 (15:23 +0200)
committerStefan Bader <stefan.bader@canonical.com>
Wed, 10 Aug 2022 07:22:17 +0000 (09:22 +0200)
BugLink: https://bugs.launchpad.net/bugs/1980278
commit bb0b197aadd928f52ce6f01f0ee977f0a08cf1be upstream.

On MediaTek SoCs, the UART IP is 16550A compatible, but there are some
specific quirks: we are declaring a register shift of 2, but this is
only valid for the majority of the registers, as there are some that
are out of the standard layout.

Specifically, this driver is using definitions from serial_reg.h, where
we have a UART_EFR register defined as 2: this results in a 0x8 offset,
but there we have the FCR register instead.

The right offset for the EFR register on MediaTek UART is at 0x98,
so, following the decimal definition convention in serial_reg.h and
accounting for the register left shift of two, add and use the correct
register address for this IP, defined as decimal 38, so that the final
calculation results in (0x26 << 2) = 0x98.

Fixes: bdbd0a7f8f03 ("serial: 8250-mtk: modify baudrate setting")
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Cc: stable <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20220427132328.228297-2-angelogioacchino.delregno@collabora.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
drivers/tty/serial/8250/8250_mtk.c

index fb65dc601b2375d755b68001de4e9692a1ac995d..a561aceb73edb625669dce2d427334b6aba95573 100644 (file)
@@ -37,6 +37,7 @@
 #define MTK_UART_IER_RTSI      0x40    /* Enable RTS Modem status interrupt */
 #define MTK_UART_IER_CTSI      0x80    /* Enable CTS Modem status interrupt */
 
+#define MTK_UART_EFR           38      /* I/O: Extended Features Register */
 #define MTK_UART_EFR_EN                0x10    /* Enable enhancement feature */
 #define MTK_UART_EFR_RTS       0x40    /* Enable hardware rx flow control */
 #define MTK_UART_EFR_CTS       0x80    /* Enable hardware tx flow control */
@@ -169,7 +170,7 @@ static void mtk8250_dma_enable(struct uart_8250_port *up)
                   MTK_UART_DMA_EN_RX | MTK_UART_DMA_EN_TX);
 
        serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
-       serial_out(up, UART_EFR, UART_EFR_ECB);
+       serial_out(up, MTK_UART_EFR, UART_EFR_ECB);
        serial_out(up, UART_LCR, lcr);
 
        if (dmaengine_slave_config(dma->rxchan, &dma->rxconf) != 0)
@@ -232,7 +233,7 @@ static void mtk8250_set_flow_ctrl(struct uart_8250_port *up, int mode)
        int lcr = serial_in(up, UART_LCR);
 
        serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
-       serial_out(up, UART_EFR, UART_EFR_ECB);
+       serial_out(up, MTK_UART_EFR, UART_EFR_ECB);
        serial_out(up, UART_LCR, lcr);
        lcr = serial_in(up, UART_LCR);
 
@@ -241,7 +242,7 @@ static void mtk8250_set_flow_ctrl(struct uart_8250_port *up, int mode)
                serial_out(up, MTK_UART_ESCAPE_DAT, MTK_UART_ESCAPE_CHAR);
                serial_out(up, MTK_UART_ESCAPE_EN, 0x00);
                serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
-               serial_out(up, UART_EFR, serial_in(up, UART_EFR) &
+               serial_out(up, MTK_UART_EFR, serial_in(up, MTK_UART_EFR) &
                        (~(MTK_UART_EFR_HW_FC | MTK_UART_EFR_SW_FC_MASK)));
                serial_out(up, UART_LCR, lcr);
                mtk8250_disable_intrs(up, MTK_UART_IER_XOFFI |
@@ -255,8 +256,8 @@ static void mtk8250_set_flow_ctrl(struct uart_8250_port *up, int mode)
                serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
 
                /*enable hw flow control*/
-               serial_out(up, UART_EFR, MTK_UART_EFR_HW_FC |
-                       (serial_in(up, UART_EFR) &
+               serial_out(up, MTK_UART_EFR, MTK_UART_EFR_HW_FC |
+                       (serial_in(up, MTK_UART_EFR) &
                        (~(MTK_UART_EFR_HW_FC | MTK_UART_EFR_SW_FC_MASK))));
 
                serial_out(up, UART_LCR, lcr);
@@ -270,8 +271,8 @@ static void mtk8250_set_flow_ctrl(struct uart_8250_port *up, int mode)
                serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
 
                /*enable sw flow control */
-               serial_out(up, UART_EFR, MTK_UART_EFR_XON1_XOFF1 |
-                       (serial_in(up, UART_EFR) &
+               serial_out(up, MTK_UART_EFR, MTK_UART_EFR_XON1_XOFF1 |
+                       (serial_in(up, MTK_UART_EFR) &
                        (~(MTK_UART_EFR_HW_FC | MTK_UART_EFR_SW_FC_MASK))));
 
                serial_out(up, UART_XON1, START_CHAR(port->state->port.tty));