dmaengine.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/8] add edma2 for i.mx7ulp
@ 2019-05-29  9:08 yibin.gong
  2019-05-29  9:08 ` [PATCH v3 1/8] dmaengine: fsl-edma: add dmamux_nr for next version yibin.gong
                   ` (7 more replies)
  0 siblings, 8 replies; 13+ messages in thread
From: yibin.gong @ 2019-05-29  9:08 UTC (permalink / raw)
  To: robh, shawnguo, s.hauer, festevam, mark.rutland, vkoul, dan.j.williams
  Cc: linux-imx, linux-arm-kernel, linux-kernel, dmaengine, devicetree, kernel

From: Robin Gong <yibin.gong@nxp.com>

  This patch set add new version of edma for i.mx7ulp, the main changes
are as belows:
  1. only one dmamux.
  2. another clock dma_clk except dmamux clk.
  3. 16 independent interrupts instead of only one interrupt for
     all channels.
  For the first change, need modify fsl-edma-common.c and mcf-edma,
so create the first two patches to prepare without any function impact.
  For the third change, need request single irq for every channel with
the legacy handler. But actually 2 dma channels share one interrupt(16
channel interrupts, but 32 channels.),ch0/ch16,ch1/ch17... For now, just
simply request irq without IRQF_SHARED flag, since 16 channels are enough
on i.mx7ulp whose M4 domain own some peripherals.

change from v1:
  1. check .data of 'of_device_id' in probe instead of compatible name. 

change from v2:
  1. move the difference between edma and edma2 into driver data so that
     no need version checking in fsl-edma.c.

Robin Gong (8):
  dmaengine: fsl-edma: add dmamux_nr for next version
  dmaengine: mcf-edma: update to 'dmamux_nr'
  dmaengine: fsl-edma-common: move dmamux register to another single
    function
  dmaengine: fsl-edma-common: version check for v2 instead
  dmaengine: fsl-edma: add drvdata for vf610
  dt-bindings: dma: fsl-edma: add new i.mx7ulp-edma
  dmaengine: fsl-edma: add i.mx7ulp edma2 version support
  ARM: dts: imx7ulp: add edma device node

 Documentation/devicetree/bindings/dma/fsl-edma.txt |  44 +++++++-
 arch/arm/boot/dts/imx7ulp.dtsi                     |  28 ++++++
 drivers/dma/fsl-edma-common.c                      |  74 +++++++++-----
 drivers/dma/fsl-edma-common.h                      |  13 +++
 drivers/dma/fsl-edma.c                             | 112 ++++++++++++++++++---
 drivers/dma/mcf-edma.c                             |   1 +
 6 files changed, 230 insertions(+), 42 deletions(-)

-- 
2.7.4


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v3 1/8] dmaengine: fsl-edma: add dmamux_nr for next version
  2019-05-29  9:08 [PATCH v3 0/8] add edma2 for i.mx7ulp yibin.gong
@ 2019-05-29  9:08 ` yibin.gong
  2019-05-29  9:08 ` [PATCH v3 2/8] dmaengine: mcf-edma: update to 'dmamux_nr' yibin.gong
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: yibin.gong @ 2019-05-29  9:08 UTC (permalink / raw)
  To: robh, shawnguo, s.hauer, festevam, mark.rutland, vkoul, dan.j.williams
  Cc: linux-imx, linux-arm-kernel, linux-kernel, dmaengine, devicetree, kernel

From: Robin Gong <yibin.gong@nxp.com>

Next version of edma such as edmav2 on i.mx7ulp has only one dmamux.
Add dmamux_nr instead of static macro define 'DMAMUX_NR'. No any
function change here.

Signed-off-by: Robin Gong <yibin.gong@nxp.com>
---
 drivers/dma/fsl-edma-common.h |  1 +
 drivers/dma/fsl-edma.c        | 11 ++++++-----
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/dma/fsl-edma-common.h b/drivers/dma/fsl-edma-common.h
index c53f76e..21a9cfd 100644
--- a/drivers/dma/fsl-edma-common.h
+++ b/drivers/dma/fsl-edma-common.h
@@ -145,6 +145,7 @@ struct fsl_edma_engine {
 	void __iomem		*membase;
 	void __iomem		*muxbase[DMAMUX_NR];
 	struct clk		*muxclk[DMAMUX_NR];
+	u32			dmamux_nr;
 	struct mutex		fsl_edma_mutex;
 	u32			n_chans;
 	int			txirq;
diff --git a/drivers/dma/fsl-edma.c b/drivers/dma/fsl-edma.c
index d641ef8..7b65ef4 100644
--- a/drivers/dma/fsl-edma.c
+++ b/drivers/dma/fsl-edma.c
@@ -96,7 +96,7 @@ static struct dma_chan *fsl_edma_xlate(struct of_phandle_args *dma_spec,
 	struct fsl_edma_engine *fsl_edma = ofdma->of_dma_data;
 	struct dma_chan *chan, *_chan;
 	struct fsl_edma_chan *fsl_chan;
-	unsigned long chans_per_mux = fsl_edma->n_chans / DMAMUX_NR;
+	unsigned long chans_per_mux = fsl_edma->n_chans / fsl_edma->dmamux_nr;
 
 	if (dma_spec->args_count != 2)
 		return NULL;
@@ -206,6 +206,7 @@ static int fsl_edma_probe(struct platform_device *pdev)
 		return -ENOMEM;
 
 	fsl_edma->version = v1;
+	fsl_edma->dmamux_nr = DMAMUX_NR;
 	fsl_edma->n_chans = chans;
 	mutex_init(&fsl_edma->fsl_edma_mutex);
 
@@ -217,7 +218,7 @@ static int fsl_edma_probe(struct platform_device *pdev)
 	fsl_edma_setup_regs(fsl_edma);
 	regs = &fsl_edma->regs;
 
-	for (i = 0; i < DMAMUX_NR; i++) {
+	for (i = 0; i < fsl_edma->dmamux_nr; i++) {
 		char clkname[32];
 
 		res = platform_get_resource(pdev, IORESOURCE_MEM, 1 + i);
@@ -295,7 +296,7 @@ static int fsl_edma_probe(struct platform_device *pdev)
 	if (ret) {
 		dev_err(&pdev->dev,
 			"Can't register Freescale eDMA engine. (%d)\n", ret);
-		fsl_disable_clocks(fsl_edma, DMAMUX_NR);
+		fsl_disable_clocks(fsl_edma, fsl_edma->dmamux_nr);
 		return ret;
 	}
 
@@ -304,7 +305,7 @@ static int fsl_edma_probe(struct platform_device *pdev)
 		dev_err(&pdev->dev,
 			"Can't register Freescale eDMA of_dma. (%d)\n", ret);
 		dma_async_device_unregister(&fsl_edma->dma_dev);
-		fsl_disable_clocks(fsl_edma, DMAMUX_NR);
+		fsl_disable_clocks(fsl_edma, fsl_edma->dmamux_nr);
 		return ret;
 	}
 
@@ -323,7 +324,7 @@ static int fsl_edma_remove(struct platform_device *pdev)
 	fsl_edma_cleanup_vchan(&fsl_edma->dma_dev);
 	of_dma_controller_free(np);
 	dma_async_device_unregister(&fsl_edma->dma_dev);
-	fsl_disable_clocks(fsl_edma, DMAMUX_NR);
+	fsl_disable_clocks(fsl_edma, fsl_edma->dmamux_nr);
 
 	return 0;
 }
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 2/8] dmaengine: mcf-edma: update to 'dmamux_nr'
  2019-05-29  9:08 [PATCH v3 0/8] add edma2 for i.mx7ulp yibin.gong
  2019-05-29  9:08 ` [PATCH v3 1/8] dmaengine: fsl-edma: add dmamux_nr for next version yibin.gong
@ 2019-05-29  9:08 ` yibin.gong
  2019-05-29  9:08 ` [PATCH v3 3/8] dmaengine: fsl-edma-common: move dmamux register to another single function yibin.gong
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: yibin.gong @ 2019-05-29  9:08 UTC (permalink / raw)
  To: robh, shawnguo, s.hauer, festevam, mark.rutland, vkoul, dan.j.williams
  Cc: linux-imx, linux-arm-kernel, linux-kernel, dmaengine, devicetree, kernel

From: Robin Gong <yibin.gong@nxp.com>

Update to 'dmamux_nr' instead of static macro DMAMUX_NR since
new version edma only has one dmamux.

Signed-off-by: Robin Gong <yibin.gong@nxp.com>
---
 drivers/dma/fsl-edma-common.c | 2 +-
 drivers/dma/mcf-edma.c        | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/dma/fsl-edma-common.c b/drivers/dma/fsl-edma-common.c
index 680b2a0..c9a17fc 100644
--- a/drivers/dma/fsl-edma-common.c
+++ b/drivers/dma/fsl-edma-common.c
@@ -84,7 +84,7 @@ void fsl_edma_chan_mux(struct fsl_edma_chan *fsl_chan,
 	void __iomem *muxaddr;
 	unsigned int chans_per_mux, ch_off;
 
-	chans_per_mux = fsl_chan->edma->n_chans / DMAMUX_NR;
+	chans_per_mux = fsl_chan->edma->n_chans / fsl_chan->edma->dmamux_nr;
 	ch_off = fsl_chan->vchan.chan.chan_id % chans_per_mux;
 	muxaddr = fsl_chan->edma->muxbase[ch / chans_per_mux];
 	slot = EDMAMUX_CHCFG_SOURCE(slot);
diff --git a/drivers/dma/mcf-edma.c b/drivers/dma/mcf-edma.c
index 7de54b2f..4484190 100644
--- a/drivers/dma/mcf-edma.c
+++ b/drivers/dma/mcf-edma.c
@@ -189,6 +189,7 @@ static int mcf_edma_probe(struct platform_device *pdev)
 
 	/* Set up version for ColdFire edma */
 	mcf_edma->version = v2;
+	mcf_edma->dmamux_nr = DMAMUX_NR;
 	mcf_edma->big_endian = 1;
 
 	if (!mcf_edma->n_chans) {
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 3/8] dmaengine: fsl-edma-common: move dmamux register to another single function
  2019-05-29  9:08 [PATCH v3 0/8] add edma2 for i.mx7ulp yibin.gong
  2019-05-29  9:08 ` [PATCH v3 1/8] dmaengine: fsl-edma: add dmamux_nr for next version yibin.gong
  2019-05-29  9:08 ` [PATCH v3 2/8] dmaengine: mcf-edma: update to 'dmamux_nr' yibin.gong
@ 2019-05-29  9:08 ` yibin.gong
  2019-05-29  9:08 ` [PATCH v3 4/8] dmaengine: fsl-edma-common: version check for v2 instead yibin.gong
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: yibin.gong @ 2019-05-29  9:08 UTC (permalink / raw)
  To: robh, shawnguo, s.hauer, festevam, mark.rutland, vkoul, dan.j.williams
  Cc: linux-imx, linux-arm-kernel, linux-kernel, dmaengine, devicetree, kernel

From: Robin Gong <yibin.gong@nxp.com>

Prepare for edmav2 on i.mx7ulp whose dmamux register is 32bit. No function
impacted.

Signed-off-by: Robin Gong <yibin.gong@nxp.com>
---
 drivers/dma/fsl-edma-common.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/drivers/dma/fsl-edma-common.c b/drivers/dma/fsl-edma-common.c
index c9a17fc..bb24251 100644
--- a/drivers/dma/fsl-edma-common.c
+++ b/drivers/dma/fsl-edma-common.c
@@ -77,6 +77,19 @@ void fsl_edma_disable_request(struct fsl_edma_chan *fsl_chan)
 }
 EXPORT_SYMBOL_GPL(fsl_edma_disable_request);
 
+static void mux_configure8(struct fsl_edma_chan *fsl_chan, void __iomem *addr,
+			   u32 off, u32 slot, bool enable)
+{
+	u8 val8;
+
+	if (enable)
+		val8 = EDMAMUX_CHCFG_ENBL | slot;
+	else
+		val8 = EDMAMUX_CHCFG_DIS;
+
+	iowrite8(val8, addr + off);
+}
+
 void fsl_edma_chan_mux(struct fsl_edma_chan *fsl_chan,
 			unsigned int slot, bool enable)
 {
@@ -89,10 +102,7 @@ void fsl_edma_chan_mux(struct fsl_edma_chan *fsl_chan,
 	muxaddr = fsl_chan->edma->muxbase[ch / chans_per_mux];
 	slot = EDMAMUX_CHCFG_SOURCE(slot);
 
-	if (enable)
-		iowrite8(EDMAMUX_CHCFG_ENBL | slot, muxaddr + ch_off);
-	else
-		iowrite8(EDMAMUX_CHCFG_DIS, muxaddr + ch_off);
+	mux_configure8(fsl_chan, muxaddr, ch_off, slot, enable);
 }
 EXPORT_SYMBOL_GPL(fsl_edma_chan_mux);
 
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 4/8] dmaengine: fsl-edma-common: version check for v2 instead
  2019-05-29  9:08 [PATCH v3 0/8] add edma2 for i.mx7ulp yibin.gong
                   ` (2 preceding siblings ...)
  2019-05-29  9:08 ` [PATCH v3 3/8] dmaengine: fsl-edma-common: move dmamux register to another single function yibin.gong
@ 2019-05-29  9:08 ` yibin.gong
  2019-05-29  9:08 ` [PATCH v3 5/8] dmaengine: fsl-edma: add drvdata for vf610 yibin.gong
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: yibin.gong @ 2019-05-29  9:08 UTC (permalink / raw)
  To: robh, shawnguo, s.hauer, festevam, mark.rutland, vkoul, dan.j.williams
  Cc: linux-imx, linux-arm-kernel, linux-kernel, dmaengine, devicetree, kernel

From: Robin Gong <yibin.gong@nxp.com>

The next v3 i.mx7ulp edma is based on v1, so change version
check logic for v2 instead.

Signed-off-by: Robin Gong <yibin.gong@nxp.com>
---
 drivers/dma/fsl-edma-common.c | 40 ++++++++++++++++++++--------------------
 1 file changed, 20 insertions(+), 20 deletions(-)

diff --git a/drivers/dma/fsl-edma-common.c b/drivers/dma/fsl-edma-common.c
index bb24251..45d70d3 100644
--- a/drivers/dma/fsl-edma-common.c
+++ b/drivers/dma/fsl-edma-common.c
@@ -657,26 +657,26 @@ void fsl_edma_setup_regs(struct fsl_edma_engine *edma)
 	edma->regs.erql = edma->membase + EDMA_ERQ;
 	edma->regs.eeil = edma->membase + EDMA_EEI;
 
-	edma->regs.serq = edma->membase + ((edma->version == v1) ?
-			EDMA_SERQ : EDMA64_SERQ);
-	edma->regs.cerq = edma->membase + ((edma->version == v1) ?
-			EDMA_CERQ : EDMA64_CERQ);
-	edma->regs.seei = edma->membase + ((edma->version == v1) ?
-			EDMA_SEEI : EDMA64_SEEI);
-	edma->regs.ceei = edma->membase + ((edma->version == v1) ?
-			EDMA_CEEI : EDMA64_CEEI);
-	edma->regs.cint = edma->membase + ((edma->version == v1) ?
-			EDMA_CINT : EDMA64_CINT);
-	edma->regs.cerr = edma->membase + ((edma->version == v1) ?
-			EDMA_CERR : EDMA64_CERR);
-	edma->regs.ssrt = edma->membase + ((edma->version == v1) ?
-			EDMA_SSRT : EDMA64_SSRT);
-	edma->regs.cdne = edma->membase + ((edma->version == v1) ?
-			EDMA_CDNE : EDMA64_CDNE);
-	edma->regs.intl = edma->membase + ((edma->version == v1) ?
-			EDMA_INTR : EDMA64_INTL);
-	edma->regs.errl = edma->membase + ((edma->version == v1) ?
-			EDMA_ERR : EDMA64_ERRL);
+	edma->regs.serq = edma->membase + ((edma->version == v2) ?
+			EDMA64_SERQ : EDMA_SERQ);
+	edma->regs.cerq = edma->membase + ((edma->version == v2) ?
+			EDMA64_CERQ : EDMA_CERQ);
+	edma->regs.seei = edma->membase + ((edma->version == v2) ?
+			EDMA64_SEEI : EDMA_SEEI);
+	edma->regs.ceei = edma->membase + ((edma->version == v2) ?
+			EDMA64_CEEI : EDMA_CEEI);
+	edma->regs.cint = edma->membase + ((edma->version == v2) ?
+			EDMA64_CINT : EDMA_CINT);
+	edma->regs.cerr = edma->membase + ((edma->version == v2) ?
+			EDMA64_CERR : EDMA_CERR);
+	edma->regs.ssrt = edma->membase + ((edma->version == v2) ?
+			EDMA64_SSRT : EDMA_SSRT);
+	edma->regs.cdne = edma->membase + ((edma->version == v2) ?
+			EDMA64_CDNE : EDMA_CDNE);
+	edma->regs.intl = edma->membase + ((edma->version == v2) ?
+			EDMA64_INTL : EDMA_INTR);
+	edma->regs.errl = edma->membase + ((edma->version == v2) ?
+			EDMA64_ERRL : EDMA_ERR);
 
 	if (edma->version == v2) {
 		edma->regs.erqh = edma->membase + EDMA64_ERQH;
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 5/8] dmaengine: fsl-edma: add drvdata for vf610
  2019-05-29  9:08 [PATCH v3 0/8] add edma2 for i.mx7ulp yibin.gong
                   ` (3 preceding siblings ...)
  2019-05-29  9:08 ` [PATCH v3 4/8] dmaengine: fsl-edma-common: version check for v2 instead yibin.gong
@ 2019-05-29  9:08 ` yibin.gong
  2019-06-04 12:33   ` Vinod Koul
  2019-05-29  9:08 ` [PATCH v3 6/8] dt-bindings: dma: fsl-edma: add new i.mx7ulp-edma yibin.gong
                   ` (2 subsequent siblings)
  7 siblings, 1 reply; 13+ messages in thread
From: yibin.gong @ 2019-05-29  9:08 UTC (permalink / raw)
  To: robh, shawnguo, s.hauer, festevam, mark.rutland, vkoul, dan.j.williams
  Cc: linux-imx, linux-arm-kernel, linux-kernel, dmaengine, devicetree, kernel

From: Robin Gong <yibin.gong@nxp.com>

There are some differences between vf610 and next i.mx7ulp. Put such
differences into static driver data for distiguish easily in driver.

Signed-off-by: Robin Gong <yibin.gong@nxp.com>
---
 drivers/dma/fsl-edma-common.h | 10 ++++++++++
 drivers/dma/fsl-edma.c        | 36 +++++++++++++++++++++++++++---------
 2 files changed, 37 insertions(+), 9 deletions(-)

diff --git a/drivers/dma/fsl-edma-common.h b/drivers/dma/fsl-edma-common.h
index 21a9cfd..014ab74 100644
--- a/drivers/dma/fsl-edma-common.h
+++ b/drivers/dma/fsl-edma-common.h
@@ -7,6 +7,7 @@
 #define _FSL_EDMA_COMMON_H_
 
 #include <linux/dma-direction.h>
+#include <linux/platform_device.h>
 #include "virt-dma.h"
 
 #define EDMA_CR_EDBG		BIT(1)
@@ -140,6 +141,14 @@ enum edma_version {
 	v2, /* 64ch Coldfire */
 };
 
+struct fsl_edma_drvdata {
+	enum edma_version	version;
+	u32	dmamuxs;
+	bool	has_dmaclk;
+	int	(*setup_irq)(struct platform_device *pdev,
+			     struct fsl_edma_engine *fsl_edma);
+};
+
 struct fsl_edma_engine {
 	struct dma_device	dma_dev;
 	void __iomem		*membase;
@@ -147,6 +156,7 @@ struct fsl_edma_engine {
 	struct clk		*muxclk[DMAMUX_NR];
 	u32			dmamux_nr;
 	struct mutex		fsl_edma_mutex;
+	const struct fsl_edma_drvdata *drvdata;
 	u32			n_chans;
 	int			txirq;
 	int			errirq;
diff --git a/drivers/dma/fsl-edma.c b/drivers/dma/fsl-edma.c
index 7b65ef4..cf18301 100644
--- a/drivers/dma/fsl-edma.c
+++ b/drivers/dma/fsl-edma.c
@@ -184,16 +184,39 @@ static void fsl_disable_clocks(struct fsl_edma_engine *fsl_edma, int nr_clocks)
 		clk_disable_unprepare(fsl_edma->muxclk[i]);
 }
 
+static struct fsl_edma_drvdata vf610_data = {
+	.version = v1,
+	.dmamuxs = DMAMUX_NR,
+	.has_dmaclk = false,
+	.setup_irq = fsl_edma_irq_init,
+};
+
+static const struct of_device_id fsl_edma_dt_ids[] = {
+	{ .compatible = "fsl,vf610-edma", .data = &vf610_data},
+	{ /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, fsl_edma_dt_ids);
+
 static int fsl_edma_probe(struct platform_device *pdev)
 {
+	const struct of_device_id *of_id =
+			of_match_device(fsl_edma_dt_ids, &pdev->dev);
 	struct device_node *np = pdev->dev.of_node;
 	struct fsl_edma_engine *fsl_edma;
+	const struct fsl_edma_drvdata *drvdata = NULL;
 	struct fsl_edma_chan *fsl_chan;
 	struct edma_regs *regs;
 	struct resource *res;
 	int len, chans;
 	int ret, i;
 
+	if (of_id)
+		drvdata = of_id->data;
+	if (!drvdata) {
+		dev_err(&pdev->dev, "unable to find driver data\n");
+		return -EINVAL;
+	}
+
 	ret = of_property_read_u32(np, "dma-channels", &chans);
 	if (ret) {
 		dev_err(&pdev->dev, "Can't get dma-channels.\n");
@@ -205,8 +228,9 @@ static int fsl_edma_probe(struct platform_device *pdev)
 	if (!fsl_edma)
 		return -ENOMEM;
 
-	fsl_edma->version = v1;
-	fsl_edma->dmamux_nr = DMAMUX_NR;
+	fsl_edma->drvdata = drvdata;
+	fsl_edma->version = drvdata->version;
+	fsl_edma->dmamux_nr = drvdata->dmamuxs;
 	fsl_edma->n_chans = chans;
 	mutex_init(&fsl_edma->fsl_edma_mutex);
 
@@ -264,7 +288,7 @@ static int fsl_edma_probe(struct platform_device *pdev)
 	}
 
 	edma_writel(fsl_edma, ~0, regs->intl);
-	ret = fsl_edma_irq_init(pdev, fsl_edma);
+	ret = fsl_edma->drvdata->setup_irq(pdev, fsl_edma);
 	if (ret)
 		return ret;
 
@@ -383,12 +407,6 @@ static const struct dev_pm_ops fsl_edma_pm_ops = {
 	.resume_early   = fsl_edma_resume_early,
 };
 
-static const struct of_device_id fsl_edma_dt_ids[] = {
-	{ .compatible = "fsl,vf610-edma", },
-	{ /* sentinel */ }
-};
-MODULE_DEVICE_TABLE(of, fsl_edma_dt_ids);
-
 static struct platform_driver fsl_edma_driver = {
 	.driver		= {
 		.name	= "fsl-edma",
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 6/8] dt-bindings: dma: fsl-edma: add new i.mx7ulp-edma
  2019-05-29  9:08 [PATCH v3 0/8] add edma2 for i.mx7ulp yibin.gong
                   ` (4 preceding siblings ...)
  2019-05-29  9:08 ` [PATCH v3 5/8] dmaengine: fsl-edma: add drvdata for vf610 yibin.gong
@ 2019-05-29  9:08 ` yibin.gong
  2019-05-29  9:08 ` [PATCH v3 7/8] dmaengine: fsl-edma: add i.mx7ulp edma2 version support yibin.gong
  2019-05-29  9:08 ` [PATCH v3 8/8] ARM: dts: imx7ulp: add edma device node yibin.gong
  7 siblings, 0 replies; 13+ messages in thread
From: yibin.gong @ 2019-05-29  9:08 UTC (permalink / raw)
  To: robh, shawnguo, s.hauer, festevam, mark.rutland, vkoul, dan.j.williams
  Cc: linux-imx, linux-arm-kernel, linux-kernel, dmaengine, devicetree, kernel

From: Robin Gong <yibin.gong@nxp.com>

More channel interrupts, one more clock, and only one
dmamux on i.mx7ulp-edma.

Signed-off-by: Robin Gong <yibin.gong@nxp.com>
---
 Documentation/devicetree/bindings/dma/fsl-edma.txt | 44 +++++++++++++++++++---
 1 file changed, 39 insertions(+), 5 deletions(-)

diff --git a/Documentation/devicetree/bindings/dma/fsl-edma.txt b/Documentation/devicetree/bindings/dma/fsl-edma.txt
index 97e213e..29dd3cc 100644
--- a/Documentation/devicetree/bindings/dma/fsl-edma.txt
+++ b/Documentation/devicetree/bindings/dma/fsl-edma.txt
@@ -9,15 +9,16 @@ group, DMAMUX0 or DMAMUX1, but not both.
 Required properties:
 - compatible :
 	- "fsl,vf610-edma" for eDMA used similar to that on Vybrid vf610 SoC
+	- "fsl,imx7ulp-edma" for eDMA2 used similar to that on i.mx7ulp
 - reg : Specifies base physical address(s) and size of the eDMA registers.
 	The 1st region is eDMA control register's address and size.
 	The 2nd and the 3rd regions are programmable channel multiplexing
 	control register's address and size.
 - interrupts : A list of interrupt-specifiers, one for each entry in
-	interrupt-names.
-- interrupt-names : Should contain:
-	"edma-tx" - the transmission interrupt
-	"edma-err" - the error interrupt
+	interrupt-names on vf610 similar SoC. But for i.mx7ulp per channel
+	per transmission interrupt, total 16 channel interrupt and 1
+	error interrupt(located in the last), no interrupt-names list on
+	i.mx7ulp for clean on dts.
 - #dma-cells : Must be <2>.
 	The 1st cell specifies the DMAMUX(0 for DMAMUX0 and 1 for DMAMUX1).
 	Specific request source can only be multiplexed by specific channels
@@ -28,6 +29,7 @@ Required properties:
 - clock-names : A list of channel group clock names. Should contain:
 	"dmamux0" - clock name of mux0 group
 	"dmamux1" - clock name of mux1 group
+	Note: No dmamux0 on i.mx7ulp, but another 'dma' clk added on i.mx7ulp.
 - clocks : A list of phandle and clock-specifier pairs, one for each entry in
 	clock-names.
 
@@ -35,6 +37,10 @@ Optional properties:
 - big-endian: If present registers and hardware scatter/gather descriptors
 	of the eDMA are implemented in big endian mode, otherwise in little
 	mode.
+- interrupt-names : Should contain the below on vf610 similar SoC but not used
+	on i.mx7ulp similar SoC:
+	"edma-tx" - the transmission interrupt
+	"edma-err" - the error interrupt
 
 
 Examples:
@@ -52,8 +58,36 @@ edma0: dma-controller@40018000 {
 	clock-names = "dmamux0", "dmamux1";
 	clocks = <&clks VF610_CLK_DMAMUX0>,
 		<&clks VF610_CLK_DMAMUX1>;
-};
+}; /* vf610 */
 
+edma1: dma-controller@40080000 {
+	#dma-cells = <2>;
+	compatible = "fsl,imx7ulp-edma";
+	reg = <0x40080000 0x2000>,
+		<0x40210000 0x1000>;
+	dma-channels = <32>;
+	interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
+		     <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
+		     <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
+		     <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>,
+		     <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>,
+		     <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>,
+		     <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,
+		     <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
+		     <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
+		     <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>,
+		     <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>,
+		     <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,
+		     <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
+		     <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>,
+		     <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>,
+		     <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
+		     /* last is eDMA2-ERR interrupt */
+		     <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
+	clock-names = "dma", "dmamux0";
+	clocks = <&pcc2 IMX7ULP_CLK_DMA1>,
+		 <&pcc2 IMX7ULP_CLK_DMA_MUX1>;
+}; /* i.mx7ulp */
 
 * DMA clients
 DMA client drivers that uses the DMA function must use the format described
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 7/8] dmaengine: fsl-edma: add i.mx7ulp edma2 version support
  2019-05-29  9:08 [PATCH v3 0/8] add edma2 for i.mx7ulp yibin.gong
                   ` (5 preceding siblings ...)
  2019-05-29  9:08 ` [PATCH v3 6/8] dt-bindings: dma: fsl-edma: add new i.mx7ulp-edma yibin.gong
@ 2019-05-29  9:08 ` yibin.gong
  2019-06-04 12:37   ` Vinod Koul
  2019-05-29  9:08 ` [PATCH v3 8/8] ARM: dts: imx7ulp: add edma device node yibin.gong
  7 siblings, 1 reply; 13+ messages in thread
From: yibin.gong @ 2019-05-29  9:08 UTC (permalink / raw)
  To: robh, shawnguo, s.hauer, festevam, mark.rutland, vkoul, dan.j.williams
  Cc: linux-imx, linux-arm-kernel, linux-kernel, dmaengine, devicetree, kernel

From: Robin Gong <yibin.gong@nxp.com>

  Add edma2 for i.mx7ulp by version v3, since v2 has already
been used by mcf-edma.
The big changes based on v1 are belows:
1. only one dmamux.
2. another clock dma_clk except dmamux clk.
3. 16 independent interrupts instead of only one interrupt for
all channels.

Signed-off-by: Robin Gong <yibin.gong@nxp.com>
---
 drivers/dma/fsl-edma-common.c | 18 +++++++++++-
 drivers/dma/fsl-edma-common.h |  3 ++
 drivers/dma/fsl-edma.c        | 67 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 87 insertions(+), 1 deletion(-)

diff --git a/drivers/dma/fsl-edma-common.c b/drivers/dma/fsl-edma-common.c
index 45d70d3..0d9915c 100644
--- a/drivers/dma/fsl-edma-common.c
+++ b/drivers/dma/fsl-edma-common.c
@@ -90,6 +90,19 @@ static void mux_configure8(struct fsl_edma_chan *fsl_chan, void __iomem *addr,
 	iowrite8(val8, addr + off);
 }
 
+void mux_configure32(struct fsl_edma_chan *fsl_chan, void __iomem *addr,
+		     u32 off, u32 slot, bool enable)
+{
+	u32 val;
+
+	if (enable)
+		val = EDMAMUX_CHCFG_ENBL << 24 | slot;
+	else
+		val = EDMAMUX_CHCFG_DIS;
+
+	iowrite32(val, addr + off * 4);
+}
+
 void fsl_edma_chan_mux(struct fsl_edma_chan *fsl_chan,
 			unsigned int slot, bool enable)
 {
@@ -102,7 +115,10 @@ void fsl_edma_chan_mux(struct fsl_edma_chan *fsl_chan,
 	muxaddr = fsl_chan->edma->muxbase[ch / chans_per_mux];
 	slot = EDMAMUX_CHCFG_SOURCE(slot);
 
-	mux_configure8(fsl_chan, muxaddr, ch_off, slot, enable);
+	if (fsl_chan->edma->version == v3)
+		mux_configure32(fsl_chan, muxaddr, ch_off, slot, enable);
+	else
+		mux_configure8(fsl_chan, muxaddr, ch_off, slot, enable);
 }
 EXPORT_SYMBOL_GPL(fsl_edma_chan_mux);
 
diff --git a/drivers/dma/fsl-edma-common.h b/drivers/dma/fsl-edma-common.h
index 014ab74..07482d2 100644
--- a/drivers/dma/fsl-edma-common.h
+++ b/drivers/dma/fsl-edma-common.h
@@ -125,6 +125,7 @@ struct fsl_edma_chan {
 	dma_addr_t			dma_dev_addr;
 	u32				dma_dev_size;
 	enum dma_data_direction		dma_dir;
+	char				chan_name[16];
 };
 
 struct fsl_edma_desc {
@@ -139,6 +140,7 @@ struct fsl_edma_desc {
 enum edma_version {
 	v1, /* 32ch, Vybrid, mpc57x, etc */
 	v2, /* 64ch Coldfire */
+	v3, /* 32ch, i.mx7ulp */
 };
 
 struct fsl_edma_drvdata {
@@ -154,6 +156,7 @@ struct fsl_edma_engine {
 	void __iomem		*membase;
 	void __iomem		*muxbase[DMAMUX_NR];
 	struct clk		*muxclk[DMAMUX_NR];
+	struct clk		*dmaclk;
 	u32			dmamux_nr;
 	struct mutex		fsl_edma_mutex;
 	const struct fsl_edma_drvdata *drvdata;
diff --git a/drivers/dma/fsl-edma.c b/drivers/dma/fsl-edma.c
index cf18301..45b26d6 100644
--- a/drivers/dma/fsl-edma.c
+++ b/drivers/dma/fsl-edma.c
@@ -165,6 +165,51 @@ fsl_edma_irq_init(struct platform_device *pdev, struct fsl_edma_engine *fsl_edma
 	return 0;
 }
 
+static int
+fsl_edma2_irq_init(struct platform_device *pdev,
+		   struct fsl_edma_engine *fsl_edma)
+{
+	struct device_node *np = pdev->dev.of_node;
+	int i, ret, irq;
+	int count = 0;
+
+	count = of_irq_count(np);
+	dev_info(&pdev->dev, "%s Found %d interrupts\r\n", __func__, count);
+	if (count <= 2) {
+		dev_err(&pdev->dev, "Interrupts in DTS not correct.\n");
+		return -EINVAL;
+	}
+	/*
+	 * 16 channel independent interrupts + 1 error interrupt on i.mx7ulp.
+	 * 2 channel share one interrupt, for example, ch0/ch16, ch1/ch17...
+	 * For now, just simply request irq without IRQF_SHARED flag, since 16
+	 * channels are enough on i.mx7ulp whose M4 domain own some peripherals.
+	 */
+	for (i = 0; i < count; i++) {
+		irq = platform_get_irq(pdev, i);
+		if (irq < 0)
+			return -ENXIO;
+
+		sprintf(fsl_edma->chans[i].chan_name, "eDMA2-CH%02d", i);
+
+		/* The last IRQ is for eDMA err */
+		if (i == count - 1)
+			ret = devm_request_irq(&pdev->dev, irq,
+						fsl_edma_err_handler,
+						0, "eDMA2-ERR", fsl_edma);
+		else
+
+			ret = devm_request_irq(&pdev->dev, irq,
+						fsl_edma_tx_handler, 0,
+						fsl_edma->chans[i].chan_name,
+						fsl_edma);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
 static void fsl_edma_irq_exit(
 		struct platform_device *pdev, struct fsl_edma_engine *fsl_edma)
 {
@@ -191,8 +236,16 @@ static struct fsl_edma_drvdata vf610_data = {
 	.setup_irq = fsl_edma_irq_init,
 };
 
+static struct fsl_edma_drvdata imx7ulp_data = {
+	.version = v3,
+	.dmamuxs = 1,
+	.has_dmaclk = true,
+	.setup_irq = fsl_edma2_irq_init,
+};
+
 static const struct of_device_id fsl_edma_dt_ids[] = {
 	{ .compatible = "fsl,vf610-edma", .data = &vf610_data},
+	{ .compatible = "fsl,imx7ulp-edma", .data = &imx7ulp_data},
 	{ /* sentinel */ }
 };
 MODULE_DEVICE_TABLE(of, fsl_edma_dt_ids);
@@ -242,6 +295,20 @@ static int fsl_edma_probe(struct platform_device *pdev)
 	fsl_edma_setup_regs(fsl_edma);
 	regs = &fsl_edma->regs;
 
+	if (drvdata->has_dmaclk) {
+		fsl_edma->dmaclk = devm_clk_get(&pdev->dev, "dma");
+		if (IS_ERR(fsl_edma->dmaclk)) {
+			dev_err(&pdev->dev, "Missing DMA block clock.\n");
+			return PTR_ERR(fsl_edma->dmaclk);
+		}
+
+		ret = clk_prepare_enable(fsl_edma->dmaclk);
+		if (ret) {
+			dev_err(&pdev->dev, "DMA clk block failed.\n");
+			return ret;
+		}
+	}
+
 	for (i = 0; i < fsl_edma->dmamux_nr; i++) {
 		char clkname[32];
 
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 8/8] ARM: dts: imx7ulp: add edma device node
  2019-05-29  9:08 [PATCH v3 0/8] add edma2 for i.mx7ulp yibin.gong
                   ` (6 preceding siblings ...)
  2019-05-29  9:08 ` [PATCH v3 7/8] dmaengine: fsl-edma: add i.mx7ulp edma2 version support yibin.gong
@ 2019-05-29  9:08 ` yibin.gong
  7 siblings, 0 replies; 13+ messages in thread
From: yibin.gong @ 2019-05-29  9:08 UTC (permalink / raw)
  To: robh, shawnguo, s.hauer, festevam, mark.rutland, vkoul, dan.j.williams
  Cc: linux-imx, linux-arm-kernel, linux-kernel, dmaengine, devicetree, kernel

From: Robin Gong <yibin.gong@nxp.com>

Add edma device node in dts.

Signed-off-by: Robin Gong <yibin.gong@nxp.com>
---
 arch/arm/boot/dts/imx7ulp.dtsi | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/arch/arm/boot/dts/imx7ulp.dtsi b/arch/arm/boot/dts/imx7ulp.dtsi
index d6b7110..b4f7adf 100644
--- a/arch/arm/boot/dts/imx7ulp.dtsi
+++ b/arch/arm/boot/dts/imx7ulp.dtsi
@@ -100,6 +100,34 @@
 		reg = <0x40000000 0x800000>;
 		ranges;
 
+		edma1: dma-controller@40080000 {
+			#dma-cells = <2>;
+			compatible = "fsl,imx7ulp-edma";
+			reg = <0x40080000 0x2000>,
+				<0x40210000 0x1000>;
+			dma-channels = <32>;
+			interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
+			clock-names = "dma", "dmamux0";
+			clocks = <&pcc2 IMX7ULP_CLK_DMA1>,
+				 <&pcc2 IMX7ULP_CLK_DMA_MUX1>;
+		};
+
 		lpuart4: serial@402d0000 {
 			compatible = "fsl,imx7ulp-lpuart";
 			reg = <0x402d0000 0x1000>;
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 5/8] dmaengine: fsl-edma: add drvdata for vf610
  2019-05-29  9:08 ` [PATCH v3 5/8] dmaengine: fsl-edma: add drvdata for vf610 yibin.gong
@ 2019-06-04 12:33   ` Vinod Koul
  2019-06-05  2:25     ` Robin Gong
  0 siblings, 1 reply; 13+ messages in thread
From: Vinod Koul @ 2019-06-04 12:33 UTC (permalink / raw)
  To: yibin.gong
  Cc: robh, shawnguo, s.hauer, festevam, mark.rutland, dan.j.williams,
	linux-imx, linux-arm-kernel, linux-kernel, dmaengine, devicetree,
	kernel

On 29-05-19, 17:08, yibin.gong@nxp.com wrote:

> @@ -205,8 +228,9 @@ static int fsl_edma_probe(struct platform_device *pdev)
>  	if (!fsl_edma)
>  		return -ENOMEM;
>  
> -	fsl_edma->version = v1;
> -	fsl_edma->dmamux_nr = DMAMUX_NR;
> +	fsl_edma->drvdata = drvdata;
> +	fsl_edma->version = drvdata->version;
> +	fsl_edma->dmamux_nr = drvdata->dmamuxs;

And can we avoid the duplication here, you have version and dmamuxs
represented in two places. But right now it looks logical so the removal
should be done after this series

-- 
~Vinod

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 7/8] dmaengine: fsl-edma: add i.mx7ulp edma2 version support
  2019-05-29  9:08 ` [PATCH v3 7/8] dmaengine: fsl-edma: add i.mx7ulp edma2 version support yibin.gong
@ 2019-06-04 12:37   ` Vinod Koul
  2019-06-05  2:29     ` Robin Gong
  0 siblings, 1 reply; 13+ messages in thread
From: Vinod Koul @ 2019-06-04 12:37 UTC (permalink / raw)
  To: yibin.gong
  Cc: robh, shawnguo, s.hauer, festevam, mark.rutland, dan.j.williams,
	linux-imx, linux-arm-kernel, linux-kernel, dmaengine, devicetree,
	kernel

On 29-05-19, 17:08, yibin.gong@nxp.com wrote:
> From: Robin Gong <yibin.gong@nxp.com>
> 
>   Add edma2 for i.mx7ulp by version v3, since v2 has already

Why leading spaces at start of line?

> been used by mcf-edma.
> The big changes based on v1 are belows:
> 1. only one dmamux.
> 2. another clock dma_clk except dmamux clk.
> 3. 16 independent interrupts instead of only one interrupt for
> all channels.
> 
> Signed-off-by: Robin Gong <yibin.gong@nxp.com>
> ---
>  drivers/dma/fsl-edma-common.c | 18 +++++++++++-
>  drivers/dma/fsl-edma-common.h |  3 ++
>  drivers/dma/fsl-edma.c        | 67 +++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 87 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/dma/fsl-edma-common.c b/drivers/dma/fsl-edma-common.c
> index 45d70d3..0d9915c 100644
> --- a/drivers/dma/fsl-edma-common.c
> +++ b/drivers/dma/fsl-edma-common.c
> @@ -90,6 +90,19 @@ static void mux_configure8(struct fsl_edma_chan *fsl_chan, void __iomem *addr,
>  	iowrite8(val8, addr + off);
>  }
>  
> +void mux_configure32(struct fsl_edma_chan *fsl_chan, void __iomem *addr,
> +		     u32 off, u32 slot, bool enable)
> +{
> +	u32 val;
> +
> +	if (enable)
> +		val = EDMAMUX_CHCFG_ENBL << 24 | slot;
> +	else
> +		val = EDMAMUX_CHCFG_DIS;
> +
> +	iowrite32(val, addr + off * 4);
> +}
> +
>  void fsl_edma_chan_mux(struct fsl_edma_chan *fsl_chan,
>  			unsigned int slot, bool enable)
>  {
> @@ -102,7 +115,10 @@ void fsl_edma_chan_mux(struct fsl_edma_chan *fsl_chan,
>  	muxaddr = fsl_chan->edma->muxbase[ch / chans_per_mux];
>  	slot = EDMAMUX_CHCFG_SOURCE(slot);
>  
> -	mux_configure8(fsl_chan, muxaddr, ch_off, slot, enable);
> +	if (fsl_chan->edma->version == v3)
> +		mux_configure32(fsl_chan, muxaddr, ch_off, slot, enable);
> +	else
> +		mux_configure8(fsl_chan, muxaddr, ch_off, slot, enable);
>  }
>  EXPORT_SYMBOL_GPL(fsl_edma_chan_mux);
>  
> diff --git a/drivers/dma/fsl-edma-common.h b/drivers/dma/fsl-edma-common.h
> index 014ab74..07482d2 100644
> --- a/drivers/dma/fsl-edma-common.h
> +++ b/drivers/dma/fsl-edma-common.h
> @@ -125,6 +125,7 @@ struct fsl_edma_chan {
>  	dma_addr_t			dma_dev_addr;
>  	u32				dma_dev_size;
>  	enum dma_data_direction		dma_dir;
> +	char				chan_name[16];
>  };
>  
>  struct fsl_edma_desc {
> @@ -139,6 +140,7 @@ struct fsl_edma_desc {
>  enum edma_version {
>  	v1, /* 32ch, Vybrid, mpc57x, etc */
>  	v2, /* 64ch Coldfire */
> +	v3, /* 32ch, i.mx7ulp */
>  };
>  
>  struct fsl_edma_drvdata {
> @@ -154,6 +156,7 @@ struct fsl_edma_engine {
>  	void __iomem		*membase;
>  	void __iomem		*muxbase[DMAMUX_NR];
>  	struct clk		*muxclk[DMAMUX_NR];
> +	struct clk		*dmaclk;
>  	u32			dmamux_nr;
>  	struct mutex		fsl_edma_mutex;
>  	const struct fsl_edma_drvdata *drvdata;
> diff --git a/drivers/dma/fsl-edma.c b/drivers/dma/fsl-edma.c
> index cf18301..45b26d6 100644
> --- a/drivers/dma/fsl-edma.c
> +++ b/drivers/dma/fsl-edma.c
> @@ -165,6 +165,51 @@ fsl_edma_irq_init(struct platform_device *pdev, struct fsl_edma_engine *fsl_edma
>  	return 0;
>  }
>  
> +static int
> +fsl_edma2_irq_init(struct platform_device *pdev,
> +		   struct fsl_edma_engine *fsl_edma)
> +{
> +	struct device_node *np = pdev->dev.of_node;
> +	int i, ret, irq;
> +	int count = 0;

Superflous initialization of count!

> +
> +	count = of_irq_count(np);
> +	dev_info(&pdev->dev, "%s Found %d interrupts\r\n", __func__, count);

Consider using debug level..

> +	if (count <= 2) {
> +		dev_err(&pdev->dev, "Interrupts in DTS not correct.\n");
> +		return -EINVAL;
> +	}
> +	/*
> +	 * 16 channel independent interrupts + 1 error interrupt on i.mx7ulp.
> +	 * 2 channel share one interrupt, for example, ch0/ch16, ch1/ch17...
> +	 * For now, just simply request irq without IRQF_SHARED flag, since 16
> +	 * channels are enough on i.mx7ulp whose M4 domain own some peripherals.
> +	 */
> +	for (i = 0; i < count; i++) {
> +		irq = platform_get_irq(pdev, i);
> +		if (irq < 0)
> +			return -ENXIO;
> +
> +		sprintf(fsl_edma->chans[i].chan_name, "eDMA2-CH%02d", i);
> +
> +		/* The last IRQ is for eDMA err */
> +		if (i == count - 1)
> +			ret = devm_request_irq(&pdev->dev, irq,
> +						fsl_edma_err_handler,
> +						0, "eDMA2-ERR", fsl_edma);
> +		else
> +

empty line is waste here

> +			ret = devm_request_irq(&pdev->dev, irq,
> +						fsl_edma_tx_handler, 0,
> +						fsl_edma->chans[i].chan_name,
> +						fsl_edma);
> +		if (ret)
> +			return ret;
> +	}
> +
> +	return 0;
> +}
> +
>  static void fsl_edma_irq_exit(
>  		struct platform_device *pdev, struct fsl_edma_engine *fsl_edma)
>  {
> @@ -191,8 +236,16 @@ static struct fsl_edma_drvdata vf610_data = {
>  	.setup_irq = fsl_edma_irq_init,
>  };
>  
> +static struct fsl_edma_drvdata imx7ulp_data = {
> +	.version = v3,
> +	.dmamuxs = 1,
> +	.has_dmaclk = true,
> +	.setup_irq = fsl_edma2_irq_init,
> +};
> +
>  static const struct of_device_id fsl_edma_dt_ids[] = {
>  	{ .compatible = "fsl,vf610-edma", .data = &vf610_data},
> +	{ .compatible = "fsl,imx7ulp-edma", .data = &imx7ulp_data},
>  	{ /* sentinel */ }
>  };
>  MODULE_DEVICE_TABLE(of, fsl_edma_dt_ids);
> @@ -242,6 +295,20 @@ static int fsl_edma_probe(struct platform_device *pdev)
>  	fsl_edma_setup_regs(fsl_edma);
>  	regs = &fsl_edma->regs;
>  
> +	if (drvdata->has_dmaclk) {
> +		fsl_edma->dmaclk = devm_clk_get(&pdev->dev, "dma");
> +		if (IS_ERR(fsl_edma->dmaclk)) {
> +			dev_err(&pdev->dev, "Missing DMA block clock.\n");
> +			return PTR_ERR(fsl_edma->dmaclk);
> +		}
> +
> +		ret = clk_prepare_enable(fsl_edma->dmaclk);
> +		if (ret) {
> +			dev_err(&pdev->dev, "DMA clk block failed.\n");
> +			return ret;
> +		}
> +	}
> +
>  	for (i = 0; i < fsl_edma->dmamux_nr; i++) {
>  		char clkname[32];
>  
> -- 
> 2.7.4

-- 
~Vinod

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 5/8] dmaengine: fsl-edma: add drvdata for vf610
  2019-06-04 12:33   ` Vinod Koul
@ 2019-06-05  2:25     ` Robin Gong
  0 siblings, 0 replies; 13+ messages in thread
From: Robin Gong @ 2019-06-05  2:25 UTC (permalink / raw)
  To: vkoul
  Cc: dl-linux-imx, linux-kernel, devicetree, festevam, dan.j.williams,
	mark.rutland, dmaengine, robh, shawnguo, linux-arm-kernel,
	kernel, s.hauer

On 二, 2019-06-04 at 18:03 +0530, Vinod Koul wrote:
> On 29-05-19, 17:08, yibin.gong@nxp.com wrote:
> 
> > 
> > @@ -205,8 +228,9 @@ static int fsl_edma_probe(struct
> > platform_device *pdev)
> >  	if (!fsl_edma)
> >  		return -ENOMEM;
> >  
> > -	fsl_edma->version = v1;
> > -	fsl_edma->dmamux_nr = DMAMUX_NR;
> > +	fsl_edma->drvdata = drvdata;
> > +	fsl_edma->version = drvdata->version;
> > +	fsl_edma->dmamux_nr = drvdata->dmamuxs;
> And can we avoid the duplication here, you have version and dmamuxs
> represented in two places. But right now it looks logical so the
> removal
> should be done after this series
To avoid more code changes in other edma driver such as mcf-edma.c and
fsl-edma-common.c(replace all version/dmamux_nr with new
'drvdata'),meanwhile, no board to test mcf-edma so I keep
'version'/'dmamux' here in the last minute. But if you stick, I would
try to refine it in next version. 
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 7/8] dmaengine: fsl-edma: add i.mx7ulp edma2 version support
  2019-06-04 12:37   ` Vinod Koul
@ 2019-06-05  2:29     ` Robin Gong
  0 siblings, 0 replies; 13+ messages in thread
From: Robin Gong @ 2019-06-05  2:29 UTC (permalink / raw)
  To: vkoul
  Cc: dl-linux-imx, linux-kernel, devicetree, festevam, dan.j.williams,
	mark.rutland, dmaengine, robh, shawnguo, linux-arm-kernel,
	kernel, s.hauer

On 2019-06-04 at 12:37 +0000, Vinod Koul wrote:
> On 29-05-19, 17:08, yibin.gong@nxp.com wrote:
> > 
> > From: Robin Gong <yibin.gong@nxp.com>
> > 
> >   Add edma2 for i.mx7ulp by version v3, since v2 has already
> Why leading spaces at start of line?
Sorry for the typo, will fix in next version
> 
> > 
> > been used by mcf-edma.
> > The big changes based on v1 are belows:
> > 1. only one dmamux.
> > 2. another clock dma_clk except dmamux clk.
> > 3. 16 independent interrupts instead of only one interrupt for
> > all channels.
> > 
> > Signed-off-by: Robin Gong <yibin.gong@nxp.com>
> > ---
> >  drivers/dma/fsl-edma-common.c | 18 +++++++++++-
> >  drivers/dma/fsl-edma-common.h |  3 ++
> >  drivers/dma/fsl-edma.c        | 67
> > +++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 87 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/dma/fsl-edma-common.c b/drivers/dma/fsl-edma-
> > common.c
> > index 45d70d3..0d9915c 100644
> > --- a/drivers/dma/fsl-edma-common.c
> > +++ b/drivers/dma/fsl-edma-common.c
> > @@ -90,6 +90,19 @@ static void mux_configure8(struct fsl_edma_chan
> > *fsl_chan, void __iomem *addr,
> >  	iowrite8(val8, addr + off);
> >  }
> >  
> > +void mux_configure32(struct fsl_edma_chan *fsl_chan, void __iomem
> > *addr,
> > +		     u32 off, u32 slot, bool enable)
> > +{
> > +	u32 val;
> > +
> > +	if (enable)
> > +		val = EDMAMUX_CHCFG_ENBL << 24 | slot;
> > +	else
> > +		val = EDMAMUX_CHCFG_DIS;
> > +
> > +	iowrite32(val, addr + off * 4);
> > +}
> > +
> >  void fsl_edma_chan_mux(struct fsl_edma_chan *fsl_chan,
> >  			unsigned int slot, bool enable)
> >  {
> > @@ -102,7 +115,10 @@ void fsl_edma_chan_mux(struct fsl_edma_chan
> > *fsl_chan,
> >  	muxaddr = fsl_chan->edma->muxbase[ch / chans_per_mux];
> >  	slot = EDMAMUX_CHCFG_SOURCE(slot);
> >  
> > -	mux_configure8(fsl_chan, muxaddr, ch_off, slot, enable);
> > +	if (fsl_chan->edma->version == v3)
> > +		mux_configure32(fsl_chan, muxaddr, ch_off, slot,
> > enable);
> > +	else
> > +		mux_configure8(fsl_chan, muxaddr, ch_off, slot,
> > enable);
> >  }
> >  EXPORT_SYMBOL_GPL(fsl_edma_chan_mux);
> >  
> > diff --git a/drivers/dma/fsl-edma-common.h b/drivers/dma/fsl-edma-
> > common.h
> > index 014ab74..07482d2 100644
> > --- a/drivers/dma/fsl-edma-common.h
> > +++ b/drivers/dma/fsl-edma-common.h
> > @@ -125,6 +125,7 @@ struct fsl_edma_chan {
> >  	dma_addr_t			dma_dev_addr;
> >  	u32				dma_dev_size;
> >  	enum dma_data_direction		dma_dir;
> > +	char				chan_name[16];
> >  };
> >  
> >  struct fsl_edma_desc {
> > @@ -139,6 +140,7 @@ struct fsl_edma_desc {
> >  enum edma_version {
> >  	v1, /* 32ch, Vybrid, mpc57x, etc */
> >  	v2, /* 64ch Coldfire */
> > +	v3, /* 32ch, i.mx7ulp */
> >  };
> >  
> >  struct fsl_edma_drvdata {
> > @@ -154,6 +156,7 @@ struct fsl_edma_engine {
> >  	void __iomem		*membase;
> >  	void __iomem		*muxbase[DMAMUX_NR];
> >  	struct clk		*muxclk[DMAMUX_NR];
> > +	struct clk		*dmaclk;
> >  	u32			dmamux_nr;
> >  	struct mutex		fsl_edma_mutex;
> >  	const struct fsl_edma_drvdata *drvdata;
> > diff --git a/drivers/dma/fsl-edma.c b/drivers/dma/fsl-edma.c
> > index cf18301..45b26d6 100644
> > --- a/drivers/dma/fsl-edma.c
> > +++ b/drivers/dma/fsl-edma.c
> > @@ -165,6 +165,51 @@ fsl_edma_irq_init(struct platform_device
> > *pdev, struct fsl_edma_engine *fsl_edma
> >  	return 0;
> >  }
> >  
> > +static int
> > +fsl_edma2_irq_init(struct platform_device *pdev,
> > +		   struct fsl_edma_engine *fsl_edma)
> > +{
> > +	struct device_node *np = pdev->dev.of_node;
> > +	int i, ret, irq;
> > +	int count = 0;
> Superflous initialization of count!
Would fix it in v4.
> 
> > 
> > +
> > +	count = of_irq_count(np);
> > +	dev_info(&pdev->dev, "%s Found %d interrupts\r\n",
> > __func__, count);
> Consider using debug level..
Would downgrade print level in v4.
> 
> > 
> > +	if (count <= 2) {
> > +		dev_err(&pdev->dev, "Interrupts in DTS not
> > correct.\n");
> > +		return -EINVAL;
> > +	}
> > +	/*
> > +	 * 16 channel independent interrupts + 1 error interrupt
> > on i.mx7ulp.
> > +	 * 2 channel share one interrupt, for example, ch0/ch16,
> > ch1/ch17...
> > +	 * For now, just simply request irq without IRQF_SHARED
> > flag, since 16
> > +	 * channels are enough on i.mx7ulp whose M4 domain own
> > some peripherals.
> > +	 */
> > +	for (i = 0; i < count; i++) {
> > +		irq = platform_get_irq(pdev, i);
> > +		if (irq < 0)
> > +			return -ENXIO;
> > +
> > +		sprintf(fsl_edma->chans[i].chan_name, "eDMA2-
> > CH%02d", i);
> > +
> > +		/* The last IRQ is for eDMA err */
> > +		if (i == count - 1)
> > +			ret = devm_request_irq(&pdev->dev, irq,
> > +						fsl_edma_err_handl
> > er,
> > +						0, "eDMA2-ERR",
> > fsl_edma);
> > +		else
> > +
> empty line is waste here
> 
> > 
> > +			ret = devm_request_irq(&pdev->dev, irq,
> > +						fsl_edma_tx_handle
> > r, 0,
> > +						fsl_edma-
> > >chans[i].chan_name,
> > +						fsl_edma);
> > +		if (ret)
> > +			return ret;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> >  static void fsl_edma_irq_exit(
> >  		struct platform_device *pdev, struct
> > fsl_edma_engine *fsl_edma)
> >  {
> > @@ -191,8 +236,16 @@ static struct fsl_edma_drvdata vf610_data = {
> >  	.setup_irq = fsl_edma_irq_init,
> >  };
> >  
> > +static struct fsl_edma_drvdata imx7ulp_data = {
> > +	.version = v3,
> > +	.dmamuxs = 1,
> > +	.has_dmaclk = true,
> > +	.setup_irq = fsl_edma2_irq_init,
> > +};
> > +
> >  static const struct of_device_id fsl_edma_dt_ids[] = {
> >  	{ .compatible = "fsl,vf610-edma", .data = &vf610_data},
> > +	{ .compatible = "fsl,imx7ulp-edma", .data =
> > &imx7ulp_data},
> >  	{ /* sentinel */ }
> >  };
> >  MODULE_DEVICE_TABLE(of, fsl_edma_dt_ids);
> > @@ -242,6 +295,20 @@ static int fsl_edma_probe(struct
> > platform_device *pdev)
> >  	fsl_edma_setup_regs(fsl_edma);
> >  	regs = &fsl_edma->regs;
> >  
> > +	if (drvdata->has_dmaclk) {
> > +		fsl_edma->dmaclk = devm_clk_get(&pdev->dev,
> > "dma");
> > +		if (IS_ERR(fsl_edma->dmaclk)) {
> > +			dev_err(&pdev->dev, "Missing DMA block
> > clock.\n");
> > +			return PTR_ERR(fsl_edma->dmaclk);
> > +		}
> > +
> > +		ret = clk_prepare_enable(fsl_edma->dmaclk);
> > +		if (ret) {
> > +			dev_err(&pdev->dev, "DMA clk block
> > failed.\n");
> > +			return ret;
> > +		}
> > +	}
> > +
> >  	for (i = 0; i < fsl_edma->dmamux_nr; i++) {
> >  		char clkname[32];
> >  
> > -- 
> > 2.7.4

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2019-06-05  2:29 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-29  9:08 [PATCH v3 0/8] add edma2 for i.mx7ulp yibin.gong
2019-05-29  9:08 ` [PATCH v3 1/8] dmaengine: fsl-edma: add dmamux_nr for next version yibin.gong
2019-05-29  9:08 ` [PATCH v3 2/8] dmaengine: mcf-edma: update to 'dmamux_nr' yibin.gong
2019-05-29  9:08 ` [PATCH v3 3/8] dmaengine: fsl-edma-common: move dmamux register to another single function yibin.gong
2019-05-29  9:08 ` [PATCH v3 4/8] dmaengine: fsl-edma-common: version check for v2 instead yibin.gong
2019-05-29  9:08 ` [PATCH v3 5/8] dmaengine: fsl-edma: add drvdata for vf610 yibin.gong
2019-06-04 12:33   ` Vinod Koul
2019-06-05  2:25     ` Robin Gong
2019-05-29  9:08 ` [PATCH v3 6/8] dt-bindings: dma: fsl-edma: add new i.mx7ulp-edma yibin.gong
2019-05-29  9:08 ` [PATCH v3 7/8] dmaengine: fsl-edma: add i.mx7ulp edma2 version support yibin.gong
2019-06-04 12:37   ` Vinod Koul
2019-06-05  2:29     ` Robin Gong
2019-05-29  9:08 ` [PATCH v3 8/8] ARM: dts: imx7ulp: add edma device node yibin.gong

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).