Re: [PATCH v2 2/3] dmaengine: dw-axi-dmac: Add support for CV1800B DMA
Inochi Amaoto <[email protected]>
| Newsgroups | dev.linux.lists.sophgo,org.infradead.lists.linux-riscv,org.kernel.vger.dmaengine,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On Fri, Jan 16, 2026 at 10:45:20AM -0500, Frank Li wrote: > On Mon, Dec 15, 2025 at 06:45:59AM +0800, Inochi Amaoto wrote: > > As the DMA controller on Sophgo CV1800 series SoC only has 8 channels, > > the SoC provides a dma multiplexer to reuse the DMA channel. However, > > the dma multiplexer also controls the DMA interrupt multiplexer, which > > means that the dma multiplexer needs to know the channel number. > > > > Allow the driver to use DMA phandle args as the channel number, so the > > DMA multiplexer can route the DMA interrupt correctly. > > > > Signed-off-by: Inochi Amaoto <[email protected]> > > --- > > .../dma/dw-axi-dmac/dw-axi-dmac-platform.c | 26 ++++++++++++++++--- > > drivers/dma/dw-axi-dmac/dw-axi-dmac.h | 1 + > > 2 files changed, 23 insertions(+), 4 deletions(-) > > > > diff --git a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c b/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c > > index b23536645ff7..829aa6c05b5c 100644 > > --- a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c > > +++ b/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c > > @@ -7,6 +7,7 @@ > > * Author: Eugeniy Paltsev <[email protected]> > > */ > > > > +#include "linux/stddef.h" > > #include <linux/bitops.h> > > #include <linux/delay.h> > > #include <linux/device.h> > > @@ -50,6 +51,7 @@ > > #define AXI_DMA_FLAG_HAS_APB_REGS BIT(0) > > #define AXI_DMA_FLAG_HAS_RESETS BIT(1) > > #define AXI_DMA_FLAG_USE_CFG2 BIT(2) > > +#define AXI_DMA_FLAG_HANDSHAKE_AS_CHAN BIT(3) > > Look like ARG0_AS_CHAN is easy understand > Good name! > Frank > > > > static inline void > > axi_dma_iowrite32(struct axi_dma_chip *chip, u32 reg, u32 val) > > @@ -1360,16 +1362,27 @@ static int __maybe_unused axi_dma_runtime_resume(struct device *dev) > > static struct dma_chan *dw_axi_dma_of_xlate(struct of_phandle_args *dma_spec, > > struct of_dma *ofdma) > > { > > + unsigned int handshake = dma_spec->args[0]; > > struct dw_axi_dma *dw = ofdma->of_dma_data; > > - struct axi_dma_chan *chan; > > + struct axi_dma_chan *chan = NULL; > > struct dma_chan *dchan; > > > > - dchan = dma_get_any_slave_channel(&dw->dma); > > + if (dw->hdata->use_handshake_as_channel_number) { > > + if (handshake >= dw->hdata->nr_channels) > > + return NULL; > > + > > + chan = &dw->chan[handshake]; > > + dchan = dma_get_slave_channel(&chan->vc.chan); > > + } else { > > + dchan = dma_get_any_slave_channel(&dw->dma); > > + } > > + > > if (!dchan) > > return NULL; > > > > - chan = dchan_to_axi_dma_chan(dchan); > > - chan->hw_handshake_num = dma_spec->args[0]; > > + if (!chan) > > + chan = dchan_to_axi_dma_chan(dchan); > > + chan->hw_handshake_num = handshake; > > return dchan; > > } > > > > @@ -1508,6 +1521,8 @@ static int dw_probe(struct platform_device *pdev) > > return ret; > > } > > > > + chip->dw->hdata->use_handshake_as_channel_number = !!(flags & AXI_DMA_FLAG_HANDSHAKE_AS_CHAN); > > + > > chip->dw->hdata->use_cfg2 = !!(flags & AXI_DMA_FLAG_USE_CFG2); > > > > chip->core_clk = devm_clk_get(chip->dev, "core-clk"); > > @@ -1663,6 +1678,9 @@ static const struct of_device_id dw_dma_of_id_table[] = { > > }, { > > .compatible = "intel,kmb-axi-dma", > > .data = (void *)AXI_DMA_FLAG_HAS_APB_REGS, > > + }, { > > + .compatible = "sophgo,cv1800b-axi-dma", > > + .data = (void *)AXI_DMA_FLAG_HANDSHAKE_AS_CHAN, > > }, { > > .compatible = "starfive,jh7110-axi-dma", > > .data = (void *)(AXI_DMA_FLAG_HAS_RESETS | AXI_DMA_FLAG_USE_CFG2), > > diff --git a/drivers/dma/dw-axi-dmac/dw-axi-dmac.h b/drivers/dma/dw-axi-dmac/dw-axi-dmac.h > > index b842e6a8d90d..67cc199e24d1 100644 > > --- a/drivers/dma/dw-axi-dmac/dw-axi-dmac.h > > +++ b/drivers/dma/dw-axi-dmac/dw-axi-dmac.h > > @@ -34,6 +34,7 @@ struct dw_axi_dma_hcfg { > > bool reg_map_8_channels; > > bool restrict_axi_burst_len; > > bool use_cfg2; > > + bool use_handshake_as_channel_number; > > }; > > > > struct axi_dma_chan { > > -- > > 2.52.0 > >