dma_addr_t bd0_phys;
bool bd0_iram;
struct sdma_buffer_descriptor *bd0;
+ bool suspend_off;
};
static struct sdma_driver_data sdma_imx31 = {
if (!(sdmac->flags & IMX_DMA_SG_LOOP))
return -EINVAL;
+ /*
+ * restore back context since context may loss if mega/fast OFF
+ */
+ if (sdma->suspend_off) {
+ if (sdma_load_context(sdmac)) {
+ dev_err(sdmac->sdma->dev, "context load failed.\n");
+ return -EINVAL;
+ }
+ }
+
sdma_enable_channel(sdmac->sdma, sdmac->channel);
spin_lock_irqsave(&sdmac->vc.lock, flags);
sdmac->status = DMA_IN_PROGRESS;
struct sdma_engine *sdma = platform_get_drvdata(pdev);
int i, ret = 0;
+ sdma->suspend_off = false;
+
/* Do nothing if not i.MX6SX or i.MX7D*/
if (sdma->drvdata != &sdma_imx6sx && sdma->drvdata != &sdma_imx7d
&& sdma->drvdata != &sdma_imx6ul)
clk_disable(sdma->clk_ahb);
return 0;
}
+
+ sdma->suspend_off = true;
+
/* restore regs and load firmware */
for (i = 0; i < MXC_SDMA_SAVED_REG_NUM; i++) {
/*