Re: [PATCH v3 24/34] dmaengine: txx9dmac: route callbacks via channel BH
From: Frank Li
Date: Wed Sep 02 2026 - 11:01:12 EST
On Mon, Aug 10, 2026 at 11:09:25AM -0700, Allen Pais wrote:
> 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 <allen.lkml@xxxxxxxxx>
> ---
Reviewed-by: Frank Li <Frank.Li@xxxxxxx>
> 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..0547f645b51c 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);
> + dmaengine_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);
> + dmaengine_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);
> + dmaengine_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);
> + dmaengine_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
>