Merge remote-tracking branch 'stable/linux-3.0.y' into develop-3.0
[firefly-linux-kernel-4.4.55.git] / drivers / spi / rk29_spim.h
1 /* drivers/spi/rk29xx_spim.h\r
2  *\r
3  * Copyright (C) 2010 ROCKCHIP, Inc.\r
4  *\r
5  * This software is licensed under the terms of the GNU General Public\r
6  * License version 2, as published by the Free Software Foundation, and\r
7  * may be copied, distributed, and modified under those terms.\r
8  *\r
9  * This program is distributed in the hope that it will be useful,\r
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
12  * GNU General Public License for more details.\r
13  */\r
14 #ifndef __DRIVERS_SPIM_RK29XX_HEADER_H\r
15 #define __DRIVERS_SPIM_RK29XX_HEADER_H\r
16 #include <linux/io.h>\r
17 #ifdef CONFIG_ARCH_RK30\r
18 #include <plat/dma-pl330.h>\r
19 #else\r
20 #include <mach/dma-pl330.h>\r
21 #endif\r
22 \r
23 /* SPI register offsets */\r
24 #define SPIM_CTRLR0                             0x0000\r
25 #define SPIM_CTRLR1                             0x0004\r
26 #define SPIM_ENR                                0x0008\r
27 #define SPIM_SER                                0x000c\r
28 #define SPIM_BAUDR                              0x0010\r
29 #define SPIM_TXFTLR                             0x0014\r
30 #define SPIM_RXFTLR                             0x0018\r
31 #define SPIM_TXFLR                              0x001c\r
32 #define SPIM_RXFLR                              0x0020\r
33 #define SPIM_SR                                 0x0024\r
34 #define SPIM_IPR                0x0028\r
35 #define SPIM_IMR                                0x002c\r
36 #define SPIM_ISR                                0x0030\r
37 #define SPIM_RISR                               0x0034\r
38 #define SPIM_ICR                                0x0038\r
39 #define SPIM_DMACR                              0x003c\r
40 #define SPIM_DMATDLR                    0x0040\r
41 #define SPIM_DMARDLR                    0x0044\r
42 #define SPIM_TXDR                               0x0400\r
43 #define SPIM_RXDR               0x0800\r
44 \r
45 /* --------Bit fields in CTRLR0--------begin */\r
46 \r
47 #define SPI_DFS_OFFSET                  0                  /* Data Frame Size */\r
48 #define SPI_DFS_4BIT            0x00\r
49 #define SPI_DFS_8BIT            0x01\r
50 #define SPI_DFS_16BIT           0x02\r
51 #define SPI_DFS_RESV            0x03\r
52 \r
53 #define SPI_FRF_OFFSET                  16                 /* Frame Format */\r
54 #define SPI_FRF_SPI                         0x00               /* motorola spi */\r
55 #define SPI_FRF_SSP                         0x01               /* Texas Instruments SSP*/\r
56 #define SPI_FRF_MICROWIRE               0x02               /*  National Semiconductors Microwire */\r
57 #define SPI_FRF_RESV                    0x03\r
58 \r
59 #define SPI_MODE_OFFSET             6                 /* SCPH & SCOL */\r
60 \r
61 #define SPI_SCPH_OFFSET                 6                  /* Serial Clock Phase */\r
62 #define SPI_SCPH_TOGMID         0                  /* Serial clock toggles in middle of first data bit */\r
63 #define SPI_SCPH_TOGSTA         1                  /* Serial clock toggles at start of first data bit */\r
64 \r
65 #define SPI_SCOL_OFFSET                 7                  /* Serial Clock Polarity */\r
66 \r
67 #define SPI_TMOD_OFFSET                 18                 /* Transfer Mode */\r
68 #define SPI_TMOD_TR                         0x00                       /* xmit & recv */\r
69 #define SPI_TMOD_TO                         0x01                       /* xmit only */\r
70 #define SPI_TMOD_RO                         0x02                       /* recv only */\r
71 #define SPI_TMOD_RESV               0x03\r
72 \r
73 #define SPI_CFS_OFFSET                  2                  /* Control Frame Size */\r
74 \r
75 #define SPI_CSM_OFFSET          8                  /* Chip Select Mode */\r
76 #define SPI_CSM_KEEP            0x00               /* ss_n keep low after every frame data is transferred */\r
77 #define SPI_CSM_HALF            0x01               /* ss_n be high for half sclk_out cycles after every frame data is transferred */\r
78 #define SPI_CSM_ONE             0x02               /* ss_n be high for one sclk_out cycle after every frame data is transferred */\r
79 \r
80 #define SPI_SSN_DELAY_OFFSET    10\r
81 #define SPI_SSN_DELAY_HALF      0x00\r
82 #define SPI_SSN_DELAY_ONE       0x01\r
83 \r
84 #define SPI_HALF_WORLD_TX_OFFSET       13\r
85 #define SPI_HALF_WORLD_ON       0x00\r
86 #define SPI_HALF_WORLD_OFF      0x01\r
87 \r
88 \r
89 /* --------Bit fields in CTRLR0--------end */\r
90 \r
91 \r
92 /* Bit fields in SR, 7 bits */\r
93 #define SR_MASK                         0x7f            /* cover 7 bits */\r
94 #define SR_BUSY                         (1 << 0)\r
95 #define SR_TF_FULL                  (1 << 1)\r
96 #define SR_TF_EMPT                      (1 << 2)\r
97 #define SR_RF_EMPT                  (1 << 3)\r
98 #define SR_RF_FULL                      (1 << 4)\r
99 \r
100 /* Bit fields in ISR, IMR, RISR, 7 bits */\r
101 #define SPI_INT_TXEI                    (1 << 0)\r
102 #define SPI_INT_TXOI                    (1 << 1)\r
103 #define SPI_INT_RXUI                    (1 << 2)\r
104 #define SPI_INT_RXOI                    (1 << 3)\r
105 #define SPI_INT_RXFI                    (1 << 4)\r
106 \r
107 /* Bit fields in DMACR */\r
108 #define SPI_DMACR_TX_ENABLE     (1 << 1)\r
109 #define SPI_DMACR_RX_ENABLE     (1 << 0)\r
110 \r
111 /* Bit fields in ICR */\r
112 #define SPI_CLEAR_INT_ALL       (1<< 0)\r
113 #define SPI_CLEAR_INT_RXUI      (1 << 1)\r
114 #define SPI_CLEAR_INT_RXOI      (1 << 2)\r
115 #define SPI_CLEAR_INT_TXOI      (1 << 3)\r
116 \r
117 enum rk29xx_ssi_type {\r
118         SSI_MOTO_SPI = 0,\r
119         SSI_TI_SSP,\r
120         SSI_NS_MICROWIRE,\r
121 };\r
122 \r
123 struct rk29xx_spi {\r
124         struct spi_master       *master;\r
125         struct spi_device       *cur_dev;\r
126         enum rk29xx_ssi_type    type;\r
127 \r
128         void __iomem            *regs;\r
129         unsigned long           paddr;\r
130         u32                     iolen;\r
131         int                     irq;\r
132         u32         irq_polarity;\r
133         u32                     fifo_len;       /* depth of the FIFO buffer */\r
134         struct clk              *clock_spim;    /* clk apb */\r
135         struct clk              *pclk;\r
136         struct platform_device  *pdev;\r
137         \r
138         /* Driver message queue */\r
139         struct workqueue_struct *workqueue;\r
140         struct work_struct      pump_messages;\r
141         spinlock_t              lock;   \r
142         struct mutex            dma_lock;\r
143         struct list_head        queue;\r
144         int                     busy;\r
145         int                     run;\r
146 \r
147         /* Message Transfer pump */\r
148         struct tasklet_struct   pump_transfers; \r
149         struct tasklet_struct   dma_transfers;  \r
150 \r
151         /* Current message transfer state info */\r
152         struct spi_message      *cur_msg;\r
153         struct spi_transfer     *cur_transfer;\r
154         struct chip_data        *cur_chip;\r
155         struct chip_data        *prev_chip;\r
156         size_t                  len;\r
157         void                    *tx;\r
158         void                    *tx_end;\r
159         void                    *rx;\r
160         void                    *rx_end;\r
161         int                     dma_mapped;\r
162         dma_addr_t              rx_dma;\r
163         dma_addr_t              tx_dma;\r
164         void                    *buffer_tx_dma;\r
165         void                    *buffer_rx_dma;\r
166         size_t                  rx_map_len;\r
167         size_t                  tx_map_len;\r
168         u8                      n_bytes;        /* current is a 1/2 bytes op */\r
169         u8                      max_bits_per_word;      /* maxim is 16b */\r
170         u32                     dma_width;\r
171         int                     cs_change;\r
172         int                     (*write)(struct rk29xx_spi *dws);\r
173         int                     (*read)(struct rk29xx_spi *dws);\r
174         irqreturn_t             (*transfer_handler)(struct rk29xx_spi *dws);\r
175         void (*cs_control)(struct rk29xx_spi *dws, u32 cs, u8 flag);\r
176 \r
177         /* Dma info */\r
178         struct completion               xfer_completion;\r
179         \r
180         struct completion               tx_completion;\r
181         struct completion               rx_completion;\r
182         unsigned    state;\r
183         unsigned                        cur_speed;\r
184         unsigned long                   sfr_start;\r
185         int                     dma_inited;\r
186         enum dma_ch rx_dmach;\r
187         enum dma_ch tx_dmach;\r
188         int                     txdma_done;\r
189         int                     rxdma_done;\r
190         u64                     tx_param;\r
191         u64                     rx_param;\r
192         struct device           *dma_dev;\r
193         dma_addr_t              dma_addr;\r
194 \r
195         /* Bus interface info */\r
196         void                    *priv;\r
197 #ifdef CONFIG_DEBUG_FS\r
198         struct dentry *debugfs;\r
199 #endif\r
200 #ifdef CONFIG_CPU_FREQ\r
201         struct notifier_block   freq_transition;\r
202 #endif\r
203 };\r
204 \r
205 #define rk29xx_readl(dw, off) \\r
206         __raw_readl(dw->regs + off)\r
207 #define rk29xx_writel(dw,off,val) \\r
208         __raw_writel(val, dw->regs + off)\r
209 #define rk29xx_readw(dw, off) \\r
210         __raw_readw(dw->regs + off)\r
211 #define rk29xx_writew(dw,off,val) \\r
212         __raw_writel(val, dw->regs + off)\r
213 \r
214 static inline void spi_enable_chip(struct rk29xx_spi *dws, int enable)\r
215 {\r
216         rk29xx_writel(dws, SPIM_ENR, (enable ? 1 : 0));\r
217 }\r
218 \r
219 static inline void spi_set_clk(struct rk29xx_spi *dws, u16 div)\r
220 {\r
221         rk29xx_writel(dws, SPIM_BAUDR, div);\r
222 }\r
223 \r
224 /* Disable IRQ bits */\r
225 static inline void spi_mask_intr(struct rk29xx_spi *dws, u32 mask)\r
226 {\r
227         u32 new_mask;\r
228 \r
229         new_mask = rk29xx_readl(dws, SPIM_IMR) & ~mask;\r
230         rk29xx_writel(dws, SPIM_IMR, new_mask);\r
231 }\r
232 \r
233 /* Enable IRQ bits */\r
234 static inline void spi_umask_intr(struct rk29xx_spi *dws, u32 mask)\r
235 {\r
236         u32 new_mask;\r
237 \r
238         new_mask = rk29xx_readl(dws, SPIM_IMR) | mask;\r
239         rk29xx_writel(dws, SPIM_IMR, new_mask);\r
240 }\r
241 \r
242 //spi transfer mode                   add by lyx\r
243 #define rk29xx_SPI_HALF_DUPLEX 0\r
244 #define rk29xx_SPI_FULL_DUPLEX 1\r
245 \r
246 /*\r
247  * Each SPI slave device to work with rk29xx spi controller should\r
248  * has such a structure claiming its working mode (PIO/DMA etc),\r
249  * which can be save in the "controller_data" member of the\r
250  * struct spi_device\r
251  */\r
252 struct rk29xx_spi_chip {\r
253         u8 transfer_mode;/*full or half duplex*/\r
254         u8 poll_mode;   /* 0 for contoller polling mode */\r
255         u8 type;        /* SPI/SSP/Micrwire */\r
256         u8 enable_dma;\r
257         void (*cs_control)(struct rk29xx_spi *dws, u32 cs, u8 flag);\r
258 };\r
259 \r
260 #endif /* __DRIVERS_SPIM_RK29XX_HEADER_H */\r