dev_vdbg(chan2dev(chan), "%s\n", __func__);
 
+       pm_runtime_get_sync(dw->dma.dev);
+
        /* ASSERT:  channel is idle */
        if (dma_readl(dw, CH_EN) & dwc->mask) {
+               pm_runtime_put_sync_suspend(dw->dma.dev);
                dev_dbg(chan2dev(chan), "DMA channel not idle?\n");
                return -EIO;
        }
         * We need controller-specific data to set up slave transfers.
         */
        if (chan->private && !dw_dma_filter(chan, chan->private)) {
+               pm_runtime_put_sync_suspend(dw->dma.dev);
                dev_warn(chan2dev(chan), "Wrong controller-specific data\n");
                return -EINVAL;
        }
        if (!dw->in_use)
                do_dw_dma_off(dw);
 
+       pm_runtime_put_sync_suspend(dw->dma.dev);
+
        dev_vdbg(chan2dev(chan), "%s: done\n", __func__);
 }