|
@@ -1650,12 +1650,24 @@ static int atmel_startup(struct uart_port *port)
|
|
|
static void atmel_shutdown(struct uart_port *port)
|
|
|
{
|
|
|
struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
|
|
|
+
|
|
|
/*
|
|
|
- * Ensure everything is stopped.
|
|
|
+ * Clear out any scheduled tasklets before
|
|
|
+ * we destroy the buffers
|
|
|
+ */
|
|
|
+ tasklet_kill(&atmel_port->tasklet);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Ensure everything is stopped and
|
|
|
+ * disable all interrupts, port and break condition.
|
|
|
*/
|
|
|
atmel_stop_rx(port);
|
|
|
atmel_stop_tx(port);
|
|
|
|
|
|
+ UART_PUT_CR(port, ATMEL_US_RSTSTA);
|
|
|
+ UART_PUT_IDR(port, -1);
|
|
|
+
|
|
|
+
|
|
|
/*
|
|
|
* Shut-down the DMA.
|
|
|
*/
|
|
@@ -1664,12 +1676,6 @@ static void atmel_shutdown(struct uart_port *port)
|
|
|
if (atmel_port->release_tx)
|
|
|
atmel_port->release_tx(port);
|
|
|
|
|
|
- /*
|
|
|
- * Disable all interrupts, port and break condition.
|
|
|
- */
|
|
|
- UART_PUT_CR(port, ATMEL_US_RSTSTA);
|
|
|
- UART_PUT_IDR(port, -1);
|
|
|
-
|
|
|
/*
|
|
|
* Free the interrupt
|
|
|
*/
|