From: Ahung Cheng <ahch...@nvidia.com>

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 <ahch...@nvidia.com>
Signed-off-by: Krishna Yarlagadda <kyarlaga...@nvidia.com>
---
 drivers/tty/serial/serial-tegra.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/tty/serial/serial-tegra.c 
b/drivers/tty/serial/serial-tegra.c
index d908465..ae7225c 100644
--- a/drivers/tty/serial/serial-tegra.c
+++ b/drivers/tty/serial/serial-tegra.c
@@ -296,6 +296,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)
@@ -315,6 +316,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);
@@ -327,6 +329,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;
 
-- 
2.7.4

Reply via email to