struct at_xdmac_desc            *desc;
        struct dma_async_tx_descriptor  *txd;
 
-       if (!list_empty(&atchan->xfers_list)) {
-               desc = list_first_entry(&atchan->xfers_list,
-                                       struct at_xdmac_desc, xfer_node);
-               txd = &desc->tx_dma_desc;
-
-               if (txd->flags & DMA_PREP_INTERRUPT)
-                       dmaengine_desc_get_callback_invoke(txd, NULL);
+       spin_lock_irq(&atchan->lock);
+       if (list_empty(&atchan->xfers_list)) {
+               spin_unlock_irq(&atchan->lock);
+               return;
        }
+       desc = list_first_entry(&atchan->xfers_list, struct at_xdmac_desc,
+                               xfer_node);
+       spin_unlock_irq(&atchan->lock);
+       txd = &desc->tx_dma_desc;
+       if (txd->flags & DMA_PREP_INTERRUPT)
+               dmaengine_desc_get_callback_invoke(txd, NULL);
 }
 
 static void at_xdmac_handle_error(struct at_xdmac_chan *atchan)