mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-22 15:03:53 +02:00
dmaengine: bcm2835-dma: Prevent suspend if DMA channel is busy
bcm2835-dma provides the service to others, so it should suspend late and resume early. Suspend should be prevented in case a DMA channel is still busy. Signed-off-by: Stefan Wahren <wahrenst@gmx.net> Link: https://lore.kernel.org/r/20241204165546.77941-1-wahrenst@gmx.net Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
68811c928f
commit
9602a843cb
|
@ -875,6 +875,27 @@ static struct dma_chan *bcm2835_dma_xlate(struct of_phandle_args *spec,
|
|||
return chan;
|
||||
}
|
||||
|
||||
static int bcm2835_dma_suspend_late(struct device *dev)
|
||||
{
|
||||
struct bcm2835_dmadev *od = dev_get_drvdata(dev);
|
||||
struct bcm2835_chan *c, *next;
|
||||
|
||||
list_for_each_entry_safe(c, next, &od->ddev.channels,
|
||||
vc.chan.device_node) {
|
||||
void __iomem *chan_base = c->chan_base;
|
||||
|
||||
/* Check if DMA channel is busy */
|
||||
if (readl(chan_base + BCM2835_DMA_ADDR))
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops bcm2835_dma_pm_ops = {
|
||||
SET_LATE_SYSTEM_SLEEP_PM_OPS(bcm2835_dma_suspend_late, NULL)
|
||||
};
|
||||
|
||||
static int bcm2835_dma_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct bcm2835_dmadev *od;
|
||||
|
@ -1033,6 +1054,7 @@ static struct platform_driver bcm2835_dma_driver = {
|
|||
.driver = {
|
||||
.name = "bcm2835-dma",
|
||||
.of_match_table = of_match_ptr(bcm2835_dma_of_match),
|
||||
.pm = pm_ptr(&bcm2835_dma_pm_ops),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user