add spi driver support
[firefly-linux-kernel-4.4.55.git] / drivers / spi / spi-rockchip-core.h
1 #ifndef DW_SPI_HEADER_H
2 #define DW_SPI_HEADER_H
3
4 #include <linux/io.h>
5 #include <linux/scatterlist.h>
6
7
8 #if 1
9 #define DBG_SPI(x...)  if(atomic_read(&dws->debug_flag) == 1) printk(x)
10 #else
11 #define DBG_SPI(x...)
12 #endif
13
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
35
36 /* --------Bit fields in CTRLR0--------begin */
37
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
43
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
49
50 #define SPI_MODE_OFFSET             6                 /* SCPH & SCOL */
51
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 */
55
56 #define SPI_SCOL_OFFSET                 7                  /* Serial Clock Polarity */
57
58 #define SPI_OPMOD_OFFSET            20
59 #define SPI_OPMOD_MASTER        0
60 #define SPI_OPMOD_SLAVE         1
61
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
68
69 #define SPI_CFS_OFFSET                  2                  /* Control Frame Size */
70
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 */
75
76 #define SPI_SSN_DELAY_OFFSET    10
77 #define SPI_SSN_DELAY_HALF      0x00
78 #define SPI_SSN_DELAY_ONE       0x01
79
80 #define SPI_HALF_WORLD_TX_OFFSET       13
81 #define SPI_HALF_WORLD_ON       0x00
82 #define SPI_HALF_WORLD_OFF      0x01
83
84
85 /* --------Bit fields in CTRLR0--------end */
86
87
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)
95
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)
102
103 /* Bit fields in DMACR */
104 #define SPI_DMACR_TX_ENABLE     (1 << 1)
105 #define SPI_DMACR_RX_ENABLE     (1 << 0)
106
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)
112
113
114 #if 0
115
116
117 /* Bit fields in CTRLR0 */
118 #define SPI_DFS_OFFSET                  0
119
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
125
126 #define SPI_MODE_OFFSET                 6
127 #define SPI_SCPH_OFFSET                 6
128 #define SPI_SCOL_OFFSET                 7
129
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 */
136
137 #define SPI_SLVOE_OFFSET                10
138 #define SPI_SRL_OFFSET                  11
139 #define SPI_CFS_OFFSET                  12
140
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)
150
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)
158
159 /* Bit fields in DMACR */
160 #define SPI_DMACR_TX_ENABLE     (1 << 1)
161 #define SPI_DMACR_RX_ENABLE     (1 << 0)
162
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)
168
169
170 /* TX RX interrupt level threshold, max can be 256 */
171 #define SPI_INT_THRESHOLD               16
172 #endif
173
174 enum dw_ssi_type {
175         SSI_MOTO_SPI = 0,
176         SSI_TI_SSP,
177         SSI_NS_MICROWIRE,
178 };
179
180 struct dw_spi;
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);
185 };
186
187 struct dw_spi {
188         struct spi_master       *master;
189         struct spi_device       *cur_dev;
190         struct device           *parent_dev;
191         enum dw_ssi_type        type;
192         char                    name[16];
193
194         struct clk          *clk_spi;
195         struct clk          *pclk_spi;
196
197         void __iomem            *regs;
198         unsigned long           paddr;
199         u32                     iolen;
200         int                     irq;
201         u32                     fifo_len;       /* depth of the FIFO buffer */
202         u32                     max_freq;       /* max bus freq supported */
203
204         u16                     bus_num;
205         u16                     num_cs;         /* supported slave numbers */
206
207         /* Driver message queue */
208         struct workqueue_struct *workqueue;
209         struct work_struct      pump_messages;
210         spinlock_t              lock;
211         struct list_head        queue;
212         int                     busy;
213         int                     run;
214
215         /* Message Transfer pump */
216         struct tasklet_struct   pump_transfers;
217
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;
223         size_t                  len;
224         void                    *tx;
225         void                    *tx_end;
226         void                    *rx;
227         void                    *rx_end;
228         int                     dma_mapped;
229         dma_addr_t              rx_dma;
230         dma_addr_t              tx_dma;
231         size_t                  rx_map_len;
232         size_t                  tx_map_len;
233         u8                      n_bytes;        /* current is a 1/2 bytes op */
234         u8                      max_bits_per_word;      /* maxim is 16b */
235         u32                     dma_width;
236         int                     cs_change;
237         irqreturn_t             (*transfer_handler)(struct dw_spi *dws);
238         void                    (*cs_control)(struct dw_spi *dws, u32 cs, u8 flag);
239
240         /* Dma info */
241         int                     dma_inited;
242         struct dma_chan         *txchan;
243         struct scatterlist      tx_sgl;
244         struct dma_chan         *rxchan;
245         struct scatterlist      rx_sgl;
246         int                     dma_chan_done;
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 */
251         
252         //struct pci_dev                *dmac;
253         atomic_t                debug_flag;
254
255         /* Bus interface info */
256         void                    *priv;
257 #ifdef CONFIG_DEBUG_FS
258         struct dentry *debugfs;
259 #endif
260 };
261
262 static inline u32 dw_readl(struct dw_spi *dws, u32 offset)
263 {
264         return __raw_readl(dws->regs + offset);
265 }
266
267 static inline void dw_writel(struct dw_spi *dws, u32 offset, u32 val)
268 {
269         __raw_writel(val, dws->regs + offset);
270 }
271
272 static inline u16 dw_readw(struct dw_spi *dws, u32 offset)
273 {
274         return __raw_readw(dws->regs + offset);
275 }
276
277 static inline void dw_writew(struct dw_spi *dws, u32 offset, u16 val)
278 {
279         __raw_writew(val, dws->regs + offset);
280 }
281
282 static inline void spi_enable_chip(struct dw_spi *dws, int enable)
283 {
284         dw_writel(dws, SPIM_SSIENR, (enable ? 1 : 0));
285 }
286
287 static inline void spi_set_clk(struct dw_spi *dws, u16 div)
288 {
289         dw_writel(dws, SPIM_BAUDR, div);
290 }
291
292 static inline void spi_chip_sel(struct dw_spi *dws, u16 cs)
293 {
294         if (cs > dws->num_cs)
295                 return;
296
297         if (dws->cs_control)
298                 dws->cs_control(dws, cs, 1);
299
300         dw_writel(dws, SPIM_SER, 1 << cs);
301
302         DBG_SPI("%s:cs=%d\n",__func__,cs);
303 }
304
305 static  inline void spi_cs_control(struct dw_spi *dws, u32 cs, u8 flag)
306 {
307         if (flag)
308                 dw_writel(dws, SPIM_SER, 1 << cs);
309         else            
310                 dw_writel(dws, SPIM_SER, 0);
311         
312         return;
313 }
314
315
316 /* Disable IRQ bits */
317 static inline void spi_mask_intr(struct dw_spi *dws, u32 mask)
318 {
319         u32 new_mask;
320
321         new_mask = dw_readl(dws, SPIM_IMR) & ~mask;
322         dw_writel(dws, SPIM_IMR, new_mask);
323 }
324
325 /* Enable IRQ bits */
326 static inline void spi_umask_intr(struct dw_spi *dws, u32 mask)
327 {
328         u32 new_mask;
329
330         new_mask = dw_readl(dws, SPIM_IMR) | mask;
331         dw_writel(dws, SPIM_IMR, new_mask);
332 }
333
334 /*
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
338  * struct spi_device
339  */
340 struct dw_spi_chip {
341         u8 poll_mode;   /* 0 for contoller polling mode */
342         u8 type;        /* SPI/SSP/Micrwire */
343         u8 enable_dma;
344         void (*cs_control)(u32 command);
345 };
346
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);
352
353 /* platform related setup */
354 extern int dw_spi_dma_init(struct dw_spi *dws); /* Intel MID platforms */
355 #endif /* SPIM_HEADER_H */