summaryrefslogtreecommitdiff
path: root/bsp/cvitek/drivers/libraries/sdif/dw_sdmmc.h
blob: 702c82dbdc10d205255edeba2e88929012ceb395 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
/*
* Copyright (C) Cvitek Co., Ltd. 2019-2029. All rights reserved.
*/
#ifndef __MMC_H__
#define __MMC_H__

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include "drv_ioremap.h"

#define TOP_BASE        0x03000000
#define DW_SDIO0_BASE               0x04320000
#define DW_SDIO1_BASE               0x04310000
#define DW_SDIO2_BASE               0x04300000

#define CONFIG_SDIO_NUM   3

#define MMC_CMD0            0
#define MMC_CMD1            1
#define MMC_CMD2            2
#define MMC_CMD3            3
#define MMC_CMD5            5
#define MMC_CMD6            6
#define MMC_CMD7            7
#define MMC_CMD8            8
#define MMC_CMD9            9
#define MMC_CMD11           11
#define MMC_CMD12           12
#define MMC_CMD13           13
#define MMC_CMD16           16
#define MMC_CMD17           17
#define MMC_CMD18           18
#define MMC_CMD19           19
#define MMC_CMD21           21
#define MMC_CMD23           23
#define MMC_CMD24           24
#define MMC_CMD25           25
#define MMC_CMD32           32
#define MMC_CMD33           33
#define MMC_CMD35           35
#define MMC_CMD36           36
#define MMC_CMD38           38
#define MMC_CMD52           52
#define MMC_CMD53           53
#define MMC_CMD55           55
#define SD_ACMD6            6
#define SD_ACMD13           13
#define SD_ACMD41           41
#define SD_ACMD42           42
#define SD_ACMD51           51

static inline int mmc_op_multi(uint32_t opcode)
{
    return opcode == MMC_CMD25 || opcode == MMC_CMD18;
}

#define SDIO0_IRQ           36
#define SDIO1_IRQ           38
#define SDIO2_IRQ           34
#define SDIO0_BASE          DRV_IOREMAP((void *)DW_SDIO1_BASE, 0x1000)
#define SDIO1_BASE          DRV_IOREMAP((void *)DW_SDIO0_BASE, 0x1000)
#define SDIO2_BASE          DRV_IOREMAP((void *)DW_SDIO2_BASE, 0x1000)

#define SDIF_DMA_ADDRESS               0x00
#define SDIF_BLOCK_SIZE                0x04
#define SDIF_MAKE_BLKSZ(dma, blksz)    ((((dma) & 0x7) << 12) | ((blksz) & 0xFFF))
#define SDIF_BLOCK_COUNT               0x06
#define SDIF_ARGUMENT                  0x08
#define SDIF_TRANSFER_MODE             0x0C
#define SDIF_TRNS_DMA                  BIT(0)
#define SDIF_TRNS_BLK_CNT_EN           BIT(1)
#define SDIF_TRNS_ACMD12               BIT(2)
#define SDIF_TRNS_READ                 BIT(4)
#define SDIF_TRNS_MULTI                BIT(5)
#define SDIF_TRNS_RESP_INT             BIT(8)
#define SDIF_COMMAND                   0x0E
#define SDIF_CMD_RESP_MASK             0x03
#define SDIF_CMD_CRC                   0x08
#define SDIF_CMD_INDEX                 0x10
#define SDIF_CMD_DATA                  0x20
#define SDIF_CMD_ABORTCMD              0xC0
#define SDIF_CMD_RESP_NONE             0x00
#define SDIF_CMD_RESP_LONG             0x01
#define SDIF_CMD_RESP_SHORT            0x02
#define SDIF_CMD_RESP_SHORT_BUSY       0x03
#define SDIF_MAKE_CMD(c, f)            ((((c) & 0xff) << 8) | ((f) & 0xff))
#define SDIF_RESPONSE_01               0x10
#define SDIF_RESPONSE_23               0x14
#define SDIF_RESPONSE_45               0x18
#define SDIF_RESPONSE_67               0x1C

#define SDIF_RESPONSE           0x10

#define SDIF_BUFFER         0x20

#define SDIF_PRESENT_STATE      0x24
#define SDIF_DATA_INHIBIT       0x00000002
#define SDIF_DOING_WRITE        0x00000100
#define SDIF_DOING_READ     0x00000200
#define SDIF_SPACE_AVAILABLE    0x00000400
#define SDIF_DATA_AVAILABLE 0x00000800
#define SDIF_CARD_PRESENT       0x00010000
#define SDIF_WRITE_PROTECT      0x00080000
#define SDIF_DATA_LVL_MASK      0x00F00000
#define SDIF_DATA_LVL_SHIFT 20
#define SDIF_DATA_0_LVL_MASK    0x00100000
#define SDIF_CMD_LVL            0x01000000

#define SDIF_CMD_INHIBIT               BIT(0)
#define SDIF_CMD_INHIBIT_DAT           BIT(1)
#define SDIF_CARD_INSERTED             BIT(16)
#define SDIF_CARD_STABLE               BIT(17)
#define SDIF_WR_PROTECT_SW_LVL         BIT(19)
#define SDIF_DAT_XFER_WIDTH            BIT(1)
#define SDIF_CTRL_SDMA                 0x00
#define SDIF_CTRL_HISPD                0x04
#define SDIF_BUS_VOL_VDD1_1_8V         0xC
#define SDIF_BUS_VOL_VDD1_3_0V         0xE
#define SDIF_CTRL_DMA_MASK             0x18
#define SDIF_BUF_DATA_R                0x20
#define SDIF_HOST_CONTROL              0x28
#define SDIF_PWR_CONTROL               0x29
#define SDIF_BLOCK_GAP_CONTROL         0x2A
#define SDIF_WAKE_UP_CONTROL           0x2B
#define SDIF_CLK_CTRL                  0x2C
#define SDIF_TOUT_CTRL                 0x2E
#define SDIF_SOFTWARE_RESET            0x2F
#define SDIF_RESET_CMD                 0x02
#define SDIF_RESET_DATA                0x04
#define SDIF_INT_STATUS                0x30
#define SDIF_ERR_INT_STATUS            0x32
#define SDIF_INT_ENABLE                0x34
#define SDIF_INT_XFER_COMPLETE         BIT(1)
#define SDIF_INT_BUF_RD_READY          BIT(5)
#define SDIF_INT_STATUS_EN             0x34
#define SDIF_ERR_INT_STATUS_EN         0x36
#define SDIF_SIGNAL_ENABLE             0x38
#define SDIF_ERROR_SIGNAL_ENABLE       0x3A
#define SDIF_AUTO_CMD_STATUS           0x3C
#define SDIF_HOST_CONTROL2             0x3E
#define SDIF_CAPABILITIES              0x40
#define SDIF_CAPABILITIES_1            0x44
#define SDIF_MAX_CURRENT               0x48
#define SDIF_ADMA_ERROR                0x54
#define SDIF_ADMA_ADDRESS              0x58
#define SDIF_ADMA_ADDRESS_HI           0x5C
#define SDIF_SLOT_INT_STATUS          0xFC
#define SDIF_HOST_VERSION              0xFE
#define SDIF_INT_XFER_COMPLETE_EN      BIT(1)
#define SDIF_INT_DMA_END_EN            BIT(3)
#define SDIF_INT_ERROR_EN              BIT(15)
#define SDIF_HOST_ADMA2_LEN_MODE       BIT(10)
#define SDIF_CTRL_UHS_MASK          0x0007
#define SDIF_CTRL_UHS_SDR12         0x0000
#define SDIF_CTRL_UHS_SDR25         0x0001
#define SDIF_CTRL_UHS_SDR50         0x0002
#define SDIF_CTRL_UHS_SDR104        0x0003
#define SDIF_CTRL_UHS_DDR50         0x0004
#define SDIF_CTRL_HS400         0x0005 /* Non-standard */
#define SDIF_CTRL_DRV_TYPE_MASK     0x0030
#define SDIF_CTRL_DRV_TYPE_B        0x0000
#define SDIF_CTRL_DRV_TYPE_A        0x0010
#define SDIF_CTRL_DRV_TYPE_C        0x0020
#define SDIF_CTRL_DRV_TYPE_D        0x0030
#define SDIF_CTRL_EXEC_TUNING       0x0040
#define SDIF_CTRL_TUNED_CLK         0x0080
#define SDIF_CTRL_PRESET_VAL_ENABLE   0x8000

#define SDIF_GET_CMD(c) ((c>>8) & 0x3f)

#define SDIF_INT_RESPONSE       0x00000001
#define SDIF_INT_DATA_END       0x00000002
#define SDIF_INT_BLK_GAP        0x00000004
#define SDIF_INT_DMA_END        0x00000008
#define SDIF_INT_SPACE_AVAIL    0x00000010
#define SDIF_INT_DATA_AVAIL 0x00000020
#define SDIF_INT_CARD_INSERT    0x00000040
#define SDIF_INT_CARD_REMOVE    0x00000080
#define SDIF_INT_CARD_INT       0x00000100
#define SDIF_INT_RETUNE     0x00001000
#define SDIF_INT_ERROR          0x00008000
#define SDIF_INT_TIMEOUT        0x00010000
#define SDIF_INT_CRC            0x00020000
#define SDIF_INT_END_BIT        0x00040000
#define SDIF_INT_INDEX          0x00080000
#define SDIF_INT_DATA_TIMEOUT   0x00100000
#define SDIF_INT_DATA_CRC       0x00200000
#define SDIF_INT_DATA_END_BIT   0x00400000
#define SDIF_INT_BUS_POWER      0x00800000
#define SDIF_INT_ACMD12ERR      0x01000000
#define SDIF_INT_ADMA_ERROR 0x02000000

#define SDIF_INT_CMD_MASK   (SDIF_INT_RESPONSE | SDIF_INT_TIMEOUT | \
        SDIF_INT_CRC | SDIF_INT_END_BIT | SDIF_INT_INDEX)
#define SDIF_INT_DATA_MASK  (SDIF_INT_DATA_END | SDIF_INT_DMA_END | \
        SDIF_INT_DATA_AVAIL | SDIF_INT_SPACE_AVAIL | \
        SDIF_INT_DATA_TIMEOUT | SDIF_INT_DATA_CRC | \
        SDIF_INT_DATA_END_BIT | SDIF_INT_ADMA_ERROR | \
        SDIF_INT_BLK_GAP)

#define SDIF_HOST_VER4_ENABLE          BIT(12)
#define SDIF_CAPABILITIES1             0x40
#define SDIF_CAPABILITIES2             0x44
#define SDIF_ADMA_SA_LOW               0x58
#define SDIF_ADMA_SA_HIGH              0x5C
#define SDIF_HOST_CNTRL_VERS            0xFE
#define SDIF_UHS_2_TIMER_CNTRL          0xC2

#define P_VENDOR_SPECIFIC_AREA          0xE8
#define P_VENDOR2_SPECIFIC_AREA         0xEA
#define VENDOR_SD_CTRL                  0x2C


#define DEFAULT_DIV_SD_INIT_CLOCK 0x2

/*execute tuning register and bit flag*/
#define SDIF_PHY_TX_RX_DLY  0x40
#define SDIF_PHY_CONFIG     0x4c

/*SDIO 0 register and bit flag*/
#define REG_SDIO0_PAD_MASK      (0xFFFFFFF3)
#define REG_SDIO0_PAD_SHIFT     (2)

#define REG_SDIO0_CD_PAD_REG        (PINMUX_BASE + 0x900)
#define REG_SDIO0_CD_PAD_VALUE      (1)

#define REG_SDIO0_PWR_EN_PAD_REG    (PINMUX_BASE + 0x904)
#define REG_SDIO0_PWR_EN_PAD_VALUE  (2)

#define REG_SDIO0_CLK_PAD_REG       (PINMUX_BASE + 0xA00)
#define REG_SDIO0_CLK_PAD_VALUE     (2)

#define REG_SDIO0_CMD_PAD_REG       (PINMUX_BASE + 0xA04)
#define REG_SDIO0_CMD_PAD_VALUE     (1)

#define REG_SDIO0_DAT0_PAD_REG      (PINMUX_BASE + 0xA08)
#define REG_SDIO0_DAT0_PAD_VALUE    (1)

#define REG_SDIO0_DAT1_PAD_REG      (PINMUX_BASE + 0xA0C)
#define REG_SDIO0_DAT1_PAD_VALUE    (1)

#define REG_SDIO0_DAT2_PAD_REG      (PINMUX_BASE + 0xA10)
#define REG_SDIO0_DAT2_PAD_VALUE    (1)

#define REG_SDIO0_DAT3_PAD_REG      (PINMUX_BASE + 0xA14)
#define REG_SDIO0_DAT3_PAD_VALUE    (1)

#define REG_SDIO0_CD_PIO_REG        (PINMUX_BASE + 0x34)
#define REG_SDIO0_CD_PIO_VALUE      (0x3)

#define REG_SDIO0_PWR_EN_PIO_REG    (PINMUX_BASE + 0x38)
#define REG_SDIO0_PWR_EN_PIO_VALUE  (0x0)

#define REG_SDIO0_CLK_PIO_REG       (PINMUX_BASE + 0x1C)
#define REG_SDIO0_CLK_PIO_VALUE     (0x0)

#define REG_SDIO0_CMD_PIO_REG       (PINMUX_BASE + 0x20)
#define REG_SDIO0_CMD_PIO_VALUE     (0x0)

#define REG_SDIO0_DAT0_PIO_REG      (PINMUX_BASE + 0x24)
#define REG_SDIO0_DAT0_PIO_VALUE    (0x0)

#define REG_SDIO0_DAT1_PIO_REG      (PINMUX_BASE + 0x28)
#define REG_SDIO0_DAT1_PIO_VALUE    (0x0)

#define REG_SDIO0_DAT2_PIO_REG      (PINMUX_BASE + 0x2C)
#define REG_SDIO0_DAT2_PIO_VALUE    (0x0)

#define REG_SDIO0_DAT3_PIO_REG      (PINMUX_BASE + 0x30)
#define REG_SDIO0_DAT3_PIO_VALUE    (0x0)

/*SDIO 1 register and bit flag*/
#define RTCIO_BASE                 (uintptr_t)DRV_IOREMAP((void *)0x5027000, 0x1000)
#define REG_SDIO1_PAD_MASK      (0xFFFFFFF3)
#define REG_SDIO1_PAD_SHIFT     (2)

#define REG_SDIO1_CLK_PAD_REG       (RTCIO_BASE + 0x6C)
#define REG_SDIO1_CLK_PAD_VALUE     (2)

#define REG_SDIO1_CMD_PAD_REG       (RTCIO_BASE + 0x68)
#define REG_SDIO1_CMD_PAD_VALUE     (1)

#define REG_SDIO1_DAT0_PAD_REG      (RTCIO_BASE + 0x64)
#define REG_SDIO1_DAT0_PAD_VALUE    (1)

#define REG_SDIO1_DAT1_PAD_REG      (RTCIO_BASE + 0x60)
#define REG_SDIO1_DAT1_PAD_VALUE    (1)

#define REG_SDIO1_DAT2_PAD_REG      (RTCIO_BASE + 0x5C)
#define REG_SDIO1_DAT2_PAD_VALUE    (1)

#define REG_SDIO1_DAT3_PAD_REG      (RTCIO_BASE + 0x58)
#define REG_SDIO1_DAT3_PAD_VALUE    (1)

#define REG_SDIO1_CLK_PIO_REG       (PINMUX_BASE + 0xE4)
#define REG_SDIO1_CLK_PIO_VALUE     (0x0)

#define REG_SDIO1_CMD_PIO_REG       (PINMUX_BASE + 0xE0)
#define REG_SDIO1_CMD_PIO_VALUE     (0x0)

#define REG_SDIO1_DAT0_PIO_REG      (PINMUX_BASE + 0xDC)
#define REG_SDIO1_DAT0_PIO_VALUE    (0x0)

#define REG_SDIO1_DAT1_PIO_REG      (PINMUX_BASE + 0xD8)
#define REG_SDIO1_DAT1_PIO_VALUE    (0x0)

#define REG_SDIO1_DAT2_PIO_REG      (PINMUX_BASE + 0xD4)
#define REG_SDIO1_DAT2_PIO_VALUE    (0x0)

#define REG_SDIO1_DAT3_PIO_REG      (PINMUX_BASE + 0xD0)
#define REG_SDIO1_DAT3_PIO_VALUE    (0x0)

#define RTC_CTRL_BASE       (uintptr_t)DRV_IOREMAP((void *)0x5025000, 0x1000)
#define RTCSYS_CLKMUX       (RTC_CTRL_BASE + 0x1C)
#define RTCSYS_CLKBYP       (RTC_CTRL_BASE + 0x30)
#define RTCSYS_MCU51_ICTRL1 (RTC_CTRL_BASE + 0x7C)

#define RTCSYS_CTRL_BASE    (uintptr_t)DRV_IOREMAP((void *)0x03000000, 0x1000)
#define RTCSYS_CTRL         (RTCSYS_CTRL_BASE + 0x248)

/*SDIO 2 register and bit flag*/
#define REG_SDIO2_PAD_MASK (0xFFFFFFF3)
#define REG_SDIO2_PAD_SHIFT (2)

#define REG_SDIO2_RSTN_PAD_REG (PINMUX_BASE + 0x914)
#define REG_SDIO2_RSTN_PAD_VALUE (1)

#define REG_SDIO2_CLK_PAD_REG (PINMUX_BASE + 0x91C)
#define REG_SDIO2_CLK_PAD_VALUE (2)

#define REG_SDIO2_CMD_PAD_REG (PINMUX_BASE + 0x928)
#define REG_SDIO2_CMD_PAD_VALUE (1)

#define REG_SDIO2_DAT0_PAD_REG (PINMUX_BASE + 0x920)
#define REG_SDIO2_DAT0_PAD_VALUE (1)

#define REG_SDIO2_DAT1_PAD_REG (PINMUX_BASE + 0x92C)
#define REG_SDIO2_DAT1_PAD_VALUE (1)

#define REG_SDIO2_DAT2_PAD_REG (PINMUX_BASE + 0x918)
#define REG_SDIO2_DAT2_PAD_VALUE (1)

#define REG_SDIO2_DAT3_PAD_REG (PINMUX_BASE + 0x924)
#define REG_SDIO2_DAT3_PAD_VALUE (1)

#define REG_SDIO2_RSTN_PIO_REG (PINMUX_BASE + 0x48)
#define REG_SDIO2_RSTN_PIO_VALUE (0x0)

#define REG_SDIO2_CLK_PIO_REG (PINMUX_BASE + 0x50)
#define REG_SDIO2_CLK_PIO_VALUE (0x0)

#define REG_SDIO2_CMD_PIO_REG (PINMUX_BASE + 0x5C)
#define REG_SDIO2_CMD_PIO_VALUE (0x0)

#define REG_SDIO2_DAT0_PIO_REG (PINMUX_BASE + 0x54)
#define REG_SDIO2_DAT0_PIO_VALUE (0x0)

#define REG_SDIO2_DAT1_PIO_REG (PINMUX_BASE + 0x60)
#define REG_SDIO2_DAT1_PIO_VALUE (0x0)

#define REG_SDIO2_DAT2_PIO_REG (PINMUX_BASE + 0x4C)
#define REG_SDIO2_DAT2_PIO_VALUE (0x0)

#define REG_SDIO2_DAT3_PIO_REG (PINMUX_BASE + 0x58)
#define REG_SDIO2_DAT3_PIO_VALUE (0x0)

#define CLK_DIV_BASE           (uintptr_t)DRV_IOREMAP((void *)0x3002000, 0x1000)
#define MMC_SDIO0_PLL_REGISTER (CLK_DIV_BASE + 0x70)
#define MMC_SDIO1_PLL_REGISTER (CLK_DIV_BASE + 0x7C)
#define MMC_SDIO2_PLL_REGISTER (CLK_DIV_BASE + 0x64)
#define MMC_MAX_CLOCK_DIV_VALUE (0x40009)
#define CLOCK_BYPASS_SELECT_REGISTER (0x3002030)

#endif /* __HAL_DW_SDIO_H_ */