dmaengine: i.MX dma fixes

6 messages, 2 authors, 2011-01-31 · open the first message on its own page

dmaengine: i.MX dma fixes

From: Sascha Hauer <s.hauer@pengutronix.de>
Date: 2011-01-31 12:00:54

The following contains fixes for the i.MX dma driver.

Sascha

The following changes since commit 1bae4ce27c9c90344f23c65ea6966c50ffeae2f5:

  Linux 2.6.38-rc2 (2011-01-21 19:01:34 -0800)

are available in the git repository at:
  git://git.pengutronix.de/git/imx/linux-2.6 dmaengine-imxdma

Sascha Hauer (4):
      dmaengine i.MX dma: set maximum segment size for our device
      dmaengine i.MX dma: check sg entries for valid addresses and lengths
      dmaengine i.MX DMA: do not initialize chan_id field
      dmaengine i.MX dma: initialize dma capabilities outside channel loop

 drivers/dma/imx-dma.c |   26 ++++++++++++++++++++++----
 1 files changed, 22 insertions(+), 4 deletions(-)

[PATCH 3/4] dmaengine i.MX DMA: do not initialize chan_id field

From: Sascha Hauer <s.hauer@pengutronix.de>
Date: 2011-01-31 12:00:55

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 drivers/dma/imx-dma.c |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)
diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c
index a1eac99..8262708 100644
--- a/drivers/dma/imx-dma.c
+++ b/drivers/dma/imx-dma.c
@@ -366,7 +366,6 @@ static int __init imxdma_probe(struct platform_device *pdev)
 		dma_cap_set(DMA_CYCLIC, imxdma->dma_device.cap_mask);
 
 		imxdmac->chan.device = &imxdma->dma_device;
-		imxdmac->chan.chan_id = i;
 		imxdmac->channel = i;
 
 		/* Add the channel to the DMAC list */
-- 
1.7.2.3

[PATCH 4/4] dmaengine i.MX dma: initialize dma capabilities outside channel loop

From: Sascha Hauer <s.hauer@pengutronix.de>
Date: 2011-01-31 12:00:56

The capabilities are device specific fields, not channel specific fields.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 drivers/dma/imx-dma.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c
index 8262708..e18eaab 100644
--- a/drivers/dma/imx-dma.c
+++ b/drivers/dma/imx-dma.c
@@ -345,6 +345,9 @@ static int __init imxdma_probe(struct platform_device *pdev)
 
 	INIT_LIST_HEAD(&imxdma->dma_device.channels);
 
+	dma_cap_set(DMA_SLAVE, imxdma->dma_device.cap_mask);
+	dma_cap_set(DMA_CYCLIC, imxdma->dma_device.cap_mask);
+
 	/* Initialize channel parameters */
 	for (i = 0; i < MAX_DMA_CHANNELS; i++) {
 		struct imxdma_channel *imxdmac = &imxdma->channel[i];
@@ -362,9 +365,6 @@ static int __init imxdma_probe(struct platform_device *pdev)
 		imxdmac->imxdma = imxdma;
 		spin_lock_init(&imxdmac->lock);
 
-		dma_cap_set(DMA_SLAVE, imxdma->dma_device.cap_mask);
-		dma_cap_set(DMA_CYCLIC, imxdma->dma_device.cap_mask);
-
 		imxdmac->chan.device = &imxdma->dma_device;
 		imxdmac->channel = i;
 
-- 
1.7.2.3

[PATCH 1/4] dmaengine i.MX dma: set maximum segment size for our device

From: Sascha Hauer <s.hauer@pengutronix.de>
Date: 2011-01-31 12:00:57

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 drivers/dma/imx-dma.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c
index e53d438..a46e1d9 100644
--- a/drivers/dma/imx-dma.c
+++ b/drivers/dma/imx-dma.c
@@ -49,6 +49,7 @@ struct imxdma_channel {
 
 struct imxdma_engine {
 	struct device			*dev;
+	struct device_dma_parameters	dma_parms;
 	struct dma_device		dma_device;
 	struct imxdma_channel		channel[MAX_DMA_CHANNELS];
 };
@@ -370,6 +371,9 @@ static int __init imxdma_probe(struct platform_device *pdev)
 
 	platform_set_drvdata(pdev, imxdma);
 
+	imxdma->dma_device.dev->dma_parms = &imxdma->dma_parms;
+	dma_set_max_seg_size(imxdma->dma_device.dev, 0xffffff);
+
 	ret = dma_async_device_register(&imxdma->dma_device);
 	if (ret) {
 		dev_err(&pdev->dev, "unable to register\n");
-- 
1.7.2.3

[PATCH 2/4] dmaengine i.MX dma: check sg entries for valid addresses and lengths

From: Sascha Hauer <s.hauer@pengutronix.de>
Date: 2011-01-31 12:00:59

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 drivers/dma/imx-dma.c |   15 +++++++++++++++
 1 files changed, 15 insertions(+), 0 deletions(-)
diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c
index a46e1d9..a1eac99 100644
--- a/drivers/dma/imx-dma.c
+++ b/drivers/dma/imx-dma.c
@@ -243,6 +243,21 @@ static struct dma_async_tx_descriptor *imxdma_prep_slave_sg(
 	else
 		dmamode = DMA_MODE_WRITE;
 
+	switch (imxdmac->word_size) {
+	case DMA_SLAVE_BUSWIDTH_4_BYTES:
+		if (sgl->length & 3 || sgl->dma_address & 3)
+			return NULL;
+		break;
+	case DMA_SLAVE_BUSWIDTH_2_BYTES:
+		if (sgl->length & 1 || sgl->dma_address & 1)
+			return NULL;
+		break;
+	case DMA_SLAVE_BUSWIDTH_1_BYTE:
+		break;
+	default:
+		return NULL;
+	}
+
 	ret = imx_dma_setup_sg(imxdmac->imxdma_channel, sgl, sg_len,
 		 dma_length, imxdmac->per_address, dmamode);
 	if (ret)
-- 
1.7.2.3

Re: dmaengine: i.MX dma fixes

From: Sergei Shtylyov <hidden>
Date: 2011-01-31 12:22:46

Hello.

On 31-01-2011 15:00, Sascha Hauer wrote:
The following contains fixes for the i.MX dma driver.
Sascha
The following changes since commit 1bae4ce27c9c90344f23c65ea6966c50ffeae2f5:
   Linux 2.6.38-rc2 (2011-01-21 19:01:34 -0800)
are available in the git repository at:
   git://git.pengutronix.de/git/imx/linux-2.6 dmaengine-imxdma
Sascha Hauer (4):
       dmaengine i.MX dma: set maximum segment size for our device
       dmaengine i.MX dma: check sg entries for valid addresses and lengths
       dmaengine i.MX DMA: do not initialize chan_id field
       dmaengine i.MX dma: initialize dma capabilities outside channel loop
  drivers/dma/imx-dma.c |   26 ++++++++++++++++++++++----
  1 files changed, 22 insertions(+), 4 deletions(-)
    Actually, would have made sense to combine the analogous changes to SDMA 
and DMA drivers into the single patch...

WBR, Sergei
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help