mt_sd.h 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740
  1. #ifndef MT_SD_H
  2. #define MT_SD_H
  3. #include <linux/bitops.h>
  4. #include <linux/mmc/host.h>
  5. #include <mt-plat/sync_write.h>
  6. #include <generated/autoconf.h>
  7. #include <linux/pm.h>
  8. #include <linux/mmc/sdio_func.h>
  9. /* weiping fix */
  10. #if !defined(CONFIG_MTK_CLKMGR)
  11. #include <linux/clk.h>
  12. #endif
  13. /* #define MSDC_DMA_ADDR_DEBUG */
  14. /* ccyeh #define MSDC_HQA */
  15. #define MTK_MSDC_USE_CMD23
  16. #if defined(CONFIG_MTK_EMMC_CACHE) && defined(MTK_MSDC_USE_CMD23)
  17. #define MTK_MSDC_USE_CACHE
  18. extern unsigned int g_emmc_cache_size;
  19. #endif
  20. #ifdef MTK_MSDC_USE_CMD23
  21. #define MSDC_USE_AUTO_CMD23 (1)
  22. #endif
  23. #define HOST_MAX_NUM (4)
  24. #define MAX_REQ_SZ (512 * 1024)
  25. #define CMD_TUNE_UHS_MAX_TIME (2*32*8*8)
  26. #define CMD_TUNE_HS_MAX_TIME (2*32)
  27. #define READ_TUNE_UHS_CLKMOD1_MAX_TIME (2*32*32*8)
  28. #define READ_TUNE_UHS_MAX_TIME (2*32*32)
  29. #define READ_TUNE_HS_MAX_TIME (2*32)
  30. #define WRITE_TUNE_HS_MAX_TIME (2*32)
  31. #define WRITE_TUNE_UHS_MAX_TIME (2*32*8)
  32. #define MAX_HS400_TUNE_COUNT (576) /* (32*18) */
  33. #define MAX_GPD_NUM (1 + 1) /* one null gpd */
  34. #define MAX_BD_NUM (1024)
  35. #define MAX_BD_PER_GPD (MAX_BD_NUM)
  36. #define CLK_SRC_MAX_NUM (1)
  37. #define EINT_MSDC1_INS_POLARITY (0)
  38. #define SDIO_ERROR_BYPASS
  39. /* #define MSDC_CLKSRC_REG (0xf100000C)*/
  40. #define MSDC_DESENSE_REG (0xf0007070)
  41. #ifdef CONFIG_SDIOAUTOK_SUPPORT
  42. #define MTK_SDIO30_ONLINE_TUNING_SUPPORT
  43. /* #define OT_LATENCY_TEST */
  44. #endif
  45. /* #define ONLINE_TUNING_DVTTEST */
  46. #ifdef CONFIG_FPGA_EARLY_PORTING
  47. #define FPGA_PLATFORM
  48. #else
  49. #define MTK_MSDC_BRINGUP_DEBUG
  50. #endif
  51. /* #define MTK_MSDC_DUMP_FIFO */
  52. #define CMD_SET_FOR_MMC_TUNE_CASE1 (0x00000000FB260140ULL)
  53. #define CMD_SET_FOR_MMC_TUNE_CASE2 (0x0000000000000080ULL)
  54. #define CMD_SET_FOR_MMC_TUNE_CASE3 (0x0000000000001000ULL)
  55. #define CMD_SET_FOR_MMC_TUNE_CASE4 (0x0000000000000020ULL)
  56. /* #define CMD_SET_FOR_MMC_TUNE_CASE5 (0x0000000000084000ULL) */
  57. #define CMD_SET_FOR_SD_TUNE_CASE1 (0x000000007B060040ULL)
  58. #define CMD_SET_FOR_APP_TUNE_CASE1 (0x0008000000402000ULL)
  59. #define IS_IN_CMD_SET(cmd_num, set) ((0x1ULL << cmd_num) & (set))
  60. #define MSDC_VERIFY_NEED_TUNE (0)
  61. #define MSDC_VERIFY_ERROR (1)
  62. #define MSDC_VERIFY_NEED_NOT_TUNE (2)
  63. /*--------------------------------------------------------------------------*/
  64. /* Common Macro */
  65. /*--------------------------------------------------------------------------*/
  66. #define REG_ADDR(x) ((base + OFFSET_##x))
  67. /*--------------------------------------------------------------------------*/
  68. /* Common Definition */
  69. /*--------------------------------------------------------------------------*/
  70. #define MSDC_FIFO_SZ (128)
  71. #define MSDC_FIFO_THD (64) /* (128) */
  72. #define MSDC_NUM (4)
  73. /* No memory stick mode, 0 use to gate clock */
  74. #define MSDC_MS (0)
  75. #define MSDC_SDMMC (1)
  76. #define MSDC_MODE_UNKNOWN (0)
  77. #define MSDC_MODE_PIO (1)
  78. #define MSDC_MODE_DMA_BASIC (2)
  79. #define MSDC_MODE_DMA_DESC (3)
  80. #define MSDC_MODE_DMA_ENHANCED (4)
  81. #define MSDC_MODE_MMC_STREAM (5)
  82. #define MSDC_BUS_1BITS (0)
  83. #define MSDC_BUS_4BITS (1)
  84. #define MSDC_BUS_8BITS (2)
  85. #define MSDC_BRUST_8B (3)
  86. #define MSDC_BRUST_16B (4)
  87. #define MSDC_BRUST_32B (5)
  88. #define MSDC_BRUST_64B (6)
  89. #define MSDC_PIN_PULL_NONE (0)
  90. #define MSDC_PIN_PULL_DOWN (1)
  91. #define MSDC_PIN_PULL_UP (2)
  92. #define MSDC_PIN_KEEP (3)
  93. #define MSDC_AUTOCMD12 (1)
  94. #define MSDC_AUTOCMD23 (2)
  95. #define MSDC_AUTOCMD19 (3)
  96. #if defined(MTK_SDIO30_ONLINE_TUNING_SUPPORT) || defined(ONLINE_TUNING_DVTTEST)
  97. #define MSDC_AUTOCMD53 (4)
  98. #endif
  99. #define MSDC_EMMC_BOOTMODE0 (0) /* Pull low CMD mode */
  100. #define MSDC_EMMC_BOOTMODE1 (1) /* Reset CMD mode */
  101. enum {
  102. RESP_NONE = 0,
  103. RESP_R1,
  104. RESP_R2,
  105. RESP_R3,
  106. RESP_R4,
  107. RESP_R5,
  108. RESP_R6,
  109. RESP_R7,
  110. RESP_R1B
  111. };
  112. /*--------------------------------------------------------------------------*/
  113. /* Register Offset */
  114. /*--------------------------------------------------------------------------*/
  115. #define OFFSET_MSDC_CFG (0x0)
  116. #define OFFSET_MSDC_IOCON (0x04)
  117. #define OFFSET_MSDC_PS (0x08)
  118. #define OFFSET_MSDC_INT (0x0c)
  119. #define OFFSET_MSDC_INTEN (0x10)
  120. #define OFFSET_MSDC_FIFOCS (0x14)
  121. #define OFFSET_MSDC_TXDATA (0x18)
  122. #define OFFSET_MSDC_RXDATA (0x1c)
  123. #define OFFSET_SDC_CFG (0x30)
  124. #define OFFSET_SDC_CMD (0x34)
  125. #define OFFSET_SDC_ARG (0x38)
  126. #define OFFSET_SDC_STS (0x3c)
  127. #define OFFSET_SDC_RESP0 (0x40)
  128. #define OFFSET_SDC_RESP1 (0x44)
  129. #define OFFSET_SDC_RESP2 (0x48)
  130. #define OFFSET_SDC_RESP3 (0x4c)
  131. #define OFFSET_SDC_BLK_NUM (0x50)
  132. #define OFFSET_SDC_VOL_CHG (0x54)
  133. #define OFFSET_SDC_CSTS (0x58)
  134. #define OFFSET_SDC_CSTS_EN (0x5c)
  135. #define OFFSET_SDC_DCRC_STS (0x60)
  136. #define OFFSET_EMMC_CFG0 (0x70)
  137. #define OFFSET_EMMC_CFG1 (0x74)
  138. #define OFFSET_EMMC_STS (0x78)
  139. #define OFFSET_EMMC_IOCON (0x7c)
  140. #define OFFSET_SDC_ACMD_RESP (0x80)
  141. #define OFFSET_SDC_ACMD19_TRG (0x84)
  142. #define OFFSET_SDC_ACMD19_STS (0x88)
  143. #define OFFSET_MSDC_DMA_SA_HIGH4BIT (0x8C)
  144. #define OFFSET_MSDC_DMA_SA (0x90)
  145. #define OFFSET_MSDC_DMA_CA (0x94)
  146. #define OFFSET_MSDC_DMA_CTRL (0x98)
  147. #define OFFSET_MSDC_DMA_CFG (0x9c)
  148. #define OFFSET_MSDC_DBG_SEL (0xa0)
  149. #define OFFSET_MSDC_DBG_OUT (0xa4)
  150. #define OFFSET_MSDC_DMA_LEN (0xa8)
  151. #define OFFSET_MSDC_PATCH_BIT0 (0xb0)
  152. #define OFFSET_MSDC_PATCH_BIT1 (0xb4)
  153. #define OFFSET_MSDC_PATCH_BIT2 (0xb8)
  154. #define OFFSET_DAT0_TUNE_CRC (0xc0)
  155. #define OFFSET_DAT1_TUNE_CRC (0xc4)
  156. #define OFFSET_DAT2_TUNE_CRC (0xc8)
  157. #define OFFSET_DAT3_TUNE_CRC (0xcc)
  158. #define OFFSET_CMD_TUNE_CRC (0xd0)
  159. #define OFFSET_SDIO_TUNE_WIND (0xd4)
  160. #define OFFSET_MSDC_PAD_TUNE0 (0xf0)
  161. #define OFFSET_MSDC_PAD_TUNE1 (0xf4)
  162. #define OFFSET_MSDC_DAT_RDDLY0 (0xf8)
  163. #define OFFSET_MSDC_DAT_RDDLY1 (0xfc)
  164. #define OFFSET_MSDC_DAT_RDDLY2 (0x100)
  165. #define OFFSET_MSDC_DAT_RDDLY3 (0x104)
  166. #define OFFSET_MSDC_HW_DBG (0x110)
  167. #define OFFSET_MSDC_VERSION (0x114)
  168. #define OFFSET_MSDC_ECO_VER (0x118)
  169. #define OFFSET_EMMC50_PAD_CTL0 (0x180)
  170. #define OFFSET_EMMC50_PAD_DS_CTL0 (0x184)
  171. #define OFFSET_EMMC50_PAD_DS_TUNE (0x188)
  172. #define OFFSET_EMMC50_PAD_CMD_TUNE (0x18c)
  173. #define OFFSET_EMMC50_PAD_DAT01_TUNE (0x190)
  174. #define OFFSET_EMMC50_PAD_DAT23_TUNE (0x194)
  175. #define OFFSET_EMMC50_PAD_DAT45_TUNE (0x198)
  176. #define OFFSET_EMMC50_PAD_DAT67_TUNE (0x19c)
  177. #define OFFSET_EMMC51_CFG0 (0x204)
  178. #define OFFSET_EMMC50_CFG0 (0x208)
  179. #define OFFSET_EMMC50_CFG1 (0x20c)
  180. #define OFFSET_EMMC50_CFG2 (0x21c)
  181. #define OFFSET_EMMC50_CFG3 (0x220)
  182. #define OFFSET_EMMC50_CFG4 (0x224)
  183. /*--------------------------------------------------------------------------*/
  184. /* Register Address */
  185. /*--------------------------------------------------------------------------*/
  186. /* common register */
  187. #define MSDC_CFG REG_ADDR(MSDC_CFG)
  188. #define MSDC_IOCON REG_ADDR(MSDC_IOCON)
  189. #define MSDC_PS REG_ADDR(MSDC_PS)
  190. #define MSDC_INT REG_ADDR(MSDC_INT)
  191. #define MSDC_INTEN REG_ADDR(MSDC_INTEN)
  192. #define MSDC_FIFOCS REG_ADDR(MSDC_FIFOCS)
  193. #define MSDC_TXDATA REG_ADDR(MSDC_TXDATA)
  194. #define MSDC_RXDATA REG_ADDR(MSDC_RXDATA)
  195. /* sdmmc register */
  196. #define SDC_CFG REG_ADDR(SDC_CFG)
  197. #define SDC_CMD REG_ADDR(SDC_CMD)
  198. #define SDC_ARG REG_ADDR(SDC_ARG)
  199. #define SDC_STS REG_ADDR(SDC_STS)
  200. #define SDC_RESP0 REG_ADDR(SDC_RESP0)
  201. #define SDC_RESP1 REG_ADDR(SDC_RESP1)
  202. #define SDC_RESP2 REG_ADDR(SDC_RESP2)
  203. #define SDC_RESP3 REG_ADDR(SDC_RESP3)
  204. #define SDC_BLK_NUM REG_ADDR(SDC_BLK_NUM)
  205. #define SDC_VOL_CHG REG_ADDR(SDC_VOL_CHG)
  206. #define SDC_CSTS REG_ADDR(SDC_CSTS)
  207. #define SDC_CSTS_EN REG_ADDR(SDC_CSTS_EN)
  208. #define SDC_DCRC_STS REG_ADDR(SDC_DCRC_STS)
  209. /* emmc register*/
  210. #define EMMC_CFG0 REG_ADDR(EMMC_CFG0)
  211. #define EMMC_CFG1 REG_ADDR(EMMC_CFG1)
  212. #define EMMC_STS REG_ADDR(EMMC_STS)
  213. #define EMMC_IOCON REG_ADDR(EMMC_IOCON)
  214. /* auto command register */
  215. #define SDC_ACMD_RESP REG_ADDR(SDC_ACMD_RESP)
  216. #define SDC_ACMD19_TRG REG_ADDR(SDC_ACMD19_TRG)
  217. #define SDC_ACMD19_STS REG_ADDR(SDC_ACMD19_STS)
  218. /* dma register */
  219. #define MSDC_DMA_SA_HIGH4BIT REG_ADDR(MSDC_DMA_SA_HIGH4BIT)
  220. #define MSDC_DMA_SA REG_ADDR(MSDC_DMA_SA)
  221. #define MSDC_DMA_CA REG_ADDR(MSDC_DMA_CA)
  222. #define MSDC_DMA_CTRL REG_ADDR(MSDC_DMA_CTRL)
  223. #define MSDC_DMA_CFG REG_ADDR(MSDC_DMA_CFG)
  224. #define MSDC_DMA_LEN REG_ADDR(MSDC_DMA_LEN)
  225. /* data read delay */
  226. #define MSDC_DAT_RDDLY0 REG_ADDR(MSDC_DAT_RDDLY0)
  227. #define MSDC_DAT_RDDLY1 REG_ADDR(MSDC_DAT_RDDLY1)
  228. #define MSDC_DAT_RDDLY2 REG_ADDR(MSDC_DAT_RDDLY2)
  229. #define MSDC_DAT_RDDLY3 REG_ADDR(MSDC_DAT_RDDLY3)
  230. /* debug register */
  231. #define MSDC_DBG_SEL REG_ADDR(MSDC_DBG_SEL)
  232. #define MSDC_DBG_OUT REG_ADDR(MSDC_DBG_OUT)
  233. /* misc register */
  234. #define MSDC_PATCH_BIT0 REG_ADDR(MSDC_PATCH_BIT0)
  235. #define MSDC_PATCH_BIT1 REG_ADDR(MSDC_PATCH_BIT1)
  236. #define MSDC_PATCH_BIT2 REG_ADDR(MSDC_PATCH_BIT2)
  237. #define DAT0_TUNE_CRC REG_ADDR(DAT0_TUNE_CRC)
  238. #define DAT1_TUNE_CRC REG_ADDR(DAT1_TUNE_CRC)
  239. #define DAT2_TUNE_CRC REG_ADDR(DAT2_TUNE_CRC)
  240. #define DAT3_TUNE_CRC REG_ADDR(DAT3_TUNE_CRC)
  241. #define CMD_TUNE_CRC REG_ADDR(CMD_TUNE_CRC)
  242. #define SDIO_TUNE_WIND REG_ADDR(SDIO_TUNE_WIND)
  243. #define MSDC_PAD_TUNE0 REG_ADDR(MSDC_PAD_TUNE0)
  244. #define MSDC_PAD_TUNE1 REG_ADDR(MSDC_PAD_TUNE1)
  245. #define MSDC_HW_DBG REG_ADDR(MSDC_HW_DBG)
  246. #define MSDC_VERSION REG_ADDR(MSDC_VERSION)
  247. #define MSDC_ECO_VER REG_ADDR(MSDC_ECO_VER)
  248. /* eMMC 5.0 register */
  249. #define EMMC50_PAD_CTL0 REG_ADDR(EMMC50_PAD_CTL0)
  250. #define EMMC50_PAD_DS_CTL0 REG_ADDR(EMMC50_PAD_DS_CTL0)
  251. #define EMMC50_PAD_DS_TUNE REG_ADDR(EMMC50_PAD_DS_TUNE)
  252. #define EMMC50_PAD_CMD_TUNE REG_ADDR(EMMC50_PAD_CMD_TUNE)
  253. #define EMMC50_PAD_DAT01_TUNE REG_ADDR(EMMC50_PAD_DAT01_TUNE)
  254. #define EMMC50_PAD_DAT23_TUNE REG_ADDR(EMMC50_PAD_DAT23_TUNE)
  255. #define EMMC50_PAD_DAT45_TUNE REG_ADDR(EMMC50_PAD_DAT45_TUNE)
  256. #define EMMC50_PAD_DAT67_TUNE REG_ADDR(EMMC50_PAD_DAT67_TUNE)
  257. #define EMMC51_CFG0 REG_ADDR(EMMC51_CFG0)
  258. #define EMMC50_CFG0 REG_ADDR(EMMC50_CFG0)
  259. #define EMMC50_CFG1 REG_ADDR(EMMC50_CFG1)
  260. #define EMMC50_CFG2 REG_ADDR(EMMC50_CFG2)
  261. #define EMMC50_CFG3 REG_ADDR(EMMC50_CFG3)
  262. #define EMMC50_CFG4 REG_ADDR(EMMC50_CFG4)
  263. /*--------------------------------------------------------------------------*/
  264. /* Register Mask */
  265. /*--------------------------------------------------------------------------*/
  266. /* MSDC_CFG mask */
  267. #define MSDC_CFG_MODE (0x1 << 0) /* RW */
  268. #define MSDC_CFG_CKPDN (0x1 << 1) /* RW */
  269. #define MSDC_CFG_RST (0x1 << 2) /* A0 */
  270. #define MSDC_CFG_PIO (0x1 << 3) /* RW */
  271. #define MSDC_CFG_CKDRVEN (0x1 << 4) /* RW */
  272. #define MSDC_CFG_BV18SDT (0x1 << 5) /* RW */
  273. #define MSDC_CFG_BV18PSS (0x1 << 6) /* R */
  274. #define MSDC_CFG_CKSTB (0x1 << 7) /* R */
  275. #define MSDC_CFG_CKDIV (0xfff << 8) /* RW */
  276. #define MSDC_CFG_CKMOD (0x3 << 20) /* W1C */
  277. #define MSDC_CFG_CKMOD_HS400 (0x1 << 22) /* RW */
  278. #define MSDC_CFG_START_BIT (0x3 << 23) /* RW */
  279. #define MSDC_CFG_SCLK_STOP_DDR (0x1 << 25) /* RW */
  280. /* MSDC_IOCON mask */
  281. #define MSDC_IOCON_SDR104CKS (0x1 << 0) /* RW */
  282. #define MSDC_IOCON_RSPL (0x1 << 1) /* RW */
  283. #define MSDC_IOCON_R_D_SMPL (0x1 << 2) /* RW */
  284. #define MSDC_IOCON_DDLSEL (0x1 << 3) /* RW */
  285. #define MSDC_IOCON_DDR50CKD (0x1 << 4) /* RW */
  286. #define MSDC_IOCON_R_D_SMPL_SEL (0x1 << 5) /* RW */
  287. #define MSDC_IOCON_W_D_SMPL (0x1 << 8) /* RW */
  288. #define MSDC_IOCON_W_D_SMPL_SEL (0x1 << 9) /* RW */
  289. #define MSDC_IOCON_W_D0SPL (0x1 << 10) /* RW */
  290. #define MSDC_IOCON_W_D1SPL (0x1 << 11) /* RW */
  291. #define MSDC_IOCON_W_D2SPL (0x1 << 12) /* RW */
  292. #define MSDC_IOCON_W_D3SPL (0x1 << 13) /* RW */
  293. #define MSDC_IOCON_R_D0SPL (0x1 << 16) /* RW */
  294. #define MSDC_IOCON_R_D1SPL (0x1 << 17) /* RW */
  295. #define MSDC_IOCON_R_D2SPL (0x1 << 18) /* RW */
  296. #define MSDC_IOCON_R_D3SPL (0x1 << 19) /* RW */
  297. #define MSDC_IOCON_R_D4SPL (0x1 << 20) /* RW */
  298. #define MSDC_IOCON_R_D5SPL (0x1 << 21) /* RW */
  299. #define MSDC_IOCON_R_D6SPL (0x1 << 22) /* RW */
  300. #define MSDC_IOCON_R_D7SPL (0x1 << 23) /* RW */
  301. /* MSDC_PS mask */
  302. #define MSDC_PS_CDEN (0x1 << 0) /* RW */
  303. #define MSDC_PS_CDSTS (0x1 << 1) /* R */
  304. #define MSDC_PS_CDDEBOUNCE (0xf << 12) /* RW */
  305. #define MSDC_PS_DAT (0xff << 16) /* R */
  306. #define MSDC_PS_CMD (0x1 << 24) /* R */
  307. #define MSDC_PS_WP (0x1UL << 31) /* R */
  308. /* MSDC_INT mask */
  309. #define MSDC_INT_MMCIRQ (0x1 << 0) /* W1C */
  310. #define MSDC_INT_CDSC (0x1 << 1) /* W1C */
  311. #define MSDC_INT_ACMDRDY (0x1 << 3) /* W1C */
  312. #define MSDC_INT_ACMDTMO (0x1 << 4) /* W1C */
  313. #define MSDC_INT_ACMDCRCERR (0x1 << 5) /* W1C */
  314. #define MSDC_INT_DMAQ_EMPTY (0x1 << 6) /* W1C */
  315. #define MSDC_INT_SDIOIRQ (0x1 << 7) /* W1C */
  316. #define MSDC_INT_CMDRDY (0x1 << 8) /* W1C */
  317. #define MSDC_INT_CMDTMO (0x1 << 9) /* W1C */
  318. #define MSDC_INT_RSPCRCERR (0x1 << 10) /* W1C */
  319. #define MSDC_INT_CSTA (0x1 << 11) /* R */
  320. #define MSDC_INT_XFER_COMPL (0x1 << 12) /* W1C */
  321. #define MSDC_INT_DXFER_DONE (0x1 << 13) /* W1C */
  322. #define MSDC_INT_DATTMO (0x1 << 14) /* W1C */
  323. #define MSDC_INT_DATCRCERR (0x1 << 15) /* W1C */
  324. #define MSDC_INT_ACMD19_DONE (0x1 << 16) /* W1C */
  325. #define MSDC_INT_BDCSERR (0x1 << 17) /* W1C */
  326. #define MSDC_INT_GPDCSERR (0x1 << 18) /* W1C */
  327. #define MSDC_INT_DMAPRO (0x1 << 19) /* W1C */
  328. #define MSDC_INT_AXI_RESP_ERR (0x1 << 23) /* W1C */
  329. #if defined(MTK_SDIO30_ONLINE_TUNING_SUPPORT) || defined(ONLINE_TUNING_DVTTEST)
  330. #define MSDC_INT_GEAR_OUT_BOUND (0x1 << 20) /* W1C */
  331. #define MSDC_INT_ACMD53_DONE (0x1 << 21) /* W1C */
  332. #define MSDC_INT_ACMD53_FAIL (0x1 << 22) /* W1C */
  333. #endif
  334. /* MSDC_INTEN mask */
  335. #define MSDC_INTEN_MMCIRQ (0x1 << 0) /* RW */
  336. #define MSDC_INTEN_CDSC (0x1 << 1) /* RW */
  337. #define MSDC_INTEN_ACMDRDY (0x1 << 3) /* RW */
  338. #define MSDC_INTEN_ACMDTMO (0x1 << 4) /* RW */
  339. #define MSDC_INTEN_ACMDCRCERR (0x1 << 5) /* RW */
  340. #define MSDC_INTEN_DMAQ_EMPTY (0x1 << 6) /* RW */
  341. #define MSDC_INTEN_SDIOIRQ (0x1 << 7) /* RW */
  342. #define MSDC_INTEN_CMDRDY (0x1 << 8) /* RW */
  343. #define MSDC_INTEN_CMDTMO (0x1 << 9) /* RW */
  344. #define MSDC_INTEN_RSPCRCERR (0x1 << 10) /* RW */
  345. #define MSDC_INTEN_CSTA (0x1 << 11) /* RW */
  346. #define MSDC_INTEN_XFER_COMPL (0x1 << 12) /* RW */
  347. #define MSDC_INTEN_DXFER_DONE (0x1 << 13) /* RW */
  348. #define MSDC_INTEN_DATTMO (0x1 << 14) /* RW */
  349. #define MSDC_INTEN_DATCRCERR (0x1 << 15) /* RW */
  350. #define MSDC_INTEN_ACMD19_DONE (0x1 << 16) /* RW */
  351. #define MSDC_INTEN_BDCSERR (0x1 << 17) /* RW */
  352. #define MSDC_INTEN_GPDCSERR (0x1 << 18) /* RW */
  353. #define MSDC_INTEN_DMAPRO (0x1 << 19) /* RW */
  354. #define MSDC_INTEN_GOBOUND (0x1 << 20) /* RW */
  355. #define MSDC_INTEN_ACMD53_DONE (0x1 << 21) /* RW */
  356. #define MSDC_INTEN_ACMD53_FAIL (0x1 << 22) /* RW */
  357. #define MSDC_INTEN_AXI_RESP_ERR (0x1 << 23) /* RW */
  358. /* MSDC_FIFOCS mask */
  359. #define MSDC_FIFOCS_RXCNT (0xff << 0) /* R */
  360. #define MSDC_FIFOCS_TXCNT (0xff << 16) /* R */
  361. #define MSDC_FIFOCS_CLR (0x1UL << 31) /* RW */
  362. /* SDC_CFG mask */
  363. #define SDC_CFG_SDIOINTWKUP (0x1 << 0) /* RW */
  364. #define SDC_CFG_INSWKUP (0x1 << 1) /* RW */
  365. #define SDC_CFG_BUSWIDTH (0x3 << 16) /* RW */
  366. #define SDC_CFG_SDIO (0x1 << 19) /* RW */
  367. #define SDC_CFG_SDIOIDE (0x1 << 20) /* RW */
  368. #define SDC_CFG_INTATGAP (0x1 << 21) /* RW */
  369. #define SDC_CFG_DTOC (0xffUL << 24) /* RW */
  370. /* SDC_CMD mask */
  371. #define SDC_CMD_OPC (0x3f << 0) /* RW */
  372. #define SDC_CMD_BRK (0x1 << 6) /* RW */
  373. #define SDC_CMD_RSPTYP (0x7 << 7) /* RW */
  374. #define SDC_CMD_DTYP (0x3 << 11) /* RW */
  375. #define SDC_CMD_RW (0x1 << 13) /* RW */
  376. #define SDC_CMD_STOP (0x1 << 14) /* RW */
  377. #define SDC_CMD_GOIRQ (0x1 << 15) /* RW */
  378. #define SDC_CMD_BLKLEN (0xfff << 16) /* RW */
  379. #define SDC_CMD_AUTOCMD (0x3 << 28) /* RW */
  380. #define SDC_CMD_VOLSWTH (0x1 << 30) /* RW */
  381. #define SDC_CMD_ACMD53 (0x1UL << 31) /* RW */
  382. /* SDC_VOL_CHG mask */
  383. #define SDC_VOL_CHG_CNT (0xffff << 0) /* RW */
  384. /* SDC_STS mask */
  385. #define SDC_STS_SDCBUSY (0x1 << 0) /* RW */
  386. #define SDC_STS_CMDBUSY (0x1 << 1) /* RW */
  387. #define SDC_STS_CMD_WR_BUSY (0x1 << 16) /* W1C */
  388. #define SDC_STS_SWR_COMPL (0x1UL << 31) /* RO */
  389. /* SDC_DCRC_STS mask */
  390. #define SDC_DCRC_STS_POS (0xff << 0) /* RO */
  391. #define SDC_DCRC_STS_NEG (0xff << 8) /* RO */
  392. /* EMMC_CFG0 mask */
  393. #define EMMC_CFG0_BOOTSTART (0x1 << 0) /* W */
  394. #define EMMC_CFG0_BOOTSTOP (0x1 << 1) /* W */
  395. #define EMMC_CFG0_BOOTMODE (0x1 << 2) /* RW */
  396. #define EMMC_CFG0_BOOTACKDIS (0x1 << 3) /* RW */
  397. #define EMMC_CFG0_BOOTWDLY (0x7 << 12) /* RW */
  398. #define EMMC_CFG0_BOOTSUPP (0x1 << 15) /* RW */
  399. /* EMMC_CFG1 mask */
  400. #define EMMC_CFG1_BOOTDATTMC (0xfffff << 0) /* RW */
  401. #define EMMC_CFG1_BOOTACKTMC (0xfffUL << 20) /* RW */
  402. /* EMMC_STS mask */
  403. #define EMMC_STS_BOOTCRCERR (0x1 << 0) /* W1C */
  404. #define EMMC_STS_BOOTACKERR (0x1 << 1) /* W1C */
  405. #define EMMC_STS_BOOTDATTMO (0x1 << 2) /* W1C */
  406. #define EMMC_STS_BOOTACKTMO (0x1 << 3) /* W1C */
  407. #define EMMC_STS_BOOTUPSTATE (0x1 << 4) /* R */
  408. #define EMMC_STS_BOOTACKRCV (0x1 << 5) /* W1C */
  409. #define EMMC_STS_BOOTDATRCV (0x1 << 6) /* R */
  410. /* EMMC_IOCON mask */
  411. #define EMMC_IOCON_BOOTRST (0x1 << 0) /* RW */
  412. /* SDC_ACMD19_TRG mask */
  413. #define SDC_ACMD19_TRG_TUNESEL (0xf << 0) /* RW */
  414. /* MSDC_DMA_SA_HIGH4BIT */
  415. #define MSDC_DMA_SURR_ADDR_HIGH4BIT (0xf << 0) /* RW */
  416. /* MSDC_DMA_CTRL mask */
  417. #define MSDC_DMA_CTRL_START (0x1 << 0) /* W */
  418. #define MSDC_DMA_CTRL_STOP (0x1 << 1) /* W */
  419. #define MSDC_DMA_CTRL_RESUME (0x1 << 2) /* W */
  420. #define MSDC_DMA_CTRL_REDAYM (0x1 << 3) /* RO */
  421. #define MSDC_DMA_CTRL_MODE (0x1 << 8) /* RW */
  422. #define MSDC_DMA_CTRL_ALIGN (0x1 << 9) /* RW */
  423. #define MSDC_DMA_CTRL_LASTBUF (0x1 << 10) /* RW */
  424. #define MSDC_DMA_CTRL_SPLIT1K (0x1 << 11) /* RW */
  425. #define MSDC_DMA_CTRL_BRUSTSZ (0x7 << 12) /* RW */
  426. /* MSDC_DMA_CFG mask */
  427. #define MSDC_DMA_CFG_STS (0x1 << 0) /* R */
  428. #define MSDC_DMA_CFG_DECSEN (0x1 << 1) /* RW */
  429. #define MSDC_DMA_CFG_LOCKDISABLE (0x1 << 2) /* RW */
  430. #define MSDC_DMA_CFG_AHBEN (0x3 << 8) /* RW */
  431. #define MSDC_DMA_CFG_ACTEN (0x3 << 12) /* RW */
  432. #define MSDC_DMA_CFG_CS12B (0x1 << 16) /* RW */
  433. /* MSDC_PATCH_BIT0 mask */
  434. #define MSDC_PB0_RESV1 (0x1 << 0)
  435. #define MSDC_PB0_EN_8BITSUP (0x1 << 1)
  436. #define MSDC_PB0_DIS_RECMDWR (0x1 << 2)
  437. #define MSDC_PB0_RESV2 (0x7 << 3)
  438. #define MSDC_PB0_DESCUP (0x1 << 6)
  439. #define MSDC_PB0_INT_DAT_LATCH_CK_SEL (0x7 << 7)
  440. #define MSDC_PB0_CKGEN_MSDC_DLY_SEL (0x1F<<10)
  441. #define MSDC_PB0_FIFORD_DIS (0x1 << 15)
  442. #define MSDC_PB0_BLKNUM_SEL (0x1 << 16)
  443. #define MSDC_PB0_SDIO_INTCSEL (0x1 << 17)
  444. #define MSDC_PB0_SDC_BSYDLY (0xf << 18)
  445. #define MSDC_PB0_SDC_WDOD (0xf << 22)
  446. #define MSDC_PB0_CMDIDRTSEL (0x1 << 26)
  447. #define MSDC_PB0_CMDFAILSEL (0x1 << 27)
  448. #define MSDC_PB0_SDIO_INTDLYSEL (0x1 << 28)
  449. #define MSDC_PB0_SPCPUSH (0x1 << 29)
  450. #define MSDC_PB0_DETWR_CRCTMO (0x1 << 30)
  451. #define MSDC_PB0_EN_DRVRSP (0x1UL << 31)
  452. /* MSDC_PATCH_BIT1 mask */
  453. #define MSDC_PB1_WRDAT_CRCS_TA_CNTR (0x7 << 0)
  454. #define MSDC_PB1_CMD_RSP_TA_CNTR (0x7 << 3)
  455. #define MSDC_PB1_GET_BUSY_MA (0x1 << 6)
  456. #define MSDC_PB1_GET_CRC_MA (0x1 << 7)
  457. #define MSDC_PB1_BIAS_TUNE_28NM (0xf << 8)
  458. #define MSDC_PB1_BIAS_EN18IO_28NM (0x1 << 12)
  459. #define MSDC_PB1_BIAS_EXT_28NM (0x1 << 13)
  460. #define MSDC_PB1_RESV2 (0x1 << 14)
  461. #define MSDC_PB1_RESET_GDMA (0x1 << 15)
  462. #define MSDC_PB1_SINGLEBURST (0x1 << 16)
  463. #define MSDC_PB1_FROCE_STOP (0x1 << 17)
  464. #define MSDC_PB1_DCM_DEV_SEL2 (0x3 << 18)
  465. #define MSDC_PB1_DCM_DEV_SEL1 (0x1 << 20)
  466. #define MSDC_PB1_DCM_EN (0x1 << 21)
  467. #define MSDC_PB1_AXI_WRAP_CKEN (0x1 << 22)
  468. #define MSDC_PB1_AHBCKEN (0x1 << 23)
  469. #define MSDC_PB1_CKSPCEN (0x1 << 24)
  470. #define MSDC_PB1_CKPSCEN (0x1 << 25)
  471. #define MSDC_PB1_CKVOLDETEN (0x1 << 26)
  472. #define MSDC_PB1_CKACMDEN (0x1 << 27)
  473. #define MSDC_PB1_CKSDEN (0x1 << 28)
  474. #define MSDC_PB1_CKWCTLEN (0x1 << 29)
  475. #define MSDC_PB1_CKRCTLEN (0x1 << 30)
  476. #define MSDC_PB1_CKSHBFFEN (0x1UL << 31)
  477. /* MSDC_PATCH_BIT2 mask */
  478. #define MSDC_PB2_ENHANCEGPD (0x1 << 0)
  479. #define MSDC_PB2_SUPPORT64G (0x1 << 1)
  480. #define MSDC_PB2_RESPWAITCNT (0x3 << 2)
  481. #define MSDC_PB2_CFGRDATCNT (0x1f << 4)
  482. #define MSDC_PB2_CFGRDAT (0x1 << 9)
  483. #define MSDC_PB2_INTCRESPSEL (0x1 << 11)
  484. #define MSDC_PB2_CFGRESPCNT (0x7 << 12)
  485. #define MSDC_PB2_CFGRESP (0x1 << 15)
  486. #define MSDC_PB2_RESPSTENSEL (0x7 << 16)
  487. #define MSDC_PB2_POPENCNT (0xf << 20)
  488. #define MSDC_PB2_CFG_CRCSTS_SEL (0x1 << 24)
  489. #define MSDC_PB2_CFGCRCSTSEDGE (0x1 << 25)
  490. #define MSDC_PB2_CFGCRCSTSCNT (0x3 << 26)
  491. #define MSDC_PB2_CFGCRCSTS (0x1 << 28)
  492. #define MSDC_PB2_CRCSTSENSEL (0x7UL << 29)
  493. #if defined(MTK_SDIO30_ONLINE_TUNING_SUPPORT) || defined(ONLINE_TUNING_DVTTEST)
  494. #define MSDC_MASK_ACMD53_CRC_ERR_INTR (0x1<<4)
  495. #define MSDC_ACMD53_FAIL_ONE_SHOT (0X1<<5)
  496. #endif
  497. /* MSDC_PAD_TUNE0 mask */
  498. #define MSDC_PAD_TUNE0_DATWRDLY (0x1F << 0) /* RW */
  499. #define MSDC_PAD_TUNE0_DELAYEN (0x1 << 7) /* RW */
  500. #define MSDC_PAD_TUNE0_DATRRDLY (0x1F << 8) /* RW */
  501. #define MSDC_PAD_TUNE0_DATRRDLYSEL (0x1 << 13) /* RW */
  502. #define MSDC_PAD_TUNE0_RXDLYSEL (0x1 << 15) /* RW */
  503. #define MSDC_PAD_TUNE0_CMDRDLY (0x1F << 16) /* RW */
  504. #define MSDC_PAD_TUNE0_CMDRRDLYSEL (0x1 << 21) /* RW */
  505. #define MSDC_PAD_TUNE0_CMDRRDLY (0x1FUL << 22) /* RW */
  506. #define MSDC_PAD_TUNE0_CLKTXDLY (0x1FUL << 27) /* RW */
  507. /* MSDC_PAD_TUNE1 mask */
  508. #define MSDC_PAD_TUNE1_DATRRDLY2 (0x1F << 8) /* RW */
  509. #define MSDC_PAD_TUNE1_DATRRDLY2SEL (0x1 << 13) /* RW */
  510. #define MSDC_PAD_TUNE1_CMDRDLY2 (0x1F << 16) /* RW */
  511. #define MSDC_PAD_TUNE1_CMDRRDLY2SEL (0x1 << 21) /* RW */
  512. /* MSDC_DAT_RDDLY0/1/2/3 mask */
  513. #define MSDC_DAT_RDDLY0_D3 (0x1F << 0) /* RW */
  514. #define MSDC_DAT_RDDLY0_D2 (0x1F << 8) /* RW */
  515. #define MSDC_DAT_RDDLY0_D1 (0x1F << 16) /* RW */
  516. #define MSDC_DAT_RDDLY0_D0 (0x1FUL << 24) /* RW */
  517. #define MSDC_DAT_RDDLY1_D7 (0x1F << 0) /* RW */
  518. #define MSDC_DAT_RDDLY1_D6 (0x1F << 8) /* RW */
  519. #define MSDC_DAT_RDDLY1_D5 (0x1F << 16) /* RW */
  520. #define MSDC_DAT_RDDLY1_D4 (0x1FUL << 24) /* RW */
  521. #define MSDC_DAT_RDDLY2_D3 (0x1F << 0) /* RW */
  522. #define MSDC_DAT_RDDLY2_D2 (0x1F << 8) /* RW */
  523. #define MSDC_DAT_RDDLY2_D1 (0x1F << 16) /* RW */
  524. #define MSDC_DAT_RDDLY2_D0 (0x1FUL << 24) /* RW */
  525. #define MSDC_DAT_RDDLY3_D7 (0x1F << 0) /* RW */
  526. #define MSDC_DAT_RDDLY3_D6 (0x1F << 8) /* RW */
  527. #define MSDC_DAT_RDDLY3_D5 (0x1F << 16) /* RW */
  528. #define MSDC_DAT_RDDLY3_D4 (0x1FUL << 24) /* RW */
  529. /* MSDC_HW_DBG_SEL mask */
  530. #define MSDC_HW_DBG0_SEL (0xff << 0)
  531. #define MSDC_HW_DBG1_SEL (0xff << 8)
  532. #define MSDC_HW_DBG2_SEL (0xff << 16)
  533. #define MSDC_HW_DBG3_SEL (0x1f << 24)
  534. #define MSDC_HW_DBG_WRAPTYPE_SEL (0x3UL << 29)
  535. /* EMMC50_PAD_DS_TUNE mask */
  536. #define MSDC_EMMC50_PAD_DS_TUNE_DLYSEL (0x1 << 0)
  537. #define MSDC_EMMC50_PAD_DS_TUNE_DLY2SEL (0x1 << 1)
  538. #define MSDC_EMMC50_PAD_DS_TUNE_DLY1 (0x1f << 2)
  539. #define MSDC_EMMC50_PAD_DS_TUNE_DLY2 (0x1f << 7)
  540. #define MSDC_EMMC50_PAD_DS_TUNE_DLY3 (0x1F << 12)
  541. /* EMMC50_PAD_CMD_TUNE mask */
  542. #define MSDC_EMMC50_PAD_CMD_TUNE_DLY3SEL (0x1 << 0)
  543. #define MSDC_EMMC50_PAD_CMD_TUNE_RXDLY3 (0x1f << 1)
  544. #define MSDC_EMMC50_PAD_CMD_TUNE_TXDLY (0x1f << 6)
  545. /* EMMC50_PAD_DAT01_TUNE mask */
  546. #define MSDC_EMMC50_PAD_DAT0_RXDLY3SEL (0x1 << 0)
  547. #define MSDC_EMMC50_PAD_DAT0_RXDLY3 (0x1f << 1)
  548. #define MSDC_EMMC50_PAD_DAT0_TXDLY (0x1f << 6)
  549. #define MSDC_EMMC50_PAD_DAT1_RXDLY3SEL (0x1 << 16)
  550. #define MSDC_EMMC50_PAD_DAT1_RXDLY3 (0x1f << 17)
  551. #define MSDC_EMMC50_PAD_DAT1_TXDLY (0x1f << 22)
  552. /* EMMC50_PAD_DAT23_TUNE mask */
  553. #define MSDC_EMMC50_PAD_DAT2_RXDLY3SEL (0x1 << 0)
  554. #define MSDC_EMMC50_PAD_DAT2_RXDLY3 (0x1f << 1)
  555. #define MSDC_EMMC50_PAD_DAT2_TXDLY (0x1f << 6)
  556. #define MSDC_EMMC50_PAD_DAT3_RXDLY3SEL (0x1 << 16)
  557. #define MSDC_EMMC50_PAD_DAT3_RXDLY3 (0x1f << 17)
  558. #define MSDC_EMMC50_PAD_DAT3_TXDLY (0x1f << 22)
  559. /* EMMC50_PAD_DAT45_TUNE mask */
  560. #define MSDC_EMMC50_PAD_DAT4_RXDLY3SEL (0x1 << 0)
  561. #define MSDC_EMMC50_PAD_DAT4_RXDLY3 (0x1f << 1)
  562. #define MSDC_EMMC50_PAD_DAT4_TXDLY (0x1f << 6)
  563. #define MSDC_EMMC50_PAD_DAT5_RXDLY3SEL (0x1 << 16)
  564. #define MSDC_EMMC50_PAD_DAT5_RXDLY3 (0x1f << 17)
  565. #define MSDC_EMMC50_PAD_DAT5_TXDLY (0x1f << 22)
  566. /* EMMC50_PAD_DAT67_TUNE mask */
  567. #define MSDC_EMMC50_PAD_DAT6_RXDLY3SEL (0x1 << 0)
  568. #define MSDC_EMMC50_PAD_DAT6_RXDLY3 (0x1f << 1)
  569. #define MSDC_EMMC50_PAD_DAT6_TXDLY (0x1f << 6)
  570. #define MSDC_EMMC50_PAD_DAT7_RXDLY3SEL (0x1 << 16)
  571. #define MSDC_EMMC50_PAD_DAT7_RXDLY3 (0x1f << 17)
  572. #define MSDC_EMMC50_PAD_DAT7_TXDLY (0x1f << 22)
  573. /* EMMC51_CFG0 mask */
  574. #define MSDC_EMMC51_CFG0_CMDQ_EN (0x1 << 0)
  575. #define MSDC_EMMC51_CFG0_WDAT_CNT (0x3ff << 1)
  576. #define MSDC_EMMC51_CFG0_RDAT_CNT (0x3ff << 11)
  577. #define MSDC_EMMC51_CFG0_CMDQ_CMD_EN (0x1 << 21)
  578. /* EMMC50_CFG0 mask */
  579. #define MSDC_EMMC50_CFG_PADCMD_LATCHCK (0x1 << 0)
  580. #define MSDC_EMMC50_CFG_CRC_STS_CNT (0x3 << 1)
  581. #define MSDC_EMMC50_CFG_CRC_STS_EDGE (0x1 << 3)
  582. #define MSDC_EMMC50_CFG_CRC_STS_SEL (0x1 << 4)
  583. #define MSDC_EMMC50_CFG_END_BIT_CHK_CNT (0xf << 5)
  584. #define MSDC_EMMC50_CFG_CMD_RESP_SEL (0x1 << 9)
  585. #define MSDC_EMMC50_CFG_CMD_EDGE_SEL (0x1 << 10)
  586. #define MSDC_EMMC50_CFG_ENDBIT_CNT (0x3ff << 11)
  587. #define MSDC_EMMC50_CFG_READ_DAT_CNT (0x7 << 21)
  588. #define MSDC_EMMC50_CFG_EMMC50_MON_SEL (0x1 << 24)
  589. #define MSDC_EMMC50_CFG_MSDC_WR_VALID (0x1 << 25)
  590. #define MSDC_EMMC50_CFG_MSDC_RD_VALID (0x1 << 26)
  591. #define MSDC_EMMC50_CFG_MSDC_WR_VALID_SEL (0x1 << 27)
  592. #define MSDC_EMMC50_CFG_EMMC50_MON_SE (0x1 << 28)
  593. #define MSDC_EMMC50_CFG_TXSKEWSEL (0x1 << 29)
  594. /* EMMC50_CFG1 mask */
  595. #define MSDC_EMMC50_CFG1_WRPTR_MARGIN (0xff << 0)
  596. #define MSDC_EMMC50_CFG1_CKSWITCH_CNT (0x7 << 8)
  597. #define MSDC_EMMC50_CFG1_RDDAT_STOP (0x1 << 11)
  598. #define MSDC_EMMC50_CFG1_WAITCLK_CNT (0xf << 12)
  599. #define MSDC_EMMC50_CFG1_DBG_SEL (0xff << 16)
  600. #define MSDC_EMMC50_CFG1_PSHCNT (0x7 << 24)
  601. #define MSDC_EMMC50_CFG1_PSHPSSEL (0x1 << 27)
  602. #define MSDC_EMMC50_CFG1_DSCFG (0x1 << 28)
  603. #define MSDC_EMMC50_CFG1_RESV0 (0x7UL << 29)
  604. /* EMMC50_CFG2_mask */
  605. /* #define MSDC_EMMC50_CFG2_AXI_GPD_UP (0x1 << 0) */
  606. #define MSDC_EMMC50_CFG2_AXI_IOMMU_WR_EMI (0x1 << 1)
  607. #define MSDC_EMMC50_CFG2_AXI_SHARE_EN_WR_EMI (0x1 << 2)
  608. #define MSDC_EMMC50_CFG2_AXI_IOMMU_RD_EMI (0x1 << 7)
  609. #define MSDC_EMMC50_CFG2_AXI_SHARE_EN_RD_EMI (0x1 << 8)
  610. #define MSDC_EMMC50_CFG2_AXI_BOUND_128B (0x1 << 13)
  611. #define MSDC_EMMC50_CFG2_AXI_BOUND_256B (0x1 << 14)
  612. #define MSDC_EMMC50_CFG2_AXI_BOUND_512B (0x1 << 15)
  613. #define MSDC_EMMC50_CFG2_AXI_BOUND_1K (0x1 << 16)
  614. #define MSDC_EMMC50_CFG2_AXI_BOUND_2K (0x1 << 17)
  615. #define MSDC_EMMC50_CFG2_AXI_BOUND_4K (0x1 << 18)
  616. #define MSDC_EMMC50_CFG2_AXI_RD_OUTS_NUM (0x1f << 19)
  617. #define MSDC_EMMC50_CFG2_AXI_SET_LEN (0xf << 24)
  618. #define MSDC_EMMC50_CFG2_AXI_RESP_ERR_TYPE (0x3 << 28)
  619. #define MSDC_EMMC50_CFG2_AXI_BUSY (0x1 << 30)
  620. /* EMMC50_CFG3_mask */
  621. #define MSDC_EMMC50_CFG3_OUTS_WR (0x1f << 0)
  622. #define MSDC_EMMC50_CFG3_ULTRA_SET_WR (0x3f << 5)
  623. #define MSDC_EMMC50_CFG3_PREULTRA_SET_WR (0x3f << 11)
  624. #define MSDC_EMMC50_CFG3_ULTRA_SET_RD (0x3f << 17)
  625. #define MSDC_EMMC50_CFG3_PREULTRA_SET_RD (0x3f << 23)
  626. /* EMMC50_CFG4_mask */
  627. #define MSDC_EMMC50_CFG4_IMPR_ULTRA_SET_WR (0xff << 0)
  628. #define MSDC_EMMC50_CFG4_IMPR_ULTRA_SET_RD (0xff << 8)
  629. #define MSDC_EMMC50_CFG4_ULTRA_EN (0x3 << 16)
  630. #define MSDC_EMMC50_CFG4_RESV0 (0x3f << 18)
  631. /* SDIO_TUNE_WIND mask*/
  632. #define MSDC_SDIO_TUNE_WIND (0x1f << 0)
  633. /* MSDC_CFG[START_BIT] value */
  634. #define START_AT_RISING (0x0)
  635. #define START_AT_FALLING (0x1)
  636. #define START_AT_RISING_AND_FALLING (0x2)
  637. #define START_AT_RISING_OR_FALLING (0x3)
  638. #define MSDC_SMPL_RISING (0)
  639. #define MSDC_SMPL_FALLING (1)
  640. #define MSDC_SMPL_SEPARATE (2)
  641. #define TYPE_CMD_RESP_EDGE (0)
  642. #define TYPE_WRITE_CRC_EDGE (1)
  643. #define TYPE_READ_DATA_EDGE (2)
  644. #define TYPE_WRITE_DATA_EDGE (3)
  645. #define CARD_READY_FOR_DATA (1<<8)
  646. #define CARD_CURRENT_STATE(x) ((x&0x00001E00)>>9)
  647. /*
  648. * MSDC0~3 IO Configuration Base.
  649. */
  650. #define GPIO_REG_BASE gpio_reg_base
  651. /*--------------------------------------------------------------------------*/
  652. /* MSDC0 GPIO Related Register */
  653. /*--------------------------------------------------------------------------*/
  654. /* MSDC0 related register base*/
  655. #define MSDC0_GPIO_MODE18_ADDR (GPIO_REG_BASE + 0x410)
  656. #define MSDC0_GPIO_MODE19_ADDR (GPIO_REG_BASE + 0x420)
  657. #define MSDC0_GPIO_IES_G5_ADDR (GPIO_REG_BASE + 0xD00)
  658. #define MSDC0_GPIO_SMT_G5_ADDR (GPIO_REG_BASE + 0xD10)
  659. #define MSDC0_GPIO_TDSEL0_G5_ADDR (GPIO_REG_BASE + 0xD20)
  660. #define MSDC0_GPIO_RDSEL0_G5_ADDR (GPIO_REG_BASE + 0xD28)
  661. #define MSDC0_GPIO_DRV0_G5_ADDR (GPIO_REG_BASE + 0xD70)
  662. #define MSDC0_GPIO_PUPD0_G5_ADDR (GPIO_REG_BASE + 0xD80)
  663. #define MSDC0_GPIO_PUPD1_G5_ADDR (GPIO_REG_BASE + 0xD90)
  664. /* MSDC0 mode mask*/
  665. #define MSDC0_MODE_CMD_MASK (0x7 << 6)
  666. #define MSDC0_MODE_DSL_MASK (0x7 << 9)
  667. #define MSDC0_MODE_CLK_MASK (0x7 << 12)
  668. #define MSDC0_MODE_DAT0_MASK (0x7 << 16)
  669. #define MSDC0_MODE_DAT1_MASK (0x7 << 19)
  670. #define MSDC0_MODE_DAT2_MASK (0x7 << 22)
  671. #define MSDC0_MODE_DAT3_MASK (0x7 << 25)
  672. #define MSDC0_MODE_DAT4_MASK (0x7 << 28)
  673. #define MSDC0_MODE_DAT5_MASK (0x7 << 0)
  674. #define MSDC0_MODE_DAT6_MASK (0x7 << 3)
  675. #define MSDC0_MODE_DAT7_MASK (0x7 << 6)
  676. #define MSDC0_MODE_RSTB_MASK (0x7 << 9)
  677. /* MSDC0 IES mask*/
  678. #define MSDC0_IES_CMD_MASK (0x1 << 0)
  679. #define MSDC0_IES_DSL_MASK (0x1 << 1)
  680. #define MSDC0_IES_CLK_MASK (0x1 << 2)
  681. #define MSDC0_IES_DAT_MASK (0x1 << 3)
  682. #define MSDC0_IES_RSTB_MASK (0x1 << 4)
  683. #define MSDC0_IES_ALL_MASK (0x1f << 0)
  684. /* MSDC0 SMT mask*/
  685. #define MSDC0_SMT_CMD_MASK (0x1 << 0)
  686. #define MSDC0_SMT_DSL_MASK (0x1 << 1)
  687. #define MSDC0_SMT_CLK_MASK (0x1 << 2)
  688. #define MSDC0_SMT_DAT_MASK (0x1 << 3)
  689. #define MSDC0_SMT_RSTB_MASK (0x1 << 4)
  690. #define MSDC0_SMT_ALL_MASK (0x1f << 0)
  691. /* MSDC0 TDSEL mask*/
  692. #define MSDC0_TDSEL_CMD_MASK (0xF << 0)
  693. #define MSDC0_TDSEL_DSL_MASK (0xF << 4)
  694. #define MSDC0_TDSEL_CLK_MASK (0xF << 8)
  695. #define MSDC0_TDSEL_DAT_MASK (0xF << 12)
  696. #define MSDC0_TDSEL_RSTB_MASK (0xF << 16)
  697. #define MSDC0_TDSEL_ALL_MASK (0xFFFFF << 0)
  698. /* MSDC0 RDSEL mask*/
  699. #define MSDC0_RDSEL_CMD_MASK (0x1F << 0)
  700. #define MSDC0_RDSEL_DSL_MASK (0x1F << 6)
  701. #define MSDC0_RDSEL_CLK_MASK (0x1F << 12)
  702. #define MSDC0_RDSEL_DAT_MASK (0x1F << 18)
  703. #define MSDC0_RDSEL_RSTB_MASK (0x1F << 24)
  704. #define MSDC0_RDSEL_ALL_MASK (0x3FFFFFFF << 0)
  705. /* MSDC0 SR mask*/
  706. #define MSDC0_SR_CMD_MASK (0x1 << 3)
  707. #define MSDC0_SR_DSL_MASK (0x1 << 7)
  708. #define MSDC0_SR_CLK_MASK (0x1 << 11)
  709. #define MSDC0_SR_DAT_MASK (0x1 << 15)
  710. #define MSDC0_SR_RSTB_MASK (0x1 << 19)
  711. #define MSDC0_SR_ALL_MASK (0x11111 << 3)
  712. /* MSDC0 DRV mask*/
  713. #define MSDC0_DRV_CMD_MASK (0x7 << 0)
  714. #define MSDC0_DRV_DSL_MASK (0x7 << 4)
  715. #define MSDC0_DRV_CLK_MASK (0x7 << 8)
  716. #define MSDC0_DRV_DAT_MASK (0x7 << 12)
  717. #define MSDC0_DRV_RSTB_MASK (0x7 << 16)
  718. #define MSDC0_DRV_ALL_MASK (0x77777 << 0)
  719. /* MSDC0 PUPD mask*/
  720. #define MSDC0_PUPD_CMD_MASK (0x7 << 0)
  721. #define MSDC0_PUPD_DSL_MASK (0x7 << 4)
  722. #define MSDC0_PUPD_CLK_MASK (0x7 << 8)
  723. #define MSDC0_PUPD_DAT0_MASK (0x7 << 12)
  724. #define MSDC0_PUPD_DAT1_MASK (0x7 << 16)
  725. #define MSDC0_PUPD_DAT2_MASK (0x7 << 20)
  726. #define MSDC0_PUPD_DAT3_MASK (0x7 << 24)
  727. #define MSDC0_PUPD_DAT4_MASK (0x7 << 28)
  728. #define MSDC0_PUPD_CMD_DSL_CLK_DAT04_MASK (0x77777777 << 0)
  729. #define MSDC0_PUPD_DAT5_MASK (0x7 << 0)
  730. #define MSDC0_PUPD_DAT6_MASK (0x7 << 4)
  731. #define MSDC0_PUPD_DAT7_MASK (0x7 << 8)
  732. #define MSDC0_PUPD_RSTB_MASK (0x7 << 12)
  733. #define MSDC0_PUPD_DAT57_RSTB_MASK (0x7777 << 0)
  734. #define MSDC0_PUPD_DAT567_MASK (0x777 << 0)
  735. /*--------------------------------------------------------------------------*/
  736. /* MSDC1 GPIO Related Register */
  737. /*--------------------------------------------------------------------------*/
  738. /* MSDC1 related register base*/
  739. #define MSDC1_GPIO_MODE17_ADDR (GPIO_REG_BASE + 0x400)
  740. #define MSDC1_GPIO_MODE18_ADDR (GPIO_REG_BASE + 0x410)
  741. #define MSDC1_GPIO_IES_G4_ADDR (GPIO_REG_BASE + 0xC00)
  742. #define MSDC1_GPIO_SMT_G4_ADDR (GPIO_REG_BASE + 0xC10)
  743. #define MSDC1_GPIO_TDSEL0_G4_ADDR (GPIO_REG_BASE + 0xC20)
  744. #define MSDC1_GPIO_RDSEL0_G4_ADDR (GPIO_REG_BASE + 0xC28)
  745. #define MSDC1_GPIO_DRV0_G4_ADDR (GPIO_REG_BASE + 0xC70)
  746. #define MSDC1_GPIO_PUPD0_G4_ADDR (GPIO_REG_BASE + 0xC80)
  747. /* MSDC1 mode mask*/
  748. #define MSDC1_MODE_CMD_MASK (0x7 << 19)
  749. #define MSDC1_MODE_CLK_MASK (0x7 << 22)
  750. #define MSDC1_MODE_DAT0_MASK (0x7 << 25)
  751. #define MSDC1_MODE_DAT1_MASK (0x7 << 28)
  752. #define MSDC1_MODE_DAT2_MASK (0x7 << 0)
  753. #define MSDC1_MODE_DAT3_MASK (0x7 << 3)
  754. /* MSDC1 IES mask*/
  755. #define MSDC1_IES_CMD_MASK (0x1 << 2)
  756. #define MSDC1_IES_CLK_MASK (0x1 << 3)
  757. #define MSDC1_IES_DAT_MASK (0x1 << 4)
  758. #define MSDC1_IES_ALL_MASK (0x7 << 2)
  759. /* MSDC1 SMT mask*/
  760. #define MSDC1_SMT_CMD_MASK (0x1 << 2)
  761. #define MSDC1_SMT_CLK_MASK (0x1 << 3)
  762. #define MSDC1_SMT_DAT_MASK (0x1 << 4)
  763. #define MSDC1_SMT_ALL_MASK (0x7 << 2)
  764. /* MSDC1 TDSEL mask*/
  765. #define MSDC1_TDSEL_CMD_MASK (0xF << 8)
  766. #define MSDC1_TDSEL_CLK_MASK (0xF << 12)
  767. #define MSDC1_TDSEL_DAT_MASK (0xF << 16)
  768. #define MSDC1_TDSEL_ALL_MASK (0xFFF << 8)
  769. /* MSDC1 RDSEL mask*/
  770. #define MSDC1_RDSEL_CMD_MASK (0x1F << 12)
  771. #define MSDC1_RDSEL_CLK_MASK (0x1F << 18)
  772. #define MSDC1_RDSEL_DAT_MASK (0x1F << 24)
  773. #define MSDC1_RDSEL_ALL_MASK (0x7FFF << 12)
  774. /* MSDC1 SR mask*/
  775. #define MSDC1_SR_CMD_MASK (0x1 << 11)
  776. #define MSDC1_SR_CLK_MASK (0x1 << 15)
  777. #define MSDC1_SR_DAT_MASK (0x1 << 19)
  778. #define MSDC1_SR_ALL_MASK (0x111 << 11)
  779. /* MSDC1 DRV mask*/
  780. #define MSDC1_DRV_CMD_MASK (0x7 << 8)
  781. #define MSDC1_DRV_CLK_MASK (0x7 << 12)
  782. #define MSDC1_DRV_DAT_MASK (0x7 << 16)
  783. #define MSDC1_DRV_ALL_MASK (0x777 << 8)
  784. /* MSDC1 PUPD mask*/
  785. #define MSDC1_PUPD_CMD_MASK (0x7 << 0)
  786. #define MSDC1_PUPD_CLK_MASK (0x7 << 4)
  787. #define MSDC1_PUPD_DAT0_MASK (0x7 << 8)
  788. #define MSDC1_PUPD_DAT1_MASK (0x7 << 12)
  789. #define MSDC1_PUPD_DAT2_MASK (0x7 << 16)
  790. #define MSDC1_PUPD_DAT3_MASK (0x7 << 20)
  791. #define MSDC1_BIAS_TUNE_MASK (0xF << 24)
  792. #define MSDC1_PUPD_CMD_CLK_DAT_MASK (0x777777 << 0)
  793. /*--------------------------------------------------------------------------*/
  794. /* MSDC2 GPIO Related Register */
  795. /*--------------------------------------------------------------------------*/
  796. /* msdc2 related register base*/
  797. #define MSDC2_GPIO_MODE20_ADDR (GPIO_REG_BASE + 0x430)
  798. #define MSDC2_GPIO_MODE21_ADDR (GPIO_REG_BASE + 0x440)
  799. #define MSDC2_GPIO_IES_G0_ADDR (GPIO_REG_BASE + 0x800)
  800. #define MSDC2_GPIO_SMT_G0_ADDR (GPIO_REG_BASE + 0x810)
  801. #define MSDC2_GPIO_TDSEL0_G0_ADDR (GPIO_REG_BASE + 0x820)
  802. #define MSDC2_GPIO_RDSEL0_G0_ADDR (GPIO_REG_BASE + 0x828)
  803. #define MSDC2_GPIO_DRV0_G0_ADDR (GPIO_REG_BASE + 0x870)
  804. #define MSDC2_GPIO_PUPD0_G0_ADDR (GPIO_REG_BASE + 0x880)
  805. /* MSDC2 mode mask*/
  806. #define MSDC2_MODE_CMD_MASK (0x7 << 25)
  807. #define MSDC2_MODE_CLK_MASK (0x7 << 28)
  808. #define MSDC2_MODE_DAT0_MASK (0x7 << 0)
  809. #define MSDC2_MODE_DAT1_MASK (0x7 << 3)
  810. #define MSDC2_MODE_DAT2_MASK (0x7 << 6)
  811. #define MSDC2_MODE_DAT3_MASK (0x7 << 9)
  812. /* MSDC2 IES mask*/
  813. #define MSDC2_IES_CMD_MASK (0x1 << 2)
  814. #define MSDC2_IES_CLK_MASK (0x1 << 3)
  815. #define MSDC2_IES_DAT_MASK (0x1 << 4)
  816. #define MSDC2_IES_ALL_MASK (0x7 << 2)
  817. /* MSDC2 SMT mask*/
  818. #define MSDC2_SMT_CMD_MASK (0x1 << 2)
  819. #define MSDC2_SMT_CLK_MASK (0x1 << 3)
  820. #define MSDC2_SMT_DAT_MASK (0x1 << 4)
  821. #define MSDC2_SMT_ALL_MASK (0x7 << 2)
  822. /* MSDC2 TDSEL mask*/
  823. #define MSDC2_TDSEL_CMD_MASK (0xF << 8)
  824. #define MSDC2_TDSEL_CLK_MASK (0xF << 12)
  825. #define MSDC2_TDSEL_DAT_MASK (0xF << 16)
  826. #define MSDC2_TDSEL_ALL_MASK (0xFFF << 8)
  827. /* MSDC2 RDSEL mask*/
  828. #define MSDC2_RDSEL_CMD_MASK (0x1F << 4)
  829. #define MSDC2_RDSEL_CLK_MASK (0x1F << 10)
  830. #define MSDC2_RDSEL_DAT_MASK (0x1F << 16)
  831. #define MSDC2_RDSEL_ALL_MASK (0x7FFF << 4)
  832. /* MSDC2 SR mask*/
  833. #define MSDC2_SR_CMD_MASK (0x1 << 11)
  834. #define MSDC2_SR_CLK_MASK (0x1 << 15)
  835. #define MSDC2_SR_DAT_MASK (0x1 << 19)
  836. #define MSDC2_SR_ALL_MASK (0x111 << 11)
  837. /* MSDC2 DRV mask*/
  838. #define MSDC2_DRV_CMD_MASK (0x7 << 8)
  839. #define MSDC2_DRV_CLK_MASK (0x7 << 12)
  840. #define MSDC2_DRV_DAT_MASK (0x7 << 16)
  841. #define MSDC2_DRV_ALL_MASK (0x777 << 8)
  842. /* MSDC2 PUPD mask*/
  843. #define MSDC2_PUPD_CMD_MASK (0x7 << 0)
  844. #define MSDC2_PUPD_CLK_MASK (0x7 << 4)
  845. #define MSDC2_PUPD_DAT0_MASK (0x7 << 8)
  846. #define MSDC2_PUPD_DAT1_MASK (0x7 << 12)
  847. #define MSDC2_PUPD_DAT2_MASK (0x7 << 16)
  848. #define MSDC2_PUPD_DAT3_MASK (0x7 << 20)
  849. #define MSDC2_BIAS_TUNE_MASK (0xF << 24)
  850. #define MSDC2_PUPD_CMD_CLK_DAT_MASK (0x777777 << 0)
  851. /* add pull down/up mode define */
  852. #define MSDC_GPIO_PULL_UP (0)
  853. #define MSDC_GPIO_PULL_DOWN (1)
  854. /* define clock related register macro */
  855. #define MSDC_MSDCPLL_CON0_OFFSET (0x240)
  856. #define MSDC_MSDCPLL_CON1_OFFSET (0x244)
  857. #define MSDC_MSDCPLL_PWR_CON0_OFFSET (0x24C)
  858. #define MSDC_CLK_CFG_2_OFFSET (0x060)
  859. #define MSDC_CLK_CFG_3_OFFSET (0x070)
  860. #define MSDC_PERI_PDN_SET0_OFFSET (0x0008)
  861. #define MSDC_PERI_PDN_CLR0_OFFSET (0x0010)
  862. #define MSDC_PERI_PDN_STA0_OFFSET (0x0018)
  863. /*--------------------------------------------------------------------------*/
  864. /* Descriptor Structure */
  865. /*--------------------------------------------------------------------------*/
  866. struct gpd_t {
  867. u32 hwo:1; /* could be changed by hw */
  868. u32 bdp:1;
  869. u32 rsv0:6;
  870. u32 chksum:8;
  871. u32 intr:1;
  872. u32 rsv1:7;
  873. u32 nexth4:4;
  874. u32 ptrh4:4;
  875. u32 next;
  876. u32 ptr;
  877. u32 buflen:24;
  878. u32 extlen:8;
  879. u32 arg;
  880. u32 blknum;
  881. u32 cmd;
  882. };
  883. struct bd_t {
  884. u32 eol:1;
  885. u32 rsv0:7;
  886. u32 chksum:8;
  887. u32 rsv1:1;
  888. u32 blkpad:1;
  889. u32 dwpad:1;
  890. u32 rsv2:5;
  891. u32 nexth4:4;
  892. u32 ptrh4:4;
  893. u32 next;
  894. u32 ptr;
  895. u32 buflen:24;
  896. u32 rsv3:8;
  897. };
  898. struct scatterlist_ex {
  899. u32 cmd;
  900. u32 arg;
  901. u32 sglen;
  902. struct scatterlist *sg;
  903. };
  904. #define DMA_FLAG_NONE (0x00000000)
  905. #define DMA_FLAG_EN_CHKSUM (0x00000001)
  906. #define DMA_FLAG_PAD_BLOCK (0x00000002)
  907. #define DMA_FLAG_PAD_DWORD (0x00000004)
  908. struct msdc_dma {
  909. u32 flags; /* flags */
  910. u32 xfersz; /* xfer size in bytes */
  911. u32 sglen; /* size of scatter list */
  912. u32 blklen; /* block size */
  913. struct scatterlist *sg; /* I/O scatter list */
  914. struct scatterlist_ex *esg; /* extended I/O scatter list */
  915. u8 mode; /* dma mode */
  916. u8 burstsz; /* burst size */
  917. u8 intr; /* dma done interrupt */
  918. u8 padding; /* padding */
  919. u32 cmd; /* enhanced mode command */
  920. u32 arg; /* enhanced mode arg */
  921. u32 rsp; /* enhanced mode command response */
  922. u32 autorsp; /* auto command response */
  923. struct gpd_t *gpd; /* pointer to gpd array */
  924. struct bd_t *bd; /* pointer to bd array */
  925. dma_addr_t gpd_addr; /* the physical address of gpd array */
  926. dma_addr_t bd_addr; /* the physical address of bd array */
  927. u32 used_gpd; /* the number of used gpd elements */
  928. u32 used_bd; /* the number of used bd elements */
  929. };
  930. struct tune_counter {
  931. u32 time_cmd;
  932. u32 time_read;
  933. u32 time_write;
  934. u32 time_hs400;
  935. };
  936. struct msdc_saved_para {
  937. u32 pad_tune0;
  938. u32 ddly0;
  939. u32 ddly1;
  940. u8 cmd_resp_ta_cntr;
  941. u8 wrdat_crc_ta_cntr;
  942. u8 suspend_flag;
  943. u32 msdc_cfg;
  944. u32 mode;
  945. u32 div;
  946. u32 sdc_cfg;
  947. u32 iocon;
  948. u8 timing;
  949. u32 hz;
  950. u8 int_dat_latch_ck_sel;
  951. u8 ckgen_msdc_dly_sel;
  952. u8 inten_sdio_irq;
  953. /* for write: 3T need wait before host check busy after crc status */
  954. u8 write_busy_margin;
  955. /* for write: host check timeout change to 16T */
  956. u8 write_crc_margin;
  957. u8 ds_dly1;
  958. u8 ds_dly3;
  959. u32 emmc50_pad_cmd_tune;
  960. u8 cfg_cmdrsp_path;
  961. u8 cfg_crcsts_path;
  962. u8 resp_wait_cnt;
  963. };
  964. #if defined(MTK_SDIO30_ONLINE_TUNING_SUPPORT) || defined(ONLINE_TUNING_DVTTEST)
  965. #define DMA_ON 0
  966. #define DMA_OFF 1
  967. struct ot_work_t {
  968. struct msdc_host *host;
  969. int chg_volt;
  970. atomic_t ot_disable;
  971. atomic_t autok_done;
  972. };
  973. #endif
  974. struct msdc_host {
  975. struct msdc_hw *hw;
  976. struct mmc_host *mmc; /* mmc structure */
  977. struct mmc_command *cmd;
  978. struct mmc_data *data;
  979. struct mmc_request *mrq;
  980. int cmd_rsp;
  981. int cmd_rsp_done;
  982. int cmd_r1b_done;
  983. int error;
  984. spinlock_t lock; /* mutex */
  985. spinlock_t clk_gate_lock;
  986. /*to solve removing bad card race condition with hot-plug enable */
  987. spinlock_t remove_bad_card;
  988. spinlock_t sdio_irq_lock; /* avoid race condition @ DATA-1 interrupt case */
  989. int clk_gate_count;
  990. struct semaphore sem;
  991. u32 blksz; /* host block size */
  992. void __iomem *base; /* host base address */
  993. int id; /* host id */
  994. int pwr_ref; /* core power reference count */
  995. u32 xfer_size; /* total transferred size */
  996. struct msdc_dma dma; /* dma channel */
  997. u32 dma_addr; /* dma transfer address */
  998. u32 dma_left_size; /* dma transfer left size */
  999. u32 dma_xfer_size; /* dma transfer size in bytes */
  1000. int dma_xfer; /* dma transfer mode */
  1001. u32 write_timeout_ms;
  1002. u32 timeout_ns; /* data timeout ns */
  1003. u32 timeout_clks; /* data timeout clks */
  1004. atomic_t abort; /* abort transfer */
  1005. int irq; /* host interrupt */
  1006. struct tasklet_struct card_tasklet;
  1007. /* struct delayed_work remove_card; */
  1008. #if defined(MTK_SDIO30_ONLINE_TUNING_SUPPORT) || defined(ONLINE_TUNING_DVTTEST)
  1009. struct ot_work_t ot_work;
  1010. atomic_t ot_done;
  1011. u32 sdio_performance_vcore; /* vcore_fixed_during_sdio_transfer */
  1012. struct delayed_work set_vcore_workq; /* vcore_fixed_during_sdio_transfer */
  1013. #endif
  1014. atomic_t sdio_stopping;
  1015. struct completion cmd_done;
  1016. struct completion xfer_done;
  1017. struct pm_message pm_state;
  1018. u8 timing; /* timing specification used */
  1019. u8 power_mode; /* host power mode */
  1020. u8 bus_width; /* data bus width */
  1021. u32 mclk; /* mmc subsystem clock */
  1022. u32 hclk; /* host clock speed */
  1023. u32 sclk; /* SD/MS clock speed */
  1024. u8 core_clkon; /* Host core clock on ? */
  1025. u8 card_clkon; /* Card clock on ? */
  1026. u8 core_power; /* core power */
  1027. u8 card_inserted; /* card inserted ? */
  1028. u8 suspend; /* host suspended ? */
  1029. u8 reserved;
  1030. u8 app_cmd; /* for app command */
  1031. u32 app_cmd_arg;
  1032. u64 starttime;
  1033. struct timer_list timer;
  1034. struct tune_counter t_counter;
  1035. u32 rwcmd_time_tune;
  1036. int read_time_tune;
  1037. int write_time_tune;
  1038. u32 write_timeout_uhs104;
  1039. u32 read_timeout_uhs104;
  1040. u32 write_timeout_emmc;
  1041. u32 read_timeout_emmc;
  1042. u8 autocmd;
  1043. u32 sw_timeout;
  1044. u32 power_cycle; /* power cycle done in tuning flow */
  1045. bool power_cycle_enable; /*Enable power cycle */
  1046. u32 continuous_fail_request_count;
  1047. u32 sd_30_busy;
  1048. bool tune;
  1049. #define MSDC_VIO18_MC1 (0)
  1050. #define MSDC_VIO18_MC2 (1)
  1051. #define MSDC_VIO28_MC1 (2)
  1052. #define MSDC_VIO28_MC2 (3)
  1053. #define MSDC_VMC (4)
  1054. #define MSDC_VGP6 (5)
  1055. int power_domain;
  1056. struct msdc_saved_para saved_para;
  1057. int sd_cd_polarity;
  1058. /* to make sure insert mmc_rescan this work in start_host when boot up */
  1059. int sd_cd_insert_work;
  1060. /* driver will get a EINT(Level sensitive) when boot up with card insert */
  1061. struct wakeup_source trans_lock;
  1062. bool block_bad_card;
  1063. struct delayed_work write_timeout;
  1064. #ifdef SDIO_ERROR_BYPASS
  1065. int sdio_error; /* sdio error can't recovery */
  1066. #endif
  1067. void (*power_control)(struct msdc_host *host, u32 on);
  1068. void (*power_switch)(struct msdc_host *host, u32 on);
  1069. #if !defined(CONFIG_MTK_CLKMGR)
  1070. struct clk *clock_control;
  1071. #endif
  1072. struct work_struct work_tune; /* new thread tune */
  1073. struct mmc_request *mrq_tune; /* backup host->mrq */
  1074. };
  1075. struct tag_msdc_hw_para {
  1076. unsigned int version; /* msdc structure version info */
  1077. unsigned int clk_src; /* host clock source */
  1078. unsigned int cmd_edge; /* command latch edge */
  1079. unsigned int rdata_edge; /* read data latch edge */
  1080. unsigned int wdata_edge; /* write data latch edge */
  1081. unsigned int clk_drv; /* clock pad driving */
  1082. unsigned int cmd_drv; /* command pad driving */
  1083. unsigned int dat_drv; /* data pad driving */
  1084. unsigned int rst_drv; /* RST-N pad driving */
  1085. unsigned int ds_drv; /* eMMC5.0 DS pad driving */
  1086. unsigned int clk_drv_sd_18;
  1087. unsigned int cmd_drv_sd_18;
  1088. unsigned int dat_drv_sd_18;
  1089. unsigned int clk_drv_sd_18_sdr50;
  1090. unsigned int cmd_drv_sd_18_sdr50;
  1091. unsigned int dat_drv_sd_18_sdr50;
  1092. unsigned int clk_drv_sd_18_ddr50;
  1093. unsigned int cmd_drv_sd_18_ddr50;
  1094. unsigned int dat_drv_sd_18_ddr50;
  1095. unsigned int flags; /* hardware capability flags */
  1096. unsigned int data_pins; /* data pins */
  1097. unsigned int data_offset; /* data address offset */
  1098. unsigned int ddlsel; /* data line delay line fine tune selecion */
  1099. unsigned int rdsplsel; /* read: latch data line rising or falling */
  1100. unsigned int wdsplsel; /* write: latch data line rising or falling */
  1101. unsigned int dat0rddly; /* read; range: 0~31 */
  1102. unsigned int dat1rddly; /* read; range: 0~31 */
  1103. unsigned int dat2rddly; /* read; range: 0~31 */
  1104. unsigned int dat3rddly; /* read; range: 0~31 */
  1105. unsigned int dat4rddly; /* read; range: 0~31 */
  1106. unsigned int dat5rddly; /* read; range: 0~31 */
  1107. unsigned int dat6rddly; /* read; range: 0~31 */
  1108. unsigned int dat7rddly; /* read; range: 0~31 */
  1109. unsigned int datwrddly; /* write; range: 0~31 */
  1110. unsigned int cmdrrddly; /* cmd; range: 0~31 */
  1111. unsigned int cmdrddly; /* cmd; range: 0~31 */
  1112. unsigned int host_function; /* define host function */
  1113. unsigned int boot; /* define boot host */
  1114. unsigned int cd_level; /* card detection level */
  1115. unsigned int end_flag; /* This struct end flag, should be 0x5a5a5a5a */
  1116. };
  1117. struct dma_addr {
  1118. u32 start_address;
  1119. u32 size;
  1120. u8 end;
  1121. struct dma_addr *next;
  1122. };
  1123. struct msdc_reg_control {
  1124. ulong addr;
  1125. u32 mask;
  1126. u32 value;
  1127. u32 default_value;
  1128. int (*restore_func)(int restore);
  1129. };
  1130. static inline unsigned int uffs(unsigned int x)
  1131. {
  1132. unsigned int r = 1;
  1133. if (!x)
  1134. return 0;
  1135. if (!(x & 0xffff)) {
  1136. x >>= 16;
  1137. r += 16;
  1138. }
  1139. if (!(x & 0xff)) {
  1140. x >>= 8;
  1141. r += 8;
  1142. }
  1143. if (!(x & 0xf)) {
  1144. x >>= 4;
  1145. r += 4;
  1146. }
  1147. if (!(x & 3)) {
  1148. x >>= 2;
  1149. r += 2;
  1150. }
  1151. if (!(x & 1)) {
  1152. x >>= 1;
  1153. r += 1;
  1154. }
  1155. return r;
  1156. }
  1157. #define sdr_read8(reg) __raw_readb((const volatile void __iomem *)reg)
  1158. #define sdr_read16(reg) __raw_readw((const volatile void __iomem *)reg)
  1159. #define sdr_read32(reg) __raw_readl((const volatile void __iomem *)reg)
  1160. #define sdr_write8(reg, val) mt_reg_sync_writeb(val, reg)
  1161. #define sdr_write16(reg, val) mt_reg_sync_writew(val, reg)
  1162. #define sdr_write32(reg, val) mt_reg_sync_writel(val, reg)
  1163. #define sdr_set_bits(reg, bs) \
  1164. do {\
  1165. unsigned int tv = sdr_read32(reg);\
  1166. tv |= (u32)(bs); \
  1167. sdr_write32(reg, tv); \
  1168. } while (0)
  1169. #define sdr_clr_bits(reg, bs) \
  1170. do { \
  1171. unsigned int tv = sdr_read32(reg);\
  1172. tv &= ~((u32)(bs)); \
  1173. sdr_write32(reg, tv); \
  1174. } while (0)
  1175. #define msdc_irq_save(val) \
  1176. do { \
  1177. val = sdr_read32(MSDC_INTEN); \
  1178. sdr_clr_bits(MSDC_INTEN, val); \
  1179. } while (0)
  1180. #define msdc_irq_restore(val) sdr_set_bits(MSDC_INTEN, val)
  1181. #define sdr_set_field(reg, field, val) \
  1182. do { \
  1183. unsigned int tv = sdr_read32(reg); \
  1184. tv &= ~(field); \
  1185. if (uffs((unsigned int)field) > 0) \
  1186. sdr_write32(reg, tv | ((val) << (uffs((unsigned int)field) - 1))); \
  1187. } while (0)
  1188. #define sdr_get_field(reg, field, val) \
  1189. do { \
  1190. unsigned int tv = sdr_read32(reg); \
  1191. if (uffs((unsigned int)field) > 0) \
  1192. val = ((tv & (field)) >> (uffs((unsigned int)field) - 1)); \
  1193. } while (0)
  1194. #define sdr_set_field_discrete(reg, field, val) \
  1195. do { \
  1196. unsigned int tv = sdr_read32(reg); \
  1197. tv = (val == 1) ? (tv|(field)) : (tv & ~(field));\
  1198. sdr_write32(reg, tv); \
  1199. } while (0)
  1200. #define sdr_get_field_discrete(reg, field, val) \
  1201. do { \
  1202. unsigned int tv = sdr_read32(reg); \
  1203. val = tv & (field); \
  1204. val = (val == field) ? 1 : 0; \
  1205. } while (0)
  1206. #define UNSTUFF_BITS(resp, start, size) \
  1207. ({ \
  1208. const int __size = size; \
  1209. const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \
  1210. const int __off = 3 - ((start) / 32); \
  1211. const int __shft = (start) & 31; \
  1212. u32 __res; \
  1213. \
  1214. __res = resp[__off] >> __shft; \
  1215. if (__size + __shft > 32) \
  1216. __res |= resp[__off-1] << ((32 - __shft) % 32); \
  1217. __res & __mask; \
  1218. })
  1219. #define sdc_is_busy() (sdr_read32(SDC_STS) & SDC_STS_SDCBUSY)
  1220. #define sdc_is_cmd_busy() (sdr_read32(SDC_STS) & SDC_STS_CMDBUSY)
  1221. #define sdc_send_cmd(cmd, arg) \
  1222. do { \
  1223. sdr_write32(SDC_ARG, (arg)); \
  1224. sdr_write32(SDC_CMD, (cmd)); \
  1225. } while (0)
  1226. /* can modify to read h/w register */
  1227. /* #define is_card_present(h) ((sdr_read32(MSDC_PS) & MSDC_PS_CDSTS) ? 0 : 1);
  1228. */
  1229. #define is_card_present(h) (((struct msdc_host *)(h))->card_inserted)
  1230. #define is_card_sdio(h) (((struct msdc_host *)(h))->hw->register_pm)
  1231. /*sd card change voltage wait time= (1/freq) * SDC_VOL_CHG_CNT(default 0x145)
  1232. */
  1233. #define msdc_set_vol_change_wait_count(count) sdr_set_field(SDC_VOL_CHG, \
  1234. SDC_VOL_CHG_CNT, (count))
  1235. #define msdc_retry(expr, retry, cnt, id) \
  1236. do { \
  1237. int backup = cnt; \
  1238. while (retry) { \
  1239. if (!(expr)) \
  1240. break; \
  1241. if (cnt-- == 0) { \
  1242. retry--; mdelay(1); cnt = backup; \
  1243. } \
  1244. } \
  1245. if (retry == 0) { \
  1246. msdc_dump_info(id); \
  1247. } \
  1248. WARN_ON(retry == 0); \
  1249. } while (0)
  1250. #define msdc_reset(id) \
  1251. do { \
  1252. int retry = 3, cnt = 1000; \
  1253. sdr_set_bits(MSDC_CFG, MSDC_CFG_RST); \
  1254. mb(); /* need comment? */ \
  1255. msdc_retry(sdr_read32(MSDC_CFG) & MSDC_CFG_RST, retry, cnt, id); \
  1256. } while (0)
  1257. #define msdc_clr_int() \
  1258. do { \
  1259. u32 val = sdr_read32(MSDC_INT); \
  1260. sdr_write32(MSDC_INT, val); \
  1261. } while (0)
  1262. /* For Inhanced DMA */
  1263. #define msdc_init_gpd_ex(gpd, extlen, cmd, arg, blknum) \
  1264. do { \
  1265. ((struct gpd_t *)gpd)->extlen = extlen; \
  1266. ((struct gpd_t *)gpd)->cmd = cmd; \
  1267. ((struct gpd_t *)gpd)->arg = arg; \
  1268. ((struct gpd_t *)gpd)->blknum = blknum; \
  1269. } while (0)
  1270. #define msdc_init_bd(bd, blkpad, dwpad, dptr, dlen) \
  1271. do { \
  1272. BUG_ON(dlen > 0xFFFFUL); \
  1273. ((struct bd_t *)bd)->blkpad = blkpad; \
  1274. ((struct bd_t *)bd)->dwpad = dwpad; \
  1275. ((struct bd_t *)bd)->ptr = (u32)dptr; \
  1276. ((struct bd_t *)bd)->buflen = dlen; \
  1277. } while (0)
  1278. #ifdef CONFIG_NEED_SG_DMA_LENGTH
  1279. #define msdc_sg_len(sg, dma) ((dma) ? (sg)->dma_length : (sg)->length)
  1280. #else
  1281. #define msdc_sg_len(sg, dma) sg_dma_len(sg)
  1282. #endif
  1283. #define msdc_txfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_TXCNT) >> 16)
  1284. #define msdc_rxfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_RXCNT) >> 0)
  1285. #define msdc_fifo_write32(v) sdr_write32(MSDC_TXDATA, (v))
  1286. #define msdc_fifo_write8(v) sdr_write8(MSDC_TXDATA, (v))
  1287. #define msdc_fifo_read32() sdr_read32(MSDC_RXDATA)
  1288. #define msdc_fifo_read8() sdr_read8(MSDC_RXDATA)
  1289. #define msdc_dma_on() sdr_clr_bits(MSDC_CFG, MSDC_CFG_PIO)
  1290. #define msdc_dma_off() sdr_set_bits(MSDC_CFG, MSDC_CFG_PIO)
  1291. #define msdc_dma_status() ((sdr_read32(MSDC_CFG) & MSDC_CFG_PIO) >> 3)
  1292. /* Debug message event */
  1293. #define MSDC_EVT_NONE (0) /* No event */
  1294. #define MSDC_EVT_DMA (1 << 0) /* DMA related event */
  1295. #define MSDC_EVT_CMD (1 << 1) /* MSDC CMD related event */
  1296. #define MSDC_EVT_RSP (1 << 2) /* MSDC CMD RSP related event */
  1297. #define MSDC_EVT_INT (1 << 3) /* MSDC INT event */
  1298. #define MSDC_EVT_CFG (1 << 4) /* MSDC CFG event */
  1299. #define MSDC_EVT_FUC (1 << 5) /* Function event */
  1300. #define MSDC_EVT_OPS (1 << 6) /* Read/Write operation event */
  1301. #define MSDC_EVT_FIO (1 << 7) /* FIFO operation event */
  1302. #define MSDC_EVT_WRN (1 << 8) /* Warning event */
  1303. #define MSDC_EVT_PWR (1 << 9) /* Power event */
  1304. #define MSDC_EVT_CLK (1 << 10) /* Trace clock gate/ungate operation */
  1305. #define MSDC_EVT_CHE (1 << 11) /* eMMC cache feature operation */
  1306. /* ==================================================== */
  1307. #define MSDC_EVT_RW (1 << 12) /* Trace the Read/Write Command */
  1308. #define MSDC_EVT_NRW (1 << 13) /* Trace other Command */
  1309. #define MSDC_EVT_ALL (0xffffffff)
  1310. #define MSDC_EVT_MASK (MSDC_EVT_ALL)
  1311. extern unsigned int sd_debug_zone[HOST_MAX_NUM];
  1312. #define N_MSG(evt, fmt, args...) \
  1313. do { \
  1314. if ((MSDC_EVT_##evt) & sd_debug_zone[host->id]) { \
  1315. pr_err("msdc%d -> "fmt" <- %s() : L<%d> PID<%s><0x%x>\n", \
  1316. host->id, ##args , __func__, __LINE__, current->comm, \
  1317. current->pid); \
  1318. } \
  1319. } while (0)
  1320. #define CMD_MSG(fmt, args...) \
  1321. do { \
  1322. if (MSDC_EVT_CMD & sd_debug_zone[host->id]) {\
  1323. pr_err("msdc%d -> "fmt"\n", host->id, ##args); \
  1324. } \
  1325. } while (0)
  1326. #define ERR_MSG(fmt, args...) \
  1327. pr_err("msdc%d -> "fmt" <- %s() : L<%d> PID<%s><0x%x>\n", \
  1328. host->id, ##args , __func__, __LINE__, current->comm, current->pid)
  1329. extern int drv_mode[HOST_MAX_NUM];
  1330. extern int msdc_latest_transfer_mode[HOST_MAX_NUM];
  1331. extern int msdc_latest_operation_type[HOST_MAX_NUM];
  1332. extern struct msdc_host *mtk_msdc_host[HOST_MAX_NUM];
  1333. extern u32 msdc_host_mode[HOST_MAX_NUM];
  1334. extern u32 msdc_host_mode2[HOST_MAX_NUM];
  1335. extern u32 g_emmc_mode_switch;
  1336. extern struct msdc_host *msdc_get_host(int host_function, bool boot,
  1337. bool secondary);
  1338. extern int msdc_reinit(struct msdc_host *host);
  1339. extern void msdc_set_driving(struct msdc_host *host, struct msdc_hw *hw,
  1340. bool sd_18);
  1341. extern void mmc_remove_card(struct mmc_card *card);
  1342. extern void mmc_detach_bus(struct mmc_host *host);
  1343. extern void mmc_power_off(struct mmc_host *host);
  1344. extern void msdc_dump_gpd_bd(int id);
  1345. extern int msdc_tune_cmdrsp(struct msdc_host *host);
  1346. extern unsigned int msdc_do_command(struct msdc_host *host,
  1347. struct mmc_command *cmd, int tune, unsigned long timeout);
  1348. #ifdef MTK_SDIO30_ONLINE_TUNING_SUPPORT
  1349. extern unsigned int autok_get_current_vcore_offset(void);
  1350. #endif
  1351. #if defined(FEATURE_MET_MMC_INDEX)
  1352. extern void met_mmc_issue(struct mmc_host *host, struct mmc_request *req);
  1353. extern void met_mmc_dma_stop(struct mmc_host *host, u32 lba, unsigned int len,
  1354. u32 opcode, unsigned int bd_num);
  1355. #endif
  1356. extern void init_tune_sdio(struct msdc_host *host);
  1357. extern int mmc_flush_cache(struct mmc_card *card);
  1358. #ifdef CONFIG_MTK_HIBERNATION
  1359. extern unsigned int mt_eint_get_polarity_external(unsigned int eint_num);
  1360. #endif
  1361. extern int msdc_cache_ctrl(struct msdc_host *host, unsigned int enable,
  1362. u32 *status);
  1363. extern int msdc_setting_parameter(struct msdc_hw *hw, unsigned int *para);
  1364. /*workaround for VMC 1.8v -> 1.84v */
  1365. extern void upmu_set_rg_vmc_184(unsigned char x);
  1366. extern void __iomem *gpio_reg_base;
  1367. extern void __iomem *infracfg_ao_reg_base;
  1368. extern void __iomem *infracfg_reg_base;
  1369. extern void __iomem *pericfg_reg_base;
  1370. extern void __iomem *emi_reg_base;
  1371. extern void __iomem *toprgu_reg_base;
  1372. extern void __iomem *apmixed_reg_base1;
  1373. extern void __iomem *topckgen_reg_base;
  1374. /* move from board.h */
  1375. typedef void (*pm_callback_t)(pm_message_t state, void *data);
  1376. #ifdef CONFIG_MTK_COMBO_COMM
  1377. #include <mt-plat/mtk_wcn_cmb_stub.h>
  1378. #define CFG_DEV_MSDC2
  1379. #endif
  1380. #ifdef CONFIG_MTK_C2K_SUPPORT
  1381. #include <mach/mt_c2k_sdio.h>
  1382. #define CFG_DEV_MSDC3
  1383. #define C2K_USE_EINT
  1384. #endif
  1385. #define MSDC_CD_PIN_EN (1 << 0) /* card detection pin is wired */
  1386. #define MSDC_WP_PIN_EN (1 << 1) /* write protection pin is wired */
  1387. #define MSDC_RST_PIN_EN (1 << 2) /* emmc reset pin is wired */
  1388. #define MSDC_SDIO_IRQ (1 << 3) /* use internal sdio irq (bus) */
  1389. #define MSDC_EXT_SDIO_IRQ (1 << 4) /* use external sdio irq */
  1390. #define MSDC_REMOVABLE (1 << 5) /* removable slot */
  1391. #define MSDC_SYS_SUSPEND (1 << 6) /* suspended by system */
  1392. #define MSDC_HIGHSPEED (1 << 7) /* high-speed mode support */
  1393. #define MSDC_UHS1 (1 << 8) /* uhs-1 mode support */
  1394. #define MSDC_DDR (1 << 9) /* ddr mode support */
  1395. #define MSDC_INTERNAL_CLK (1 << 11) /* Force Internal clock */
  1396. #ifdef CONFIG_MTK_EMMC_CACHE
  1397. #define MSDC_CACHE (1 << 12) /* eMMC cache feature */
  1398. #endif
  1399. #define MSDC_HS400 (1 << 13) /* HS400 speed mode support */
  1400. /* for Yecon board, need SD power always on!! or cannot recognize the sd card */
  1401. #define MSDC_SD_NEED_POWER (1 << 31)
  1402. #define MSDC_SMPL_RISING (0)
  1403. #define MSDC_SMPL_FALLING (1)
  1404. #define MSDC_CMD_PIN (0)
  1405. #define MSDC_DAT_PIN (1)
  1406. #define MSDC_CD_PIN (2)
  1407. #define MSDC_WP_PIN (3)
  1408. #define MSDC_RST_PIN (4)
  1409. #define MSDC_DATA1_INT (1)
  1410. /* each PLL have different gears for select
  1411. * software can used mux interface from clock management module to select */
  1412. enum {
  1413. MSDC50_CLKSRC_26MHZ = 0,
  1414. MSDC50_CLKSRC_800MHZ,
  1415. MSDC50_CLKSRC_400MHZ,
  1416. MSDC50_CLKSRC_200MHZ,
  1417. MSDC50_CLKSRC_182MHZ,
  1418. MSDC50_CLKSRC_136MHZ,
  1419. MSDC50_CLKSRC_156MHZ,
  1420. MSDC50_CLKSRC_416MHZ,
  1421. MSDC50_CLKSRC_48MHZ,
  1422. MSDC50_CLKSRC_91MHZ,
  1423. MSDC50_CLKSRC_624MHZ
  1424. };
  1425. enum {
  1426. MSDC30_CLKSRC_26MHZ = 0,
  1427. MSDC30_CLKSRC_208MHZ,
  1428. MSDC30_CLKSRC_200MHZ,
  1429. MSDC30_CLKSRC_182MHZ,
  1430. MSDC30_CLKSRC_136MHZ,
  1431. MSDC30_CLKSRC_156MHZ,
  1432. MSDC30_CLKSRC_48MHZ,
  1433. MSDC30_CLKSRC_91MHZ
  1434. };
  1435. #define MSDC_BOOT_EN (1)
  1436. #define MSDC_CD_HIGH (1)
  1437. #define MSDC_CD_LOW (0)
  1438. enum {
  1439. MSDC_EMMC = 0,
  1440. MSDC_SD = 1,
  1441. MSDC_SDIO = 2
  1442. };
  1443. struct msdc_ett_settings {
  1444. #define MSDC_DEFAULT_MODE (0)
  1445. #define MSDC_SDR50_MODE (1)
  1446. #define MSDC_DDR50_MODE (2)
  1447. #define MSDC_HS200_MODE (3)
  1448. #define MSDC_HS400_MODE (4)
  1449. unsigned int reg_addr;
  1450. unsigned int reg_offset;
  1451. unsigned int value;
  1452. };
  1453. struct msdc_hw {
  1454. unsigned char clk_src; /* host clock source */
  1455. unsigned char cmd_edge; /* command latch edge */
  1456. unsigned char rdata_edge; /* read data latch edge */
  1457. unsigned char wdata_edge; /* write data latch edge */
  1458. unsigned char clk_drv; /* clock pad driving */
  1459. unsigned char cmd_drv; /* command pad driving */
  1460. unsigned char dat_drv; /* data pad driving */
  1461. unsigned char rst_drv; /* RST-N pad driving */
  1462. unsigned char ds_drv; /* eMMC5.0 DS pad driving */
  1463. unsigned char clk_drv_sd_18; /* clock pad driving for SD card at 1.8v sdr104 mode */
  1464. unsigned char cmd_drv_sd_18; /* command pad driving for SD card at 1.8v sdr104 mode */
  1465. unsigned char dat_drv_sd_18; /* data pad driving for SD card at 1.8v sdr104 mode */
  1466. unsigned char clk_drv_sd_18_sdr50; /* clock pad driving for SD card at 1.8v sdr50 mode */
  1467. unsigned char cmd_drv_sd_18_sdr50; /* command pad driving for SD card at 1.8v sdr50 mode */
  1468. unsigned char dat_drv_sd_18_sdr50; /* data pad driving for SD card at 1.8v sdr50 mode */
  1469. unsigned char clk_drv_sd_18_ddr50; /* clock pad driving for SD card at 1.8v ddr50 mode */
  1470. unsigned char cmd_drv_sd_18_ddr50; /* command pad driving for SD card at 1.8v ddr50 mode */
  1471. unsigned char dat_drv_sd_18_ddr50; /* data pad driving for SD card at 1.8v ddr50 mode */
  1472. unsigned long flags; /* hardware capability flags */
  1473. unsigned long data_pins; /* data pins */
  1474. unsigned long data_offset; /* data address offset */
  1475. unsigned char ddlsel; /* data line delay line fine tune selecion*/
  1476. unsigned char rdsplsel; /* read: data line rising or falling latch fine tune selection */
  1477. unsigned char wdsplsel; /* write: data line rising or falling latch fine tune selection*/
  1478. unsigned char dat0rddly; /*read; range: 0~31*/
  1479. unsigned char dat1rddly; /*read; range: 0~31*/
  1480. unsigned char dat2rddly; /*read; range: 0~31*/
  1481. unsigned char dat3rddly; /*read; range: 0~31*/
  1482. unsigned char dat4rddly; /*read; range: 0~31*/
  1483. unsigned char dat5rddly; /*read; range: 0~31*/
  1484. unsigned char dat6rddly; /*read; range: 0~31*/
  1485. unsigned char dat7rddly; /*read; range: 0~31*/
  1486. unsigned char datwrddly; /*write; range: 0~31*/
  1487. unsigned char cmdrrddly; /*cmd; range: 0~31*/
  1488. unsigned char cmdrddly; /*cmd; range: 0~31*/
  1489. unsigned char cmdrtactr_sdr50; /* command response turn around counter, sdr 50 mode*/
  1490. unsigned char wdatcrctactr_sdr50; /* write data crc turn around counter, sdr 50 mode*/
  1491. unsigned char intdatlatcksel_sdr50; /* internal data latch CK select, sdr 50 mode*/
  1492. unsigned char cmdrtactr_sdr200; /* command response turn around counter, sdr 200 mode*/
  1493. unsigned char wdatcrctactr_sdr200; /* write data crc turn around counter, sdr 200 mode*/
  1494. unsigned char intdatlatcksel_sdr200; /* internal data latch CK select, sdr 200 mode*/
  1495. struct msdc_ett_settings *ett_hs200_settings;
  1496. unsigned int ett_hs200_count;
  1497. struct msdc_ett_settings *ett_hs400_settings;
  1498. unsigned int ett_hs400_count;
  1499. unsigned char host_function; /* define host function*/
  1500. bool boot; /* define boot host */
  1501. bool cd_level; /* card detection level */
  1502. /* config gpio pull mode */
  1503. void (*config_gpio_pin)(int type, int pull);
  1504. /* external power control for card */
  1505. void (*ext_power_on)(void);
  1506. void (*ext_power_off)(void);
  1507. /* external sdio irq operations */
  1508. void (*request_sdio_eirq)(sdio_irq_handler_t sdio_irq_handler, void *data);
  1509. void (*enable_sdio_eirq)(void);
  1510. void (*disable_sdio_eirq)(void);
  1511. /* external cd irq operations */
  1512. void (*request_cd_eirq)(sdio_irq_handler_t cd_irq_handler, void *data);
  1513. void (*enable_cd_eirq)(void);
  1514. void (*disable_cd_eirq)(void);
  1515. int (*get_cd_status)(void);
  1516. /* power management callback for external module */
  1517. void (*register_pm)(pm_callback_t pm_cb, void *data);
  1518. };
  1519. extern struct msdc_hw msdc2_hw;
  1520. extern struct msdc_hw msdc3_hw;
  1521. #endif /* end of MT_SD_H */