Currently we support DMAC DT nodes, located under a multiplexer. This also supports systems with a single DMAC instance by placing it alone under such a multiplexer node, but this is rather unnatural. This patch adds an ability to shdma support such single DT nodes with no dummy multiplexer.
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski+rene...@gmail.com> Cc: Vinod Koul <vinod.k...@intel.com> --- drivers/dma/sh/shdma-of.c | 5 +++-- drivers/dma/sh/shdma.c | 16 ++++++++++++++++ include/linux/sh_dma.h | 5 +++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/drivers/dma/sh/shdma-of.c b/drivers/dma/sh/shdma-of.c index 9ab869d..fd2fa10 100644 --- a/drivers/dma/sh/shdma-of.c +++ b/drivers/dma/sh/shdma-of.c @@ -19,8 +19,8 @@ #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, - struct of_dma *ofdma) +struct dma_chan *shdma_of_xlate(struct of_phandle_args *dma_spec, + struct of_dma *ofdma) { u32 id = dma_spec->args[0]; dma_cap_mask_t mask; @@ -39,6 +39,7 @@ static struct dma_chan *shdma_of_xlate(struct of_phandle_args *dma_spec, return chan; } +EXPORT_SYMBOL(shdma_of_xlate); static int shdma_of_probe(struct platform_device *pdev) { diff --git a/drivers/dma/sh/shdma.c b/drivers/dma/sh/shdma.c index 70bc99a..98b2693 100644 --- a/drivers/dma/sh/shdma.c +++ b/drivers/dma/sh/shdma.c @@ -20,6 +20,8 @@ #include <linux/init.h> #include <linux/module.h> +#include <linux/of.h> +#include <linux/of_dma.h> #include <linux/slab.h> #include <linux/interrupt.h> #include <linux/dmaengine.h> @@ -849,6 +851,15 @@ static int sh_dmae_probe(struct platform_device *pdev) pm_runtime_put(&pdev->dev); + if (pdev->dev.of_node && + !of_device_is_compatible(pdev->dev.of_node->parent, + "renesas,shdma-mux")) { + err = of_dma_controller_register(pdev->dev.of_node, + shdma_of_xlate, pdev); + if (err < 0) + goto eofdma; + } + err = dma_async_device_register(&shdev->shdma_dev.dma_dev); if (err < 0) goto edmadevreg; @@ -856,6 +867,8 @@ static int sh_dmae_probe(struct platform_device *pdev) return err; edmadevreg: + of_dma_controller_free(pdev->dev.of_node); +eofdma: pm_runtime_get(&pdev->dev); chan_probe_err: @@ -901,6 +914,9 @@ static int sh_dmae_remove(struct platform_device *pdev) dma_async_device_unregister(dma_dev); + /* Is a NOP if this controller isn't registered with of-dma */ + of_dma_controller_free(pdev->dev.of_node); + if (errirq > 0) free_irq(errirq, shdev); diff --git a/include/linux/sh_dma.h b/include/linux/sh_dma.h index 4e83f3e..887977d 100644 --- a/include/linux/sh_dma.h +++ b/include/linux/sh_dma.h @@ -99,4 +99,9 @@ struct sh_dmae_pdata { #define CHCR_TE 0x00000002 #define CHCR_IE 0x00000004 +struct of_phandle_args; +struct of_dma; +struct dma_chan *shdma_of_xlate(struct of_phandle_args *dma_spec, + struct of_dma *ofdma); + #endif -- 1.7.2.5 _______________________________________________ devicetree-discuss mailing list devicetree-discuss@lists.ozlabs.org https://lists.ozlabs.org/listinfo/devicetree-discuss