Hi Sia, > Subject: [PATCH v4 08/15] dmaengine: dw-axi-dmac: Support of_dma_controller_register() > > Add support for of_dma_controller_register() so that DMA clients > can pass in device handshake number to the AxiDMA driver. > > DMA clients shall code the device handshake number in the Device tree. > When DMA activities are needed, DMA clients shall invoke OF helper > function to pass in the device handshake number to the AxiDMA. > > Without register to the of_dma_controller_register(), data transfer > between memory to device and device to memory operations would failed. > > Reviewed-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> > Signed-off-by: Sia Jee Heng <jee.heng.sia@xxxxxxxxx> > --- > .../dma/dw-axi-dmac/dw-axi-dmac-platform.c | 26 +++++++++++++++++++ > drivers/dma/dw-axi-dmac/dw-axi-dmac.h | 1 + > 2 files changed, 27 insertions(+) > > 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 b5f92f9cb2bc..72871b8738be 100644 > --- a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c > +++ b/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c > @@ -20,6 +20,7 @@ > #include <linux/kernel.h> > #include <linux/module.h> > #include <linux/of.h> > +#include <linux/of_dma.h> > #include <linux/platform_device.h> > #include <linux/pm_runtime.h> > #include <linux/property.h> > @@ -1044,6 +1045,22 @@ static int __maybe_unused axi_dma_runtime_resume(struct device *dev) > return axi_dma_resume(chip); > } > > +static struct dma_chan *dw_axi_dma_of_xlate(struct of_phandle_args *dma_spec, > + struct of_dma *ofdma) > +{ > + struct dw_axi_dma *dw = ofdma->of_dma_data; > + struct axi_dma_chan *chan; > + struct dma_chan *dchan; > + > + dchan = dma_get_any_slave_channel(&dw->dma); > + if (!dchan) > + return NULL; > + > + chan = dchan_to_axi_dma_chan(dchan); > + chan->hw_hs_num = dma_spec->args[0]; > + return dchan; > +} > + > static int parse_device_properties(struct axi_dma_chip *chip) > { > struct device *dev = chip->dev; > @@ -1233,6 +1250,13 @@ static int dw_probe(struct platform_device *pdev) > if (ret) > goto err_pm_disable; > > + /* Register with OF helpers for DMA lookups */ > + ret = of_dma_controller_register(pdev->dev.of_node, > + dw_axi_dma_of_xlate, dw); > + if (ret < 0) > + dev_warn(&pdev->dev, > + "Failed to register OF DMA controller, fallback to MEM_TO_MEM mode\n"); > + > dev_info(chip->dev, "DesignWare AXI DMA Controller, %d channels\n", > dw->hdata->nr_channels); > > @@ -1266,6 +1290,8 @@ static int dw_remove(struct platform_device *pdev) > > devm_free_irq(chip->dev, chip->irq, chip); > > + of_dma_controller_free(chip->dev->of_node); > + > list_for_each_entry_safe(chan, _chan, &dw->dma.channels, > vc.chan.device_node) { > list_del(&chan->vc.chan.device_node); > diff --git a/drivers/dma/dw-axi-dmac/dw-axi-dmac.h b/drivers/dma/dw-axi-dmac/dw-axi-dmac.h > index a26b0a242a93..651874e5c88f 100644 > --- a/drivers/dma/dw-axi-dmac/dw-axi-dmac.h > +++ b/drivers/dma/dw-axi-dmac/dw-axi-dmac.h > @@ -37,6 +37,7 @@ struct axi_dma_chan { > struct axi_dma_chip *chip; > void __iomem *chan_regs; > u8 id; > + u8 hw_hs_num; Just a nitpick: 'hw_hs_num' sounds quite obfuscated. Could it be 'hw_handshake_num' for example? > atomic_t descs_allocated; > > struct dma_pool *desc_pool; > -- > 2.18.0 >