Commit 9f2f4956 authored by Vinod Koul's avatar Vinod Koul

Merge branch 'topic/edma' into for-linus

parents 0f4cc16c e4d8817c
...@@ -866,6 +866,13 @@ static int edma_terminate_all(struct dma_chan *chan) ...@@ -866,6 +866,13 @@ static int edma_terminate_all(struct dma_chan *chan)
return 0; return 0;
} }
static void edma_synchronize(struct dma_chan *chan)
{
struct edma_chan *echan = to_edma_chan(chan);
vchan_synchronize(&echan->vchan);
}
static int edma_slave_config(struct dma_chan *chan, static int edma_slave_config(struct dma_chan *chan,
struct dma_slave_config *cfg) struct dma_slave_config *cfg)
{ {
...@@ -1362,36 +1369,36 @@ static struct dma_async_tx_descriptor *edma_prep_dma_cyclic( ...@@ -1362,36 +1369,36 @@ static struct dma_async_tx_descriptor *edma_prep_dma_cyclic(
static void edma_completion_handler(struct edma_chan *echan) static void edma_completion_handler(struct edma_chan *echan)
{ {
struct device *dev = echan->vchan.chan.device->dev; struct device *dev = echan->vchan.chan.device->dev;
struct edma_desc *edesc = echan->edesc; struct edma_desc *edesc;
if (!edesc)
return;
spin_lock(&echan->vchan.lock); spin_lock(&echan->vchan.lock);
if (edesc->cyclic) { edesc = echan->edesc;
vchan_cyclic_callback(&edesc->vdesc); if (edesc) {
spin_unlock(&echan->vchan.lock); if (edesc->cyclic) {
return; vchan_cyclic_callback(&edesc->vdesc);
} else if (edesc->processed == edesc->pset_nr) { spin_unlock(&echan->vchan.lock);
edesc->residue = 0; return;
edma_stop(echan); } else if (edesc->processed == edesc->pset_nr) {
vchan_cookie_complete(&edesc->vdesc); edesc->residue = 0;
echan->edesc = NULL; edma_stop(echan);
vchan_cookie_complete(&edesc->vdesc);
dev_dbg(dev, "Transfer completed on channel %d\n", echan->edesc = NULL;
echan->ch_num);
} else { dev_dbg(dev, "Transfer completed on channel %d\n",
dev_dbg(dev, "Sub transfer completed on channel %d\n", echan->ch_num);
echan->ch_num); } else {
dev_dbg(dev, "Sub transfer completed on channel %d\n",
edma_pause(echan); echan->ch_num);
/* Update statistics for tx_status */ edma_pause(echan);
edesc->residue -= edesc->sg_len;
edesc->residue_stat = edesc->residue; /* Update statistics for tx_status */
edesc->processed_stat = edesc->processed; edesc->residue -= edesc->sg_len;
edesc->residue_stat = edesc->residue;
edesc->processed_stat = edesc->processed;
}
edma_execute(echan);
} }
edma_execute(echan);
spin_unlock(&echan->vchan.lock); spin_unlock(&echan->vchan.lock);
} }
...@@ -1798,6 +1805,7 @@ static void edma_dma_init(struct edma_cc *ecc, bool legacy_mode) ...@@ -1798,6 +1805,7 @@ static void edma_dma_init(struct edma_cc *ecc, bool legacy_mode)
s_ddev->device_pause = edma_dma_pause; s_ddev->device_pause = edma_dma_pause;
s_ddev->device_resume = edma_dma_resume; s_ddev->device_resume = edma_dma_resume;
s_ddev->device_terminate_all = edma_terminate_all; s_ddev->device_terminate_all = edma_terminate_all;
s_ddev->device_synchronize = edma_synchronize;
s_ddev->src_addr_widths = EDMA_DMA_BUSWIDTHS; s_ddev->src_addr_widths = EDMA_DMA_BUSWIDTHS;
s_ddev->dst_addr_widths = EDMA_DMA_BUSWIDTHS; s_ddev->dst_addr_widths = EDMA_DMA_BUSWIDTHS;
...@@ -1823,6 +1831,7 @@ static void edma_dma_init(struct edma_cc *ecc, bool legacy_mode) ...@@ -1823,6 +1831,7 @@ static void edma_dma_init(struct edma_cc *ecc, bool legacy_mode)
m_ddev->device_pause = edma_dma_pause; m_ddev->device_pause = edma_dma_pause;
m_ddev->device_resume = edma_dma_resume; m_ddev->device_resume = edma_dma_resume;
m_ddev->device_terminate_all = edma_terminate_all; m_ddev->device_terminate_all = edma_terminate_all;
m_ddev->device_synchronize = edma_synchronize;
m_ddev->src_addr_widths = EDMA_DMA_BUSWIDTHS; m_ddev->src_addr_widths = EDMA_DMA_BUSWIDTHS;
m_ddev->dst_addr_widths = EDMA_DMA_BUSWIDTHS; m_ddev->dst_addr_widths = EDMA_DMA_BUSWIDTHS;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment