Re: [PATCH v9 4/4] dmaengine: fsl-edma: add ColdFire mcf5441x edma support

2018-08-12 Thread Krzysztof Kozlowski
On 11 August 2018 at 13:26, Angelo Dureghello  wrote:
> This patch adds support for ColdFire mcf5441x-family edma
> module.
>
> The ColdFire edma module is slightly different from fsl-edma,
> so a new driver is added. But most of the code is common
> between fsl-edma and mcf-edma so it has been collected into a
> separate common module fsl-edma-common (patch 1/3).
>
> Signed-off-by: Angelo Dureghello 
> ---
> Changes for v8:
> - patch rewritten from scratch, this patch (3/3) has just been added.
>
> Changes for v9:
> - add compile test for Kconfig,
> - fix include guard.
> ---
>  drivers/dma/Kconfig|  11 +
>  drivers/dma/Makefile   |   1 +
>  drivers/dma/fsl-edma-common.c  |  24 +-
>  drivers/dma/mcf-edma.c | 315 +
>  include/linux/platform_data/dma-mcf-edma.h |  38 +++
>  5 files changed, 385 insertions(+), 4 deletions(-)
>  create mode 100644 drivers/dma/mcf-edma.c
>  create mode 100644 include/linux/platform_data/dma-mcf-edma.h

Here and in other patches I already gave you my Tested-by tags...

Best regards,
Krzysztof


[PATCH v9 4/4] dmaengine: fsl-edma: add ColdFire mcf5441x edma support

2018-08-11 Thread Angelo Dureghello
This patch adds support for ColdFire mcf5441x-family edma
module.

The ColdFire edma module is slightly different from fsl-edma,
so a new driver is added. But most of the code is common
between fsl-edma and mcf-edma so it has been collected into a
separate common module fsl-edma-common (patch 1/3).

Signed-off-by: Angelo Dureghello 
---
Changes for v8:
- patch rewritten from scratch, this patch (3/3) has just been added.

Changes for v9:
- add compile test for Kconfig,
- fix include guard.
---
 drivers/dma/Kconfig|  11 +
 drivers/dma/Makefile   |   1 +
 drivers/dma/fsl-edma-common.c  |  24 +-
 drivers/dma/mcf-edma.c | 315 +
 include/linux/platform_data/dma-mcf-edma.h |  38 +++
 5 files changed, 385 insertions(+), 4 deletions(-)
 create mode 100644 drivers/dma/mcf-edma.c
 create mode 100644 include/linux/platform_data/dma-mcf-edma.h

diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index ca1680afa20a..45ca5e556774 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -320,6 +320,17 @@ config LPC18XX_DMAMUX
  Enable support for DMA on NXP LPC18xx/43xx platforms
  with PL080 and multiplexed DMA request lines.
 
+config MCF_EDMA
+   tristate "Freescale eDMA engine support, ColdFire mcf5441x SoCs"
+   depends on M5441x || COMPILE_TEST
+   select DMA_ENGINE
+   select DMA_VIRTUAL_CHANNELS
+   help
+ Support the Freescale ColdFire eDMA engine, 64-channel
+ implementation that performs complex data transfers with
+ minimal intervention from a host processor.
+ This module can be found on Freescale ColdFire mcf5441x SoCs.
+
 config MMP_PDMA
bool "MMP PDMA support"
depends on ARCH_MMP || ARCH_PXA || COMPILE_TEST
diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile
index 66022f59fca4..d97f317f4b34 100644
--- a/drivers/dma/Makefile
+++ b/drivers/dma/Makefile
@@ -32,6 +32,7 @@ obj-$(CONFIG_DW_DMAC_CORE) += dw/
 obj-$(CONFIG_EP93XX_DMA) += ep93xx_dma.o
 obj-$(CONFIG_FSL_DMA) += fsldma.o
 obj-$(CONFIG_FSL_EDMA) += fsl-edma.o fsl-edma-common.o
+obj-$(CONFIG_MCF_EDMA) += mcf-edma.o fsl-edma-common.o
 obj-$(CONFIG_FSL_RAID) += fsl_raid.o
 obj-$(CONFIG_HSU_DMA) += hsu/
 obj-$(CONFIG_IMG_MDC_DMA) += img-mdc-dma.o
diff --git a/drivers/dma/fsl-edma-common.c b/drivers/dma/fsl-edma-common.c
index 227034de256e..8ba80f4b6f55 100644
--- a/drivers/dma/fsl-edma-common.c
+++ b/drivers/dma/fsl-edma-common.c
@@ -46,8 +46,16 @@ static void fsl_edma_enable_request(struct fsl_edma_chan 
*fsl_chan)
struct edma_regs *regs = _chan->edma->regs;
u32 ch = fsl_chan->vchan.chan.chan_id;
 
-   edma_writeb(fsl_chan->edma, EDMA_SEEI_SEEI(ch), regs->seei);
-   edma_writeb(fsl_chan->edma, ch, regs->serq);
+   if (fsl_chan->edma->version == v1) {
+   edma_writeb(fsl_chan->edma, EDMA_SEEI_SEEI(ch), regs->seei);
+   edma_writeb(fsl_chan->edma, ch, regs->serq);
+   } else {
+   /* ColdFire is big endian, and accesses natively
+* big endian I/O peripherals
+*/
+   iowrite8(EDMA_SEEI_SEEI(ch), regs->seei);
+   iowrite8(ch, regs->serq);
+   }
 }
 
 void fsl_edma_disable_request(struct fsl_edma_chan *fsl_chan)
@@ -55,8 +63,16 @@ void fsl_edma_disable_request(struct fsl_edma_chan *fsl_chan)
struct edma_regs *regs = _chan->edma->regs;
u32 ch = fsl_chan->vchan.chan.chan_id;
 
-   edma_writeb(fsl_chan->edma, ch, regs->cerq);
-   edma_writeb(fsl_chan->edma, EDMA_CEEI_CEEI(ch), regs->ceei);
+   if (fsl_chan->edma->version == v1) {
+   edma_writeb(fsl_chan->edma, ch, regs->cerq);
+   edma_writeb(fsl_chan->edma, EDMA_CEEI_CEEI(ch), regs->ceei);
+   } else {
+   /* ColdFire is big endian, and accesses natively
+* big endian I/O peripherals
+*/
+   iowrite8(ch, regs->cerq);
+   iowrite8(EDMA_CEEI_CEEI(ch), regs->ceei);
+   }
 }
 EXPORT_SYMBOL_GPL(fsl_edma_disable_request);
 
diff --git a/drivers/dma/mcf-edma.c b/drivers/dma/mcf-edma.c
new file mode 100644
index ..d4b2fd871ff4
--- /dev/null
+++ b/drivers/dma/mcf-edma.c
@@ -0,0 +1,315 @@
+// SPDX-License-Identifier: GPL-2.0+
+//
+// Copyright (c) 2013-2014 Freescale Semiconductor, Inc
+// Copyright (c) 2017 Sysam, Angelo Dureghello  
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "fsl-edma-common.h"
+
+#define EDMA_CHANNELS  64
+#define EDMA_MASK_CH(x)((x) & GENMASK(5, 0))
+
+static irqreturn_t mcf_edma_tx_handler(int irq, void *dev_id)
+{
+   struct fsl_edma_engine *mcf_edma = dev_id;
+   struct edma_regs *regs = _edma->regs;
+   unsigned int ch;
+   struct fsl_edma_chan *mcf_chan;
+   u64 intmap;
+
+   intmap = ioread32(regs->inth);
+   intmap <<= 32;
+   intmap |= ioread32(regs->intl);