[PATCH v3 03/34] dmaengine: apple-admac: use dmaengine BH callback

Frank Li Frank.li at oss.nxp.com
Wed Sep 2 08:33:04 PDT 2026


On Mon, Aug 10, 2026 at 11:09:04AM -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: Frank Li <Frank.Li at nxp.com>


>  drivers/dma/apple-admac.c | 16 ++++++----------
>  1 file changed, 6 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/dma/apple-admac.c b/drivers/dma/apple-admac.c
> index 14a5ee14a481..c5d4fb96d3c4 100644
> --- a/drivers/dma/apple-admac.c
> +++ b/drivers/dma/apple-admac.c
> @@ -89,7 +89,6 @@ struct admac_chan {
>  	unsigned int no;
>  	struct admac_data *host;
>  	struct dma_chan chan;
> -	struct tasklet_struct tasklet;
>
>  	u32 carveout;
>
> @@ -521,10 +520,7 @@ static int admac_terminate_all(struct dma_chan *chan)
>  		list_add_tail(&adchan->current_tx->node, &adchan->to_free);
>  		adchan->current_tx = NULL;
>  	}
> -	/*
> -	 * Descriptors can only be freed after the tasklet
> -	 * has been killed (in admac_synchronize).
> -	 */
> +	/* Descriptors are released once the BH is flushed in admac_synchronize */
>  	list_splice_tail_init(&adchan->submitted, &adchan->to_free);
>  	list_splice_tail_init(&adchan->issued, &adchan->to_free);
>  	spin_unlock_irqrestore(&adchan->lock, flags);
> @@ -543,7 +539,7 @@ static void admac_synchronize(struct dma_chan *chan)
>  	list_splice_tail_init(&adchan->to_free, &head);
>  	spin_unlock_irqrestore(&adchan->lock, flags);
>
> -	tasklet_kill(&adchan->tasklet);
> +	dmaengine_kill_bh(&adchan->chan);
>
>  	list_for_each_entry_safe(adtx, _adtx, &head, node) {
>  		list_del(&adtx->node);
> @@ -662,7 +658,7 @@ static void admac_handle_status_desc_done(struct admac_data *ad, int channo)
>  		tx->reclaimed_pos %= 2 * tx->buf_len;
>
>  		admac_cyclic_write_desc(ad, channo, tx);
> -		tasklet_schedule(&adchan->tasklet);
> +		dmaengine_schedule_bh(&adchan->chan);
>  	}
>  	spin_unlock_irqrestore(&adchan->lock, flags);
>  }
> @@ -712,9 +708,9 @@ static irqreturn_t admac_interrupt(int irq, void *devid)
>  	return IRQ_HANDLED;
>  }
>
> -static void admac_chan_tasklet(struct tasklet_struct *t)
> +static void admac_chan_bh(struct dma_chan *chan)
>  {
> -	struct admac_chan *adchan = from_tasklet(adchan, t, tasklet);
> +	struct admac_chan *adchan = to_admac_chan(chan);
>  	struct admac_tx *adtx;
>  	struct dmaengine_desc_callback cb;
>  	struct dmaengine_result tx_result;
> @@ -886,7 +882,7 @@ static int admac_probe(struct platform_device *pdev)
>  		INIT_LIST_HEAD(&adchan->issued);
>  		INIT_LIST_HEAD(&adchan->to_free);
>  		list_add_tail(&adchan->chan.device_node, &dma->channels);
> -		tasklet_setup(&adchan->tasklet, admac_chan_tasklet);
> +		dmaengine_init_bh(&adchan->chan, admac_chan_bh);
>  	}
>
>  	err = reset_control_reset(ad->rstc);
> --
> 2.43.0
>



More information about the linux-arm-kernel mailing list