[PATCH v2 24/64] dmaengine: txx9dmac: route callbacks via channel BH
Allen Pais <[email protected]> Mon, 27 Jul 2026 13:28:52 -0700
| Newsgroups | org.kernel.vger.dmaengine,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <8c967b8a3cdc82ba43494ac218ca7c0ae2450993.1785183549.git.allen.lkml@gmail.com> |
Use the per-channel BH helpers for descriptor completion handling and schedule per-channel work from both channel and controller IRQ paths. Signed-off-by: Allen Pais <[email protected]> --- drivers/dma/txx9dmac.c | 12 ++++++------ drivers/dma/txx9dmac.h | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/drivers/dma/txx9dmac.c b/drivers/dma/txx9dmac.c index 05622b68a936..6269baa28c51 100644 --- a/drivers/dma/txx9dmac.c +++ b/drivers/dma/txx9dmac.c @@ -601,13 +601,13 @@ static void txx9dmac_scan_descriptors(struct txx9dmac_chan *dc) } } -static void txx9dmac_chan_tasklet(struct tasklet_struct *t) +static void txx9dmac_chan_tasklet(struct dma_chan *chan) { int irq; u32 csr; struct txx9dmac_chan *dc; - dc = from_tasklet(dc, t, tasklet); + dc = container_of(chan, struct txx9dmac_chan, chan); csr = channel_readl(dc, CSR); dev_vdbg(chan2dev(&dc->chan), "tasklet: status=%x\n", csr); @@ -628,7 +628,7 @@ static irqreturn_t txx9dmac_chan_interrupt(int irq, void *dev_id) dev_vdbg(chan2dev(&dc->chan), "interrupt: status=%#x\n", channel_readl(dc, CSR)); - tasklet_schedule(&dc->tasklet); + dma_chan_schedule_bh(&dc->chan); /* * Just disable the interrupts. We'll turn them back on in the * softirq handler. @@ -659,7 +659,7 @@ static void txx9dmac_tasklet(struct tasklet_struct *t) spin_lock(&dc->lock); if (csr & (TXX9_DMA_CSR_ABCHC | TXX9_DMA_CSR_NCHNC | TXX9_DMA_CSR_NTRNFC)) - txx9dmac_scan_descriptors(dc); + dma_chan_schedule_bh(&dc->chan); spin_unlock(&dc->lock); } } @@ -1113,7 +1113,7 @@ static int __init txx9dmac_chan_probe(struct platform_device *pdev) irq = platform_get_irq(pdev, 0); if (irq < 0) return irq; - tasklet_setup(&dc->tasklet, txx9dmac_chan_tasklet); + dma_chan_init_bh(&dc->chan, txx9dmac_chan_tasklet); dc->irq = irq; err = devm_request_irq(&pdev->dev, dc->irq, txx9dmac_chan_interrupt, 0, dev_name(&pdev->dev), dc); @@ -1159,7 +1159,7 @@ static void txx9dmac_chan_remove(struct platform_device *pdev) dma_async_device_unregister(&dc->dma); if (dc->irq >= 0) { devm_free_irq(&pdev->dev, dc->irq, dc); - tasklet_kill(&dc->tasklet); + dma_chan_kill_bh(&dc->chan); } dc->ddev->chan[pdev->id % TXX9_DMA_MAX_NR_CHANNELS] = NULL; } diff --git a/drivers/dma/txx9dmac.h b/drivers/dma/txx9dmac.h index aa53eafb1519..f2abedb73d49 100644 --- a/drivers/dma/txx9dmac.h +++ b/drivers/dma/txx9dmac.h @@ -162,7 +162,6 @@ struct txx9dmac_chan { struct dma_device dma; struct txx9dmac_dev *ddev; void __iomem *ch_regs; - struct tasklet_struct tasklet; int irq; u32 ccr; -- 2.43.0