mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-03-01 19:58:21 +07:00
Merge branch 'fixes' of git://git.infradead.org/users/vkoul/slave-dma
Pull slave-dmaengine fixes from Vinod Koul: "The first one fixes issue in pl330 to check for DT compatible and the second one fixes omap-dma to start without delay" * 'fixes' of git://git.infradead.org/users/vkoul/slave-dma: dmaengine: omap-dma: Start DMA without delay for cyclic channels DMA: PL330: Add check if device tree compatible
This commit is contained in:
commit
cfb63bafdb
@ -276,12 +276,20 @@ static void omap_dma_issue_pending(struct dma_chan *chan)
|
|||||||
|
|
||||||
spin_lock_irqsave(&c->vc.lock, flags);
|
spin_lock_irqsave(&c->vc.lock, flags);
|
||||||
if (vchan_issue_pending(&c->vc) && !c->desc) {
|
if (vchan_issue_pending(&c->vc) && !c->desc) {
|
||||||
struct omap_dmadev *d = to_omap_dma_dev(chan->device);
|
/*
|
||||||
spin_lock(&d->lock);
|
* c->cyclic is used only by audio and in this case the DMA need
|
||||||
if (list_empty(&c->node))
|
* to be started without delay.
|
||||||
list_add_tail(&c->node, &d->pending);
|
*/
|
||||||
spin_unlock(&d->lock);
|
if (!c->cyclic) {
|
||||||
tasklet_schedule(&d->task);
|
struct omap_dmadev *d = to_omap_dma_dev(chan->device);
|
||||||
|
spin_lock(&d->lock);
|
||||||
|
if (list_empty(&c->node))
|
||||||
|
list_add_tail(&c->node, &d->pending);
|
||||||
|
spin_unlock(&d->lock);
|
||||||
|
tasklet_schedule(&d->task);
|
||||||
|
} else {
|
||||||
|
omap_dma_start_desc(c);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&c->vc.lock, flags);
|
spin_unlock_irqrestore(&c->vc.lock, flags);
|
||||||
}
|
}
|
||||||
|
@ -2882,7 +2882,7 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
|
|||||||
{
|
{
|
||||||
struct dma_pl330_platdata *pdat;
|
struct dma_pl330_platdata *pdat;
|
||||||
struct dma_pl330_dmac *pdmac;
|
struct dma_pl330_dmac *pdmac;
|
||||||
struct dma_pl330_chan *pch;
|
struct dma_pl330_chan *pch, *_p;
|
||||||
struct pl330_info *pi;
|
struct pl330_info *pi;
|
||||||
struct dma_device *pd;
|
struct dma_device *pd;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
@ -2984,7 +2984,16 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
|
|||||||
ret = dma_async_device_register(pd);
|
ret = dma_async_device_register(pd);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&adev->dev, "unable to register DMAC\n");
|
dev_err(&adev->dev, "unable to register DMAC\n");
|
||||||
goto probe_err2;
|
goto probe_err3;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (adev->dev.of_node) {
|
||||||
|
ret = of_dma_controller_register(adev->dev.of_node,
|
||||||
|
of_dma_pl330_xlate, pdmac);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(&adev->dev,
|
||||||
|
"unable to register DMA to the generic DT DMA helpers\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_info(&adev->dev,
|
dev_info(&adev->dev,
|
||||||
@ -2995,16 +3004,21 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
|
|||||||
pi->pcfg.data_bus_width / 8, pi->pcfg.num_chan,
|
pi->pcfg.data_bus_width / 8, pi->pcfg.num_chan,
|
||||||
pi->pcfg.num_peri, pi->pcfg.num_events);
|
pi->pcfg.num_peri, pi->pcfg.num_events);
|
||||||
|
|
||||||
ret = of_dma_controller_register(adev->dev.of_node,
|
|
||||||
of_dma_pl330_xlate, pdmac);
|
|
||||||
if (ret) {
|
|
||||||
dev_err(&adev->dev,
|
|
||||||
"unable to register DMA to the generic DT DMA helpers\n");
|
|
||||||
goto probe_err2;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
probe_err3:
|
||||||
|
amba_set_drvdata(adev, NULL);
|
||||||
|
|
||||||
|
/* Idle the DMAC */
|
||||||
|
list_for_each_entry_safe(pch, _p, &pdmac->ddma.channels,
|
||||||
|
chan.device_node) {
|
||||||
|
|
||||||
|
/* Remove the channel */
|
||||||
|
list_del(&pch->chan.device_node);
|
||||||
|
|
||||||
|
/* Flush the channel */
|
||||||
|
pl330_control(&pch->chan, DMA_TERMINATE_ALL, 0);
|
||||||
|
pl330_free_chan_resources(&pch->chan);
|
||||||
|
}
|
||||||
probe_err2:
|
probe_err2:
|
||||||
pl330_del(pi);
|
pl330_del(pi);
|
||||||
probe_err1:
|
probe_err1:
|
||||||
@ -3023,8 +3037,10 @@ static int pl330_remove(struct amba_device *adev)
|
|||||||
if (!pdmac)
|
if (!pdmac)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
of_dma_controller_free(adev->dev.of_node);
|
if (adev->dev.of_node)
|
||||||
|
of_dma_controller_free(adev->dev.of_node);
|
||||||
|
|
||||||
|
dma_async_device_unregister(&pdmac->ddma);
|
||||||
amba_set_drvdata(adev, NULL);
|
amba_set_drvdata(adev, NULL);
|
||||||
|
|
||||||
/* Idle the DMAC */
|
/* Idle the DMAC */
|
||||||
|
Loading…
Reference in New Issue
Block a user