Re: [PATCH v4 5/9] dmaengine: dw-edma: Pass dma_slave_config to dw_edma_device_transfer()
Manivannan Sadhasivam <[email protected]> Tue, 12 May 2026 19:34:52 +0530
| Newsgroups | dev.linux.lists.mhi,dev.linux.lists.imx,org.infradead.lists.linux-arm-kernel,org.infradead.lists.linux-nvme,org.kernel.vger.dmaengine,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-crypto,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pci |
|---|---|
| Message-ID | <35yqgcks3umcplmqq4q5qpbyqmjn2j2utk2tsyz6lbbtkgx7bi@ndbu2timf2ok> |
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 <[email protected]> > Signed-off-by: Frank Li <[email protected]> Reviewed-by: Manivannan Sadhasivam <[email protected]> - 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 > -- மணிவண்ணன் சதாசிவம்