dw_sdmmc.h 13 KB

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