[PATCH v4 5/9] dmaengine: dw-edma: Pass dma_slave_config to dw_edma_device_transfer()
Manivannan Sadhasivam
mani at kernel.org
Tue May 12 07:04:52 PDT 2026
On Wed, May 06, 2026 at 04:44:17PM -0400, Frank Li wrote:
> Pass dma_slave_config to dw_edma_device_transfer() to support atomic
> configuration and descriptor preparation when a non-NULL config is
> provided to device_prep_config_sg().
>
> Tested-by: Niklas Cassel <cassel at kernel.org>
> Signed-off-by: Frank Li <Frank.Li at nxp.com>
Reviewed-by: Manivannan Sadhasivam <mani at kernel.org>
- Mani
> ---
> change in v3
> - rewrite dw_edma_device_slave_config() according to Damien's suggestion.
> ---
> drivers/dma/dw-edma/dw-edma-core.c | 27 +++++++++++++++++++++------
> 1 file changed, 21 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/dma/dw-edma/dw-edma-core.c b/drivers/dma/dw-edma/dw-edma-core.c
> index f7f58b0010e26b529ffb7382d5b166a703587c71..ec6f6b1e482568a27ebe90852d5679672b24a1e9 100644
> --- a/drivers/dma/dw-edma/dw-edma-core.c
> +++ b/drivers/dma/dw-edma/dw-edma-core.c
> @@ -267,6 +267,20 @@ static int dw_edma_device_config(struct dma_chan *dchan,
> return 0;
> }
>
> +static struct dma_slave_config *
> +dw_edma_device_get_config(struct dma_chan *dchan,
> + struct dma_slave_config *config)
> +{
> + struct dw_edma_chan *chan;
> +
> + if (config)
> + return config;
> +
> + chan = dchan2dw_edma_chan(dchan);
> +
> + return &chan->config;
> +}
> +
> static int dw_edma_device_pause(struct dma_chan *dchan)
> {
> struct dw_edma_chan *chan = dchan2dw_edma_chan(dchan);
> @@ -385,7 +399,8 @@ dw_edma_device_tx_status(struct dma_chan *dchan, dma_cookie_t cookie,
> }
>
> static struct dma_async_tx_descriptor *
> -dw_edma_device_transfer(struct dw_edma_transfer *xfer)
> +dw_edma_device_transfer(struct dw_edma_transfer *xfer,
> + struct dma_slave_config *config)
> {
> struct dw_edma_chan *chan = dchan2dw_edma_chan(xfer->dchan);
> enum dma_transfer_direction dir = xfer->direction;
> @@ -472,8 +487,8 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer)
> src_addr = xfer->xfer.il->src_start;
> dst_addr = xfer->xfer.il->dst_start;
> } else {
> - src_addr = chan->config.src_addr;
> - dst_addr = chan->config.dst_addr;
> + src_addr = config->src_addr;
> + dst_addr = config->dst_addr;
> }
>
> if (dir == DMA_DEV_TO_MEM)
> @@ -595,7 +610,7 @@ dw_edma_device_prep_config_sg(struct dma_chan *dchan, struct scatterlist *sgl,
> if (config)
> dw_edma_device_config(dchan, config);
>
> - return dw_edma_device_transfer(&xfer);
> + return dw_edma_device_transfer(&xfer, dw_edma_device_get_config(dchan, config));
> }
>
> static struct dma_async_tx_descriptor *
> @@ -614,7 +629,7 @@ dw_edma_device_prep_dma_cyclic(struct dma_chan *dchan, dma_addr_t paddr,
> xfer.flags = flags;
> xfer.type = EDMA_XFER_CYCLIC;
>
> - return dw_edma_device_transfer(&xfer);
> + return dw_edma_device_transfer(&xfer, dw_edma_device_get_config(dchan, NULL));
> }
>
> static struct dma_async_tx_descriptor *
> @@ -630,7 +645,7 @@ dw_edma_device_prep_interleaved_dma(struct dma_chan *dchan,
> xfer.flags = flags;
> xfer.type = EDMA_XFER_INTERLEAVED;
>
> - return dw_edma_device_transfer(&xfer);
> + return dw_edma_device_transfer(&xfer, dw_edma_device_get_config(dchan, NULL));
> }
>
> static void dw_hdma_set_callback_result(struct virt_dma_desc *vd,
>
> --
> 2.43.0
>
--
மணிவண்ணன் சதாசிவம்
More information about the Linux-nvme
mailing list