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