serial: tegra: protect IER against LCR.DLAB
authorAhung Cheng <ahcheng@nvidia.com>
Mon, 12 Aug 2019 11:28:13 +0000 (16:58 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 4 Sep 2019 10:43:54 +0000 (12:43 +0200)
The IER and DLH registers occupy the same address space, selected by
the LCR.DLAB bit. Hence, add port lock to protect IER when LCR.DLAB bit
is set.

Signed-off-by: Ahung Cheng <ahcheng@nvidia.com>
Signed-off-by: Krishna Yarlagadda <kyarlagadda@nvidia.com>
Acked-by: Thierry Reding <treding@nvidia.com>
Link: https://lore.kernel.org/r/1565609303-27000-5-git-send-email-kyarlagadda@nvidia.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/serial-tegra.c

index 83cc8dc..82a8d51 100644 (file)
@@ -294,6 +294,7 @@ static int tegra_set_baudrate(struct tegra_uart_port *tup, unsigned int baud)
        unsigned long rate;
        unsigned int divisor;
        unsigned long lcr;
+       unsigned long flags;
        int ret;
 
        if (tup->current_baud == baud)
@@ -313,6 +314,7 @@ static int tegra_set_baudrate(struct tegra_uart_port *tup, unsigned int baud)
                divisor = DIV_ROUND_CLOSEST(rate, baud * 16);
        }
 
+       spin_lock_irqsave(&tup->uport.lock, flags);
        lcr = tup->lcr_shadow;
        lcr |= UART_LCR_DLAB;
        tegra_uart_write(tup, lcr, UART_LCR);
@@ -325,6 +327,7 @@ static int tegra_set_baudrate(struct tegra_uart_port *tup, unsigned int baud)
 
        /* Dummy read to ensure the write is posted */
        tegra_uart_read(tup, UART_SCR);
+       spin_unlock_irqrestore(&tup->uport.lock, flags);
 
        tup->current_baud = baud;