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);
 
                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);
        }
        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);
        }