{
        enum dma_data_direction dir;
 
+       if (!host->dma_on)
+               return false;
+
        if (!host->data)
                return false;
 
        if (dir == DMA_FROM_DEVICE)
                clear_bit(SDHI_INTERNAL_DMAC_RX_IN_USE, &global_flags);
 
+       host->dma_on = false;
+
        return true;
 }
 
        spin_unlock_irq(&host->lock);
 }
 
+static void renesas_sdhi_internal_dmac_end_dma(struct tmio_mmc_host *host)
+{
+       if (host->data)
+               renesas_sdhi_internal_dmac_complete(host);
+}
+
 static void
 renesas_sdhi_internal_dmac_request_dma(struct tmio_mmc_host *host,
                                       struct tmio_mmc_data *pdata)
        .release = renesas_sdhi_internal_dmac_release_dma,
        .abort = renesas_sdhi_internal_dmac_abort_dma,
        .dataend = renesas_sdhi_internal_dmac_dataend_dma,
+       .end = renesas_sdhi_internal_dmac_end_dma,
 };
 
 /*