summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Agner <stefan@agner.ch>2014-10-21 17:36:41 +0200
committerStefan Agner <stefan@agner.ch>2014-10-31 13:34:57 +0100
commitfb0dc728d38626f44a54acdc90a7bf92cfb9bf50 (patch)
tree5cfc1d81069fcecbea2ad84a83c05c6e4eff446a
parent2994d87d4bb9821cd10a47c613eabe1d739a9b05 (diff)
serial: fsl_lpuart: delete timer on shutdown
If we close the serial port while a RX transfer is in progress, the timer might fire after the serial port shutdown finished. Setup the timer on UART startup which allows to delete the timer unconditionally on shutdown. This also saves the initialization on each transfer too.
-rw-r--r--drivers/tty/serial/fsl_lpuart.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
index 6dd53af546a3..b1905a93fac9 100644
--- a/drivers/tty/serial/fsl_lpuart.c
+++ b/drivers/tty/serial/fsl_lpuart.c
@@ -506,9 +506,6 @@ static inline void lpuart_prepare_rx(struct lpuart_port *sport)
spin_lock_irqsave(&sport->port.lock, flags);
- init_timer(&sport->lpuart_timer);
- sport->lpuart_timer.function = lpuart_timer_func;
- sport->lpuart_timer.data = (unsigned long)sport;
sport->lpuart_timer.expires = jiffies + sport->dma_rx_timeout;
add_timer(&sport->lpuart_timer);
@@ -1106,6 +1103,8 @@ static int lpuart_startup(struct uart_port *port)
sport->lpuart_dma_use = false;
} else {
sport->lpuart_dma_use = true;
+ setup_timer(&sport->lpuart_timer, lpuart_timer_func,
+ (unsigned long)sport);
temp = readb(port->membase + UARTCR5);
writeb(temp | UARTCR5_TDMAS, port->membase + UARTCR5);
}
@@ -1180,6 +1179,8 @@ static void lpuart_shutdown(struct uart_port *port)
devm_free_irq(port->dev, port->irq, sport);
if (sport->lpuart_dma_use) {
+ del_timer_sync(&sport->lpuart_timer);
+
lpuart_dma_tx_free(port);
lpuart_dma_rx_free(port);
}