Message ID | 1401898455-31064-3-git-send-email-ben.dooks@codethink.co.uk (mailing list archive) |
---|---|
State | RFC |
Headers | show |
Hi Ben > Move the shdma-of.c code to allocating and using a slave bitmap for > tracking allocation of the slave channels used by the mid-rid stored > in the phandle for the mux. > > This means that we can have multiple shdma muxes in the system without > any issue of slave-ids clashing and all the child dma units will be > able to properly protect against the re-use of a mid/rid pair. > > Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk> > --- (snip) > +void shdma_of_setup(struct device *dev, struct shdma_dev *shdev) > +{ > + struct shdma_of_state *ofs = dev_get_platdata(dev->parent); > + > + shdev->slave_used = ofs->slave_used; > +} > + > static int shdma_of_probe(struct platform_device *pdev) > { > const struct of_dev_auxdata *lookup = dev_get_platdata(&pdev->dev); > + struct shdma_of_state *ofs; > int ret; > > + ofs = devm_kzalloc(&pdev->dev, sizeof(*ofs), GFP_KERNEL); > + if (!ofs) > + return -ENOMEM; > + > ret = of_dma_controller_register(pdev->dev.of_node, > shdma_of_xlate, pdev); > if (ret < 0) > diff --git a/include/linux/shdma-base.h b/include/linux/shdma-base.h This ofs is created by devm_kzalloc(), but not used ?? It is missing to call dev_set_platdata() ? -- To unsubscribe from this list: send the line "unsubscribe linux-sh" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 05/06/14 11:47, Kuninori Morimoto wrote: > Hi Ben > >> Move the shdma-of.c code to allocating and using a slave bitmap for >> tracking allocation of the slave channels used by the mid-rid stored >> in the phandle for the mux. >> >> This means that we can have multiple shdma muxes in the system without >> any issue of slave-ids clashing and all the child dma units will be >> able to properly protect against the re-use of a mid/rid pair. >> >> Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk> >> --- > (snip) >> +void shdma_of_setup(struct device *dev, struct shdma_dev *shdev) >> +{ >> + struct shdma_of_state *ofs = dev_get_platdata(dev->parent); >> + >> + shdev->slave_used = ofs->slave_used; >> +} >> + >> static int shdma_of_probe(struct platform_device *pdev) >> { >> const struct of_dev_auxdata *lookup = dev_get_platdata(&pdev->dev); >> + struct shdma_of_state *ofs; >> int ret; >> >> + ofs = devm_kzalloc(&pdev->dev, sizeof(*ofs), GFP_KERNEL); >> + if (!ofs) >> + return -ENOMEM; >> + >> ret = of_dma_controller_register(pdev->dev.of_node, >> shdma_of_xlate, pdev); >> if (ret < 0) >> diff --git a/include/linux/shdma-base.h b/include/linux/shdma-base.h > > This ofs is created by devm_kzalloc(), but not used ?? > It is missing to call dev_set_platdata() ? Thanks for noticing it, I've yet to actually get access to a board to test this.
Hi Ben > > This ofs is created by devm_kzalloc(), but not used ?? > > It is missing to call dev_set_platdata() ? > > Thanks for noticing it, I've yet to actually get access to a board > to test this. I see. Thank you for your hard work anyway. -- To unsubscribe from this list: send the line "unsubscribe linux-sh" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/dma/sh/shdma-base.c b/drivers/dma/sh/shdma-base.c index 5b18c88..861e1f5 100644 --- a/drivers/dma/sh/shdma-base.c +++ b/drivers/dma/sh/shdma-base.c @@ -986,6 +986,8 @@ int shdma_init(struct device *dev, struct shdma_dev *sdev, dma_dev->dev = dev; sdev->slave_used = shdma_global_slave_used; + shdma_of_setup(dev, sdev); + return 0; } EXPORT_SYMBOL(shdma_init); diff --git a/drivers/dma/sh/shdma-of.c b/drivers/dma/sh/shdma-of.c index b4ff9d3..894c48e 100644 --- a/drivers/dma/sh/shdma-of.c +++ b/drivers/dma/sh/shdma-of.c @@ -17,6 +17,10 @@ #include <linux/platform_device.h> #include <linux/shdma-base.h> +struct shdma_of_state { + unsigned long slave_used[256 / sizeof(unsigned long)]; +}; + #define to_shdma_chan(c) container_of(c, struct shdma_chan, dma_chan) static struct dma_chan *shdma_of_xlate(struct of_phandle_args *dma_spec, @@ -41,11 +45,23 @@ static struct dma_chan *shdma_of_xlate(struct of_phandle_args *dma_spec, return chan; } +void shdma_of_setup(struct device *dev, struct shdma_dev *shdev) +{ + struct shdma_of_state *ofs = dev_get_platdata(dev->parent); + + shdev->slave_used = ofs->slave_used; +} + static int shdma_of_probe(struct platform_device *pdev) { const struct of_dev_auxdata *lookup = dev_get_platdata(&pdev->dev); + struct shdma_of_state *ofs; int ret; + ofs = devm_kzalloc(&pdev->dev, sizeof(*ofs), GFP_KERNEL); + if (!ofs) + return -ENOMEM; + ret = of_dma_controller_register(pdev->dev.of_node, shdma_of_xlate, pdev); if (ret < 0) diff --git a/include/linux/shdma-base.h b/include/linux/shdma-base.h index 6966593..0a3e422 100644 --- a/include/linux/shdma-base.h +++ b/include/linux/shdma-base.h @@ -131,4 +131,10 @@ bool shdma_chan_filter(struct dma_chan *chan, void *arg); #define shdma_chan_filter NULL #endif +#ifdef CONFIG_OF +extern void shdma_of_setup(struct device *dev, struct shdma_dev *sdev); +#else +static inline void shdma_of_setup(struct device *dev, struct shdma_dev *sdev) { } +#endif + #endif
Move the shdma-of.c code to allocating and using a slave bitmap for tracking allocation of the slave channels used by the mid-rid stored in the phandle for the mux. This means that we can have multiple shdma muxes in the system without any issue of slave-ids clashing and all the child dma units will be able to properly protect against the re-use of a mid/rid pair. Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk> --- drivers/dma/sh/shdma-base.c | 2 ++ drivers/dma/sh/shdma-of.c | 16 ++++++++++++++++ include/linux/shdma-base.h | 6 ++++++ 3 files changed, 24 insertions(+)