1 /*
2 * Copyright (C) Cvitek Co., Ltd. 2019-2029. All rights reserved.
3 */
4 #ifndef __MMC_H__
5 #define __MMC_H__
6 
7 #include <stdint.h>
8 #include <stdio.h>
9 #include <string.h>
10 #include <stdbool.h>
11 #include "drv_ioremap.h"
12 
13 #define TOP_BASE        0x03000000
14 #define DW_SDIO0_BASE               0x04320000
15 #define DW_SDIO1_BASE               0x04310000
16 #define DW_SDIO2_BASE               0x04300000
17 
18 #define CONFIG_SDIO_NUM   3
19 
20 #define MMC_CMD0            0
21 #define MMC_CMD1            1
22 #define MMC_CMD2            2
23 #define MMC_CMD3            3
24 #define MMC_CMD5            5
25 #define MMC_CMD6            6
26 #define MMC_CMD7            7
27 #define MMC_CMD8            8
28 #define MMC_CMD9            9
29 #define MMC_CMD11           11
30 #define MMC_CMD12           12
31 #define MMC_CMD13           13
32 #define MMC_CMD16           16
33 #define MMC_CMD17           17
34 #define MMC_CMD18           18
35 #define MMC_CMD19           19
36 #define MMC_CMD21           21
37 #define MMC_CMD23           23
38 #define MMC_CMD24           24
39 #define MMC_CMD25           25
40 #define MMC_CMD32           32
41 #define MMC_CMD33           33
42 #define MMC_CMD35           35
43 #define MMC_CMD36           36
44 #define MMC_CMD38           38
45 #define MMC_CMD52           52
46 #define MMC_CMD53           53
47 #define MMC_CMD55           55
48 #define SD_ACMD6            6
49 #define SD_ACMD13           13
50 #define SD_ACMD41           41
51 #define SD_ACMD42           42
52 #define SD_ACMD51           51
53 
mmc_op_multi(uint32_t opcode)54 static inline int mmc_op_multi(uint32_t opcode)
55 {
56     return opcode == MMC_CMD25 || opcode == MMC_CMD18;
57 }
58 
59 #define SDIO0_IRQ           36
60 #define SDIO1_IRQ           38
61 #define SDIO2_IRQ           34
62 #define SDIO0_BASE          DRV_IOREMAP((void *)DW_SDIO1_BASE, 0x1000)
63 #define SDIO1_BASE          DRV_IOREMAP((void *)DW_SDIO0_BASE, 0x1000)
64 #define SDIO2_BASE          DRV_IOREMAP((void *)DW_SDIO2_BASE, 0x1000)
65 
66 #define SDIF_DMA_ADDRESS               0x00
67 #define SDIF_BLOCK_SIZE                0x04
68 #define SDIF_MAKE_BLKSZ(dma, blksz)    ((((dma) & 0x7) << 12) | ((blksz) & 0xFFF))
69 #define SDIF_BLOCK_COUNT               0x06
70 #define SDIF_ARGUMENT                  0x08
71 #define SDIF_TRANSFER_MODE             0x0C
72 #define SDIF_TRNS_DMA                  BIT(0)
73 #define SDIF_TRNS_BLK_CNT_EN           BIT(1)
74 #define SDIF_TRNS_ACMD12               BIT(2)
75 #define SDIF_TRNS_READ                 BIT(4)
76 #define SDIF_TRNS_MULTI                BIT(5)
77 #define SDIF_TRNS_RESP_INT             BIT(8)
78 #define SDIF_COMMAND                   0x0E
79 #define SDIF_CMD_RESP_MASK             0x03
80 #define SDIF_CMD_CRC                   0x08
81 #define SDIF_CMD_INDEX                 0x10
82 #define SDIF_CMD_DATA                  0x20
83 #define SDIF_CMD_ABORTCMD              0xC0
84 #define SDIF_CMD_RESP_NONE             0x00
85 #define SDIF_CMD_RESP_LONG             0x01
86 #define SDIF_CMD_RESP_SHORT            0x02
87 #define SDIF_CMD_RESP_SHORT_BUSY       0x03
88 #define SDIF_MAKE_CMD(c, f)            ((((c) & 0xff) << 8) | ((f) & 0xff))
89 #define SDIF_RESPONSE_01               0x10
90 #define SDIF_RESPONSE_23               0x14
91 #define SDIF_RESPONSE_45               0x18
92 #define SDIF_RESPONSE_67               0x1C
93 
94 #define SDIF_RESPONSE           0x10
95 
96 #define SDIF_BUFFER         0x20
97 
98 #define SDIF_PRESENT_STATE      0x24
99 #define SDIF_DATA_INHIBIT       0x00000002
100 #define SDIF_DOING_WRITE        0x00000100
101 #define SDIF_DOING_READ     0x00000200
102 #define SDIF_SPACE_AVAILABLE    0x00000400
103 #define SDIF_DATA_AVAILABLE 0x00000800
104 #define SDIF_CARD_PRESENT       0x00010000
105 #define SDIF_WRITE_PROTECT      0x00080000
106 #define SDIF_DATA_LVL_MASK      0x00F00000
107 #define SDIF_DATA_LVL_SHIFT 20
108 #define SDIF_DATA_0_LVL_MASK    0x00100000
109 #define SDIF_CMD_LVL            0x01000000
110 
111 #define SDIF_CMD_INHIBIT               BIT(0)
112 #define SDIF_CMD_INHIBIT_DAT           BIT(1)
113 #define SDIF_CARD_INSERTED             BIT(16)
114 #define SDIF_CARD_STABLE               BIT(17)
115 #define SDIF_WR_PROTECT_SW_LVL         BIT(19)
116 #define SDIF_DAT_XFER_WIDTH            BIT(1)
117 #define SDIF_CTRL_SDMA                 0x00
118 #define SDIF_CTRL_HISPD                0x04
119 #define SDIF_BUS_VOL_VDD1_1_8V         0xC
120 #define SDIF_BUS_VOL_VDD1_3_0V         0xE
121 #define SDIF_CTRL_DMA_MASK             0x18
122 #define SDIF_BUF_DATA_R                0x20
123 #define SDIF_HOST_CONTROL              0x28
124 #define SDIF_PWR_CONTROL               0x29
125 #define SDIF_BLOCK_GAP_CONTROL         0x2A
126 #define SDIF_WAKE_UP_CONTROL           0x2B
127 #define SDIF_CLK_CTRL                  0x2C
128 #define SDIF_TOUT_CTRL                 0x2E
129 #define SDIF_SOFTWARE_RESET            0x2F
130 #define SDIF_RESET_CMD                 0x02
131 #define SDIF_RESET_DATA                0x04
132 #define SDIF_INT_STATUS                0x30
133 #define SDIF_ERR_INT_STATUS            0x32
134 #define SDIF_INT_ENABLE                0x34
135 #define SDIF_INT_XFER_COMPLETE         BIT(1)
136 #define SDIF_INT_BUF_RD_READY          BIT(5)
137 #define SDIF_INT_STATUS_EN             0x34
138 #define SDIF_ERR_INT_STATUS_EN         0x36
139 #define SDIF_SIGNAL_ENABLE             0x38
140 #define SDIF_ERROR_SIGNAL_ENABLE       0x3A
141 #define SDIF_AUTO_CMD_STATUS           0x3C
142 #define SDIF_HOST_CONTROL2             0x3E
143 #define SDIF_CAPABILITIES              0x40
144 #define SDIF_CAPABILITIES_1            0x44
145 #define SDIF_MAX_CURRENT               0x48
146 #define SDIF_ADMA_ERROR                0x54
147 #define SDIF_ADMA_ADDRESS              0x58
148 #define SDIF_ADMA_ADDRESS_HI           0x5C
149 #define SDIF_SLOT_INT_STATUS          0xFC
150 #define SDIF_HOST_VERSION              0xFE
151 #define SDIF_INT_XFER_COMPLETE_EN      BIT(1)
152 #define SDIF_INT_DMA_END_EN            BIT(3)
153 #define SDIF_INT_ERROR_EN              BIT(15)
154 #define SDIF_HOST_ADMA2_LEN_MODE       BIT(10)
155 #define SDIF_CTRL_UHS_MASK          0x0007
156 #define SDIF_CTRL_UHS_SDR12         0x0000
157 #define SDIF_CTRL_UHS_SDR25         0x0001
158 #define SDIF_CTRL_UHS_SDR50         0x0002
159 #define SDIF_CTRL_UHS_SDR104        0x0003
160 #define SDIF_CTRL_UHS_DDR50         0x0004
161 #define SDIF_CTRL_HS400         0x0005 /* Non-standard */
162 #define SDIF_CTRL_DRV_TYPE_MASK     0x0030
163 #define SDIF_CTRL_DRV_TYPE_B        0x0000
164 #define SDIF_CTRL_DRV_TYPE_A        0x0010
165 #define SDIF_CTRL_DRV_TYPE_C        0x0020
166 #define SDIF_CTRL_DRV_TYPE_D        0x0030
167 #define SDIF_CTRL_EXEC_TUNING       0x0040
168 #define SDIF_CTRL_TUNED_CLK         0x0080
169 #define SDIF_CTRL_PRESET_VAL_ENABLE   0x8000
170 
171 #define SDIF_GET_CMD(c) ((c>>8) & 0x3f)
172 
173 #define SDIF_INT_RESPONSE       0x00000001
174 #define SDIF_INT_DATA_END       0x00000002
175 #define SDIF_INT_BLK_GAP        0x00000004
176 #define SDIF_INT_DMA_END        0x00000008
177 #define SDIF_INT_SPACE_AVAIL    0x00000010
178 #define SDIF_INT_DATA_AVAIL 0x00000020
179 #define SDIF_INT_CARD_INSERT    0x00000040
180 #define SDIF_INT_CARD_REMOVE    0x00000080
181 #define SDIF_INT_CARD_INT       0x00000100
182 #define SDIF_INT_RETUNE     0x00001000
183 #define SDIF_INT_ERROR          0x00008000
184 #define SDIF_INT_TIMEOUT        0x00010000
185 #define SDIF_INT_CRC            0x00020000
186 #define SDIF_INT_END_BIT        0x00040000
187 #define SDIF_INT_INDEX          0x00080000
188 #define SDIF_INT_DATA_TIMEOUT   0x00100000
189 #define SDIF_INT_DATA_CRC       0x00200000
190 #define SDIF_INT_DATA_END_BIT   0x00400000
191 #define SDIF_INT_BUS_POWER      0x00800000
192 #define SDIF_INT_ACMD12ERR      0x01000000
193 #define SDIF_INT_ADMA_ERROR 0x02000000
194 
195 #define SDIF_INT_CMD_MASK   (SDIF_INT_RESPONSE | SDIF_INT_TIMEOUT | \
196         SDIF_INT_CRC | SDIF_INT_END_BIT | SDIF_INT_INDEX)
197 #define SDIF_INT_DATA_MASK  (SDIF_INT_DATA_END | SDIF_INT_DMA_END | \
198         SDIF_INT_DATA_AVAIL | SDIF_INT_SPACE_AVAIL | \
199         SDIF_INT_DATA_TIMEOUT | SDIF_INT_DATA_CRC | \
200         SDIF_INT_DATA_END_BIT | SDIF_INT_ADMA_ERROR | \
201         SDIF_INT_BLK_GAP)
202 
203 #define SDIF_HOST_VER4_ENABLE          BIT(12)
204 #define SDIF_CAPABILITIES1             0x40
205 #define SDIF_CAPABILITIES2             0x44
206 #define SDIF_ADMA_SA_LOW               0x58
207 #define SDIF_ADMA_SA_HIGH              0x5C
208 #define SDIF_HOST_CNTRL_VERS            0xFE
209 #define SDIF_UHS_2_TIMER_CNTRL          0xC2
210 
211 #define P_VENDOR_SPECIFIC_AREA          0xE8
212 #define P_VENDOR2_SPECIFIC_AREA         0xEA
213 #define VENDOR_SD_CTRL                  0x2C
214 
215 
216 #define DEFAULT_DIV_SD_INIT_CLOCK 0x2
217 
218 /*execute tuning register and bit flag*/
219 #define SDIF_PHY_TX_RX_DLY  0x40
220 #define SDIF_PHY_CONFIG     0x4c
221 
222 /*SDIO 0 register and bit flag*/
223 #define REG_SDIO0_PAD_MASK      (0xFFFFFFF3)
224 #define REG_SDIO0_PAD_SHIFT     (2)
225 
226 #define REG_SDIO0_CD_PAD_REG        (PINMUX_BASE + 0x900)
227 #define REG_SDIO0_CD_PAD_VALUE      (1)
228 
229 #define REG_SDIO0_PWR_EN_PAD_REG    (PINMUX_BASE + 0x904)
230 #define REG_SDIO0_PWR_EN_PAD_VALUE  (2)
231 
232 #define REG_SDIO0_CLK_PAD_REG       (PINMUX_BASE + 0xA00)
233 #define REG_SDIO0_CLK_PAD_VALUE     (2)
234 
235 #define REG_SDIO0_CMD_PAD_REG       (PINMUX_BASE + 0xA04)
236 #define REG_SDIO0_CMD_PAD_VALUE     (1)
237 
238 #define REG_SDIO0_DAT0_PAD_REG      (PINMUX_BASE + 0xA08)
239 #define REG_SDIO0_DAT0_PAD_VALUE    (1)
240 
241 #define REG_SDIO0_DAT1_PAD_REG      (PINMUX_BASE + 0xA0C)
242 #define REG_SDIO0_DAT1_PAD_VALUE    (1)
243 
244 #define REG_SDIO0_DAT2_PAD_REG      (PINMUX_BASE + 0xA10)
245 #define REG_SDIO0_DAT2_PAD_VALUE    (1)
246 
247 #define REG_SDIO0_DAT3_PAD_REG      (PINMUX_BASE + 0xA14)
248 #define REG_SDIO0_DAT3_PAD_VALUE    (1)
249 
250 #define REG_SDIO0_CD_PIO_REG        (PINMUX_BASE + 0x34)
251 #define REG_SDIO0_CD_PIO_VALUE      (0x3)
252 
253 #define REG_SDIO0_PWR_EN_PIO_REG    (PINMUX_BASE + 0x38)
254 #define REG_SDIO0_PWR_EN_PIO_VALUE  (0x0)
255 
256 #define REG_SDIO0_CLK_PIO_REG       (PINMUX_BASE + 0x1C)
257 #define REG_SDIO0_CLK_PIO_VALUE     (0x0)
258 
259 #define REG_SDIO0_CMD_PIO_REG       (PINMUX_BASE + 0x20)
260 #define REG_SDIO0_CMD_PIO_VALUE     (0x0)
261 
262 #define REG_SDIO0_DAT0_PIO_REG      (PINMUX_BASE + 0x24)
263 #define REG_SDIO0_DAT0_PIO_VALUE    (0x0)
264 
265 #define REG_SDIO0_DAT1_PIO_REG      (PINMUX_BASE + 0x28)
266 #define REG_SDIO0_DAT1_PIO_VALUE    (0x0)
267 
268 #define REG_SDIO0_DAT2_PIO_REG      (PINMUX_BASE + 0x2C)
269 #define REG_SDIO0_DAT2_PIO_VALUE    (0x0)
270 
271 #define REG_SDIO0_DAT3_PIO_REG      (PINMUX_BASE + 0x30)
272 #define REG_SDIO0_DAT3_PIO_VALUE    (0x0)
273 
274 /*SDIO 1 register and bit flag*/
275 #define RTCIO_BASE                 (uintptr_t)DRV_IOREMAP((void *)0x5027000, 0x1000)
276 #define REG_SDIO1_PAD_MASK      (0xFFFFFFF3)
277 #define REG_SDIO1_PAD_SHIFT     (2)
278 
279 #define REG_SDIO1_CLK_PAD_REG       (RTCIO_BASE + 0x6C)
280 #define REG_SDIO1_CLK_PAD_VALUE     (2)
281 
282 #define REG_SDIO1_CMD_PAD_REG       (RTCIO_BASE + 0x68)
283 #define REG_SDIO1_CMD_PAD_VALUE     (1)
284 
285 #define REG_SDIO1_DAT0_PAD_REG      (RTCIO_BASE + 0x64)
286 #define REG_SDIO1_DAT0_PAD_VALUE    (1)
287 
288 #define REG_SDIO1_DAT1_PAD_REG      (RTCIO_BASE + 0x60)
289 #define REG_SDIO1_DAT1_PAD_VALUE    (1)
290 
291 #define REG_SDIO1_DAT2_PAD_REG      (RTCIO_BASE + 0x5C)
292 #define REG_SDIO1_DAT2_PAD_VALUE    (1)
293 
294 #define REG_SDIO1_DAT3_PAD_REG      (RTCIO_BASE + 0x58)
295 #define REG_SDIO1_DAT3_PAD_VALUE    (1)
296 
297 #define REG_SDIO1_CLK_PIO_REG       (PINMUX_BASE + 0xE4)
298 #define REG_SDIO1_CLK_PIO_VALUE     (0x0)
299 
300 #define REG_SDIO1_CMD_PIO_REG       (PINMUX_BASE + 0xE0)
301 #define REG_SDIO1_CMD_PIO_VALUE     (0x0)
302 
303 #define REG_SDIO1_DAT0_PIO_REG      (PINMUX_BASE + 0xDC)
304 #define REG_SDIO1_DAT0_PIO_VALUE    (0x0)
305 
306 #define REG_SDIO1_DAT1_PIO_REG      (PINMUX_BASE + 0xD8)
307 #define REG_SDIO1_DAT1_PIO_VALUE    (0x0)
308 
309 #define REG_SDIO1_DAT2_PIO_REG      (PINMUX_BASE + 0xD4)
310 #define REG_SDIO1_DAT2_PIO_VALUE    (0x0)
311 
312 #define REG_SDIO1_DAT3_PIO_REG      (PINMUX_BASE + 0xD0)
313 #define REG_SDIO1_DAT3_PIO_VALUE    (0x0)
314 
315 #define RTC_CTRL_BASE       (uintptr_t)DRV_IOREMAP((void *)0x5025000, 0x1000)
316 #define RTCSYS_CLKMUX       (RTC_CTRL_BASE + 0x1C)
317 #define RTCSYS_CLKBYP       (RTC_CTRL_BASE + 0x30)
318 #define RTCSYS_MCU51_ICTRL1 (RTC_CTRL_BASE + 0x7C)
319 
320 #define RTCSYS_CTRL_BASE    (uintptr_t)DRV_IOREMAP((void *)0x03000000, 0x1000)
321 #define RTCSYS_CTRL         (RTCSYS_CTRL_BASE + 0x248)
322 
323 /*SDIO 2 register and bit flag*/
324 #define REG_SDIO2_PAD_MASK (0xFFFFFFF3)
325 #define REG_SDIO2_PAD_SHIFT (2)
326 
327 #define REG_SDIO2_RSTN_PAD_REG (PINMUX_BASE + 0x914)
328 #define REG_SDIO2_RSTN_PAD_VALUE (1)
329 
330 #define REG_SDIO2_CLK_PAD_REG (PINMUX_BASE + 0x91C)
331 #define REG_SDIO2_CLK_PAD_VALUE (2)
332 
333 #define REG_SDIO2_CMD_PAD_REG (PINMUX_BASE + 0x928)
334 #define REG_SDIO2_CMD_PAD_VALUE (1)
335 
336 #define REG_SDIO2_DAT0_PAD_REG (PINMUX_BASE + 0x920)
337 #define REG_SDIO2_DAT0_PAD_VALUE (1)
338 
339 #define REG_SDIO2_DAT1_PAD_REG (PINMUX_BASE + 0x92C)
340 #define REG_SDIO2_DAT1_PAD_VALUE (1)
341 
342 #define REG_SDIO2_DAT2_PAD_REG (PINMUX_BASE + 0x918)
343 #define REG_SDIO2_DAT2_PAD_VALUE (1)
344 
345 #define REG_SDIO2_DAT3_PAD_REG (PINMUX_BASE + 0x924)
346 #define REG_SDIO2_DAT3_PAD_VALUE (1)
347 
348 #define REG_SDIO2_RSTN_PIO_REG (PINMUX_BASE + 0x48)
349 #define REG_SDIO2_RSTN_PIO_VALUE (0x0)
350 
351 #define REG_SDIO2_CLK_PIO_REG (PINMUX_BASE + 0x50)
352 #define REG_SDIO2_CLK_PIO_VALUE (0x0)
353 
354 #define REG_SDIO2_CMD_PIO_REG (PINMUX_BASE + 0x5C)
355 #define REG_SDIO2_CMD_PIO_VALUE (0x0)
356 
357 #define REG_SDIO2_DAT0_PIO_REG (PINMUX_BASE + 0x54)
358 #define REG_SDIO2_DAT0_PIO_VALUE (0x0)
359 
360 #define REG_SDIO2_DAT1_PIO_REG (PINMUX_BASE + 0x60)
361 #define REG_SDIO2_DAT1_PIO_VALUE (0x0)
362 
363 #define REG_SDIO2_DAT2_PIO_REG (PINMUX_BASE + 0x4C)
364 #define REG_SDIO2_DAT2_PIO_VALUE (0x0)
365 
366 #define REG_SDIO2_DAT3_PIO_REG (PINMUX_BASE + 0x58)
367 #define REG_SDIO2_DAT3_PIO_VALUE (0x0)
368 
369 #define CLK_DIV_BASE           (uintptr_t)DRV_IOREMAP((void *)0x3002000, 0x1000)
370 #define MMC_SDIO0_PLL_REGISTER (CLK_DIV_BASE + 0x70)
371 #define MMC_SDIO1_PLL_REGISTER (CLK_DIV_BASE + 0x7C)
372 #define MMC_SDIO2_PLL_REGISTER (CLK_DIV_BASE + 0x64)
373 #define MMC_MAX_CLOCK_DIV_VALUE (0x40009)
374 #define CLOCK_BYPASS_SELECT_REGISTER (0x3002030)
375 
376 #endif /* __HAL_DW_SDIO_H_ */
377