aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-pxa2xx.h
diff options
context:
space:
mode:
authorMika Westerberg <mika.westerberg@linux.intel.com>2013-01-22 05:26:29 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-02-08 07:15:28 -0500
commit5928808ef623347e0d4aa22327b992e9e125b6ad (patch)
tree224237a53eaa3e75c093430f967d5f2bd255f1f4 /drivers/spi/spi-pxa2xx.h
parentcd7bed00340475ee72a013a070e200e065085ef3 (diff)
spi/pxa2xx: add support for DMA engine
To be able to use DMA with this driver on non-PXA platforms we implement support for the generic DMA engine API. This lets user to use different DMA engines with little or no modification to the driver. Request lines and channel numbers can be passed to the driver from the platform specific data. The DMA engine implementation will be selected by default even on PXA platform. User can select the legacy DMA API by enabling Kconfig option CONFIG_SPI_PXA2XX_PXADMA. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Acked-by: Linus Walleij <linus.walleij@linaro.org> Tested-by: Lu Cao <lucao@marvell.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/spi/spi-pxa2xx.h')
-rw-r--r--drivers/spi/spi-pxa2xx.h32
1 files changed, 31 insertions, 1 deletions
diff --git a/drivers/spi/spi-pxa2xx.h b/drivers/spi/spi-pxa2xx.h
index 0a98905c916e..97ff4717e6ac 100644
--- a/drivers/spi/spi-pxa2xx.h
+++ b/drivers/spi/spi-pxa2xx.h
@@ -10,11 +10,15 @@
10#ifndef SPI_PXA2XX_H 10#ifndef SPI_PXA2XX_H
11#define SPI_PXA2XX_H 11#define SPI_PXA2XX_H
12 12
13#include <linux/atomic.h>
14#include <linux/dmaengine.h>
13#include <linux/errno.h> 15#include <linux/errno.h>
14#include <linux/io.h> 16#include <linux/io.h>
15#include <linux/interrupt.h> 17#include <linux/interrupt.h>
16#include <linux/platform_device.h> 18#include <linux/platform_device.h>
17#include <linux/pxa2xx_ssp.h> 19#include <linux/pxa2xx_ssp.h>
20#include <linux/scatterlist.h>
21#include <linux/sizes.h>
18#include <linux/spi/spi.h> 22#include <linux/spi/spi.h>
19#include <linux/spi/pxa2xx_spi.h> 23#include <linux/spi/pxa2xx_spi.h>
20 24
@@ -53,6 +57,16 @@ struct driver_data {
53 /* Message Transfer pump */ 57 /* Message Transfer pump */
54 struct tasklet_struct pump_transfers; 58 struct tasklet_struct pump_transfers;
55 59
60 /* DMA engine support */
61 struct dma_chan *rx_chan;
62 struct dma_chan *tx_chan;
63 struct sg_table rx_sgt;
64 struct sg_table tx_sgt;
65 int rx_nents;
66 int tx_nents;
67 void *dummy;
68 atomic_t dma_running;
69
56 /* Current message transfer state info */ 70 /* Current message transfer state info */
57 struct spi_message *cur_msg; 71 struct spi_message *cur_msg;
58 struct spi_transfer *cur_transfer; 72 struct spi_transfer *cur_transfer;
@@ -116,7 +130,6 @@ DEFINE_SSP_REG(SSPSP, 0x2c)
116#define DONE_STATE ((void *)2) 130#define DONE_STATE ((void *)2)
117#define ERROR_STATE ((void *)-1) 131#define ERROR_STATE ((void *)-1)
118 132
119#define MAX_DMA_LEN 8191
120#define IS_DMA_ALIGNED(x) IS_ALIGNED((unsigned long)(x), DMA_ALIGNMENT) 133#define IS_DMA_ALIGNED(x) IS_ALIGNED((unsigned long)(x), DMA_ALIGNMENT)
121#define DMA_ALIGNMENT 8 134#define DMA_ALIGNMENT 8
122 135
@@ -142,7 +155,24 @@ static inline void write_SSSR_CS(struct driver_data *drv_data, u32 val)
142extern int pxa2xx_spi_flush(struct driver_data *drv_data); 155extern int pxa2xx_spi_flush(struct driver_data *drv_data);
143extern void *pxa2xx_spi_next_transfer(struct driver_data *drv_data); 156extern void *pxa2xx_spi_next_transfer(struct driver_data *drv_data);
144 157
158/*
159 * Select the right DMA implementation.
160 */
145#if defined(CONFIG_SPI_PXA2XX_PXADMA) 161#if defined(CONFIG_SPI_PXA2XX_PXADMA)
162#define SPI_PXA2XX_USE_DMA 1
163#define MAX_DMA_LEN 8191
164#define DEFAULT_DMA_CR1 (SSCR1_TSRE | SSCR1_RSRE | SSCR1_TINTE)
165#elif defined(CONFIG_SPI_PXA2XX_DMA)
166#define SPI_PXA2XX_USE_DMA 1
167#define MAX_DMA_LEN SZ_64K
168#define DEFAULT_DMA_CR1 (SSCR1_TSRE | SSCR1_RSRE | SSCR1_TRAIL)
169#else
170#undef SPI_PXA2XX_USE_DMA
171#define MAX_DMA_LEN 0
172#define DEFAULT_DMA_CR1 0
173#endif
174
175#ifdef SPI_PXA2XX_USE_DMA
146extern bool pxa2xx_spi_dma_is_possible(size_t len); 176extern bool pxa2xx_spi_dma_is_possible(size_t len);
147extern int pxa2xx_spi_map_dma_buffers(struct driver_data *drv_data); 177extern int pxa2xx_spi_map_dma_buffers(struct driver_data *drv_data);
148extern irqreturn_t pxa2xx_spi_dma_transfer(struct driver_data *drv_data); 178extern irqreturn_t pxa2xx_spi_dma_transfer(struct driver_data *drv_data);