device_set_wakeup_enable(&pdev->dev, false);
        }
 
-       ret = uart_add_one_port(&stm32_usart_driver, &stm32port->port);
-       if (ret)
-               goto err_wirq;
-
        ret = stm32_usart_of_dma_rx_probe(stm32port, pdev);
        if (ret)
                dev_info(&pdev->dev, "interrupt mode used for rx (no dma)\n");
        pm_runtime_get_noresume(&pdev->dev);
        pm_runtime_set_active(&pdev->dev);
        pm_runtime_enable(&pdev->dev);
+
+       ret = uart_add_one_port(&stm32_usart_driver, &stm32port->port);
+       if (ret)
+               goto err_port;
+
        pm_runtime_put_sync(&pdev->dev);
 
        return 0;
 
-err_wirq:
+err_port:
+       pm_runtime_disable(&pdev->dev);
+       pm_runtime_set_suspended(&pdev->dev);
+       pm_runtime_put_noidle(&pdev->dev);
+
+       if (stm32port->rx_ch) {
+               dmaengine_terminate_async(stm32port->rx_ch);
+               dma_release_channel(stm32port->rx_ch);
+       }
+
+       if (stm32port->rx_dma_buf)
+               dma_free_coherent(&pdev->dev,
+                                 RX_BUF_L, stm32port->rx_buf,
+                                 stm32port->rx_dma_buf);
+
+       if (stm32port->tx_ch) {
+               dmaengine_terminate_async(stm32port->tx_ch);
+               dma_release_channel(stm32port->tx_ch);
+       }
+
+       if (stm32port->tx_dma_buf)
+               dma_free_coherent(&pdev->dev,
+                                 TX_BUF_L, stm32port->tx_buf,
+                                 stm32port->tx_dma_buf);
+
        if (stm32port->wakeirq > 0)
                dev_pm_clear_wake_irq(&pdev->dev);
 
        int err;
 
        pm_runtime_get_sync(&pdev->dev);
+       err = uart_remove_one_port(&stm32_usart_driver, port);
+       if (err)
+               return(err);
+
+       pm_runtime_disable(&pdev->dev);
+       pm_runtime_set_suspended(&pdev->dev);
+       pm_runtime_put_noidle(&pdev->dev);
 
        stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR);
 
-       if (stm32_port->rx_ch)
+       if (stm32_port->rx_ch) {
+               dmaengine_terminate_async(stm32_port->rx_ch);
                dma_release_channel(stm32_port->rx_ch);
+       }
 
        if (stm32_port->rx_dma_buf)
                dma_free_coherent(&pdev->dev,
 
        stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT);
 
-       if (stm32_port->tx_ch)
+       if (stm32_port->tx_ch) {
+               dmaengine_terminate_async(stm32_port->tx_ch);
                dma_release_channel(stm32_port->tx_ch);
+       }
 
        if (stm32_port->tx_dma_buf)
                dma_free_coherent(&pdev->dev,
 
        stm32_usart_deinit_port(stm32_port);
 
-       err = uart_remove_one_port(&stm32_usart_driver, port);
-
-       pm_runtime_disable(&pdev->dev);
-       pm_runtime_put_noidle(&pdev->dev);
-
-       return err;
+       return 0;
 }
 
 #ifdef CONFIG_SERIAL_STM32_CONSOLE