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

From: Frank Li

Date: Wed Sep 02 2026 - 11:41:33 EST


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@xxxxxxxxx>
> ---
Reviewed-by: Frank Li <Frank.Li@xxxxxxx>


> 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
>