diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/dma/imx-sdma.c | 7 | 
1 files changed, 7 insertions, 0 deletions
| diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c index a2b0a0e71168..015c17a3b826 100644 --- a/drivers/dma/imx-sdma.c +++ b/drivers/dma/imx-sdma.c @@ -377,6 +377,7 @@ struct sdma_channel {  	unsigned long			watermark_level;  	u32				shp_addr, per_addr;  	enum dma_status			status; +	bool				context_loaded;  	struct imx_dma_data		data;  	struct work_struct		terminate_worker;  }; @@ -970,6 +971,9 @@ static int sdma_load_context(struct sdma_channel *sdmac)  	int ret;  	unsigned long flags; +	if (sdmac->context_loaded) +		return 0; +  	if (sdmac->direction == DMA_DEV_TO_MEM)  		load_address = sdmac->pc_from_device;  	else if (sdmac->direction == DMA_DEV_TO_DEV) @@ -1012,6 +1016,8 @@ static int sdma_load_context(struct sdma_channel *sdmac)  	spin_unlock_irqrestore(&sdma->channel_0_lock, flags); +	sdmac->context_loaded = true; +  	return ret;  } @@ -1051,6 +1057,7 @@ static void sdma_channel_terminate_work(struct work_struct *work)  	sdmac->desc = NULL;  	spin_unlock_irqrestore(&sdmac->vc.lock, flags);  	vchan_dma_desc_free_list(&sdmac->vc, &head); +	sdmac->context_loaded = false;  }  static int sdma_disable_channel_async(struct dma_chan *chan) | 
