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