Hi Vinod, > -----Original Message----- > From: Vinod Koul <vkoul@xxxxxxxxxx> > Sent: Friday, November 24, 2023 5:39 PM > To: shravan Chippa - I35088 <Shravan.Chippa@xxxxxxxxxxxxx> > Cc: green.wan@xxxxxxxxxx; robh+dt@xxxxxxxxxx; > krzysztof.kozlowski+dt@xxxxxxxxxx; palmer@xxxxxxxxxxx; > paul.walmsley@xxxxxxxxxx; conor+dt@xxxxxxxxxx; > dmaengine@xxxxxxxxxxxxxxx; devicetree@xxxxxxxxxxxxxxx; linux- > riscv@xxxxxxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; Nagasuresh Relli - > I67208 <Nagasuresh.Relli@xxxxxxxxxxxxx>; Praveen Kumar - I30718 > <Praveen.Kumar@xxxxxxxxxxxxx> > Subject: Re: [PATCH v4 1/4] dmaengine: sf-pdma: Support > of_dma_controller_register() > > EXTERNAL EMAIL: Do not click links or open attachments unless you know the > content is safe > > On 31-10-23, 10:57, shravan chippa wrote: > > From: Shravan Chippa <shravan.chippa@xxxxxxxxxxxxx> > > > > Update sf-pdma driver to adopt generic DMA device tree bindings. > > It calls of_dma_controller_register() with sf-pdma specific > > of_dma_xlate to get the generic DMA device tree helper support and the > > DMA clients can look up the sf-pdma controller using standard APIs. > > > > Signed-off-by: Shravan Chippa <shravan.chippa@xxxxxxxxxxxxx> > > --- > > drivers/dma/sf-pdma/sf-pdma.c | 44 > > +++++++++++++++++++++++++++++++++++ > > 1 file changed, 44 insertions(+) > > > > diff --git a/drivers/dma/sf-pdma/sf-pdma.c > > b/drivers/dma/sf-pdma/sf-pdma.c index d1c6956af452..4c456bdef882 > > 100644 > > --- a/drivers/dma/sf-pdma/sf-pdma.c > > +++ b/drivers/dma/sf-pdma/sf-pdma.c > > @@ -20,6 +20,7 @@ > > #include <linux/mod_devicetable.h> > > #include <linux/dma-mapping.h> > > #include <linux/of.h> > > +#include <linux/of_dma.h> > > #include <linux/slab.h> > > > > #include "sf-pdma.h" > > @@ -490,6 +491,33 @@ static void sf_pdma_setup_chans(struct sf_pdma > *pdma) > > } > > } > > > > +static struct dma_chan *sf_pdma_of_xlate(struct of_phandle_args > *dma_spec, > > + struct of_dma *ofdma) { > > + struct sf_pdma *pdma = ofdma->of_dma_data; > > + struct device *dev = pdma->dma_dev.dev; > > + struct sf_pdma_chan *chan; > > + struct dma_chan *c; > > + u32 channel_id; > > + > > + if (dma_spec->args_count != 1) { > > + dev_err(dev, "Bad number of cells\n"); > > + return NULL; > > + } > > + > > + channel_id = dma_spec->args[0]; > > + > > + chan = &pdma->chans[channel_id]; > > + > > + c = dma_get_slave_channel(&chan->vchan.chan); > > + if (!c) { > > + dev_err(dev, "No more channels available\n"); > > + return NULL; > > + } > > + > > + return c; > > +} > > This seems could be replaced by of_dma_xlate_by_chan_id() can you tell me > why that cant be used? I will try to use the of_dma_xlate_by_chan_id() function instead of a custom function, I will try to send the next revision. Thanks, Shravan > > > + > > static int sf_pdma_probe(struct platform_device *pdev) { > > struct sf_pdma *pdma; > > @@ -563,7 +591,20 @@ static int sf_pdma_probe(struct platform_device > *pdev) > > return ret; > > } > > > > + ret = of_dma_controller_register(pdev->dev.of_node, > > + sf_pdma_of_xlate, pdma); > > + if (ret < 0) { > > + dev_err(&pdev->dev, > > + "Can't register SiFive Platform OF_DMA. (%d)\n", ret); > > + goto err_unregister; > > + } > > + > > return 0; > > + > > +err_unregister: > > + dma_async_device_unregister(&pdma->dma_dev); > > + > > + return ret; > > } > > > > static int sf_pdma_remove(struct platform_device *pdev) @@ -583,6 > > +624,9 @@ static int sf_pdma_remove(struct platform_device *pdev) > > tasklet_kill(&ch->err_tasklet); > > } > > > > + if (pdev->dev.of_node) > > + of_dma_controller_free(pdev->dev.of_node); > > + > > dma_async_device_unregister(&pdma->dma_dev); > > > > return 0; > > -- > > 2.34.1 > > -- > ~Vinod