[PATCH v3 17/34] dmaengine: ste_dma40: convert per-channel tasklet to dmaengine BH

Frank Li Frank.li at oss.nxp.com
Wed Sep 2 07:43:02 PDT 2026


On Mon, Aug 10, 2026 at 11:09:18AM -0700, Allen Pais wrote:
> Replace the per-channel tasklet with the shared dmaengine BH helper.
> The handler continues to run in softirq context while dmaengine owns
> the common scheduling and teardown mechanism.
>
> Signed-off-by: Allen Pais <allen.lkml at gmail.com>
> Reviewed-by: Linus Walleij <linusw at kernel.org>
> ---

Reviewed-by: Frank Li <Frank.Li at nxp.com>

>  drivers/dma/ste_dma40.c | 13 +++++--------
>  1 file changed, 5 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/dma/ste_dma40.c b/drivers/dma/ste_dma40.c
> index 0d9ffa3e2663..e6dfa1fc5e5a 100644
> --- a/drivers/dma/ste_dma40.c
> +++ b/drivers/dma/ste_dma40.c
> @@ -461,8 +461,6 @@ struct d40_base;
>   * @phy_chan: Pointer to physical channel which this instance runs on. If this
>   * point is NULL, then the channel is not allocated.
>   * @chan: DMA engine handle.
> - * @tasklet: Tasklet that gets scheduled from interrupt context to complete a
> - * transfer and call client callback.
>   * @client: Cliented owned descriptor list.
>   * @pending_queue: Submitted jobs, to be issued by issue_pending()
>   * @active: Active descriptor.
> @@ -489,7 +487,6 @@ struct d40_chan {
>  	bool				 busy;
>  	struct d40_phy_res		*phy_chan;
>  	struct dma_chan			 chan;
> -	struct tasklet_struct		 tasklet;
>  	struct list_head		 client;
>  	struct list_head		 pending_queue;
>  	struct list_head		 active;
> @@ -1587,13 +1584,13 @@ static void dma_tc_handle(struct d40_chan *d40c)
>  	}
>
>  	d40c->pending_tx++;
> -	tasklet_schedule(&d40c->tasklet);
> +	dmaengine_schedule_bh(&d40c->chan);
>
>  }
>
> -static void dma_tasklet(struct tasklet_struct *t)
> +static void dma_tasklet(struct dma_chan *chan)
>  {
> -	struct d40_chan *d40c = from_tasklet(d40c, t, tasklet);
> +	struct d40_chan *d40c = container_of(chan, struct d40_chan, chan);
>  	struct d40_desc *d40d;
>  	unsigned long flags;
>  	bool callback_active;
> @@ -1641,7 +1638,7 @@ static void dma_tasklet(struct tasklet_struct *t)
>  	d40c->pending_tx--;
>
>  	if (d40c->pending_tx)
> -		tasklet_schedule(&d40c->tasklet);
> +		dmaengine_schedule_bh(&d40c->chan);
>
>  	spin_unlock_irqrestore(&d40c->lock, flags);
>
> @@ -2815,7 +2812,7 @@ static void __init d40_chan_init(struct d40_base *base, struct dma_device *dma,
>  		INIT_LIST_HEAD(&d40c->client);
>  		INIT_LIST_HEAD(&d40c->prepare_queue);
>
> -		tasklet_setup(&d40c->tasklet, dma_tasklet);
> +		dmaengine_init_bh(&d40c->chan, dma_tasklet);
>
>  		list_add_tail(&d40c->chan.device_node,
>  			      &dma->channels);
> --
> 2.43.0
>



More information about the linux-arm-kernel mailing list