1 #ifndef DW_SPI_HEADER_H
2 #define DW_SPI_HEADER_H
5 #include <linux/scatterlist.h>
9 #define DBG_SPI(x...) if(atomic_read(&dws->debug_flag) == 1) printk(x)
14 /* SPI register offsets */
15 #define SPIM_CTRLR0 0x0000
16 #define SPIM_CTRLR1 0x0004
17 #define SPIM_SSIENR 0x0008
18 #define SPIM_SER 0x000c
19 #define SPIM_BAUDR 0x0010
20 #define SPIM_TXFTLR 0x0014
21 #define SPIM_RXFTLR 0x0018
22 #define SPIM_TXFLR 0x001c
23 #define SPIM_RXFLR 0x0020
24 #define SPIM_SR 0x0024
25 #define SPIM_IPR 0x0028
26 #define SPIM_IMR 0x002c
27 #define SPIM_ISR 0x0030
28 #define SPIM_RISR 0x0034
29 #define SPIM_ICR 0x0038
30 #define SPIM_DMACR 0x003c
31 #define SPIM_DMATDLR 0x0040
32 #define SPIM_DMARDLR 0x0044
33 #define SPIM_TXDR 0x0400
34 #define SPIM_RXDR 0x0800
36 /* --------Bit fields in CTRLR0--------begin */
38 #define SPI_DFS_OFFSET 0 /* Data Frame Size */
39 #define SPI_DFS_4BIT 0x00
40 #define SPI_DFS_8BIT 0x01
41 #define SPI_DFS_16BIT 0x02
42 #define SPI_DFS_RESV 0x03
44 #define SPI_FRF_OFFSET 16 /* Frame Format */
45 #define SPI_FRF_SPI 0x00 /* motorola spi */
46 #define SPI_FRF_SSP 0x01 /* Texas Instruments SSP*/
47 #define SPI_FRF_MICROWIRE 0x02 /* National Semiconductors Microwire */
48 #define SPI_FRF_RESV 0x03
50 #define SPI_MODE_OFFSET 6 /* SCPH & SCOL */
52 #define SPI_SCPH_OFFSET 6 /* Serial Clock Phase */
53 #define SPI_SCPH_TOGMID 0 /* Serial clock toggles in middle of first data bit */
54 #define SPI_SCPH_TOGSTA 1 /* Serial clock toggles at start of first data bit */
56 #define SPI_SCOL_OFFSET 7 /* Serial Clock Polarity */
58 #define SPI_OPMOD_OFFSET 20
59 #define SPI_OPMOD_MASTER 0
60 #define SPI_OPMOD_SLAVE 1
62 #define SPI_TMOD_OFFSET 18 /* Transfer Mode */
63 //#define SPI_TMOD_MASK (0x3 << SPI_TMOD_OFFSET)
64 #define SPI_TMOD_TR 0x00 /* xmit & recv */
65 #define SPI_TMOD_TO 0x01 /* xmit only */
66 #define SPI_TMOD_RO 0x02 /* recv only */
67 #define SPI_TMOD_RESV 0x03
69 #define SPI_CFS_OFFSET 2 /* Control Frame Size */
71 #define SPI_CSM_OFFSET 8 /* Chip Select Mode */
72 #define SPI_CSM_KEEP 0x00 /* ss_n keep low after every frame data is transferred */
73 #define SPI_CSM_HALF 0x01 /* ss_n be high for half sclk_out cycles after every frame data is transferred */
74 #define SPI_CSM_ONE 0x02 /* ss_n be high for one sclk_out cycle after every frame data is transferred */
76 #define SPI_SSN_DELAY_OFFSET 10
77 #define SPI_SSN_DELAY_HALF 0x00
78 #define SPI_SSN_DELAY_ONE 0x01
80 #define SPI_HALF_WORLD_TX_OFFSET 13
81 #define SPI_HALF_WORLD_ON 0x00
82 #define SPI_HALF_WORLD_OFF 0x01
85 /* --------Bit fields in CTRLR0--------end */
88 /* Bit fields in SR, 7 bits */
89 #define SR_MASK 0x7f /* cover 7 bits */
90 #define SR_BUSY (1 << 0)
91 #define SR_TF_FULL (1 << 1)
92 #define SR_TF_EMPT (1 << 2)
93 #define SR_RF_EMPT (1 << 3)
94 #define SR_RF_FULL (1 << 4)
96 /* Bit fields in ISR, IMR, RISR, 7 bits */
97 #define SPI_INT_TXEI (1 << 0)
98 #define SPI_INT_TXOI (1 << 1)
99 #define SPI_INT_RXUI (1 << 2)
100 #define SPI_INT_RXOI (1 << 3)
101 #define SPI_INT_RXFI (1 << 4)
103 /* Bit fields in DMACR */
104 #define SPI_DMACR_TX_ENABLE (1 << 1)
105 #define SPI_DMACR_RX_ENABLE (1 << 0)
107 /* Bit fields in ICR */
108 #define SPI_CLEAR_INT_ALL (1<< 0)
109 #define SPI_CLEAR_INT_RXUI (1 << 1)
110 #define SPI_CLEAR_INT_RXOI (1 << 2)
111 #define SPI_CLEAR_INT_TXOI (1 << 3)
117 /* Bit fields in CTRLR0 */
118 #define SPI_DFS_OFFSET 0
120 #define SPI_FRF_OFFSET 4
121 #define SPI_FRF_SPI 0x0
122 #define SPI_FRF_SSP 0x1
123 #define SPI_FRF_MICROWIRE 0x2
124 #define SPI_FRF_RESV 0x3
126 #define SPI_MODE_OFFSET 6
127 #define SPI_SCPH_OFFSET 6
128 #define SPI_SCOL_OFFSET 7
130 #define SPI_TMOD_OFFSET 8
131 #define SPI_TMOD_MASK (0x3 << SPI_TMOD_OFFSET)
132 #define SPI_TMOD_TR 0x0 /* xmit & recv */
133 #define SPI_TMOD_TO 0x1 /* xmit only */
134 #define SPI_TMOD_RO 0x2 /* recv only */
135 #define SPI_TMOD_EPROMREAD 0x3 /* eeprom read mode */
137 #define SPI_SLVOE_OFFSET 10
138 #define SPI_SRL_OFFSET 11
139 #define SPI_CFS_OFFSET 12
141 /* Bit fields in SR, 7 bits */
142 #define SR_MASK 0x7f /* cover 7 bits */
143 #define SR_BUSY (1 << 0)
144 #define SR_TF_NOT_FULL (1 << 1)
145 #define SR_TF_EMPT (1 << 2)
146 #define SR_RF_NOT_EMPT (1 << 3)
147 #define SR_RF_FULL (1 << 4)
148 #define SR_TX_ERR (1 << 5)
149 #define SR_DCOL (1 << 6)
151 /* Bit fields in ISR, IMR, RISR, 7 bits */
152 #define SPI_INT_TXEI (1 << 0)
153 #define SPI_INT_TXOI (1 << 1)
154 #define SPI_INT_RXUI (1 << 2)
155 #define SPI_INT_RXOI (1 << 3)
156 #define SPI_INT_RXFI (1 << 4)
157 #define SPI_INT_MSTI (1 << 5)
159 /* Bit fields in DMACR */
160 #define SPI_DMACR_TX_ENABLE (1 << 1)
161 #define SPI_DMACR_RX_ENABLE (1 << 0)
163 /* Bit fields in ICR */
164 #define SPI_CLEAR_INT_ALL (1<< 0)
165 #define SPI_CLEAR_INT_RXUI (1 << 1)
166 #define SPI_CLEAR_INT_RXOI (1 << 2)
167 #define SPI_CLEAR_INT_TXOI (1 << 3)
170 /* TX RX interrupt level threshold, max can be 256 */
171 #define SPI_INT_THRESHOLD 16
181 struct dw_spi_dma_ops {
182 int (*dma_init)(struct dw_spi *dws);
183 void (*dma_exit)(struct dw_spi *dws);
184 int (*dma_transfer)(struct dw_spi *dws, int cs_change);
188 struct spi_master *master;
189 struct spi_device *cur_dev;
190 struct device *parent_dev;
191 enum dw_ssi_type type;
195 struct clk *pclk_spi;
201 u32 fifo_len; /* depth of the FIFO buffer */
202 u32 max_freq; /* max bus freq supported */
205 u16 num_cs; /* supported slave numbers */
207 /* Driver message queue */
208 struct workqueue_struct *workqueue;
209 struct work_struct pump_messages;
211 struct list_head queue;
215 /* Message Transfer pump */
216 struct tasklet_struct pump_transfers;
218 /* Current message transfer state info */
219 struct spi_message *cur_msg;
220 struct spi_transfer *cur_transfer;
221 struct chip_data *cur_chip;
222 struct chip_data *prev_chip;
233 u8 n_bytes; /* current is a 1/2 bytes op */
234 u8 max_bits_per_word; /* maxim is 16b */
237 irqreturn_t (*transfer_handler)(struct dw_spi *dws);
238 void (*cs_control)(struct dw_spi *dws, u32 cs, u8 flag);
242 struct dma_chan *txchan;
243 struct scatterlist tx_sgl;
244 struct dma_chan *rxchan;
245 struct scatterlist rx_sgl;
247 struct device *dma_dev;
248 dma_addr_t dma_addr; /* phy address of the Data register */
249 struct dw_spi_dma_ops *dma_ops;
250 void *dma_priv; /* platform relate info */
252 //struct pci_dev *dmac;
255 /* Bus interface info */
257 #ifdef CONFIG_DEBUG_FS
258 struct dentry *debugfs;
262 static inline u32 dw_readl(struct dw_spi *dws, u32 offset)
264 return __raw_readl(dws->regs + offset);
267 static inline void dw_writel(struct dw_spi *dws, u32 offset, u32 val)
269 __raw_writel(val, dws->regs + offset);
272 static inline u16 dw_readw(struct dw_spi *dws, u32 offset)
274 return __raw_readw(dws->regs + offset);
277 static inline void dw_writew(struct dw_spi *dws, u32 offset, u16 val)
279 __raw_writew(val, dws->regs + offset);
282 static inline void spi_enable_chip(struct dw_spi *dws, int enable)
284 dw_writel(dws, SPIM_SSIENR, (enable ? 1 : 0));
287 static inline void spi_set_clk(struct dw_spi *dws, u16 div)
289 dw_writel(dws, SPIM_BAUDR, div);
292 static inline void spi_chip_sel(struct dw_spi *dws, u16 cs)
294 if (cs > dws->num_cs)
298 dws->cs_control(dws, cs, 1);
300 dw_writel(dws, SPIM_SER, 1 << cs);
302 DBG_SPI("%s:cs=%d\n",__func__,cs);
305 static inline void spi_cs_control(struct dw_spi *dws, u32 cs, u8 flag)
308 dw_writel(dws, SPIM_SER, 1 << cs);
310 dw_writel(dws, SPIM_SER, 0);
316 /* Disable IRQ bits */
317 static inline void spi_mask_intr(struct dw_spi *dws, u32 mask)
321 new_mask = dw_readl(dws, SPIM_IMR) & ~mask;
322 dw_writel(dws, SPIM_IMR, new_mask);
325 /* Enable IRQ bits */
326 static inline void spi_umask_intr(struct dw_spi *dws, u32 mask)
330 new_mask = dw_readl(dws, SPIM_IMR) | mask;
331 dw_writel(dws, SPIM_IMR, new_mask);
335 * Each SPI slave device to work with dw_api controller should
336 * has such a structure claiming its working mode (PIO/DMA etc),
337 * which can be save in the "controller_data" member of the
341 u8 poll_mode; /* 0 for contoller polling mode */
342 u8 type; /* SPI/SSP/Micrwire */
344 void (*cs_control)(u32 command);
347 extern int dw_spi_add_host(struct dw_spi *dws);
348 extern void dw_spi_remove_host(struct dw_spi *dws);
349 extern int dw_spi_suspend_host(struct dw_spi *dws);
350 extern int dw_spi_resume_host(struct dw_spi *dws);
351 extern void dw_spi_xfer_done(struct dw_spi *dws);
353 /* platform related setup */
354 extern int dw_spi_dma_init(struct dw_spi *dws); /* Intel MID platforms */
355 #endif /* SPIM_HEADER_H */