Merge branch 'topic/edma' into for-linus
This commit is contained in:
Коммит
9f2f4956ed
|
@ -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(
|
||||||
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);
|
||||||
|
echan->edesc = NULL;
|
||||||
|
|
||||||
dev_dbg(dev, "Transfer completed on channel %d\n",
|
dev_dbg(dev, "Transfer completed on channel %d\n",
|
||||||
echan->ch_num);
|
echan->ch_num);
|
||||||
} else {
|
} else {
|
||||||
dev_dbg(dev, "Sub transfer completed on channel %d\n",
|
dev_dbg(dev, "Sub transfer completed on channel %d\n",
|
||||||
echan->ch_num);
|
echan->ch_num);
|
||||||
|
|
||||||
edma_pause(echan);
|
edma_pause(echan);
|
||||||
|
|
||||||
/* Update statistics for tx_status */
|
/* Update statistics for tx_status */
|
||||||
edesc->residue -= edesc->sg_len;
|
edesc->residue -= edesc->sg_len;
|
||||||
edesc->residue_stat = edesc->residue;
|
edesc->residue_stat = edesc->residue;
|
||||||
edesc->processed_stat = edesc->processed;
|
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)
|
||||||
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)
|
||||||
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;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче