RE: [PATCH V1] spi: imx: add dma support for ecspi

2014-02-12 Thread Yibin Gong
Sorry, I miss the message .Thanks Shawn's reminding and thanks Sascha's 
comments and I will talk with Frank.

-Original Message-
From: Shawn Guo [mailto:shawn@linaro.org] 
Sent: Thursday, February 13, 2014 9:56 AM
To: Gong Yibin-B38343
Cc: broo...@kernel.org; s.ha...@pengutronix.de; linux-...@vger.kernel.org; 
linux-kernel@vger.kernel.org; Huang Shijie-B32955
Subject: Re: [PATCH V1] spi: imx: add dma support for ecspi

On Wed, Feb 12, 2014 at 06:02:59PM +0800, Robin Gong wrote:
> Add basical dma support for ecspi. Validate on i.MX6qsabresd board.
> 
> Signed-off-by: Robin Gong 

Robin,

Are you aware of the submission [1] from Frank Li?  You may want to coordinate 
the effort with him.

Shawn

[1] http://thread.gmane.org/gmane.linux.ports.arm.kernel/291722

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH V1] spi: imx: add dma support for ecspi

2014-02-12 Thread Shawn Guo
On Wed, Feb 12, 2014 at 06:02:59PM +0800, Robin Gong wrote:
> Add basical dma support for ecspi. Validate on i.MX6qsabresd board.
> 
> Signed-off-by: Robin Gong 

Robin,

Are you aware of the submission [1] from Frank Li?  You may want to
coordinate the effort with him.

Shawn

[1] http://thread.gmane.org/gmane.linux.ports.arm.kernel/291722

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH V1] spi: imx: add dma support for ecspi

2014-02-12 Thread Sascha Hauer
On Wed, Feb 12, 2014 at 06:02:59PM +0800, Robin Gong wrote:
> Add basical dma support for ecspi. Validate on i.MX6qsabresd board.
> 
> Signed-off-by: Robin Gong 
> ---
>  drivers/spi/spi-imx.c |  221 ++--
>  1 files changed, 211 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
> index a5474ef..6a80658 100644
> --- a/drivers/spi/spi-imx.c
> +++ b/drivers/spi/spi-imx.c
> @@ -21,6 +21,8 @@
>  #include 
>  #include 
>  #include 
> +#include 
> +#include 
>  #include 
>  #include 
>  #include 
> @@ -42,6 +44,9 @@
>  
>  #define DRIVER_NAME "spi_imx"
>  
> +#define DMA_SG_MAXLEN0x /* align with imx-sdma.c */
> +#define ECSPI_TIMEOUT1000
> +
>  #define MXC_CSPIRXDATA   0x00
>  #define MXC_CSPITXDATA   0x04
>  #define MXC_CSPICTRL 0x08
> @@ -76,13 +81,14 @@ struct spi_imx_devtype_data {
>   void (*trigger)(struct spi_imx_data *);
>   int (*rx_available)(struct spi_imx_data *);
>   void (*reset)(struct spi_imx_data *);
> + void (*dmactrl)(struct spi_imx_data *, int);
>   enum spi_imx_devtype devtype;
>  };
>  
>  struct spi_imx_data {
>   struct spi_bitbang bitbang;
>  
> - struct completion xfer_done;
> + struct completion rx_done; /* PIO mode use rx_done both rx/tx */

Why rename it? Just keep the original name.

>   void __iomem *base;
>   int irq;
>   struct clk *clk_per;
> @@ -96,6 +102,16 @@ struct spi_imx_data {
>   const void *tx_buf;
>   unsigned int txfifo; /* number of words pushed in tx FIFO */
>  
> + /* DMA used */
> + struct dma_chan *rx_dmach;  /* rx dma channel */
> + struct dma_chan *tx_dmach;  /* tx dma channel */
> + dma_addr_t src_start;
> + dma_addr_t dst_start;
> + dma_addr_t rxfifo_phy;
> + dma_addr_t txfifo_phy;
> + struct completion tx_done;
> + void *dummy_buf; /* send or receive dummy data in DMA mode */
> +
>   const struct spi_imx_devtype_data *devtype_data;
>   int chipselect[0];
>  };
> @@ -185,6 +201,7 @@ static unsigned int spi_imx_clkdiv_2(unsigned int fin,
>  #define MX51_ECSPI_CTRL  0x08
>  #define MX51_ECSPI_CTRL_ENABLE   (1 <<  0)
>  #define MX51_ECSPI_CTRL_XCH  (1 <<  2)
> +#define MX51_ECSPI_CTRL_SMC  (1 <<  3)
>  #define MX51_ECSPI_CTRL_MODE_MASK(0xf << 4)
>  #define MX51_ECSPI_CTRL_POSTDIV_OFFSET   8
>  #define MX51_ECSPI_CTRL_PREDIV_OFFSET12
> @@ -202,6 +219,17 @@ static unsigned int spi_imx_clkdiv_2(unsigned int fin,
>  #define MX51_ECSPI_INT_TEEN  (1 <<  0)
>  #define MX51_ECSPI_INT_RREN  (1 <<  3)
>  
> +#define MX51_ECSPI_DMA   0x14
> +#define MX51_ECSPI_DMA_TXTHR_OFFSET  (0)
> +#define MX51_ECSPI_DMA_TXTHR_MASK(0x3f << MX51_ECSPI_DMA_TXTHR_OFFSET)
> +#define MX51_ECSPI_DMA_TXDEN (1 << 7)
> +#define MX51_ECSPI_DMA_RXTHR_OFFSET  (16)
> +#define MX51_ECSPI_DMA_RXTHR_MASK(0x3f << MX51_ECSPI_DMA_RXTHR_OFFSET)
> +#define MX51_ECSPI_DMA_RXDEN (1 << 23)
> +#define MX51_ECSPI_DMA_RXDMALEN_OFFSET   (24)
> +#define MX51_ECSPI_DMA_RXDMALEN_MASK (0x3f << MX51_ECSPI_DMA_RXDMALEN_OFFSET)
> +#define MX51_ECSPI_DMA_RXTDEN(1 << 31)
> +
>  #define MX51_ECSPI_STAT  0x18
>  #define MX51_ECSPI_STAT_RR   (1 <<  3)
>  
> @@ -288,6 +316,10 @@ static int __maybe_unused mx51_ecspi_config(struct 
> spi_imx_data *spi_imx,
>  
>   ctrl |= (config->bpw - 1) << MX51_ECSPI_CTRL_BL_OFFSET;
>  
> + /* set smc bit for dma */
> + if (spi_imx->rx_dmach)
> + ctrl |= MX51_ECSPI_CTRL_SMC;

The comment just states the obvious. Remove it.

> +
>   cfg |= MX51_ECSPI_CONFIG_SBBCTRL(config->cs);
>  
>   if (config->mode & SPI_CPHA)
> @@ -303,6 +335,26 @@ static int __maybe_unused mx51_ecspi_config(struct 
> spi_imx_data *spi_imx,
>   writel(ctrl, spi_imx->base + MX51_ECSPI_CTRL);
>   writel(cfg, spi_imx->base + MX51_ECSPI_CONFIG);
>  
> + /* set rx/tx fifo threshold in DMA mode */
> + if (spi_imx->rx_dmach) {
> + cfg = readl(spi_imx->base + MX51_ECSPI_DMA);
> + cfg &= ~(MX51_ECSPI_DMA_TXTHR_MASK | MX51_ECSPI_DMA_RXTHR_MASK
> + | MX51_ECSPI_DMA_RXDMALEN_MASK);
> + /* set rx/tx fifo threshold */
> + cfg |= (spi_imx_get_fifosize(spi_imx) / 2) <<
> + MX51_ECSPI_DMA_TXTHR_OFFSET;
> + cfg |= (spi_imx_get_fifosize(spi_imx) / 2) <<
> + MX51_ECSPI_DMA_RXTHR_OFFSET;
> + /*
> +  * set RX_DMA_LENTH to 1 to prvent missing the last bytes which
> +  * is less than rx threshold based on current design.
> +  */
> + cfg |= 1 << MX51_ECSPI_DMA_RXDMALEN_OFFSET;
> + cfg |= MX51_ECSPI_DMA_RXTDEN;
> +
> + writel(cfg, spi_imx->base + MX51_ECSPI_DMA);
> + }

You exactly *know* the value to write to the 

[PATCH V1] spi: imx: add dma support for ecspi

2014-02-12 Thread Robin Gong
Add basical dma support for ecspi. Validate on i.MX6qsabresd board.

Signed-off-by: Robin Gong 
---
 drivers/spi/spi-imx.c |  221 ++--
 1 files changed, 211 insertions(+), 10 deletions(-)

diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index a5474ef..6a80658 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -21,6 +21,8 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 #include 
 #include 
 #include 
@@ -42,6 +44,9 @@
 
 #define DRIVER_NAME "spi_imx"
 
+#define DMA_SG_MAXLEN  0x /* align with imx-sdma.c */
+#define ECSPI_TIMEOUT  1000
+
 #define MXC_CSPIRXDATA 0x00
 #define MXC_CSPITXDATA 0x04
 #define MXC_CSPICTRL   0x08
@@ -76,13 +81,14 @@ struct spi_imx_devtype_data {
void (*trigger)(struct spi_imx_data *);
int (*rx_available)(struct spi_imx_data *);
void (*reset)(struct spi_imx_data *);
+   void (*dmactrl)(struct spi_imx_data *, int);
enum spi_imx_devtype devtype;
 };
 
 struct spi_imx_data {
struct spi_bitbang bitbang;
 
-   struct completion xfer_done;
+   struct completion rx_done; /* PIO mode use rx_done both rx/tx */
void __iomem *base;
int irq;
struct clk *clk_per;
@@ -96,6 +102,16 @@ struct spi_imx_data {
const void *tx_buf;
unsigned int txfifo; /* number of words pushed in tx FIFO */
 
+   /* DMA used */
+   struct dma_chan *rx_dmach;  /* rx dma channel */
+   struct dma_chan *tx_dmach;  /* tx dma channel */
+   dma_addr_t src_start;
+   dma_addr_t dst_start;
+   dma_addr_t rxfifo_phy;
+   dma_addr_t txfifo_phy;
+   struct completion tx_done;
+   void *dummy_buf; /* send or receive dummy data in DMA mode */
+
const struct spi_imx_devtype_data *devtype_data;
int chipselect[0];
 };
@@ -185,6 +201,7 @@ static unsigned int spi_imx_clkdiv_2(unsigned int fin,
 #define MX51_ECSPI_CTRL0x08
 #define MX51_ECSPI_CTRL_ENABLE (1 <<  0)
 #define MX51_ECSPI_CTRL_XCH(1 <<  2)
+#define MX51_ECSPI_CTRL_SMC(1 <<  3)
 #define MX51_ECSPI_CTRL_MODE_MASK  (0xf << 4)
 #define MX51_ECSPI_CTRL_POSTDIV_OFFSET 8
 #define MX51_ECSPI_CTRL_PREDIV_OFFSET  12
@@ -202,6 +219,17 @@ static unsigned int spi_imx_clkdiv_2(unsigned int fin,
 #define MX51_ECSPI_INT_TEEN(1 <<  0)
 #define MX51_ECSPI_INT_RREN(1 <<  3)
 
+#define MX51_ECSPI_DMA 0x14
+#define MX51_ECSPI_DMA_TXTHR_OFFSET(0)
+#define MX51_ECSPI_DMA_TXTHR_MASK  (0x3f << MX51_ECSPI_DMA_TXTHR_OFFSET)
+#define MX51_ECSPI_DMA_TXDEN   (1 << 7)
+#define MX51_ECSPI_DMA_RXTHR_OFFSET(16)
+#define MX51_ECSPI_DMA_RXTHR_MASK  (0x3f << MX51_ECSPI_DMA_RXTHR_OFFSET)
+#define MX51_ECSPI_DMA_RXDEN   (1 << 23)
+#define MX51_ECSPI_DMA_RXDMALEN_OFFSET (24)
+#define MX51_ECSPI_DMA_RXDMALEN_MASK   (0x3f << MX51_ECSPI_DMA_RXDMALEN_OFFSET)
+#define MX51_ECSPI_DMA_RXTDEN  (1 << 31)
+
 #define MX51_ECSPI_STAT0x18
 #define MX51_ECSPI_STAT_RR (1 <<  3)
 
@@ -288,6 +316,10 @@ static int __maybe_unused mx51_ecspi_config(struct 
spi_imx_data *spi_imx,
 
ctrl |= (config->bpw - 1) << MX51_ECSPI_CTRL_BL_OFFSET;
 
+   /* set smc bit for dma */
+   if (spi_imx->rx_dmach)
+   ctrl |= MX51_ECSPI_CTRL_SMC;
+
cfg |= MX51_ECSPI_CONFIG_SBBCTRL(config->cs);
 
if (config->mode & SPI_CPHA)
@@ -303,6 +335,26 @@ static int __maybe_unused mx51_ecspi_config(struct 
spi_imx_data *spi_imx,
writel(ctrl, spi_imx->base + MX51_ECSPI_CTRL);
writel(cfg, spi_imx->base + MX51_ECSPI_CONFIG);
 
+   /* set rx/tx fifo threshold in DMA mode */
+   if (spi_imx->rx_dmach) {
+   cfg = readl(spi_imx->base + MX51_ECSPI_DMA);
+   cfg &= ~(MX51_ECSPI_DMA_TXTHR_MASK | MX51_ECSPI_DMA_RXTHR_MASK
+   | MX51_ECSPI_DMA_RXDMALEN_MASK);
+   /* set rx/tx fifo threshold */
+   cfg |= (spi_imx_get_fifosize(spi_imx) / 2) <<
+   MX51_ECSPI_DMA_TXTHR_OFFSET;
+   cfg |= (spi_imx_get_fifosize(spi_imx) / 2) <<
+   MX51_ECSPI_DMA_RXTHR_OFFSET;
+   /*
+* set RX_DMA_LENTH to 1 to prvent missing the last bytes which
+* is less than rx threshold based on current design.
+*/
+   cfg |= 1 << MX51_ECSPI_DMA_RXDMALEN_OFFSET;
+   cfg |= MX51_ECSPI_DMA_RXTDEN;
+
+   writel(cfg, spi_imx->base + MX51_ECSPI_DMA);
+   }
+
/*
 * Wait until the changes in the configuration register CONFIGREG
 * propagate into the hardware. It takes exactly one tick of the
@@ -335,6 +387,17 @@ static void __maybe_unused mx51_ecspi_reset(struct 
spi_imx_data *spi_imx)
readl(spi_imx->base + MXC_CSPIRXDATA);
 }
 
+static void __maybe_unused mx51_ecspi_dmactrl(struct spi_imx_data 

[PATCH V1] spi: imx: add dma support for ecspi

2014-02-12 Thread Robin Gong
Add basical dma support for ecspi. Validate on i.MX6qsabresd board.

Signed-off-by: Robin Gong b38...@freescale.com
---
 drivers/spi/spi-imx.c |  221 ++--
 1 files changed, 211 insertions(+), 10 deletions(-)

diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index a5474ef..6a80658 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -21,6 +21,8 @@
 #include linux/clk.h
 #include linux/completion.h
 #include linux/delay.h
+#include linux/dma-mapping.h
+#include linux/dmaengine.h
 #include linux/err.h
 #include linux/gpio.h
 #include linux/init.h
@@ -42,6 +44,9 @@
 
 #define DRIVER_NAME spi_imx
 
+#define DMA_SG_MAXLEN  0x /* align with imx-sdma.c */
+#define ECSPI_TIMEOUT  1000
+
 #define MXC_CSPIRXDATA 0x00
 #define MXC_CSPITXDATA 0x04
 #define MXC_CSPICTRL   0x08
@@ -76,13 +81,14 @@ struct spi_imx_devtype_data {
void (*trigger)(struct spi_imx_data *);
int (*rx_available)(struct spi_imx_data *);
void (*reset)(struct spi_imx_data *);
+   void (*dmactrl)(struct spi_imx_data *, int);
enum spi_imx_devtype devtype;
 };
 
 struct spi_imx_data {
struct spi_bitbang bitbang;
 
-   struct completion xfer_done;
+   struct completion rx_done; /* PIO mode use rx_done both rx/tx */
void __iomem *base;
int irq;
struct clk *clk_per;
@@ -96,6 +102,16 @@ struct spi_imx_data {
const void *tx_buf;
unsigned int txfifo; /* number of words pushed in tx FIFO */
 
+   /* DMA used */
+   struct dma_chan *rx_dmach;  /* rx dma channel */
+   struct dma_chan *tx_dmach;  /* tx dma channel */
+   dma_addr_t src_start;
+   dma_addr_t dst_start;
+   dma_addr_t rxfifo_phy;
+   dma_addr_t txfifo_phy;
+   struct completion tx_done;
+   void *dummy_buf; /* send or receive dummy data in DMA mode */
+
const struct spi_imx_devtype_data *devtype_data;
int chipselect[0];
 };
@@ -185,6 +201,7 @@ static unsigned int spi_imx_clkdiv_2(unsigned int fin,
 #define MX51_ECSPI_CTRL0x08
 #define MX51_ECSPI_CTRL_ENABLE (1   0)
 #define MX51_ECSPI_CTRL_XCH(1   2)
+#define MX51_ECSPI_CTRL_SMC(1   3)
 #define MX51_ECSPI_CTRL_MODE_MASK  (0xf  4)
 #define MX51_ECSPI_CTRL_POSTDIV_OFFSET 8
 #define MX51_ECSPI_CTRL_PREDIV_OFFSET  12
@@ -202,6 +219,17 @@ static unsigned int spi_imx_clkdiv_2(unsigned int fin,
 #define MX51_ECSPI_INT_TEEN(1   0)
 #define MX51_ECSPI_INT_RREN(1   3)
 
+#define MX51_ECSPI_DMA 0x14
+#define MX51_ECSPI_DMA_TXTHR_OFFSET(0)
+#define MX51_ECSPI_DMA_TXTHR_MASK  (0x3f  MX51_ECSPI_DMA_TXTHR_OFFSET)
+#define MX51_ECSPI_DMA_TXDEN   (1  7)
+#define MX51_ECSPI_DMA_RXTHR_OFFSET(16)
+#define MX51_ECSPI_DMA_RXTHR_MASK  (0x3f  MX51_ECSPI_DMA_RXTHR_OFFSET)
+#define MX51_ECSPI_DMA_RXDEN   (1  23)
+#define MX51_ECSPI_DMA_RXDMALEN_OFFSET (24)
+#define MX51_ECSPI_DMA_RXDMALEN_MASK   (0x3f  MX51_ECSPI_DMA_RXDMALEN_OFFSET)
+#define MX51_ECSPI_DMA_RXTDEN  (1  31)
+
 #define MX51_ECSPI_STAT0x18
 #define MX51_ECSPI_STAT_RR (1   3)
 
@@ -288,6 +316,10 @@ static int __maybe_unused mx51_ecspi_config(struct 
spi_imx_data *spi_imx,
 
ctrl |= (config-bpw - 1)  MX51_ECSPI_CTRL_BL_OFFSET;
 
+   /* set smc bit for dma */
+   if (spi_imx-rx_dmach)
+   ctrl |= MX51_ECSPI_CTRL_SMC;
+
cfg |= MX51_ECSPI_CONFIG_SBBCTRL(config-cs);
 
if (config-mode  SPI_CPHA)
@@ -303,6 +335,26 @@ static int __maybe_unused mx51_ecspi_config(struct 
spi_imx_data *spi_imx,
writel(ctrl, spi_imx-base + MX51_ECSPI_CTRL);
writel(cfg, spi_imx-base + MX51_ECSPI_CONFIG);
 
+   /* set rx/tx fifo threshold in DMA mode */
+   if (spi_imx-rx_dmach) {
+   cfg = readl(spi_imx-base + MX51_ECSPI_DMA);
+   cfg = ~(MX51_ECSPI_DMA_TXTHR_MASK | MX51_ECSPI_DMA_RXTHR_MASK
+   | MX51_ECSPI_DMA_RXDMALEN_MASK);
+   /* set rx/tx fifo threshold */
+   cfg |= (spi_imx_get_fifosize(spi_imx) / 2) 
+   MX51_ECSPI_DMA_TXTHR_OFFSET;
+   cfg |= (spi_imx_get_fifosize(spi_imx) / 2) 
+   MX51_ECSPI_DMA_RXTHR_OFFSET;
+   /*
+* set RX_DMA_LENTH to 1 to prvent missing the last bytes which
+* is less than rx threshold based on current design.
+*/
+   cfg |= 1  MX51_ECSPI_DMA_RXDMALEN_OFFSET;
+   cfg |= MX51_ECSPI_DMA_RXTDEN;
+
+   writel(cfg, spi_imx-base + MX51_ECSPI_DMA);
+   }
+
/*
 * Wait until the changes in the configuration register CONFIGREG
 * propagate into the hardware. It takes exactly one tick of the
@@ -335,6 +387,17 @@ static void __maybe_unused mx51_ecspi_reset(struct 
spi_imx_data *spi_imx)
readl(spi_imx-base + 

Re: [PATCH V1] spi: imx: add dma support for ecspi

2014-02-12 Thread Sascha Hauer
On Wed, Feb 12, 2014 at 06:02:59PM +0800, Robin Gong wrote:
 Add basical dma support for ecspi. Validate on i.MX6qsabresd board.
 
 Signed-off-by: Robin Gong b38...@freescale.com
 ---
  drivers/spi/spi-imx.c |  221 ++--
  1 files changed, 211 insertions(+), 10 deletions(-)
 
 diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
 index a5474ef..6a80658 100644
 --- a/drivers/spi/spi-imx.c
 +++ b/drivers/spi/spi-imx.c
 @@ -21,6 +21,8 @@
  #include linux/clk.h
  #include linux/completion.h
  #include linux/delay.h
 +#include linux/dma-mapping.h
 +#include linux/dmaengine.h
  #include linux/err.h
  #include linux/gpio.h
  #include linux/init.h
 @@ -42,6 +44,9 @@
  
  #define DRIVER_NAME spi_imx
  
 +#define DMA_SG_MAXLEN0x /* align with imx-sdma.c */
 +#define ECSPI_TIMEOUT1000
 +
  #define MXC_CSPIRXDATA   0x00
  #define MXC_CSPITXDATA   0x04
  #define MXC_CSPICTRL 0x08
 @@ -76,13 +81,14 @@ struct spi_imx_devtype_data {
   void (*trigger)(struct spi_imx_data *);
   int (*rx_available)(struct spi_imx_data *);
   void (*reset)(struct spi_imx_data *);
 + void (*dmactrl)(struct spi_imx_data *, int);
   enum spi_imx_devtype devtype;
  };
  
  struct spi_imx_data {
   struct spi_bitbang bitbang;
  
 - struct completion xfer_done;
 + struct completion rx_done; /* PIO mode use rx_done both rx/tx */

Why rename it? Just keep the original name.

   void __iomem *base;
   int irq;
   struct clk *clk_per;
 @@ -96,6 +102,16 @@ struct spi_imx_data {
   const void *tx_buf;
   unsigned int txfifo; /* number of words pushed in tx FIFO */
  
 + /* DMA used */
 + struct dma_chan *rx_dmach;  /* rx dma channel */
 + struct dma_chan *tx_dmach;  /* tx dma channel */
 + dma_addr_t src_start;
 + dma_addr_t dst_start;
 + dma_addr_t rxfifo_phy;
 + dma_addr_t txfifo_phy;
 + struct completion tx_done;
 + void *dummy_buf; /* send or receive dummy data in DMA mode */
 +
   const struct spi_imx_devtype_data *devtype_data;
   int chipselect[0];
  };
 @@ -185,6 +201,7 @@ static unsigned int spi_imx_clkdiv_2(unsigned int fin,
  #define MX51_ECSPI_CTRL  0x08
  #define MX51_ECSPI_CTRL_ENABLE   (1   0)
  #define MX51_ECSPI_CTRL_XCH  (1   2)
 +#define MX51_ECSPI_CTRL_SMC  (1   3)
  #define MX51_ECSPI_CTRL_MODE_MASK(0xf  4)
  #define MX51_ECSPI_CTRL_POSTDIV_OFFSET   8
  #define MX51_ECSPI_CTRL_PREDIV_OFFSET12
 @@ -202,6 +219,17 @@ static unsigned int spi_imx_clkdiv_2(unsigned int fin,
  #define MX51_ECSPI_INT_TEEN  (1   0)
  #define MX51_ECSPI_INT_RREN  (1   3)
  
 +#define MX51_ECSPI_DMA   0x14
 +#define MX51_ECSPI_DMA_TXTHR_OFFSET  (0)
 +#define MX51_ECSPI_DMA_TXTHR_MASK(0x3f  MX51_ECSPI_DMA_TXTHR_OFFSET)
 +#define MX51_ECSPI_DMA_TXDEN (1  7)
 +#define MX51_ECSPI_DMA_RXTHR_OFFSET  (16)
 +#define MX51_ECSPI_DMA_RXTHR_MASK(0x3f  MX51_ECSPI_DMA_RXTHR_OFFSET)
 +#define MX51_ECSPI_DMA_RXDEN (1  23)
 +#define MX51_ECSPI_DMA_RXDMALEN_OFFSET   (24)
 +#define MX51_ECSPI_DMA_RXDMALEN_MASK (0x3f  MX51_ECSPI_DMA_RXDMALEN_OFFSET)
 +#define MX51_ECSPI_DMA_RXTDEN(1  31)
 +
  #define MX51_ECSPI_STAT  0x18
  #define MX51_ECSPI_STAT_RR   (1   3)
  
 @@ -288,6 +316,10 @@ static int __maybe_unused mx51_ecspi_config(struct 
 spi_imx_data *spi_imx,
  
   ctrl |= (config-bpw - 1)  MX51_ECSPI_CTRL_BL_OFFSET;
  
 + /* set smc bit for dma */
 + if (spi_imx-rx_dmach)
 + ctrl |= MX51_ECSPI_CTRL_SMC;

The comment just states the obvious. Remove it.

 +
   cfg |= MX51_ECSPI_CONFIG_SBBCTRL(config-cs);
  
   if (config-mode  SPI_CPHA)
 @@ -303,6 +335,26 @@ static int __maybe_unused mx51_ecspi_config(struct 
 spi_imx_data *spi_imx,
   writel(ctrl, spi_imx-base + MX51_ECSPI_CTRL);
   writel(cfg, spi_imx-base + MX51_ECSPI_CONFIG);
  
 + /* set rx/tx fifo threshold in DMA mode */
 + if (spi_imx-rx_dmach) {
 + cfg = readl(spi_imx-base + MX51_ECSPI_DMA);
 + cfg = ~(MX51_ECSPI_DMA_TXTHR_MASK | MX51_ECSPI_DMA_RXTHR_MASK
 + | MX51_ECSPI_DMA_RXDMALEN_MASK);
 + /* set rx/tx fifo threshold */
 + cfg |= (spi_imx_get_fifosize(spi_imx) / 2) 
 + MX51_ECSPI_DMA_TXTHR_OFFSET;
 + cfg |= (spi_imx_get_fifosize(spi_imx) / 2) 
 + MX51_ECSPI_DMA_RXTHR_OFFSET;
 + /*
 +  * set RX_DMA_LENTH to 1 to prvent missing the last bytes which
 +  * is less than rx threshold based on current design.
 +  */
 + cfg |= 1  MX51_ECSPI_DMA_RXDMALEN_OFFSET;
 + cfg |= MX51_ECSPI_DMA_RXTDEN;
 +
 + writel(cfg, spi_imx-base + MX51_ECSPI_DMA);
 + }

You exactly *know* the value to write to the MX51_ECSPI_DMA register. So
instead of 

Re: [PATCH V1] spi: imx: add dma support for ecspi

2014-02-12 Thread Shawn Guo
On Wed, Feb 12, 2014 at 06:02:59PM +0800, Robin Gong wrote:
 Add basical dma support for ecspi. Validate on i.MX6qsabresd board.
 
 Signed-off-by: Robin Gong b38...@freescale.com

Robin,

Are you aware of the submission [1] from Frank Li?  You may want to
coordinate the effort with him.

Shawn

[1] http://thread.gmane.org/gmane.linux.ports.arm.kernel/291722

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


RE: [PATCH V1] spi: imx: add dma support for ecspi

2014-02-12 Thread Yibin Gong
Sorry, I miss the message .Thanks Shawn's reminding and thanks Sascha's 
comments and I will talk with Frank.

-Original Message-
From: Shawn Guo [mailto:shawn@linaro.org] 
Sent: Thursday, February 13, 2014 9:56 AM
To: Gong Yibin-B38343
Cc: broo...@kernel.org; s.ha...@pengutronix.de; linux-...@vger.kernel.org; 
linux-kernel@vger.kernel.org; Huang Shijie-B32955
Subject: Re: [PATCH V1] spi: imx: add dma support for ecspi

On Wed, Feb 12, 2014 at 06:02:59PM +0800, Robin Gong wrote:
 Add basical dma support for ecspi. Validate on i.MX6qsabresd board.
 
 Signed-off-by: Robin Gong b38...@freescale.com

Robin,

Are you aware of the submission [1] from Frank Li?  You may want to coordinate 
the effort with him.

Shawn

[1] http://thread.gmane.org/gmane.linux.ports.arm.kernel/291722

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/