diff options
Diffstat (limited to 'drivers/tty')
-rw-r--r-- | drivers/tty/serial/tegra_hsuart.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/tty/serial/tegra_hsuart.c b/drivers/tty/serial/tegra_hsuart.c index 277361698d08..ab41cc5db9e6 100644 --- a/drivers/tty/serial/tegra_hsuart.c +++ b/drivers/tty/serial/tegra_hsuart.c @@ -90,6 +90,8 @@ const int dma_req_sel[] = { #define TEGRA_UART_TX_TRIG_4B 0x20 #define TEGRA_UART_TX_TRIG_1B 0x30 +#define TX_EMPTY_TIMEOUT_CNT 5000 + struct tegra_uart_port { struct uart_port uport; char port_name[32]; @@ -621,12 +623,19 @@ static void tegra_stop_rx(struct uart_port *u) static void tegra_uart_hw_deinit(struct tegra_uart_port *t) { unsigned long flags; + int retry = 0; /* Disable interrupts */ uart_writeb(t, 0, UART_IER); - while ((uart_readb(t, UART_LSR) & UART_LSR_TEMT) != UART_LSR_TEMT); + while ((uart_readb(t, UART_LSR) & UART_LSR_TEMT) != UART_LSR_TEMT) { udelay(200); + if (retry++ > TX_EMPTY_TIMEOUT_CNT) { + dev_err(t->uport.dev, "%s: Tx Empty timeout! (%d)\n", + __func__, TX_EMPTY_TIMEOUT_CNT); + break; + } + } spin_lock_irqsave(&t->uport.lock, flags); |