All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/4] dw_dmac: cleanup for DT usage
@ 2013-03-26 14:53 Andy Shevchenko
  2013-03-26 14:53 ` [PATCH v2 1/4] dw_dmac: fix style of the comments Andy Shevchenko
                   ` (4 more replies)
  0 siblings, 5 replies; 21+ messages in thread
From: Andy Shevchenko @ 2013-03-26 14:53 UTC (permalink / raw)
  To: Vinod Koul, Arnd Bergmann, Viresh Kumar, linux-kernel, spear-devel
  Cc: Andy Shevchenko

It includes few cleanups when used with DT. Patch 4/4 is a modified version of
the [1].

[1] http://www.spinics.net/lists/arm-kernel/msg225366.html

Since v1:
 - address Arnd's comments
 - apply Acks I got from Viresh

Andy Shevchenko (3):
  dw_dmac: fix style of the comments
  dw_dmac: rename DT related methods to reflect their belonging
  dw_dmac: make wrapper on of_dma_controller_register()

Arnd Bergmann (1):
  dmaengine: dw_dmac: simplify master selection

 drivers/dma/dw_dmac.c      | 145 +++++++++++++++++++++------------------------
 drivers/dma/dw_dmac_regs.h |   5 +-
 2 files changed, 71 insertions(+), 79 deletions(-)

-- 
1.8.2.rc0.22.gb3600c3


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

* [PATCH v2 1/4] dw_dmac: fix style of the comments
  2013-03-26 14:53 [PATCH v2 0/4] dw_dmac: cleanup for DT usage Andy Shevchenko
@ 2013-03-26 14:53 ` Andy Shevchenko
  2013-03-26 15:01   ` Arnd Bergmann
  2013-03-26 14:53 ` [PATCH v2 2/4] dw_dmac: rename DT related methods to reflect their belonging Andy Shevchenko
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 21+ messages in thread
From: Andy Shevchenko @ 2013-03-26 14:53 UTC (permalink / raw)
  To: Vinod Koul, Arnd Bergmann, Viresh Kumar, linux-kernel, spear-devel
  Cc: Andy Shevchenko

Let's use capital letter as a first one in the comments.
There is no functional changes.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
---
 drivers/dma/dw_dmac.c | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
index 43e2e89..d6dbb14 100644
--- a/drivers/dma/dw_dmac.c
+++ b/drivers/dma/dw_dmac.c
@@ -173,7 +173,7 @@ static void dwc_initialize(struct dw_dma_chan *dwc)
 		return;
 
 	if (dws && dws->cfg_hi == ~0 && dws->cfg_lo == ~0) {
-		/* autoconfigure based on request line from DT */
+		/* Autoconfigure based on request line from DT */
 		if (dwc->direction == DMA_MEM_TO_DEV)
 			cfghi = DWC_CFGH_DST_PER(dwc->request_line);
 		else if (dwc->direction == DMA_DEV_TO_MEM)
@@ -473,16 +473,16 @@ static void dwc_scan_descriptors(struct dw_dma *dw, struct dw_dma_chan *dwc)
 			(unsigned long long)llp);
 
 	list_for_each_entry_safe(desc, _desc, &dwc->active_list, desc_node) {
-		/* initial residue value */
+		/* Initial residue value */
 		dwc->residue = desc->total_len;
 
-		/* check first descriptors addr */
+		/* Check first descriptors addr */
 		if (desc->txd.phys == llp) {
 			spin_unlock_irqrestore(&dwc->lock, flags);
 			return;
 		}
 
-		/* check first descriptors llp */
+		/* Check first descriptors llp */
 		if (desc->lli.llp == llp) {
 			/* This one is currently in progress */
 			dwc->residue -= dwc_get_sent(dwc);
@@ -588,7 +588,7 @@ inline dma_addr_t dw_dma_get_dst_addr(struct dma_chan *chan)
 }
 EXPORT_SYMBOL(dw_dma_get_dst_addr);
 
-/* called with dwc->lock held and all DMAC interrupts disabled */
+/* Called with dwc->lock held and all DMAC interrupts disabled */
 static void dwc_handle_cyclic(struct dw_dma *dw, struct dw_dma_chan *dwc,
 		u32 status_err, u32 status_xfer)
 {
@@ -626,7 +626,7 @@ static void dwc_handle_cyclic(struct dw_dma *dw, struct dw_dma_chan *dwc,
 
 		dwc_chan_disable(dw, dwc);
 
-		/* make sure DMA does not restart by loading a new list */
+		/* Make sure DMA does not restart by loading a new list */
 		channel_writel(dwc, LLP, 0);
 		channel_writel(dwc, CTL_LO, 0);
 		channel_writel(dwc, CTL_HI, 0);
@@ -1256,7 +1256,7 @@ static bool dw_dma_generic_filter(struct dma_chan *chan, void *param)
 	struct dw_dma_filter_args *fargs = param;
 	struct dw_dma_slave *dws = &dwc->slave;
 
-	/* ensure the device matches our channel */
+	/* Ensure the device matches our channel */
         if (chan->device != &fargs->dw->dma)
                 return false;
 
@@ -1323,7 +1323,7 @@ int dw_dma_cyclic_start(struct dma_chan *chan)
 
 	spin_lock_irqsave(&dwc->lock, flags);
 
-	/* assert channel is idle */
+	/* Assert channel is idle */
 	if (dma_readl(dw, CH_EN) & dwc->mask) {
 		dev_err(chan2dev(&dwc->chan),
 			"BUG: Attempted to start non-idle channel\n");
@@ -1335,7 +1335,7 @@ int dw_dma_cyclic_start(struct dma_chan *chan)
 	dma_writel(dw, CLEAR.ERROR, dwc->mask);
 	dma_writel(dw, CLEAR.XFER, dwc->mask);
 
-	/* setup DMAC channel registers */
+	/* Setup DMAC channel registers */
 	channel_writel(dwc, LLP, dwc->cdesc->desc[0]->txd.phys);
 	channel_writel(dwc, CTL_LO, DWC_CTLL_LLP_D_EN | DWC_CTLL_LLP_S_EN);
 	channel_writel(dwc, CTL_HI, 0);
@@ -1502,7 +1502,7 @@ struct dw_cyclic_desc *dw_dma_cyclic_prep(struct dma_chan *chan,
 		last = desc;
 	}
 
-	/* lets make a cyclic list */
+	/* Let's make a cyclic list */
 	last->lli.llp = cdesc->desc[0]->txd.phys;
 
 	dev_dbg(chan2dev(&dwc->chan), "cyclic prepared buf 0x%llx len %zu "
@@ -1707,7 +1707,7 @@ static int dw_probe(struct platform_device *pdev)
 
 	dw->regs = regs;
 
-	/* get hardware configuration parameters */
+	/* Get hardware configuration parameters */
 	if (autocfg) {
 		max_blk_size = dma_readl(dw, MAX_BLK_SIZE);
 
@@ -1729,10 +1729,10 @@ static int dw_probe(struct platform_device *pdev)
 	/* Calculate all channel mask before DMA setup */
 	dw->all_chan_mask = (1 << nr_channels) - 1;
 
-	/* force dma off, just in case */
+	/* Force dma off, just in case */
 	dw_dma_off(dw);
 
-	/* disable BLOCK interrupts as well */
+	/* Disable BLOCK interrupts as well */
 	channel_clear_bit(dw, MASK.BLOCK, dw->all_chan_mask);
 
 	err = devm_request_irq(&pdev->dev, irq, dw_dma_interrupt, 0,
@@ -1742,7 +1742,7 @@ static int dw_probe(struct platform_device *pdev)
 
 	platform_set_drvdata(pdev, dw);
 
-	/* create a pool of consistent memory blocks for hardware descriptors */
+	/* Create a pool of consistent memory blocks for hardware descriptors */
 	dw->desc_pool = dmam_pool_create("dw_dmac_desc_pool", &pdev->dev,
 					 sizeof(struct dw_desc), 4, 0);
 	if (!dw->desc_pool) {
@@ -1783,7 +1783,7 @@ static int dw_probe(struct platform_device *pdev)
 
 		dwc->direction = DMA_TRANS_NONE;
 
-		/* hardware configuration */
+		/* Hardware configuration */
 		if (autocfg) {
 			unsigned int dwc_params;
 
-- 
1.8.2.rc0.22.gb3600c3


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

* [PATCH v2 2/4] dw_dmac: rename DT related methods to reflect their belonging
  2013-03-26 14:53 [PATCH v2 0/4] dw_dmac: cleanup for DT usage Andy Shevchenko
  2013-03-26 14:53 ` [PATCH v2 1/4] dw_dmac: fix style of the comments Andy Shevchenko
@ 2013-03-26 14:53 ` Andy Shevchenko
  2013-03-26 15:02   ` Arnd Bergmann
  2013-03-26 14:53 ` [PATCH v2 3/4] dw_dmac: make wrapper on of_dma_controller_register() Andy Shevchenko
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 21+ messages in thread
From: Andy Shevchenko @ 2013-03-26 14:53 UTC (permalink / raw)
  To: Vinod Koul, Arnd Bergmann, Viresh Kumar, linux-kernel, spear-devel
  Cc: Andy Shevchenko

Since we will have not only DT cases in future let's rename DT related methods
to reflect their belonging.

The rename was done as follows:
	struct dw_dma_filter_args	-> struct dw_dma_of_filter_args
	dw_dma_generic_filter()		-> dw_dma_of_filter()
	dw_dma_xlate()			-> dw_dma_of_xlate()
	dw_dma_id_table			-> dw_dma_of_id_table

There is no functional change.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
---
 drivers/dma/dw_dmac.c | 24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
index d6dbb14..274fd7d 100644
--- a/drivers/dma/dw_dmac.c
+++ b/drivers/dma/dw_dmac.c
@@ -1242,18 +1242,20 @@ static void dwc_free_chan_resources(struct dma_chan *chan)
 	dev_vdbg(chan2dev(chan), "%s: done\n", __func__);
 }
 
-struct dw_dma_filter_args {
+/*----------------------------------------------------------------------*/
+
+struct dw_dma_of_filter_args {
 	struct dw_dma *dw;
 	unsigned int req;
 	unsigned int src;
 	unsigned int dst;
 };
 
-static bool dw_dma_generic_filter(struct dma_chan *chan, void *param)
+static bool dw_dma_of_filter(struct dma_chan *chan, void *param)
 {
 	struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
 	struct dw_dma *dw = to_dw_dma(chan->device);
-	struct dw_dma_filter_args *fargs = param;
+	struct dw_dma_of_filter_args *fargs = param;
 	struct dw_dma_slave *dws = &dwc->slave;
 
 	/* Ensure the device matches our channel */
@@ -1273,11 +1275,11 @@ static bool dw_dma_generic_filter(struct dma_chan *chan, void *param)
 	return true;
 }
 
-static struct dma_chan *dw_dma_xlate(struct of_phandle_args *dma_spec,
-					 struct of_dma *ofdma)
+static struct dma_chan *dw_dma_of_xlate(struct of_phandle_args *dma_spec,
+					struct of_dma *ofdma)
 {
 	struct dw_dma *dw = ofdma->of_dma_data;
-	struct dw_dma_filter_args fargs = {
+	struct dw_dma_of_filter_args fargs = {
 		.dw = dw,
 	};
 	dma_cap_mask_t cap;
@@ -1298,7 +1300,7 @@ static struct dma_chan *dw_dma_xlate(struct of_phandle_args *dma_spec,
 	dma_cap_set(DMA_SLAVE, cap);
 
 	/* TODO: there should be a simpler way to do this */
-	return dma_request_channel(cap, dw_dma_generic_filter, &fargs);
+	return dma_request_channel(cap, dw_dma_of_filter, &fargs);
 }
 
 /* --------------------- Cyclic DMA API extensions -------------------- */
@@ -1843,7 +1845,7 @@ static int dw_probe(struct platform_device *pdev)
 
 	if (pdev->dev.of_node) {
 		err = of_dma_controller_register(pdev->dev.of_node,
-						 dw_dma_xlate, dw);
+						 dw_dma_of_xlate, dw);
 		if (err && err != -ENODEV)
 			dev_err(&pdev->dev,
 				"could not register of_dma_controller\n");
@@ -1913,11 +1915,11 @@ static const struct dev_pm_ops dw_dev_pm_ops = {
 };
 
 #ifdef CONFIG_OF
-static const struct of_device_id dw_dma_id_table[] = {
+static const struct of_device_id dw_dma_of_id_table[] = {
 	{ .compatible = "snps,dma-spear1340" },
 	{}
 };
-MODULE_DEVICE_TABLE(of, dw_dma_id_table);
+MODULE_DEVICE_TABLE(of, dw_dma_of_id_table);
 #endif
 
 static const struct platform_device_id dw_dma_ids[] = {
@@ -1933,7 +1935,7 @@ static struct platform_driver dw_driver = {
 	.driver = {
 		.name	= "dw_dmac",
 		.pm	= &dw_dev_pm_ops,
-		.of_match_table = of_match_ptr(dw_dma_id_table),
+		.of_match_table = of_match_ptr(dw_dma_of_id_table),
 	},
 	.id_table	= dw_dma_ids,
 };
-- 
1.8.2.rc0.22.gb3600c3


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

* [PATCH v2 3/4] dw_dmac: make wrapper on of_dma_controller_register()
  2013-03-26 14:53 [PATCH v2 0/4] dw_dmac: cleanup for DT usage Andy Shevchenko
  2013-03-26 14:53 ` [PATCH v2 1/4] dw_dmac: fix style of the comments Andy Shevchenko
  2013-03-26 14:53 ` [PATCH v2 2/4] dw_dmac: rename DT related methods to reflect their belonging Andy Shevchenko
@ 2013-03-26 14:53 ` Andy Shevchenko
  2013-03-26 15:01   ` Arnd Bergmann
  2013-03-26 15:04   ` Lars-Peter Clausen
  2013-03-26 14:53   ` Andy Shevchenko
  2013-04-01 17:55 ` [PATCH v2 0/4] dw_dmac: cleanup for DT usage Vinod Koul
  4 siblings, 2 replies; 21+ messages in thread
From: Andy Shevchenko @ 2013-03-26 14:53 UTC (permalink / raw)
  To: Vinod Koul, Arnd Bergmann, Viresh Kumar, linux-kernel, spear-devel
  Cc: Andy Shevchenko

This patch introduces new method dw_dma_of_controller_register() and adds
checks of the of_node presence together with CONFIG_OF before calling the
wrapper. It helps to distinguish the real -ENODEV return code of fake one when
of_dma_controller_register is not implemented.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/dma/dw_dmac.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
index 274fd7d..c1f017b 100644
--- a/drivers/dma/dw_dmac.c
+++ b/drivers/dma/dw_dmac.c
@@ -1303,6 +1303,16 @@ static struct dma_chan *dw_dma_of_xlate(struct of_phandle_args *dma_spec,
 	return dma_request_channel(cap, dw_dma_of_filter, &fargs);
 }
 
+static void dw_dma_of_controller_register(struct dw_dma *dw)
+{
+	struct device *dev = dw->dma.dev;
+	int err;
+
+	err = of_dma_controller_register(dev->of_node, dw_dma_of_xlate, dw);
+	if (err)
+		dev_err(dev, "could not register of_dma_controller\n");
+}
+
 /* --------------------- Cyclic DMA API extensions -------------------- */
 
 /**
@@ -1843,13 +1853,8 @@ static int dw_probe(struct platform_device *pdev)
 
 	dma_async_device_register(&dw->dma);
 
-	if (pdev->dev.of_node) {
-		err = of_dma_controller_register(pdev->dev.of_node,
-						 dw_dma_of_xlate, dw);
-		if (err && err != -ENODEV)
-			dev_err(&pdev->dev,
-				"could not register of_dma_controller\n");
-	}
+	if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node)
+		dw_dma_of_controller_register(dw);
 
 	return 0;
 }
-- 
1.8.2.rc0.22.gb3600c3


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

* [PATCH v2 4/4] dmaengine: dw_dmac: simplify master selection
  2013-03-26 14:53 [PATCH v2 0/4] dw_dmac: cleanup for DT usage Andy Shevchenko
@ 2013-03-26 14:53   ` Andy Shevchenko
  2013-03-26 14:53 ` [PATCH v2 2/4] dw_dmac: rename DT related methods to reflect their belonging Andy Shevchenko
                     ` (3 subsequent siblings)
  4 siblings, 0 replies; 21+ messages in thread
From: Andy Shevchenko @ 2013-03-26 14:53 UTC (permalink / raw)
  To: Vinod Koul, Arnd Bergmann, Viresh Kumar, linux-kernel, spear-devel
  Cc: Andy Shevchenko, linux-arm-kernel

From: Arnd Bergmann <arnd@arndb.de>

The patch to add the common DMA binding added a dummy dw_dma_slave
structure into the dw_dma_chan structure in order to configure the
masters correctly. It turns out that this can be simplified if we
pick the DMA masters in the dwc_alloc_chan_resources function instead
and save them in the dw_dma_chan structure directly.

This could be simplified further once all users that today use
dw_dma_slave for configuration get converted to device tree based
setup instead.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Cc: linux-arm-kernel@lists.infradead.org
---
 drivers/dma/dw_dmac.c      | 76 ++++++++++++++++++----------------------------
 drivers/dma/dw_dmac_regs.h |  5 ++-
 2 files changed, 33 insertions(+), 48 deletions(-)

diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
index c1f017b..5c9fec6 100644
--- a/drivers/dma/dw_dmac.c
+++ b/drivers/dma/dw_dmac.c
@@ -49,29 +49,22 @@ static inline unsigned int dwc_get_sms(struct dw_dma_slave *slave)
 	return slave ? slave->src_master : 1;
 }
 
-#define SRC_MASTER	0
-#define DST_MASTER	1
-
-static inline unsigned int dwc_get_master(struct dma_chan *chan, int master)
+static inline void dwc_set_masters(struct dw_dma_chan *dwc)
 {
-	struct dw_dma *dw = to_dw_dma(chan->device);
-	struct dw_dma_slave *dws = chan->private;
-	unsigned int m;
-
-	if (master == SRC_MASTER)
-		m = dwc_get_sms(dws);
-	else
-		m = dwc_get_dms(dws);
+	struct dw_dma *dw = to_dw_dma(dwc->chan.device);
+	struct dw_dma_slave *dws = dwc->chan.private;
+	unsigned char mmax = dw->nr_masters - 1;
 
-	return min_t(unsigned int, dw->nr_masters - 1, m);
+	if (dwc->request_line == ~0) {
+		dwc->src_master = min_t(unsigned char, mmax, dwc_get_sms(dws));
+		dwc->dst_master = min_t(unsigned char, mmax, dwc_get_dms(dws));
+	}
 }
 
 #define DWC_DEFAULT_CTLLO(_chan) ({				\
 		struct dw_dma_chan *_dwc = to_dw_dma_chan(_chan);	\
 		struct dma_slave_config	*_sconfig = &_dwc->dma_sconfig;	\
 		bool _is_slave = is_slave_direction(_dwc->direction);	\
-		int _dms = dwc_get_master(_chan, DST_MASTER);		\
-		int _sms = dwc_get_master(_chan, SRC_MASTER);		\
 		u8 _smsize = _is_slave ? _sconfig->src_maxburst :	\
 			DW_DMA_MSIZE_16;			\
 		u8 _dmsize = _is_slave ? _sconfig->dst_maxburst :	\
@@ -81,8 +74,8 @@ static inline unsigned int dwc_get_master(struct dma_chan *chan, int master)
 		 | DWC_CTLL_SRC_MSIZE(_smsize)			\
 		 | DWC_CTLL_LLP_D_EN				\
 		 | DWC_CTLL_LLP_S_EN				\
-		 | DWC_CTLL_DMS(_dms)				\
-		 | DWC_CTLL_SMS(_sms));				\
+		 | DWC_CTLL_DMS(_dwc->dst_master)		\
+		 | DWC_CTLL_SMS(_dwc->src_master));		\
 	})
 
 /*
@@ -92,13 +85,6 @@ static inline unsigned int dwc_get_master(struct dma_chan *chan, int master)
  */
 #define NR_DESCS_PER_CHANNEL	64
 
-static inline unsigned int dwc_get_data_width(struct dma_chan *chan, int master)
-{
-	struct dw_dma *dw = to_dw_dma(chan->device);
-
-	return dw->data_width[dwc_get_master(chan, master)];
-}
-
 /*----------------------------------------------------------------------*/
 
 static struct device *chan2dev(struct dma_chan *chan)
@@ -172,13 +158,7 @@ static void dwc_initialize(struct dw_dma_chan *dwc)
 	if (dwc->initialized == true)
 		return;
 
-	if (dws && dws->cfg_hi == ~0 && dws->cfg_lo == ~0) {
-		/* Autoconfigure based on request line from DT */
-		if (dwc->direction == DMA_MEM_TO_DEV)
-			cfghi = DWC_CFGH_DST_PER(dwc->request_line);
-		else if (dwc->direction == DMA_DEV_TO_MEM)
-			cfghi = DWC_CFGH_SRC_PER(dwc->request_line);
-	} else if (dws) {
+	if (dws) {
 		/*
 		 * We need controller-specific data to set up slave
 		 * transfers.
@@ -189,9 +169,9 @@ static void dwc_initialize(struct dw_dma_chan *dwc)
 		cfglo |= dws->cfg_lo & ~DWC_CFGL_CH_PRIOR_MASK;
 	} else {
 		if (dwc->direction == DMA_MEM_TO_DEV)
-			cfghi = DWC_CFGH_DST_PER(dwc->dma_sconfig.slave_id);
+			cfghi = DWC_CFGH_DST_PER(dwc->request_line);
 		else if (dwc->direction == DMA_DEV_TO_MEM)
-			cfghi = DWC_CFGH_SRC_PER(dwc->dma_sconfig.slave_id);
+			cfghi = DWC_CFGH_SRC_PER(dwc->request_line);
 	}
 
 	channel_writel(dwc, CFG_LO, cfglo);
@@ -745,6 +725,7 @@ dwc_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
 		size_t len, unsigned long flags)
 {
 	struct dw_dma_chan	*dwc = to_dw_dma_chan(chan);
+	struct dw_dma		*dw = to_dw_dma(chan->device);
 	struct dw_desc		*desc;
 	struct dw_desc		*first;
 	struct dw_desc		*prev;
@@ -767,8 +748,8 @@ dwc_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
 
 	dwc->direction = DMA_MEM_TO_MEM;
 
-	data_width = min_t(unsigned int, dwc_get_data_width(chan, SRC_MASTER),
-			   dwc_get_data_width(chan, DST_MASTER));
+	data_width = min_t(unsigned int, dw->data_width[dwc->src_master],
+			   dw->data_width[dwc->dst_master]);
 
 	src_width = dst_width = min_t(unsigned int, data_width,
 				      dwc_fast_fls(src | dest | len));
@@ -826,6 +807,7 @@ dwc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
 		unsigned long flags, void *context)
 {
 	struct dw_dma_chan	*dwc = to_dw_dma_chan(chan);
+	struct dw_dma		*dw = to_dw_dma(chan->device);
 	struct dma_slave_config	*sconfig = &dwc->dma_sconfig;
 	struct dw_desc		*prev;
 	struct dw_desc		*first;
@@ -859,7 +841,7 @@ dwc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
 		ctllo |= sconfig->device_fc ? DWC_CTLL_FC(DW_DMA_FC_P_M2P) :
 			DWC_CTLL_FC(DW_DMA_FC_D_M2P);
 
-		data_width = dwc_get_data_width(chan, SRC_MASTER);
+		data_width = dw->data_width[dwc->src_master];
 
 		for_each_sg(sgl, sg, sg_len, i) {
 			struct dw_desc	*desc;
@@ -919,7 +901,7 @@ slave_sg_todev_fill_desc:
 		ctllo |= sconfig->device_fc ? DWC_CTLL_FC(DW_DMA_FC_P_P2M) :
 			DWC_CTLL_FC(DW_DMA_FC_D_P2M);
 
-		data_width = dwc_get_data_width(chan, DST_MASTER);
+		data_width = dw->data_width[dwc->dst_master];
 
 		for_each_sg(sgl, sg, sg_len, i) {
 			struct dw_desc	*desc;
@@ -1020,6 +1002,10 @@ set_runtime_config(struct dma_chan *chan, struct dma_slave_config *sconfig)
 	memcpy(&dwc->dma_sconfig, sconfig, sizeof(*sconfig));
 	dwc->direction = sconfig->direction;
 
+	/* Take the request line from slave_id member */
+	if (dwc->request_line == ~0)
+		dwc->request_line = sconfig->slave_id;
+
 	convert_burst(&dwc->dma_sconfig.src_maxburst);
 	convert_burst(&dwc->dma_sconfig.dst_maxburst);
 	convert_slave_id(dwc);
@@ -1170,6 +1156,8 @@ static int dwc_alloc_chan_resources(struct dma_chan *chan)
 	 * doesn't mean what you think it means), and status writeback.
 	 */
 
+	dwc_set_masters(dwc);
+
 	spin_lock_irqsave(&dwc->lock, flags);
 	i = dwc->descs_allocated;
 	while (dwc->descs_allocated < NR_DESCS_PER_CHANNEL) {
@@ -1227,6 +1215,7 @@ static void dwc_free_chan_resources(struct dma_chan *chan)
 	list_splice_init(&dwc->free_list, &list);
 	dwc->descs_allocated = 0;
 	dwc->initialized = false;
+	dwc->request_line = ~0;
 
 	/* Disable interrupts */
 	channel_clear_bit(dw, MASK.XFER, dwc->mask);
@@ -1254,23 +1243,15 @@ struct dw_dma_of_filter_args {
 static bool dw_dma_of_filter(struct dma_chan *chan, void *param)
 {
 	struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
-	struct dw_dma *dw = to_dw_dma(chan->device);
 	struct dw_dma_of_filter_args *fargs = param;
-	struct dw_dma_slave *dws = &dwc->slave;
 
 	/* Ensure the device matches our channel */
         if (chan->device != &fargs->dw->dma)
                 return false;
 
-	dws->dma_dev	= dw->dma.dev;
-	dws->cfg_hi	= ~0;
-	dws->cfg_lo	= ~0;
-	dws->src_master	= fargs->src;
-	dws->dst_master	= fargs->dst;
-
 	dwc->request_line = fargs->req;
-
-	chan->private = dws;
+	dwc->src_master	= fargs->src;
+	dwc->dst_master	= fargs->dst;
 
 	return true;
 }
@@ -1794,6 +1775,7 @@ static int dw_probe(struct platform_device *pdev)
 		channel_clear_bit(dw, CH_EN, dwc->mask);
 
 		dwc->direction = DMA_TRANS_NONE;
+		dwc->request_line = ~0;
 
 		/* Hardware configuration */
 		if (autocfg) {
diff --git a/drivers/dma/dw_dmac_regs.h b/drivers/dma/dw_dmac_regs.h
index 4d02c36..9b0e12e 100644
--- a/drivers/dma/dw_dmac_regs.h
+++ b/drivers/dma/dw_dmac_regs.h
@@ -212,8 +212,11 @@ struct dw_dma_chan {
 	/* hardware configuration */
 	unsigned int		block_size;
 	bool			nollp;
+
+	/* custom slave configuration */
 	unsigned int		request_line;
-	struct dw_dma_slave	slave;
+	unsigned char		src_master;
+	unsigned char		dst_master;
 
 	/* configuration passed via DMA_SLAVE_CONFIG */
 	struct dma_slave_config dma_sconfig;
-- 
1.8.2.rc0.22.gb3600c3


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

* [PATCH v2 4/4] dmaengine: dw_dmac: simplify master selection
@ 2013-03-26 14:53   ` Andy Shevchenko
  0 siblings, 0 replies; 21+ messages in thread
From: Andy Shevchenko @ 2013-03-26 14:53 UTC (permalink / raw)
  To: linux-arm-kernel

From: Arnd Bergmann <arnd@arndb.de>

The patch to add the common DMA binding added a dummy dw_dma_slave
structure into the dw_dma_chan structure in order to configure the
masters correctly. It turns out that this can be simplified if we
pick the DMA masters in the dwc_alloc_chan_resources function instead
and save them in the dw_dma_chan structure directly.

This could be simplified further once all users that today use
dw_dma_slave for configuration get converted to device tree based
setup instead.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Cc: linux-arm-kernel at lists.infradead.org
---
 drivers/dma/dw_dmac.c      | 76 ++++++++++++++++++----------------------------
 drivers/dma/dw_dmac_regs.h |  5 ++-
 2 files changed, 33 insertions(+), 48 deletions(-)

diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
index c1f017b..5c9fec6 100644
--- a/drivers/dma/dw_dmac.c
+++ b/drivers/dma/dw_dmac.c
@@ -49,29 +49,22 @@ static inline unsigned int dwc_get_sms(struct dw_dma_slave *slave)
 	return slave ? slave->src_master : 1;
 }
 
-#define SRC_MASTER	0
-#define DST_MASTER	1
-
-static inline unsigned int dwc_get_master(struct dma_chan *chan, int master)
+static inline void dwc_set_masters(struct dw_dma_chan *dwc)
 {
-	struct dw_dma *dw = to_dw_dma(chan->device);
-	struct dw_dma_slave *dws = chan->private;
-	unsigned int m;
-
-	if (master == SRC_MASTER)
-		m = dwc_get_sms(dws);
-	else
-		m = dwc_get_dms(dws);
+	struct dw_dma *dw = to_dw_dma(dwc->chan.device);
+	struct dw_dma_slave *dws = dwc->chan.private;
+	unsigned char mmax = dw->nr_masters - 1;
 
-	return min_t(unsigned int, dw->nr_masters - 1, m);
+	if (dwc->request_line == ~0) {
+		dwc->src_master = min_t(unsigned char, mmax, dwc_get_sms(dws));
+		dwc->dst_master = min_t(unsigned char, mmax, dwc_get_dms(dws));
+	}
 }
 
 #define DWC_DEFAULT_CTLLO(_chan) ({				\
 		struct dw_dma_chan *_dwc = to_dw_dma_chan(_chan);	\
 		struct dma_slave_config	*_sconfig = &_dwc->dma_sconfig;	\
 		bool _is_slave = is_slave_direction(_dwc->direction);	\
-		int _dms = dwc_get_master(_chan, DST_MASTER);		\
-		int _sms = dwc_get_master(_chan, SRC_MASTER);		\
 		u8 _smsize = _is_slave ? _sconfig->src_maxburst :	\
 			DW_DMA_MSIZE_16;			\
 		u8 _dmsize = _is_slave ? _sconfig->dst_maxburst :	\
@@ -81,8 +74,8 @@ static inline unsigned int dwc_get_master(struct dma_chan *chan, int master)
 		 | DWC_CTLL_SRC_MSIZE(_smsize)			\
 		 | DWC_CTLL_LLP_D_EN				\
 		 | DWC_CTLL_LLP_S_EN				\
-		 | DWC_CTLL_DMS(_dms)				\
-		 | DWC_CTLL_SMS(_sms));				\
+		 | DWC_CTLL_DMS(_dwc->dst_master)		\
+		 | DWC_CTLL_SMS(_dwc->src_master));		\
 	})
 
 /*
@@ -92,13 +85,6 @@ static inline unsigned int dwc_get_master(struct dma_chan *chan, int master)
  */
 #define NR_DESCS_PER_CHANNEL	64
 
-static inline unsigned int dwc_get_data_width(struct dma_chan *chan, int master)
-{
-	struct dw_dma *dw = to_dw_dma(chan->device);
-
-	return dw->data_width[dwc_get_master(chan, master)];
-}
-
 /*----------------------------------------------------------------------*/
 
 static struct device *chan2dev(struct dma_chan *chan)
@@ -172,13 +158,7 @@ static void dwc_initialize(struct dw_dma_chan *dwc)
 	if (dwc->initialized == true)
 		return;
 
-	if (dws && dws->cfg_hi == ~0 && dws->cfg_lo == ~0) {
-		/* Autoconfigure based on request line from DT */
-		if (dwc->direction == DMA_MEM_TO_DEV)
-			cfghi = DWC_CFGH_DST_PER(dwc->request_line);
-		else if (dwc->direction == DMA_DEV_TO_MEM)
-			cfghi = DWC_CFGH_SRC_PER(dwc->request_line);
-	} else if (dws) {
+	if (dws) {
 		/*
 		 * We need controller-specific data to set up slave
 		 * transfers.
@@ -189,9 +169,9 @@ static void dwc_initialize(struct dw_dma_chan *dwc)
 		cfglo |= dws->cfg_lo & ~DWC_CFGL_CH_PRIOR_MASK;
 	} else {
 		if (dwc->direction == DMA_MEM_TO_DEV)
-			cfghi = DWC_CFGH_DST_PER(dwc->dma_sconfig.slave_id);
+			cfghi = DWC_CFGH_DST_PER(dwc->request_line);
 		else if (dwc->direction == DMA_DEV_TO_MEM)
-			cfghi = DWC_CFGH_SRC_PER(dwc->dma_sconfig.slave_id);
+			cfghi = DWC_CFGH_SRC_PER(dwc->request_line);
 	}
 
 	channel_writel(dwc, CFG_LO, cfglo);
@@ -745,6 +725,7 @@ dwc_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
 		size_t len, unsigned long flags)
 {
 	struct dw_dma_chan	*dwc = to_dw_dma_chan(chan);
+	struct dw_dma		*dw = to_dw_dma(chan->device);
 	struct dw_desc		*desc;
 	struct dw_desc		*first;
 	struct dw_desc		*prev;
@@ -767,8 +748,8 @@ dwc_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
 
 	dwc->direction = DMA_MEM_TO_MEM;
 
-	data_width = min_t(unsigned int, dwc_get_data_width(chan, SRC_MASTER),
-			   dwc_get_data_width(chan, DST_MASTER));
+	data_width = min_t(unsigned int, dw->data_width[dwc->src_master],
+			   dw->data_width[dwc->dst_master]);
 
 	src_width = dst_width = min_t(unsigned int, data_width,
 				      dwc_fast_fls(src | dest | len));
@@ -826,6 +807,7 @@ dwc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
 		unsigned long flags, void *context)
 {
 	struct dw_dma_chan	*dwc = to_dw_dma_chan(chan);
+	struct dw_dma		*dw = to_dw_dma(chan->device);
 	struct dma_slave_config	*sconfig = &dwc->dma_sconfig;
 	struct dw_desc		*prev;
 	struct dw_desc		*first;
@@ -859,7 +841,7 @@ dwc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
 		ctllo |= sconfig->device_fc ? DWC_CTLL_FC(DW_DMA_FC_P_M2P) :
 			DWC_CTLL_FC(DW_DMA_FC_D_M2P);
 
-		data_width = dwc_get_data_width(chan, SRC_MASTER);
+		data_width = dw->data_width[dwc->src_master];
 
 		for_each_sg(sgl, sg, sg_len, i) {
 			struct dw_desc	*desc;
@@ -919,7 +901,7 @@ slave_sg_todev_fill_desc:
 		ctllo |= sconfig->device_fc ? DWC_CTLL_FC(DW_DMA_FC_P_P2M) :
 			DWC_CTLL_FC(DW_DMA_FC_D_P2M);
 
-		data_width = dwc_get_data_width(chan, DST_MASTER);
+		data_width = dw->data_width[dwc->dst_master];
 
 		for_each_sg(sgl, sg, sg_len, i) {
 			struct dw_desc	*desc;
@@ -1020,6 +1002,10 @@ set_runtime_config(struct dma_chan *chan, struct dma_slave_config *sconfig)
 	memcpy(&dwc->dma_sconfig, sconfig, sizeof(*sconfig));
 	dwc->direction = sconfig->direction;
 
+	/* Take the request line from slave_id member */
+	if (dwc->request_line == ~0)
+		dwc->request_line = sconfig->slave_id;
+
 	convert_burst(&dwc->dma_sconfig.src_maxburst);
 	convert_burst(&dwc->dma_sconfig.dst_maxburst);
 	convert_slave_id(dwc);
@@ -1170,6 +1156,8 @@ static int dwc_alloc_chan_resources(struct dma_chan *chan)
 	 * doesn't mean what you think it means), and status writeback.
 	 */
 
+	dwc_set_masters(dwc);
+
 	spin_lock_irqsave(&dwc->lock, flags);
 	i = dwc->descs_allocated;
 	while (dwc->descs_allocated < NR_DESCS_PER_CHANNEL) {
@@ -1227,6 +1215,7 @@ static void dwc_free_chan_resources(struct dma_chan *chan)
 	list_splice_init(&dwc->free_list, &list);
 	dwc->descs_allocated = 0;
 	dwc->initialized = false;
+	dwc->request_line = ~0;
 
 	/* Disable interrupts */
 	channel_clear_bit(dw, MASK.XFER, dwc->mask);
@@ -1254,23 +1243,15 @@ struct dw_dma_of_filter_args {
 static bool dw_dma_of_filter(struct dma_chan *chan, void *param)
 {
 	struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
-	struct dw_dma *dw = to_dw_dma(chan->device);
 	struct dw_dma_of_filter_args *fargs = param;
-	struct dw_dma_slave *dws = &dwc->slave;
 
 	/* Ensure the device matches our channel */
         if (chan->device != &fargs->dw->dma)
                 return false;
 
-	dws->dma_dev	= dw->dma.dev;
-	dws->cfg_hi	= ~0;
-	dws->cfg_lo	= ~0;
-	dws->src_master	= fargs->src;
-	dws->dst_master	= fargs->dst;
-
 	dwc->request_line = fargs->req;
-
-	chan->private = dws;
+	dwc->src_master	= fargs->src;
+	dwc->dst_master	= fargs->dst;
 
 	return true;
 }
@@ -1794,6 +1775,7 @@ static int dw_probe(struct platform_device *pdev)
 		channel_clear_bit(dw, CH_EN, dwc->mask);
 
 		dwc->direction = DMA_TRANS_NONE;
+		dwc->request_line = ~0;
 
 		/* Hardware configuration */
 		if (autocfg) {
diff --git a/drivers/dma/dw_dmac_regs.h b/drivers/dma/dw_dmac_regs.h
index 4d02c36..9b0e12e 100644
--- a/drivers/dma/dw_dmac_regs.h
+++ b/drivers/dma/dw_dmac_regs.h
@@ -212,8 +212,11 @@ struct dw_dma_chan {
 	/* hardware configuration */
 	unsigned int		block_size;
 	bool			nollp;
+
+	/* custom slave configuration */
 	unsigned int		request_line;
-	struct dw_dma_slave	slave;
+	unsigned char		src_master;
+	unsigned char		dst_master;
 
 	/* configuration passed via DMA_SLAVE_CONFIG */
 	struct dma_slave_config dma_sconfig;
-- 
1.8.2.rc0.22.gb3600c3

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

* Re: [PATCH v2 3/4] dw_dmac: make wrapper on of_dma_controller_register()
  2013-03-26 14:53 ` [PATCH v2 3/4] dw_dmac: make wrapper on of_dma_controller_register() Andy Shevchenko
@ 2013-03-26 15:01   ` Arnd Bergmann
  2013-03-26 15:04   ` Lars-Peter Clausen
  1 sibling, 0 replies; 21+ messages in thread
From: Arnd Bergmann @ 2013-03-26 15:01 UTC (permalink / raw)
  To: Andy Shevchenko; +Cc: Vinod Koul, Viresh Kumar, linux-kernel, spear-devel

On Tuesday 26 March 2013, Andy Shevchenko wrote:
> This patch introduces new method dw_dma_of_controller_register() and adds
> checks of the of_node presence together with CONFIG_OF before calling the
> wrapper. It helps to distinguish the real -ENODEV return code of fake one when
> of_dma_controller_register is not implemented.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

Acked-by: Arnd Bergmann <arnd@arndb.de>

Thanks for the update

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

* Re: [PATCH v2 1/4] dw_dmac: fix style of the comments
  2013-03-26 14:53 ` [PATCH v2 1/4] dw_dmac: fix style of the comments Andy Shevchenko
@ 2013-03-26 15:01   ` Arnd Bergmann
  0 siblings, 0 replies; 21+ messages in thread
From: Arnd Bergmann @ 2013-03-26 15:01 UTC (permalink / raw)
  To: Andy Shevchenko; +Cc: Vinod Koul, Viresh Kumar, linux-kernel, spear-devel

On Tuesday 26 March 2013, Andy Shevchenko wrote:
> Let's use capital letter as a first one in the comments.
> There is no functional changes.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

Acked-by: Arnd Bergmann <arnd@arndb.de>

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

* Re: [PATCH v2 2/4] dw_dmac: rename DT related methods to reflect their belonging
  2013-03-26 14:53 ` [PATCH v2 2/4] dw_dmac: rename DT related methods to reflect their belonging Andy Shevchenko
@ 2013-03-26 15:02   ` Arnd Bergmann
  0 siblings, 0 replies; 21+ messages in thread
From: Arnd Bergmann @ 2013-03-26 15:02 UTC (permalink / raw)
  To: Andy Shevchenko; +Cc: Vinod Koul, Viresh Kumar, linux-kernel, spear-devel

On Tuesday 26 March 2013, Andy Shevchenko wrote:
> Since we will have not only DT cases in future let's rename DT related methods
> to reflect their belonging.
> 
> The rename was done as follows:
> 	struct dw_dma_filter_args	-> struct dw_dma_of_filter_args
> 	dw_dma_generic_filter()		-> dw_dma_of_filter()
> 	dw_dma_xlate()			-> dw_dma_of_xlate()
> 	dw_dma_id_table			-> dw_dma_of_id_table
> 
> There is no functional change.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

Acked-by: Arnd Bergmann <arnd@arndb.de>

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

* Re: [PATCH v2 4/4] dmaengine: dw_dmac: simplify master selection
  2013-03-26 14:53   ` Andy Shevchenko
@ 2013-03-26 15:02     ` Arnd Bergmann
  -1 siblings, 0 replies; 21+ messages in thread
From: Arnd Bergmann @ 2013-03-26 15:02 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Vinod Koul, Viresh Kumar, linux-kernel, spear-devel, linux-arm-kernel

On Tuesday 26 March 2013, Andy Shevchenko wrote:
> 
> From: Arnd Bergmann <arnd@arndb.de>
> 
> The patch to add the common DMA binding added a dummy dw_dma_slave
> structure into the dw_dma_chan structure in order to configure the
> masters correctly. It turns out that this can be simplified if we
> pick the DMA masters in the dwc_alloc_chan_resources function instead
> and save them in the dw_dma_chan structure directly.
> 
> This could be simplified further once all users that today use
> dw_dma_slave for configuration get converted to device tree based
> setup instead.
> 
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
> Cc: linux-arm-kernel@lists.infradead.org

Acked-by: Arnd Bergmann <arnd@arndb.de>

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

* [PATCH v2 4/4] dmaengine: dw_dmac: simplify master selection
@ 2013-03-26 15:02     ` Arnd Bergmann
  0 siblings, 0 replies; 21+ messages in thread
From: Arnd Bergmann @ 2013-03-26 15:02 UTC (permalink / raw)
  To: linux-arm-kernel

On Tuesday 26 March 2013, Andy Shevchenko wrote:
> 
> From: Arnd Bergmann <arnd@arndb.de>
> 
> The patch to add the common DMA binding added a dummy dw_dma_slave
> structure into the dw_dma_chan structure in order to configure the
> masters correctly. It turns out that this can be simplified if we
> pick the DMA masters in the dwc_alloc_chan_resources function instead
> and save them in the dw_dma_chan structure directly.
> 
> This could be simplified further once all users that today use
> dw_dma_slave for configuration get converted to device tree based
> setup instead.
> 
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
> Cc: linux-arm-kernel at lists.infradead.org

Acked-by: Arnd Bergmann <arnd@arndb.de>

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

* Re: [PATCH v2 3/4] dw_dmac: make wrapper on of_dma_controller_register()
  2013-03-26 14:53 ` [PATCH v2 3/4] dw_dmac: make wrapper on of_dma_controller_register() Andy Shevchenko
  2013-03-26 15:01   ` Arnd Bergmann
@ 2013-03-26 15:04   ` Lars-Peter Clausen
  2013-03-26 16:59     ` Andy Shevchenko
  2013-03-26 17:04     ` [PATCH v2.1] " Andy Shevchenko
  1 sibling, 2 replies; 21+ messages in thread
From: Lars-Peter Clausen @ 2013-03-26 15:04 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Vinod Koul, Arnd Bergmann, Viresh Kumar, linux-kernel, spear-devel

On 03/26/2013 03:53 PM, Andy Shevchenko wrote:
> This patch introduces new method dw_dma_of_controller_register() and adds
> checks of the of_node presence together with CONFIG_OF before calling the
> wrapper. It helps to distinguish the real -ENODEV return code of fake one when
> of_dma_controller_register is not implemented.

If CONFIG_OF is not set the of_node of the device will always be NULL. Which
means of_dma_controller_register() will only be called if it is implemented.
So you'll never get the -ENODEV from the of_dma_controller_register() stub.

- Lars

> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
>  drivers/dma/dw_dmac.c | 19 ++++++++++++-------
>  1 file changed, 12 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
> index 274fd7d..c1f017b 100644
> --- a/drivers/dma/dw_dmac.c
> +++ b/drivers/dma/dw_dmac.c
> @@ -1303,6 +1303,16 @@ static struct dma_chan *dw_dma_of_xlate(struct of_phandle_args *dma_spec,
>  	return dma_request_channel(cap, dw_dma_of_filter, &fargs);
>  }
>  
> +static void dw_dma_of_controller_register(struct dw_dma *dw)
> +{
> +	struct device *dev = dw->dma.dev;
> +	int err;
> +
> +	err = of_dma_controller_register(dev->of_node, dw_dma_of_xlate, dw);
> +	if (err)
> +		dev_err(dev, "could not register of_dma_controller\n");
> +}
> +
>  /* --------------------- Cyclic DMA API extensions -------------------- */
>  
>  /**
> @@ -1843,13 +1853,8 @@ static int dw_probe(struct platform_device *pdev)
>  
>  	dma_async_device_register(&dw->dma);
>  
> -	if (pdev->dev.of_node) {
> -		err = of_dma_controller_register(pdev->dev.of_node,
> -						 dw_dma_of_xlate, dw);
> -		if (err && err != -ENODEV)
> -			dev_err(&pdev->dev,
> -				"could not register of_dma_controller\n");
> -	}
> +	if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node)
> +		dw_dma_of_controller_register(dw);
>  
>  	return 0;
>  }


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

* Re: [PATCH v2 3/4] dw_dmac: make wrapper on of_dma_controller_register()
  2013-03-26 15:04   ` Lars-Peter Clausen
@ 2013-03-26 16:59     ` Andy Shevchenko
  2013-03-26 17:04     ` [PATCH v2.1] " Andy Shevchenko
  1 sibling, 0 replies; 21+ messages in thread
From: Andy Shevchenko @ 2013-03-26 16:59 UTC (permalink / raw)
  To: Lars-Peter Clausen
  Cc: Vinod Koul, Arnd Bergmann, Viresh Kumar, linux-kernel, spear-devel

On Tue, 2013-03-26 at 16:04 +0100, Lars-Peter Clausen wrote: 
> On 03/26/2013 03:53 PM, Andy Shevchenko wrote:
> > This patch introduces new method dw_dma_of_controller_register() and adds
> > checks of the of_node presence together with CONFIG_OF before calling the
> > wrapper. It helps to distinguish the real -ENODEV return code of fake one when
> > of_dma_controller_register is not implemented.
> 
> If CONFIG_OF is not set the of_node of the device will always be NULL. Which
> means of_dma_controller_register() will only be called if it is implemented.
> So you'll never get the -ENODEV from the of_dma_controller_register() stub.

Thanks for clarification, I'll update the patch.


> 
> - Lars
> 
> > 
> > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > ---
> >  drivers/dma/dw_dmac.c | 19 ++++++++++++-------
> >  1 file changed, 12 insertions(+), 7 deletions(-)
> > 
> > diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
> > index 274fd7d..c1f017b 100644
> > --- a/drivers/dma/dw_dmac.c
> > +++ b/drivers/dma/dw_dmac.c
> > @@ -1303,6 +1303,16 @@ static struct dma_chan *dw_dma_of_xlate(struct of_phandle_args *dma_spec,
> >  	return dma_request_channel(cap, dw_dma_of_filter, &fargs);
> >  }
> >  
> > +static void dw_dma_of_controller_register(struct dw_dma *dw)
> > +{
> > +	struct device *dev = dw->dma.dev;
> > +	int err;
> > +
> > +	err = of_dma_controller_register(dev->of_node, dw_dma_of_xlate, dw);
> > +	if (err)
> > +		dev_err(dev, "could not register of_dma_controller\n");
> > +}
> > +
> >  /* --------------------- Cyclic DMA API extensions -------------------- */
> >  
> >  /**
> > @@ -1843,13 +1853,8 @@ static int dw_probe(struct platform_device *pdev)
> >  
> >  	dma_async_device_register(&dw->dma);
> >  
> > -	if (pdev->dev.of_node) {
> > -		err = of_dma_controller_register(pdev->dev.of_node,
> > -						 dw_dma_of_xlate, dw);
> > -		if (err && err != -ENODEV)
> > -			dev_err(&pdev->dev,
> > -				"could not register of_dma_controller\n");
> > -	}
> > +	if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node)
> > +		dw_dma_of_controller_register(dw);
> >  
> >  	return 0;
> >  }
> 

-- 
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy

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

* [PATCH v2.1] dw_dmac: make wrapper on of_dma_controller_register()
  2013-03-26 15:04   ` Lars-Peter Clausen
  2013-03-26 16:59     ` Andy Shevchenko
@ 2013-03-26 17:04     ` Andy Shevchenko
  2013-03-26 17:07       ` Viresh Kumar
  1 sibling, 1 reply; 21+ messages in thread
From: Andy Shevchenko @ 2013-03-26 17:04 UTC (permalink / raw)
  To: Vinod Koul, Arnd Bergmann, Viresh Kumar, linux-kernel,
	spear-devel, Lars-Peter Clausen
  Cc: Andy Shevchenko

This patch introduces new method dw_dma_of_controller_register(). The wrapper
is called only when of_node is present.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
---
 drivers/dma/dw_dmac.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
index 274fd7d..12657d7 100644
--- a/drivers/dma/dw_dmac.c
+++ b/drivers/dma/dw_dmac.c
@@ -1303,6 +1303,16 @@ static struct dma_chan *dw_dma_of_xlate(struct of_phandle_args *dma_spec,
 	return dma_request_channel(cap, dw_dma_of_filter, &fargs);
 }
 
+static void dw_dma_of_controller_register(struct dw_dma *dw)
+{
+	struct device *dev = dw->dma.dev;
+	int err;
+
+	err = of_dma_controller_register(dev->of_node, dw_dma_of_xlate, dw);
+	if (err)
+		dev_err(dev, "could not register of_dma_controller\n");
+}
+
 /* --------------------- Cyclic DMA API extensions -------------------- */
 
 /**
@@ -1843,13 +1853,8 @@ static int dw_probe(struct platform_device *pdev)
 
 	dma_async_device_register(&dw->dma);
 
-	if (pdev->dev.of_node) {
-		err = of_dma_controller_register(pdev->dev.of_node,
-						 dw_dma_of_xlate, dw);
-		if (err && err != -ENODEV)
-			dev_err(&pdev->dev,
-				"could not register of_dma_controller\n");
-	}
+	if (pdev->dev.of_node)
+		dw_dma_of_controller_register(dw);
 
 	return 0;
 }
-- 
1.8.2.rc0.22.gb3600c3


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

* Re: [PATCH v2.1] dw_dmac: make wrapper on of_dma_controller_register()
  2013-03-26 17:04     ` [PATCH v2.1] " Andy Shevchenko
@ 2013-03-26 17:07       ` Viresh Kumar
  2013-03-26 17:12         ` Andy Shevchenko
  0 siblings, 1 reply; 21+ messages in thread
From: Viresh Kumar @ 2013-03-26 17:07 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Vinod Koul, Arnd Bergmann, linux-kernel, spear-devel, Lars-Peter Clausen

On 26 March 2013 22:34, Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
> This patch introduces new method dw_dma_of_controller_register(). The wrapper
> is called only when of_node is present.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Acked-by: Arnd Bergmann <arnd@arndb.de>
> ---
>  drivers/dma/dw_dmac.c | 19 ++++++++++++-------
>  1 file changed, 12 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
> index 274fd7d..12657d7 100644
> --- a/drivers/dma/dw_dmac.c
> +++ b/drivers/dma/dw_dmac.c
> @@ -1303,6 +1303,16 @@ static struct dma_chan *dw_dma_of_xlate(struct of_phandle_args *dma_spec,
>         return dma_request_channel(cap, dw_dma_of_filter, &fargs);
>  }
>
> +static void dw_dma_of_controller_register(struct dw_dma *dw)
> +{
> +       struct device *dev = dw->dma.dev;
> +       int err;
> +
> +       err = of_dma_controller_register(dev->of_node, dw_dma_of_xlate, dw);
> +       if (err)
> +               dev_err(dev, "could not register of_dma_controller\n");
> +}
> +
>  /* --------------------- Cyclic DMA API extensions -------------------- */
>
>  /**
> @@ -1843,13 +1853,8 @@ static int dw_probe(struct platform_device *pdev)
>
>         dma_async_device_register(&dw->dma);
>
> -       if (pdev->dev.of_node) {
> -               err = of_dma_controller_register(pdev->dev.of_node,
> -                                                dw_dma_of_xlate, dw);
> -               if (err && err != -ENODEV)
> -                       dev_err(&pdev->dev,
> -                               "could not register of_dma_controller\n");
> -       }
> +       if (pdev->dev.of_node)
> +               dw_dma_of_controller_register(dw);

I forgot where we started from, but what's the need of this patch?

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

* Re: [PATCH v2.1] dw_dmac: make wrapper on of_dma_controller_register()
  2013-03-26 17:07       ` Viresh Kumar
@ 2013-03-26 17:12         ` Andy Shevchenko
  2013-03-26 17:16           ` Viresh Kumar
  0 siblings, 1 reply; 21+ messages in thread
From: Andy Shevchenko @ 2013-03-26 17:12 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Vinod Koul, Arnd Bergmann, linux-kernel, spear-devel, Lars-Peter Clausen

On Tue, 2013-03-26 at 22:37 +0530, Viresh Kumar wrote: 
> On 26 March 2013 22:34, Andy Shevchenko
> <andriy.shevchenko@linux.intel.com> wrote:
> > This patch introduces new method dw_dma_of_controller_register(). The wrapper
> > is called only when of_node is present.
> >
> > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > Acked-by: Arnd Bergmann <arnd@arndb.de>
> > ---
> >  drivers/dma/dw_dmac.c | 19 ++++++++++++-------
> >  1 file changed, 12 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
> > index 274fd7d..12657d7 100644
> > --- a/drivers/dma/dw_dmac.c
> > +++ b/drivers/dma/dw_dmac.c
> > @@ -1303,6 +1303,16 @@ static struct dma_chan *dw_dma_of_xlate(struct of_phandle_args *dma_spec,
> >         return dma_request_channel(cap, dw_dma_of_filter, &fargs);
> >  }
> >
> > +static void dw_dma_of_controller_register(struct dw_dma *dw)
> > +{
> > +       struct device *dev = dw->dma.dev;
> > +       int err;
> > +
> > +       err = of_dma_controller_register(dev->of_node, dw_dma_of_xlate, dw);
> > +       if (err)
> > +               dev_err(dev, "could not register of_dma_controller\n");
> > +}
> > +
> >  /* --------------------- Cyclic DMA API extensions -------------------- */
> >
> >  /**
> > @@ -1843,13 +1853,8 @@ static int dw_probe(struct platform_device *pdev)
> >
> >         dma_async_device_register(&dw->dma);
> >
> > -       if (pdev->dev.of_node) {
> > -               err = of_dma_controller_register(pdev->dev.of_node,
> > -                                                dw_dma_of_xlate, dw);
> > -               if (err && err != -ENODEV)
> > -                       dev_err(&pdev->dev,
> > -                               "could not register of_dma_controller\n");
> > -       }
> > +       if (pdev->dev.of_node)
> > +               dw_dma_of_controller_register(dw);
> 
> I forgot where we started from, but what's the need of this patch?

Nowadays, besides removal of the -ENODEV checking, it makes probe
function looks tidier.

Think about upcoming stuff (e.g. ACPI), if we put everything inside
probe it will look overloaded.


-- 
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy

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

* Re: [PATCH v2.1] dw_dmac: make wrapper on of_dma_controller_register()
  2013-03-26 17:12         ` Andy Shevchenko
@ 2013-03-26 17:16           ` Viresh Kumar
  2013-03-26 17:29             ` [PATCH v2.2] dw_dmac: remove unnecessary ENODEV check Andy Shevchenko
  0 siblings, 1 reply; 21+ messages in thread
From: Viresh Kumar @ 2013-03-26 17:16 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Vinod Koul, Arnd Bergmann, linux-kernel, spear-devel, Lars-Peter Clausen

On 26 March 2013 22:42, Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
> Nowadays, besides removal of the -ENODEV checking, it makes probe
> function looks tidier.

Removal of -ENODEV is okay but am not sure if it makes code good :)

This is unnecessary abstraction for just calling a single routine. If that
part was bigger, i would have agreed but to me this wrapper is just
adding abstraction and nothing more.

--
viresh

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

* [PATCH v2.2] dw_dmac: remove unnecessary ENODEV check
  2013-03-26 17:16           ` Viresh Kumar
@ 2013-03-26 17:29             ` Andy Shevchenko
  2013-03-26 17:31               ` Viresh Kumar
  0 siblings, 1 reply; 21+ messages in thread
From: Andy Shevchenko @ 2013-03-26 17:29 UTC (permalink / raw)
  To: Vinod Koul, Arnd Bergmann, Viresh Kumar, linux-kernel,
	spear-devel, Lars-Peter Clausen
  Cc: Andy Shevchenko

If CONFIG_OF is not set the of_node of the device will always be NULL.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/dma/dw_dmac.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
index 274fd7d..736cffa 100644
--- a/drivers/dma/dw_dmac.c
+++ b/drivers/dma/dw_dmac.c
@@ -1846,7 +1846,7 @@ static int dw_probe(struct platform_device *pdev)
 	if (pdev->dev.of_node) {
 		err = of_dma_controller_register(pdev->dev.of_node,
 						 dw_dma_of_xlate, dw);
-		if (err && err != -ENODEV)
+		if (err)
 			dev_err(&pdev->dev,
 				"could not register of_dma_controller\n");
 	}
-- 
1.8.2.rc0.22.gb3600c3


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

* Re: [PATCH v2.2] dw_dmac: remove unnecessary ENODEV check
  2013-03-26 17:29             ` [PATCH v2.2] dw_dmac: remove unnecessary ENODEV check Andy Shevchenko
@ 2013-03-26 17:31               ` Viresh Kumar
  2013-03-26 18:15                 ` Arnd Bergmann
  0 siblings, 1 reply; 21+ messages in thread
From: Viresh Kumar @ 2013-03-26 17:31 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Vinod Koul, Arnd Bergmann, linux-kernel, spear-devel, Lars-Peter Clausen

On 26 March 2013 22:59, Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
> If CONFIG_OF is not set the of_node of the device will always be NULL.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
>  drivers/dma/dw_dmac.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
> index 274fd7d..736cffa 100644
> --- a/drivers/dma/dw_dmac.c
> +++ b/drivers/dma/dw_dmac.c
> @@ -1846,7 +1846,7 @@ static int dw_probe(struct platform_device *pdev)
>         if (pdev->dev.of_node) {
>                 err = of_dma_controller_register(pdev->dev.of_node,
>                                                  dw_dma_of_xlate, dw);
> -               if (err && err != -ENODEV)
> +               if (err)
>                         dev_err(&pdev->dev,
>                                 "could not register of_dma_controller\n");

Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

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

* Re: [PATCH v2.2] dw_dmac: remove unnecessary ENODEV check
  2013-03-26 17:31               ` Viresh Kumar
@ 2013-03-26 18:15                 ` Arnd Bergmann
  0 siblings, 0 replies; 21+ messages in thread
From: Arnd Bergmann @ 2013-03-26 18:15 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Andy Shevchenko, Vinod Koul, linux-kernel, spear-devel,
	Lars-Peter Clausen

On Tuesday 26 March 2013, Viresh Kumar wrote:
> 
> On 26 March 2013 22:59, Andy Shevchenko
> <andriy.shevchenko@linux.intel.com> wrote:
> > If CONFIG_OF is not set the of_node of the device will always be NULL.
> >
> > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > ---
> >  drivers/dma/dw_dmac.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
> > index 274fd7d..736cffa 100644
> > --- a/drivers/dma/dw_dmac.c
> > +++ b/drivers/dma/dw_dmac.c
> > @@ -1846,7 +1846,7 @@ static int dw_probe(struct platform_device *pdev)
> >         if (pdev->dev.of_node) {
> >                 err = of_dma_controller_register(pdev->dev.of_node,
> >                                                  dw_dma_of_xlate, dw);
> > -               if (err && err != -ENODEV)
> > +               if (err)
> >                         dev_err(&pdev->dev,
> >                                 "could not register of_dma_controller\n");
> 
> Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

Acked-by: Arnd Bergmann <arnd@arndb.de>

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

* Re: [PATCH v2 0/4] dw_dmac: cleanup for DT usage
  2013-03-26 14:53 [PATCH v2 0/4] dw_dmac: cleanup for DT usage Andy Shevchenko
                   ` (3 preceding siblings ...)
  2013-03-26 14:53   ` Andy Shevchenko
@ 2013-04-01 17:55 ` Vinod Koul
  4 siblings, 0 replies; 21+ messages in thread
From: Vinod Koul @ 2013-04-01 17:55 UTC (permalink / raw)
  To: Andy Shevchenko; +Cc: Arnd Bergmann, Viresh Kumar, linux-kernel, spear-devel

On Tue, Mar 26, 2013 at 04:53:53PM +0200, Andy Shevchenko wrote:
> It includes few cleanups when used with DT. Patch 4/4 is a modified version of
> the [1].
Applied 1, 2, 4 & 2.2

Thanks
~Vinod
> 
> [1] http://www.spinics.net/lists/arm-kernel/msg225366.html
> 
> Since v1:
>  - address Arnd's comments
>  - apply Acks I got from Viresh
> 
> Andy Shevchenko (3):
>   dw_dmac: fix style of the comments
>   dw_dmac: rename DT related methods to reflect their belonging
>   dw_dmac: make wrapper on of_dma_controller_register()
> 
> Arnd Bergmann (1):
>   dmaengine: dw_dmac: simplify master selection
> 
>  drivers/dma/dw_dmac.c      | 145 +++++++++++++++++++++------------------------
>  drivers/dma/dw_dmac_regs.h |   5 +-
>  2 files changed, 71 insertions(+), 79 deletions(-)
> 
> -- 
> 1.8.2.rc0.22.gb3600c3
> 

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

end of thread, other threads:[~2013-04-01 18:23 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-03-26 14:53 [PATCH v2 0/4] dw_dmac: cleanup for DT usage Andy Shevchenko
2013-03-26 14:53 ` [PATCH v2 1/4] dw_dmac: fix style of the comments Andy Shevchenko
2013-03-26 15:01   ` Arnd Bergmann
2013-03-26 14:53 ` [PATCH v2 2/4] dw_dmac: rename DT related methods to reflect their belonging Andy Shevchenko
2013-03-26 15:02   ` Arnd Bergmann
2013-03-26 14:53 ` [PATCH v2 3/4] dw_dmac: make wrapper on of_dma_controller_register() Andy Shevchenko
2013-03-26 15:01   ` Arnd Bergmann
2013-03-26 15:04   ` Lars-Peter Clausen
2013-03-26 16:59     ` Andy Shevchenko
2013-03-26 17:04     ` [PATCH v2.1] " Andy Shevchenko
2013-03-26 17:07       ` Viresh Kumar
2013-03-26 17:12         ` Andy Shevchenko
2013-03-26 17:16           ` Viresh Kumar
2013-03-26 17:29             ` [PATCH v2.2] dw_dmac: remove unnecessary ENODEV check Andy Shevchenko
2013-03-26 17:31               ` Viresh Kumar
2013-03-26 18:15                 ` Arnd Bergmann
2013-03-26 14:53 ` [PATCH v2 4/4] dmaengine: dw_dmac: simplify master selection Andy Shevchenko
2013-03-26 14:53   ` Andy Shevchenko
2013-03-26 15:02   ` Arnd Bergmann
2013-03-26 15:02     ` Arnd Bergmann
2013-04-01 17:55 ` [PATCH v2 0/4] dw_dmac: cleanup for DT usage Vinod Koul

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.