RE: [PATCH V1] spi: imx: add dma support for ecspi
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
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
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
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
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
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
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
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/