msdc.h 53 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367
  1. /*****************************************************************************
  2. * Copyright Statement:
  3. * --------------------
  4. * This software is protected by Copyright and the information contained
  5. * herein is confidential. The software may not be copied and the information
  6. * contained herein may not be used or disclosed except with the written
  7. * permission of MediaTek Inc. (C) 2010
  8. *
  9. * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  10. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  11. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  12. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  13. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  14. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  15. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  16. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  17. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  18. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  19. * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  20. * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  21. *
  22. * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  23. * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  24. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  25. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  26. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  27. *
  28. * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  29. * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  30. * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  31. * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  32. * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  33. *
  34. *****************************************************************************/
  35. #ifndef _MSDC_H_
  36. #define _MSDC_H_
  37. #include "cust_msdc.h"
  38. #include "msdc_cfg.h"
  39. #include "msdc_utils.h"
  40. #include "mmc_core.h"
  41. #include "msdc_irq.h"
  42. #include "mmc_test.h"
  43. #if defined(MMC_MSDC_DRV_PRELOADER)
  44. #include "platform.h"
  45. #include "pll.h"
  46. #include "sync_write.h"
  47. #endif
  48. #if defined(MMC_MSDC_DRV_LK)
  49. #include "sync_write.h"
  50. #include "mt_reg_base.h"
  51. #endif
  52. #if defined(MMC_MSDC_DRV_CTP)
  53. #include "reg_base.H"
  54. #include "intrCtrl.h"
  55. #endif
  56. #if defined(MSDC_ENABLE_DMA_MODE)
  57. #include "msdc_dma.h"
  58. #endif
  59. //#define MTK_MSDC_DUMP_FIFO
  60. /*--------------------------------------------------------------------------*/
  61. /* Common Macro */
  62. /*--------------------------------------------------------------------------*/
  63. #define REG_ADDR(x) ((volatile uint32*)(base + OFFSET_##x))
  64. /*--------------------------------------------------------------------------*/
  65. /* Common Definition */
  66. /*--------------------------------------------------------------------------*/
  67. #define MSDC_FIFO_SZ (128)
  68. #define MSDC_FIFO_THD (64)
  69. #define MSDC_MS (0)
  70. #define MSDC_SDMMC (1)
  71. #define MSDC_MODE_UNKNOWN (0)
  72. #define MSDC_MODE_PIO (1)
  73. #define MSDC_MODE_DMA_BASIC (2)
  74. #define MSDC_MODE_DMA_DESC (3)
  75. #define MSDC_MODE_DMA_ENHANCED (4)
  76. #if defined(MSDC_MODE_DEFAULT_PIO)
  77. #define MSDC_MODE_DEFAULT MSDC_MODE_PIO
  78. #elif defined(MSDC_MODE_DEFAULT_DMA_BASIC)
  79. #define MSDC_MODE_DEFAULT MSDC_MODE_DMA_BASIC
  80. #elif defined(MSDC_MODE_DEFAULT_DMA_DESC)
  81. #define MSDC_MODE_DEFAULT MSDC_MODE_DMA_DESC
  82. #elif defined(MSDC_MODE_DEFAULT_DMA_ENHANCED)
  83. #define MSDC_MODE_DEFAULT MSDC_MODE_DMA_ENHANCED
  84. #else
  85. #define MSDC_MODE_DEFAULT MSDC_MODE_UNKNOWN
  86. #endif
  87. #define MSDC_BUS_1BITS (0)
  88. #define MSDC_BUS_4BITS (1)
  89. #define MSDC_BUS_8BITS (2)
  90. #define MSDC_BRUST_8B (3)
  91. #define MSDC_BRUST_16B (4)
  92. #define MSDC_BRUST_32B (5)
  93. #define MSDC_BRUST_64B (6)
  94. #define MSDC_PIN_PULL_NONE (0)
  95. #define MSDC_PIN_PULL_DOWN (1)
  96. #define MSDC_PIN_PULL_UP (2)
  97. #define MSDC_PIN_KEEP (3)
  98. #if defined(FPGA_PLATFORM)
  99. #define MSDC_OP_SCLK (12000000)
  100. #define MSDC_SRC_CLK (12000000)
  101. #define MSDC_MAX_SCLK (MSDC_SRC_CLK>>1)
  102. #else
  103. #define MSDC_OP_SCLK (200000000)
  104. #define MSDC_MAX_SCLK (800000000)
  105. #endif
  106. #define MSDC_MIN_SCLK (260000)
  107. #define MSDC_350K_SCLK (350000)
  108. #define MSDC_400K_SCLK (400000)
  109. #define MSDC_25M_SCLK (25000000)
  110. #define MSDC_26M_SCLK (26000000)
  111. #define MSDC_50M_SCLK (50000000)
  112. #define MSDC_52M_SCLK (52000000)
  113. #define MSDC_100M_SCLK (100000000)
  114. #define MSDC_179M_SCLK (179000000)
  115. #define MSDC_200M_SCLK (200000000)
  116. #define MSDC_208M_SCLK (208000000)
  117. #define MSDC_400M_SCLK (400000000)
  118. #define MSDC_800M_SCLK (800000000)
  119. #define MSDC_CLK_CFG_3_OFFSET (0x070 )
  120. #define MSDC_CLK_CFG_3_MSDC30_MASK (0xf << 0 )
  121. #define MSDC_CLK_CFG_3_MSDC31_MASK (0xf << 8 )
  122. #define MSDC_AUTOCMD12 (0x0001)
  123. #define MSDC_AUTOCMD23 (0x0002)
  124. #define MSDC_AUTOCMD19 (0x0003)
  125. #define TYPE_CMD_RESP_EDGE (0)
  126. #define TYPE_WRITE_CRC_EDGE (1)
  127. #define TYPE_READ_DATA_EDGE (2)
  128. #define TYPE_WRITE_DATA_EDGE (3)
  129. #define START_AT_RISING (0x0)
  130. #define START_AT_FALLING (0x1)
  131. #define START_AT_RISING_AND_FALLING (0x2)
  132. #define START_AT_RISING_OR_FALLING (0x3)
  133. /* Tuning Parameter */
  134. #define DEFAULT_DEBOUNCE (8) /* 8 cycles */
  135. #define DEFAULT_DTOC (40) /* data timeout counter. 65536x40 sclk. */
  136. #define DEFAULT_WDOD (0) /* write data output delay. no delay. */
  137. #define DEFAULT_BSYDLY (8) /* card busy delay. 8 extend sclk */
  138. /* Timeout Parameter */
  139. #define TMO_IN_CLK_2POWER 20 /* 2^20=1048576 */
  140. #define EMMC_BOOT_TMO_IN_CLK_2POWER 16 /* 2^16=65536 */
  141. /*--------------------------------------------------------------------------*/
  142. /* Register Offset */
  143. /*--------------------------------------------------------------------------*/
  144. #define OFFSET_MSDC_CFG (0x0)
  145. #define OFFSET_MSDC_IOCON (0x04)
  146. #define OFFSET_MSDC_PS (0x08)
  147. #define OFFSET_MSDC_INT (0x0c)
  148. #define OFFSET_MSDC_INTEN (0x10)
  149. #define OFFSET_MSDC_FIFOCS (0x14)
  150. #define OFFSET_MSDC_TXDATA (0x18)
  151. #define OFFSET_MSDC_RXDATA (0x1c)
  152. #define OFFSET_SDC_CFG (0x30)
  153. #define OFFSET_SDC_CMD (0x34)
  154. #define OFFSET_SDC_ARG (0x38)
  155. #define OFFSET_SDC_STS (0x3c)
  156. #define OFFSET_SDC_RESP0 (0x40)
  157. #define OFFSET_SDC_RESP1 (0x44)
  158. #define OFFSET_SDC_RESP2 (0x48)
  159. #define OFFSET_SDC_RESP3 (0x4c)
  160. #define OFFSET_SDC_BLK_NUM (0x50)
  161. #define OFFSET_SDC_VOL_CHG (0x54)
  162. #define OFFSET_SDC_CSTS (0x58)
  163. #define OFFSET_SDC_CSTS_EN (0x5c)
  164. #define OFFSET_SDC_DCRC_STS (0x60)
  165. #define OFFSET_EMMC_CFG0 (0x70)
  166. #define OFFSET_EMMC_CFG1 (0x74)
  167. #define OFFSET_EMMC_STS (0x78)
  168. #define OFFSET_EMMC_IOCON (0x7c)
  169. #define OFFSET_SDC_ACMD_RESP (0x80)
  170. #define OFFSET_SDC_ACMD19_TRG (0x84)
  171. #define OFFSET_SDC_ACMD19_STS (0x88)
  172. #define OFFSET_MSDC_DMA_SA_HIGH4BIT (0x8C)
  173. #define OFFSET_MSDC_DMA_SA (0x90)
  174. #define OFFSET_MSDC_DMA_CA (0x94)
  175. #define OFFSET_MSDC_DMA_CTRL (0x98)
  176. #define OFFSET_MSDC_DMA_CFG (0x9c)
  177. #define OFFSET_MSDC_DBG_SEL (0xa0)
  178. #define OFFSET_MSDC_DBG_OUT (0xa4)
  179. #define OFFSET_MSDC_DMA_LEN (0xa8)
  180. #define OFFSET_MSDC_PATCH_BIT0 (0xb0)
  181. #define OFFSET_MSDC_PATCH_BIT1 (0xb4)
  182. #define OFFSET_MSDC_PATCH_BIT2 (0xb8)
  183. #define OFFSET_DAT0_TUNE_CRC (0xc0)
  184. #define OFFSET_DAT1_TUNE_CRC (0xc4)
  185. #define OFFSET_DAT2_TUNE_CRC (0xc8)
  186. #define OFFSET_DAT3_TUNE_CRC (0xcc)
  187. #define OFFSET_CMD_TUNE_CRC (0xd0)
  188. #define OFFSET_SDIO_TUNE_WIND (0xd4)
  189. #define OFFSET_MSDC_PAD_TUNE0 (0xf0)
  190. #define OFFSET_MSDC_DAT_RDDLY0 (0xf8)
  191. #define OFFSET_MSDC_DAT_RDDLY1 (0xfc)
  192. #define OFFSET_MSDC_HW_DBG (0x110)
  193. #define OFFSET_MSDC_VERSION (0x114)
  194. #define OFFSET_MSDC_ECO_VER (0x118)
  195. #define OFFSET_EMMC50_PAD_CTL0 (0x180)
  196. #define OFFSET_EMMC50_PAD_DS_CTL0 (0x184)
  197. #define OFFSET_EMMC50_PAD_DS_TUNE (0x188)
  198. #define OFFSET_EMMC50_PAD_CMD_TUNE (0x18c)
  199. #define OFFSET_EMMC50_PAD_DAT01_TUNE (0x190)
  200. #define OFFSET_EMMC50_PAD_DAT23_TUNE (0x194)
  201. #define OFFSET_EMMC50_PAD_DAT45_TUNE (0x198)
  202. #define OFFSET_EMMC50_PAD_DAT67_TUNE (0x19c)
  203. #define OFFSET_EMMC51_CFG0 (0x204)
  204. #define OFFSET_EMMC50_CFG0 (0x208)
  205. #define OFFSET_EMMC50_CFG1 (0x20c)
  206. #define OFFSET_EMMC50_CFG2 (0x21c)
  207. #define OFFSET_EMMC50_CFG3 (0x220)
  208. #define OFFSET_EMMC50_CFG4 (0x224)
  209. /*--------------------------------------------------------------------------*/
  210. /* Register Address */
  211. /*--------------------------------------------------------------------------*/
  212. /* common register */
  213. #define MSDC_CFG REG_ADDR(MSDC_CFG)
  214. #define MSDC_IOCON REG_ADDR(MSDC_IOCON)
  215. #define MSDC_PS REG_ADDR(MSDC_PS)
  216. #define MSDC_INT REG_ADDR(MSDC_INT)
  217. #define MSDC_INTEN REG_ADDR(MSDC_INTEN)
  218. #define MSDC_FIFOCS REG_ADDR(MSDC_FIFOCS)
  219. #define MSDC_TXDATA REG_ADDR(MSDC_TXDATA)
  220. #define MSDC_RXDATA REG_ADDR(MSDC_RXDATA)
  221. /* sdmmc register */
  222. #define SDC_CFG REG_ADDR(SDC_CFG)
  223. #define SDC_CMD REG_ADDR(SDC_CMD)
  224. #define SDC_ARG REG_ADDR(SDC_ARG)
  225. #define SDC_STS REG_ADDR(SDC_STS)
  226. #define SDC_RESP0 REG_ADDR(SDC_RESP0)
  227. #define SDC_RESP1 REG_ADDR(SDC_RESP1)
  228. #define SDC_RESP2 REG_ADDR(SDC_RESP2)
  229. #define SDC_RESP3 REG_ADDR(SDC_RESP3)
  230. #define SDC_BLK_NUM REG_ADDR(SDC_BLK_NUM)
  231. #define SDC_VOL_CHG REG_ADDR(SDC_VOL_CHG)
  232. #define SDC_CSTS REG_ADDR(SDC_CSTS)
  233. #define SDC_CSTS_EN REG_ADDR(SDC_CSTS_EN)
  234. #define SDC_DCRC_STS REG_ADDR(SDC_DCRC_STS)
  235. /* emmc register*/
  236. #define EMMC_CFG0 REG_ADDR(EMMC_CFG0)
  237. #define EMMC_CFG1 REG_ADDR(EMMC_CFG1)
  238. #define EMMC_STS REG_ADDR(EMMC_STS)
  239. #define EMMC_IOCON REG_ADDR(EMMC_IOCON)
  240. /* auto command register */
  241. #define SDC_ACMD_RESP REG_ADDR(SDC_ACMD_RESP)
  242. #define SDC_ACMD19_TRG REG_ADDR(SDC_ACMD19_TRG)
  243. #define SDC_ACMD19_STS REG_ADDR(SDC_ACMD19_STS)
  244. /* dma register */
  245. #define MSDC_DMA_SA_HIGH4BIT REG_ADDR(MSDC_DMA_SA_HIGH4BIT)
  246. #define MSDC_DMA_SA REG_ADDR(MSDC_DMA_SA)
  247. #define MSDC_DMA_CA REG_ADDR(MSDC_DMA_CA)
  248. #define MSDC_DMA_CTRL REG_ADDR(MSDC_DMA_CTRL)
  249. #define MSDC_DMA_CFG REG_ADDR(MSDC_DMA_CFG)
  250. #define MSDC_DMA_LEN REG_ADDR(MSDC_DMA_LEN)
  251. /* data read delay */
  252. #define MSDC_DAT_RDDLY0 REG_ADDR(MSDC_DAT_RDDLY0)
  253. #define MSDC_DAT_RDDLY1 REG_ADDR(MSDC_DAT_RDDLY1)
  254. /* debug register */
  255. #define MSDC_DBG_SEL REG_ADDR(MSDC_DBG_SEL)
  256. #define MSDC_DBG_OUT REG_ADDR(MSDC_DBG_OUT)
  257. /* misc register */
  258. #define MSDC_PATCH_BIT0 REG_ADDR(MSDC_PATCH_BIT0)
  259. #define MSDC_PATCH_BIT1 REG_ADDR(MSDC_PATCH_BIT1)
  260. #define MSDC_PATCH_BIT2 REG_ADDR(MSDC_PATCH_BIT2)
  261. #define DAT0_TUNE_CRC REG_ADDR(DAT0_TUNE_CRC)
  262. #define DAT1_TUNE_CRC REG_ADDR(DAT1_TUNE_CRC)
  263. #define DAT2_TUNE_CRC REG_ADDR(DAT2_TUNE_CRC)
  264. #define DAT3_TUNE_CRC REG_ADDR(DAT3_TUNE_CRC)
  265. #define CMD_TUNE_CRC REG_ADDR(CMD_TUNE_CRC)
  266. #define SDIO_TUNE_WIND REG_ADDR(SDIO_TUNE_WIND)
  267. #define MSDC_PAD_TUNE0 REG_ADDR(MSDC_PAD_TUNE0)
  268. #define MSDC_HW_DBG REG_ADDR(MSDC_HW_DBG)
  269. #define MSDC_VERSION REG_ADDR(MSDC_VERSION)
  270. #define MSDC_ECO_VER REG_ADDR(MSDC_ECO_VER)
  271. /* eMMC 5.0 register */
  272. #define EMMC50_PAD_CTL0 REG_ADDR(EMMC50_PAD_CTL0)
  273. #define EMMC50_PAD_DS_CTL0 REG_ADDR(EMMC50_PAD_DS_CTL0)
  274. #define EMMC50_PAD_DS_TUNE REG_ADDR(EMMC50_PAD_DS_TUNE)
  275. #define EMMC50_PAD_CMD_TUNE REG_ADDR(EMMC50_PAD_CMD_TUNE)
  276. #define EMMC50_PAD_DAT01_TUNE REG_ADDR(EMMC50_PAD_DAT01_TUNE)
  277. #define EMMC50_PAD_DAT23_TUNE REG_ADDR(EMMC50_PAD_DAT23_TUNE)
  278. #define EMMC50_PAD_DAT45_TUNE REG_ADDR(EMMC50_PAD_DAT45_TUNE)
  279. #define EMMC50_PAD_DAT67_TUNE REG_ADDR(EMMC50_PAD_DAT67_TUNE)
  280. #define EMMC51_CFG0 REG_ADDR(EMMC51_CFG0)
  281. #define EMMC50_CFG0 REG_ADDR(EMMC50_CFG0)
  282. #define EMMC50_CFG1 REG_ADDR(EMMC50_CFG1)
  283. #define EMMC50_CFG2 REG_ADDR(EMMC50_CFG2)
  284. #define EMMC50_CFG3 REG_ADDR(EMMC50_CFG3)
  285. #define EMMC50_CFG4 REG_ADDR(EMMC50_CFG4)
  286. /*--------------------------------------------------------------------------*/
  287. /* Register Mask */
  288. /*--------------------------------------------------------------------------*/
  289. /* MSDC_CFG mask */
  290. #define MSDC_CFG_MODE (0x1 << 0) /* RW */
  291. #define MSDC_CFG_CKPDN (0x1 << 1) /* RW */
  292. #define MSDC_CFG_RST (0x1 << 2) /* A0 */
  293. #define MSDC_CFG_PIO (0x1 << 3) /* RW */
  294. #define MSDC_CFG_CKDRVEN (0x1 << 4) /* RW */
  295. #define MSDC_CFG_BV18SDT (0x1 << 5) /* RW */
  296. #define MSDC_CFG_BV18PSS (0x1 << 6) /* R */
  297. #define MSDC_CFG_CKSTB (0x1 << 7) /* R */
  298. #define MSDC_CFG_CKDIV (0xfff<< 8) /* RW */
  299. #define MSDC_CFG_CKMOD (0x3 << 20) /* W1C */
  300. #define MSDC_CFG_CKMOD_HS400 (0x1 << 22) /* RW */
  301. #define MSDC_CFG_START_BIT (0x3 << 23) /* RW */
  302. #define MSDC_CFG_SCLK_STOP_DDR (0x1 << 25) /* RW */
  303. /* MSDC_IOCON mask */
  304. #define MSDC_IOCON_SDR104CKS (0x1 << 0) /* RW */
  305. #define MSDC_IOCON_RSPL (0x1 << 1) /* RW */
  306. #define MSDC_IOCON_R_D_SMPL (0x1 << 2) /* RW */
  307. #define MSDC_IOCON_DDLSEL (0x1 << 3) /* RW */
  308. #define MSDC_IOCON_DDR50CKD (0x1 << 4) /* RW */
  309. #define MSDC_IOCON_R_D_SMPL_SEL (0x1 << 5) /* RW */
  310. #define MSDC_IOCON_W_D_SMPL (0x1 << 8) /* RW */
  311. #define MSDC_IOCON_W_D_SMPL_SEL (0x1 << 9) /* RW */
  312. #define MSDC_IOCON_W_D0SPL (0x1 << 10) /* RW */
  313. #define MSDC_IOCON_W_D1SPL (0x1 << 11) /* RW */
  314. #define MSDC_IOCON_W_D2SPL (0x1 << 12) /* RW */
  315. #define MSDC_IOCON_W_D3SPL (0x1 << 13) /* RW */
  316. #define MSDC_IOCON_R_D0SPL (0x1 << 16) /* RW */
  317. #define MSDC_IOCON_R_D1SPL (0x1 << 17) /* RW */
  318. #define MSDC_IOCON_R_D2SPL (0x1 << 18) /* RW */
  319. #define MSDC_IOCON_R_D3SPL (0x1 << 19) /* RW */
  320. #define MSDC_IOCON_R_D4SPL (0x1 << 20) /* RW */
  321. #define MSDC_IOCON_R_D5SPL (0x1 << 21) /* RW */
  322. #define MSDC_IOCON_R_D6SPL (0x1 << 22) /* RW */
  323. #define MSDC_IOCON_R_D7SPL (0x1 << 23) /* RW */
  324. /* MSDC_PS mask */
  325. #define MSDC_PS_CDEN (0x1 << 0) /* RW */
  326. #define MSDC_PS_CDSTS (0x1 << 1) /* R */
  327. #define MSDC_PS_CDDEBOUNCE (0xf << 12) /* RW */
  328. #define MSDC_PS_DAT (0xff << 16) /* R */
  329. #define MSDC_PS_CMD (0x1 << 24) /* R */
  330. #define MSDC_PS_WP (0x1UL<< 31) /* R */
  331. /* MSDC_INT mask */
  332. #define MSDC_INT_MMCIRQ (0x1 << 0) /* W1C */
  333. #define MSDC_INT_CDSC (0x1 << 1) /* W1C */
  334. #define MSDC_INT_ACMDRDY (0x1 << 3) /* W1C */
  335. #define MSDC_INT_ACMDTMO (0x1 << 4) /* W1C */
  336. #define MSDC_INT_ACMDCRCERR (0x1 << 5) /* W1C */
  337. #define MSDC_INT_DMAQ_EMPTY (0x1 << 6) /* W1C */
  338. #define MSDC_INT_SDIOIRQ (0x1 << 7) /* W1C */
  339. #define MSDC_INT_CMDRDY (0x1 << 8) /* W1C */
  340. #define MSDC_INT_CMDTMO (0x1 << 9) /* W1C */
  341. #define MSDC_INT_RSPCRCERR (0x1 << 10) /* W1C */
  342. #define MSDC_INT_CSTA (0x1 << 11) /* R */
  343. #define MSDC_INT_XFER_COMPL (0x1 << 12) /* W1C */
  344. #define MSDC_INT_DXFER_DONE (0x1 << 13) /* W1C */
  345. #define MSDC_INT_DATTMO (0x1 << 14) /* W1C */
  346. #define MSDC_INT_DATCRCERR (0x1 << 15) /* W1C */
  347. #define MSDC_INT_ACMD19_DONE (0x1 << 16) /* W1C */
  348. #define MSDC_INT_BDCSERR (0x1 << 17) /* W1C */
  349. #define MSDC_INT_GPDCSERR (0x1 << 18) /* W1C */
  350. #define MSDC_INT_DMAPRO (0x1 << 19) /* W1C */
  351. #define MSDC_INT_AXI_RESP_ERR (0x1 << 23) /* W1C */
  352. #ifdef MTK_SDIO30_TEST_MODE_SUPPORT
  353. #define MSDC_INT_GEAR_OUT_BOUND (0x1 << 20) /* W1C */
  354. #define MSDC_INT_ACMD53_DONE (0x1 << 21) /* W1C */
  355. #define MSDC_INT_ACMD53_FAIL (0x1 << 22) /* W1C */
  356. #endif
  357. /* MSDC_INTEN mask */
  358. #define MSDC_INTEN_MMCIRQ (0x1 << 0) /* RW */
  359. #define MSDC_INTEN_CDSC (0x1 << 1) /* RW */
  360. #define MSDC_INTEN_ACMDRDY (0x1 << 3) /* RW */
  361. #define MSDC_INTEN_ACMDTMO (0x1 << 4) /* RW */
  362. #define MSDC_INTEN_ACMDCRCERR (0x1 << 5) /* RW */
  363. #define MSDC_INTEN_DMAQ_EMPTY (0x1 << 6) /* RW */
  364. #define MSDC_INTEN_SDIOIRQ (0x1 << 7) /* RW */
  365. #define MSDC_INTEN_CMDRDY (0x1 << 8) /* RW */
  366. #define MSDC_INTEN_CMDTMO (0x1 << 9) /* RW */
  367. #define MSDC_INTEN_RSPCRCERR (0x1 << 10) /* RW */
  368. #define MSDC_INTEN_CSTA (0x1 << 11) /* RW */
  369. #define MSDC_INTEN_XFER_COMPL (0x1 << 12) /* RW */
  370. #define MSDC_INTEN_DXFER_DONE (0x1 << 13) /* RW */
  371. #define MSDC_INTEN_DATTMO (0x1 << 14) /* RW */
  372. #define MSDC_INTEN_DATCRCERR (0x1 << 15) /* RW */
  373. #define MSDC_INTEN_ACMD19_DONE (0x1 << 16) /* RW */
  374. #define MSDC_INTEN_BDCSERR (0x1 << 17) /* RW */
  375. #define MSDC_INTEN_GPDCSERR (0x1 << 18) /* RW */
  376. #define MSDC_INTEN_DMAPRO (0x1 << 19) /* RW */
  377. #ifdef MTK_SDIO30_TEST_MODE_SUPPORT
  378. #define MSDC_INTEN_GOBOUND (0x1 << 20) /* RW */
  379. #define MSDC_INTEN_ACMD53_DONE (0x1 << 21) /* RW */
  380. #define MSDC_INTEN_ACMD53_FAIL (0x1 << 22) /* RW */
  381. #endif
  382. #define MSDC_INTEN_AXI_RESP_ERR (0x1 << 23) /* RW */
  383. /* MSDC_FIFOCS mask */
  384. #define MSDC_FIFOCS_RXCNT (0xff << 0) /* R */
  385. #define MSDC_FIFOCS_TXCNT (0xff << 16) /* R */
  386. #define MSDC_FIFOCS_CLR (0x1UL<< 31) /* RW */
  387. /* SDC_CFG mask */
  388. #define SDC_CFG_SDIOINTWKUP (0x1 << 0) /* RW */
  389. #define SDC_CFG_INSWKUP (0x1 << 1) /* RW */
  390. #define SDC_CFG_BUSWIDTH (0x3 << 16) /* RW */
  391. #define SDC_CFG_SDIO (0x1 << 19) /* RW */
  392. #define SDC_CFG_SDIOIDE (0x1 << 20) /* RW */
  393. #define SDC_CFG_INTATGAP (0x1 << 21) /* RW */
  394. #define SDC_CFG_DTOC (0xffUL << 24) /* RW */
  395. /* SDC_CMD mask */
  396. #define SDC_CMD_OPC (0x3f << 0) /* RW */
  397. #define SDC_CMD_BRK (0x1 << 6) /* RW */
  398. #define SDC_CMD_RSPTYP (0x7 << 7) /* RW */
  399. #define SDC_CMD_DTYP (0x3 << 11) /* RW */
  400. #define SDC_CMD_RW (0x1 << 13) /* RW */
  401. #define SDC_CMD_STOP (0x1 << 14) /* RW */
  402. #define SDC_CMD_GOIRQ (0x1 << 15) /* RW */
  403. #define SDC_CMD_BLKLEN (0xfff<< 16) /* RW */
  404. #define SDC_CMD_AUTOCMD (0x3 << 28) /* RW */
  405. #define SDC_CMD_VOLSWTH (0x1 << 30) /* RW */
  406. #ifdef MTK_SDIO30_TEST_MODE_SUPPORT
  407. #define SDC_CMD_ACMD53 (0x1UL << 31) /* RW */
  408. #endif
  409. /* SDC_VOL_CHG mask */
  410. #define SDC_VOL_CHG_CNT (0xffff << 0) /* RW */
  411. /* SDC_STS mask */
  412. #define SDC_STS_SDCBUSY (0x1 << 0) /* RW */
  413. #define SDC_STS_CMDBUSY (0x1 << 1) /* RW */
  414. #define SDC_STS_CMD_WR_BUSY (0x1 << 16) /* W1C */
  415. #define SDC_STS_SWR_COMPL (0x1UL << 31) /* RO */
  416. /* SDC_DCRC_STS mask */
  417. #define SDC_DCRC_STS_POS (0xff << 0) /* RO */
  418. #define SDC_DCRC_STS_NEG (0xff << 8) /* RO */
  419. /* EMMC_CFG0 mask */
  420. #define EMMC_CFG0_BOOTSTART (0x1 << 0) /* W */
  421. #define EMMC_CFG0_BOOTSTOP (0x1 << 1) /* W */
  422. #define EMMC_CFG0_BOOTMODE (0x1 << 2) /* RW */
  423. #define EMMC_CFG0_BOOTACKDIS (0x1 << 3) /* RW */
  424. #define EMMC_CFG0_BOOTWDLY (0x7 << 12) /* RW */
  425. #define EMMC_CFG0_BOOTSUPP (0x1 << 15) /* RW */
  426. /* EMMC_CFG1 mask */
  427. #define EMMC_CFG1_BOOTDATTMC (0xfffff << 0) /* RW */
  428. #define EMMC_CFG1_BOOTACKTMC (0xfffUL << 20) /* RW */
  429. /* EMMC_STS mask */
  430. #define EMMC_STS_BOOTCRCERR (0x1 << 0) /* W1C */
  431. #define EMMC_STS_BOOTACKERR (0x1 << 1) /* W1C */
  432. #define EMMC_STS_BOOTDATTMO (0x1 << 2) /* W1C */
  433. #define EMMC_STS_BOOTACKTMO (0x1 << 3) /* W1C */
  434. #define EMMC_STS_BOOTUPSTATE (0x1 << 4) /* R */
  435. #define EMMC_STS_BOOTACKRCV (0x1 << 5) /* W1C */
  436. #define EMMC_STS_BOOTDATRCV (0x1 << 6) /* R */
  437. /* EMMC_IOCON mask */
  438. #define EMMC_IOCON_BOOTRST (0x1 << 0) /* RW */
  439. /* SDC_ACMD19_TRG mask */
  440. #define SDC_ACMD19_TRG_TUNESEL (0xf << 0) /* RW */
  441. /* MSDC_DMA_SA_HIGH4BIT */
  442. #define MSDC_DMA_SURR_ADDR_HIGH4BIT (0xf << 0) /* RW */
  443. /* MSDC_DMA_CTRL mask */
  444. #define MSDC_DMA_CTRL_START (0x1 << 0) /* W */
  445. #define MSDC_DMA_CTRL_STOP (0x1 << 1) /* W */
  446. #define MSDC_DMA_CTRL_RESUME (0x1 << 2) /* W */
  447. #define MSDC_DMA_CTRL_REDAYM (0x1 << 3) /* RO */
  448. #define MSDC_DMA_CTRL_MODE (0x1 << 8) /* RW */
  449. #define MSDC_DMA_CTRL_ALIGN (0x1 << 9) /* RW */
  450. #define MSDC_DMA_CTRL_LASTBUF (0x1 << 10) /* RW */
  451. #define MSDC_DMA_CTRL_SPLI1K (0x1 << 11) /* RW */
  452. #define MSDC_DMA_CTRL_BRUSTSZ (0x7 << 12) /* RW */
  453. /* MSDC_DMA_CFG mask */
  454. #define MSDC_DMA_CFG_STS (0x1 << 0) /* R */
  455. #define MSDC_DMA_CFG_DECSEN (0x1 << 1) /* RW */
  456. #define MSDC_DMA_CFG_LOCKDISABLE (0x1 << 2) /* RW */
  457. #define MSDC_DMA_CFG_AHBEN (0x3 << 8) /* RW */
  458. #define MSDC_DMA_CFG_ACTEN (0x3 << 12) /* RW */
  459. #define MSDC_DMA_CFG_CS12B (0x1 << 16) /* RW */
  460. /* MSDC_PATCH_BIT0 mask */
  461. #define MSDC_PB0_RESV1 (0x1 << 0)
  462. #define MSDC_PB0_EN_8BITSUP (0x1 << 1)
  463. #define MSDC_PB0_DIS_RECMDWR (0x1 << 2)
  464. #define MSDC_PB0_RESV2 (0x7 << 3)
  465. #define MSDC_PB0_DESCUP (0x1 << 6)
  466. #define MSDC_PB0_INT_DAT_LATCH_CK_SEL (0x7 << 7)
  467. #define MSDC_PB0_CKGEN_MSDC_DLY_SEL (0x1F<<10)
  468. #define MSDC_PB0_FIFORD_DIS (0x1 << 15)
  469. #define MSDC_PB0_BLKNUM_SEL (0x1 << 16)
  470. #define MSDC_PB0_SDIO_INTCSEL (0x1 << 17)
  471. #define MSDC_PB0_SDC_BSYDLY (0xf << 18)
  472. #define MSDC_PB0_SDC_WDOD (0xf << 22)
  473. #define MSDC_PB0_CMDIDRTSEL (0x1 << 26)
  474. #define MSDC_PB0_CMDFAILSEL (0x1 << 27)
  475. #define MSDC_PB0_SDIO_INTDLYSEL (0x1 << 28)
  476. #define MSDC_PB0_SPCPUSH (0x1 << 29)
  477. #define MSDC_PB0_DETWR_CRCTMO (0x1 << 30)
  478. #define MSDC_PB0_EN_DRVRSP (0x1UL << 31)
  479. /* MSDC_PATCH_BIT1 mask */
  480. #define MSDC_PB1_WRDAT_CRCS_TA_CNTR (0x7 << 0)
  481. #define MSDC_PB1_CMD_RSP_TA_CNTR (0x7 << 3)
  482. #define MSDC_PB1_GET_BUSY_MA (0x1 << 6)
  483. #define MSDC_PB1_GET_CRC_MA (0x1 << 7)
  484. #define MSDC_PB1_BIAS_TUNE_28NM (0xf << 8)
  485. #define MSDC_PB1_BIAS_EN18IO_28NM (0x1 << 12)
  486. #define MSDC_PB1_BIAS_EXT_28NM (0x1 << 13)
  487. #define MSDC_PB1_RESV2 (0x1 << 14)
  488. #define MSDC_PB1_RESET_GDMA (0x1 << 15)
  489. #define MSDC_PB1_SINGLEBURST (0x1 << 16)
  490. #define MSDC_PB1_FROCE_STOP (0x1 << 17)
  491. #define MSDC_PB1_DCM_DEV_SEL2 (0x3 << 18)
  492. #define MSDC_PB1_DCM_DEV_SEL1 (0x1 << 20)
  493. #define MSDC_PB1_DCM_EN (0x1 << 21)
  494. #define MSDC_PB1_AXI_WRAP_CKEN (0x1 << 22)
  495. #define MSDC_PB1_AHBCKEN (0x1 << 23)
  496. #define MSDC_PB1_CKSPCEN (0x1 << 24)
  497. #define MSDC_PB1_CKPSCEN (0x1 << 25)
  498. #define MSDC_PB1_CKVOLDETEN (0x1 << 26)
  499. #define MSDC_PB1_CKACMDEN (0x1 << 27)
  500. #define MSDC_PB1_CKSDEN (0x1 << 28)
  501. #define MSDC_PB1_CKWCTLEN (0x1 << 29)
  502. #define MSDC_PB1_CKRCTLEN (0x1 << 30)
  503. #define MSDC_PB1_CKSHBFFEN (0x1UL << 31)
  504. /* MSDC_PATCH_BIT2 mask */
  505. #define MSDC_PB2_ENHANCEGPD (0x1 << 0)
  506. #define MSDC_PB2_SUPPORT64G (0x1 << 1)
  507. #define MSDC_PB2_RESPWAITCNT (0x3 << 2)
  508. #define MSDC_PB2_CFGRDATCNT (0x1f << 4)
  509. #define MSDC_PB2_CFGRDAT (0x1 << 9)
  510. #define MSDC_PB2_INTCRESPSEL (0x1 << 11)
  511. #define MSDC_PB2_CFGRESPCNT (0x7 << 12)
  512. #define MSDC_PB2_CFGRESP (0x1 << 15)
  513. #define MSDC_PB2_RESPSTENSEL (0x7 << 16)
  514. #define MSDC_PB2_POPENCNT (0xf << 20)
  515. #define MSDC_PB2_CFG_CRCSTS_SEL (0x1 << 24)
  516. #define MSDC_PB2_CFGCRCSTSEDGE (0x1 << 25)
  517. #define MSDC_PB2_CFGCRCSTSCNT (0x3 << 26)
  518. #define MSDC_PB2_CFGCRCSTS (0x1 << 28)
  519. #define MSDC_PB2_CRCSTSENSEL (0x7UL << 29)
  520. #ifdef MTK_SDIO30_TEST_MODE_SUPPORT
  521. #define MSDC_MASK_ACMD53_CRC_ERR_INTR (0x1<<4)
  522. #define MSDC_ACMD53_FAIL_ONE_SHOT (0X1<<5)
  523. #endif
  524. /* MSDC_PAD_TUNE0 mask */
  525. #define MSDC_PAD_TUNE0_DATWRDLY (0x1F << 0) /* RW */
  526. #define MSDC_PAD_TUNE0_DELAYEN (0x1 << 7) /* RW */
  527. #define MSDC_PAD_TUNE0_DATRRDLY (0x1F << 8) /* RW */
  528. #define MSDC_PAD_TUNE0_CMDRDLY (0x1F << 16) /* RW */
  529. #define MSDC_PAD_TUNE0_CMDRRDLY (0x1FUL << 22) /* RW */
  530. #define MSDC_PAD_TUNE0_CLKTXDLY (0x1FUL << 27) /* RW */
  531. /* MSDC_DAT_RDDLY0/1 mask */
  532. #define MSDC_DAT_RDDLY0_D3 (0x1F << 0) /* RW */
  533. #define MSDC_DAT_RDDLY0_D2 (0x1F << 8) /* RW */
  534. #define MSDC_DAT_RDDLY0_D1 (0x1F << 16) /* RW */
  535. #define MSDC_DAT_RDDLY0_D0 (0x1FUL << 24) /* RW */
  536. #define MSDC_DAT_RDDLY1_D7 (0x1F << 0) /* RW */
  537. #define MSDC_DAT_RDDLY1_D6 (0x1F << 8) /* RW */
  538. #define MSDC_DAT_RDDLY1_D5 (0x1F << 16) /* RW */
  539. #define MSDC_DAT_RDDLY1_D4 (0x1FUL << 24) /* RW */
  540. /* MSDC_HW_DBG_SEL mask */
  541. #define MSDC_HW_DBG0_SEL (0xff << 0)
  542. #define MSDC_HW_DBG1_SEL (0x3f << 8)
  543. #define MSDC_HW_DBG2_SEL (0xff << 16)
  544. #define MSDC_HW_DBG3_SEL (0x3f << 24)
  545. #define MSDC_HW_DBG_WRAPTYPE_SEL (0x1UL << 30)
  546. /* EMMC50_PAD_DS_TUNE mask */
  547. #define MSDC_EMMC50_PAD_DS_TUNE_DLYSEL (0x1 << 0)
  548. #define MSDC_EMMC50_PAD_DS_TUNE_DLY2SEL (0x1 << 1)
  549. #define MSDC_EMMC50_PAD_DS_TUNE_DLY1 (0x1f << 2)
  550. #define MSDC_EMMC50_PAD_DS_TUNE_DLY2 (0x1f << 7)
  551. #define MSDC_EMMC50_PAD_DS_TUNE_DLY3 (0x1F << 12)
  552. /* EMMC50_PAD_CMD_TUNE mask */
  553. #define MSDC_EMMC50_PAD_CMD_TUNE_DLY3SEL (0x1 << 0)
  554. #define MSDC_EMMC50_PAD_CMD_TUNE_RXDLY3 (0x1f << 1)
  555. #define MSDC_EMMC50_PAD_CMD_TUNE_TXDLY (0x1f << 6)
  556. /* EMMC50_PAD_DAT01_TUNE mask */
  557. #define MSDC_EMMC50_PAD_DAT0_RXDLY3SEL (0x1 << 0)
  558. #define MSDC_EMMC50_PAD_DAT0_RXDLY3 (0x1f << 1)
  559. #define MSDC_EMMC50_PAD_DAT0_TXDLY (0x1f << 6)
  560. #define MSDC_EMMC50_PAD_DAT1_RXDLY3SEL (0x1 << 16)
  561. #define MSDC_EMMC50_PAD_DAT1_RXDLY3 (0x1f << 17)
  562. #define MSDC_EMMC50_PAD_DAT1_TXDLY (0x1f << 22)
  563. /* EMMC50_PAD_DAT23_TUNE mask */
  564. #define MSDC_EMMC50_PAD_DAT2_RXDLY3SEL (0x1 << 0)
  565. #define MSDC_EMMC50_PAD_DAT2_RXDLY3 (0x1f << 1)
  566. #define MSDC_EMMC50_PAD_DAT2_TXDLY (0x1f << 6)
  567. #define MSDC_EMMC50_PAD_DAT3_RXDLY3SEL (0x1 << 16)
  568. #define MSDC_EMMC50_PAD_DAT3_RXDLY3 (0x1f << 17)
  569. #define MSDC_EMMC50_PAD_DAT3_TXDLY (0x1f << 22)
  570. /* EMMC50_PAD_DAT45_TUNE mask */
  571. #define MSDC_EMMC50_PAD_DAT4_RXDLY3SEL (0x1 << 0)
  572. #define MSDC_EMMC50_PAD_DAT4_RXDLY3 (0x1f << 1)
  573. #define MSDC_EMMC50_PAD_DAT4_TXDLY (0x1f << 6)
  574. #define MSDC_EMMC50_PAD_DAT5_RXDLY3SEL (0x1 << 16)
  575. #define MSDC_EMMC50_PAD_DAT5_RXDLY3 (0x1f << 17)
  576. #define MSDC_EMMC50_PAD_DAT5_TXDLY (0x1f << 22)
  577. /* EMMC50_PAD_DAT67_TUNE mask */
  578. #define MSDC_EMMC50_PAD_DAT6_RXDLY3SEL (0x1 << 0)
  579. #define MSDC_EMMC50_PAD_DAT6_RXDLY3 (0x1f << 1)
  580. #define MSDC_EMMC50_PAD_DAT6_TXDLY (0x1f << 6)
  581. #define MSDC_EMMC50_PAD_DAT7_RXDLY3SEL (0x1 << 16)
  582. #define MSDC_EMMC50_PAD_DAT7_RXDLY3 (0x1f << 17)
  583. #define MSDC_EMMC50_PAD_DAT7_TXDLY (0x1f << 22)
  584. /* EMMC51_CFG0 mask */
  585. #define MSDC_EMMC51_CFG0_CMDQ_EN (0x1 << 0)
  586. #define MSDC_EMMC51_CFG0_WDAT_CNT (0x3ff << 1)
  587. #define MSDC_EMMC51_CFG0_RDAT_CNT (0x3ff << 11)
  588. #define MSDC_EMMC51_CFG0_CMDQ_CMD_EN (0x1 << 21)
  589. /* EMMC50_CFG0 mask */
  590. #define MSDC_EMMC50_CFG_PADCMD_LATCHCK (0x1 << 0)
  591. #define MSDC_EMMC50_CFG_CRC_STS_CNT (0x3 << 1)
  592. #define MSDC_EMMC50_CFG_CRC_STS_EDGE (0x1 << 3)
  593. #define MSDC_EMMC50_CFG_CRC_STS_SEL (0x1 << 4)
  594. #define MSDC_EMMC50_CFG_END_BIT_CHK_CNT (0xf << 5)
  595. #define MSDC_EMMC50_CFG_CMD_RESP_SEL (0x1 << 9)
  596. #define MSDC_EMMC50_CFG_CMD_EDGE_SEL (0x1 << 10)
  597. #define MSDC_EMMC50_CFG_ENDBIT_CNT (0x3ff << 11)
  598. #define MSDC_EMMC50_CFG_READ_DAT_CNT (0x7 << 21)
  599. #define MSDC_EMMC50_CFG_EMMC50_MON_SEL (0x1 << 24)
  600. #define MSDC_EMMC50_CFG_MSDC_WR_VALID (0x1 << 25)
  601. #define MSDC_EMMC50_CFG_MSDC_RD_VALID (0x1 << 26)
  602. #define MSDC_EMMC50_CFG_MSDC_WR_VALID_SEL (0x1 << 27)
  603. #define MSDC_EMMC50_CFG_EMMC50_MON_SE (0x1 << 28)
  604. #define MSDC_EMMC50_CFG_EMMC50_TXSKEWSEL (0x1 << 29)
  605. /* EMMC50_CFG1 mask */
  606. #define MSDC_EMMC50_CFG1_WRPTR_MARGIN (0xff << 0)
  607. #define MSDC_EMMC50_CFG1_CKSWITCH_CNT (0x7 << 8)
  608. #define MSDC_EMMC50_CFG1_RDDAT_STOP (0x1 << 11)
  609. #define MSDC_EMMC50_CFG1_WAITCLK_CNT (0xf << 12)
  610. #define MSDC_EMMC50_CFG1_DBG_SEL (0xff << 16)
  611. #define MSDC_EMMC50_CFG1_PSHCNT (0x7 << 24)
  612. #define MSDC_EMMC50_CFG1_PSHPSSEL (0x1 << 27)
  613. #define MSDC_EMMC50_CFG1_DSCFG (0x1 << 28)
  614. #define MSDC_EMMC50_CFG1_RESV0 (0x7UL << 29)
  615. /* EMMC50_CFG2_mask */
  616. //#define MSDC_EMMC50_CFG2_AXI_GPD_UP (0x1 << 0)
  617. #define MSDC_EMMC50_CFG2_AXI_IOMMU_WR_EMI (0x1 << 1)
  618. #define MSDC_EMMC50_CFG2_AXI_SHARE_EN_WR_EMI (0x1 << 2)
  619. #define MSDC_EMMC50_CFG2_AXI_IOMMU_RD_EMI (0x1 << 7)
  620. #define MSDC_EMMC50_CFG2_AXI_SHARE_EN_RD_EMI (0x1 << 8)
  621. #define MSDC_EMMC50_CFG2_AXI_BOUND_128B (0x1 << 13)
  622. #define MSDC_EMMC50_CFG2_AXI_BOUND_256B (0x1 << 14)
  623. #define MSDC_EMMC50_CFG2_AXI_BOUND_512B (0x1 << 15)
  624. #define MSDC_EMMC50_CFG2_AXI_BOUND_1K (0x1 << 16)
  625. #define MSDC_EMMC50_CFG2_AXI_BOUND_2K (0x1 << 17)
  626. #define MSDC_EMMC50_CFG2_AXI_BOUND_4K (0x1 << 18)
  627. #define MSDC_EMMC50_CFG2_AXI_RD_OUTS_NUM (0x1f<< 19)
  628. #define MSDC_EMMC50_CFG2_AXI_SET_LEN (0xf << 24)
  629. #define MSDC_EMMC50_CFG2_AXI_RESP_ERR_TYPE (0x3 << 28)
  630. #define MSDC_EMMC50_CFG2_AXI_BUSY (0x1 << 30)
  631. /* EMMC50_CFG3_mask */
  632. #define MSDC_EMMC50_CFG3_OUTS_WR (0x1f << 0)
  633. #define MSDC_EMMC50_CFG3_ULTRA_SET_WR (0x3f << 5)
  634. #define MSDC_EMMC50_CFG3_PREULTRA_SET_WR (0x3f << 11)
  635. #define MSDC_EMMC50_CFG3_ULTRA_SET_RD (0x3f << 17)
  636. #define MSDC_EMMC50_CFG3_PREULTRA_SET_RD (0x3f <<23)
  637. /* EMMC50_CFG4_mask */
  638. #define MSDC_EMMC50_CFG4_IMPR_ULTRA_SET_WR (0xff << 0)
  639. #define MSDC_EMMC50_CFG4_IMPR_ULTRA_SET_RD (0xff << 8)
  640. #define MSDC_EMMC50_CFG4_ULTRA_EN (0x3 << 16)
  641. #define MSDC_EMMC50_CFG4_AXI_WRAP_DBG_SEL (0x1f << 18)
  642. /* SDIO_TUNE_WIND mask*/
  643. #define MSDC_SDIO_TUNE_WIND (0x1f << 0)
  644. /*
  645. * MSDC0~3 IO Configuration Base.
  646. */
  647. #define GPIO_REG_BASE (0x10211000)
  648. /*--------------------------------------------------------------------------*/
  649. /* MSDC0 GPIO Related Register */
  650. /*--------------------------------------------------------------------------*/
  651. /* MSDC0 related register base*/
  652. #define MSDC0_GPIO_MODE18_ADDR (GPIO_REG_BASE + 0x410)
  653. #define MSDC0_GPIO_MODE19_ADDR (GPIO_REG_BASE + 0x420)
  654. #define MSDC0_GPIO_IES_G5_ADDR (GPIO_REG_BASE + 0xD00)
  655. #define MSDC0_GPIO_SMT_G5_ADDR (GPIO_REG_BASE + 0xD10)
  656. #define MSDC0_GPIO_TDSEL0_G5_ADDR (GPIO_REG_BASE + 0xD20)
  657. #define MSDC0_GPIO_RDSEL0_G5_ADDR (GPIO_REG_BASE + 0xD28)
  658. #define MSDC0_GPIO_DRV0_G5_ADDR (GPIO_REG_BASE + 0xD70)
  659. #define MSDC0_GPIO_PUPD0_G5_ADDR (GPIO_REG_BASE + 0xD80)
  660. #define MSDC0_GPIO_PUPD1_G5_ADDR (GPIO_REG_BASE + 0xD90)
  661. /* MSDC0 mode mask*/
  662. #define MSDC0_MODE_CMD_MASK (0x7 << 6 )
  663. #define MSDC0_MODE_DSL_MASK (0x7 << 9 )
  664. #define MSDC0_MODE_CLK_MASK (0x7 << 12)
  665. #define MSDC0_MODE_DAT0_MASK (0x7 << 16)
  666. #define MSDC0_MODE_DAT1_MASK (0x7 << 19)
  667. #define MSDC0_MODE_DAT2_MASK (0x7 << 22)
  668. #define MSDC0_MODE_DAT3_MASK (0x7 << 25)
  669. #define MSDC0_MODE_DAT4_MASK (0x7 << 28)
  670. #define MSDC0_MODE_DAT5_MASK (0x7 << 0 )
  671. #define MSDC0_MODE_DAT6_MASK (0x7 << 3 )
  672. #define MSDC0_MODE_DAT7_MASK (0x7 << 6 )
  673. #define MSDC0_MODE_RSTB_MASK (0x7 << 9 )
  674. /* MSDC0 IES mask*/
  675. #define MSDC0_IES_CMD_MASK (0x1 << 0 )
  676. #define MSDC0_IES_DSL_MASK (0x1 << 1 )
  677. #define MSDC0_IES_CLK_MASK (0x1 << 2 )
  678. #define MSDC0_IES_DAT_MASK (0x1 << 3 )
  679. #define MSDC0_IES_RSTB_MASK (0x1 << 4 )
  680. #define MSDC0_IES_ALL_MASK (0x1f << 0 )
  681. /* MSDC0 SMT mask*/
  682. #define MSDC0_SMT_CMD_MASK (0x1 << 0 )
  683. #define MSDC0_SMT_DSL_MASK (0x1 << 1 )
  684. #define MSDC0_SMT_CLK_MASK (0x1 << 2 )
  685. #define MSDC0_SMT_DAT_MASK (0x1 << 3 )
  686. #define MSDC0_SMT_RSTB_MASK (0x1 << 4 )
  687. #define MSDC0_SMT_ALL_MASK (0x1f << 0 )
  688. /* MSDC0 TDSEL mask*/
  689. #define MSDC0_TDSEL_CMD_MASK (0xF << 0 )
  690. #define MSDC0_TDSEL_DSL_MASK (0xF << 4 )
  691. #define MSDC0_TDSEL_CLK_MASK (0xF << 8 )
  692. #define MSDC0_TDSEL_DAT_MASK (0xF << 12)
  693. #define MSDC0_TDSEL_RSTB_MASK (0xF << 16)
  694. #define MSDC0_TDSEL_ALL_MASK (0xFFFFF << 0)
  695. /* MSDC0 RDSEL mask*/
  696. #define MSDC0_RDSEL_CMD_MASK (0x1F << 0 )
  697. #define MSDC0_RDSEL_DSL_MASK (0x1F << 6 )
  698. #define MSDC0_RDSEL_CLK_MASK (0x1F << 12)
  699. #define MSDC0_RDSEL_DAT_MASK (0x1F << 18)
  700. #define MSDC0_RDSEL_RSTB_MASK (0x1F << 24)
  701. #define MSDC0_RDSEL_ALL_MASK (0x3FFFFFFF << 0)
  702. /* MSDC0 SR mask*/
  703. #define MSDC0_SR_CMD_MASK (0x1 << 3 )
  704. #define MSDC0_SR_DSL_MASK (0x1 << 7 )
  705. #define MSDC0_SR_CLK_MASK (0x1 << 11)
  706. #define MSDC0_SR_DAT_MASK (0x1 << 15)
  707. #define MSDC0_SR_RSTB_MASK (0x1 << 19)
  708. #define MSDC0_SR_ALL_MASK (0x11111 << 3)
  709. /* MSDC0 DRV mask*/
  710. #define MSDC0_DRV_CMD_MASK (0x7 << 0 )
  711. #define MSDC0_DRV_DSL_MASK (0x7 << 4 )
  712. #define MSDC0_DRV_CLK_MASK (0x7 << 8 )
  713. #define MSDC0_DRV_DAT_MASK (0x7 << 12)
  714. #define MSDC0_DRV_RSTB_MASK (0x7 << 16)
  715. #define MSDC0_DRV_ALL_MASK (0x77777 << 0)
  716. /* MSDC0 PUPD mask*/
  717. #define MSDC0_PUPD_CMD_MASK (0x7 << 0 )
  718. #define MSDC0_PUPD_DSL_MASK (0x7 << 4 )
  719. #define MSDC0_PUPD_CLK_MASK (0x7 << 8 )
  720. #define MSDC0_PUPD_DAT0_MASK (0x7 << 12)
  721. #define MSDC0_PUPD_DAT1_MASK (0x7 << 16)
  722. #define MSDC0_PUPD_DAT2_MASK (0x7 << 20)
  723. #define MSDC0_PUPD_DAT3_MASK (0x7 << 24)
  724. #define MSDC0_PUPD_DAT4_MASK (0x7 << 28)
  725. #define MSDC0_PUPD_CMD_DSL_CLK_DAT04_MASK (0x77777777 << 0)
  726. #define MSDC0_PUPD_DAT5_MASK (0x7 << 0 )
  727. #define MSDC0_PUPD_DAT6_MASK (0x7 << 4 )
  728. #define MSDC0_PUPD_DAT7_MASK (0x7 << 8 )
  729. #define MSDC0_PUPD_RSTB_MASK (0x7 << 12)
  730. #define MSDC0_PUPD_DAT57_RSTB_MASK (0x7777 << 0)
  731. /*--------------------------------------------------------------------------*/
  732. /* MSDC1 GPIO Related Register */
  733. /*--------------------------------------------------------------------------*/
  734. /* MSDC1 related register base*/
  735. #define MSDC1_GPIO_MODE17_ADDR (GPIO_REG_BASE + 0x400)
  736. #define MSDC1_GPIO_MODE18_ADDR (GPIO_REG_BASE + 0x410)
  737. #define MSDC1_GPIO_IES_G4_ADDR (GPIO_REG_BASE + 0xC00)
  738. #define MSDC1_GPIO_SMT_G4_ADDR (GPIO_REG_BASE + 0xC10)
  739. #define MSDC1_GPIO_TDSEL0_G4_ADDR (GPIO_REG_BASE + 0xC20)
  740. #define MSDC1_GPIO_RDSEL0_G4_ADDR (GPIO_REG_BASE + 0xC28)
  741. #define MSDC1_GPIO_DRV0_G4_ADDR (GPIO_REG_BASE + 0xC70)
  742. #define MSDC1_GPIO_PUPD0_G4_ADDR (GPIO_REG_BASE + 0xC80)
  743. /* MSDC1 mode mask*/
  744. #define MSDC1_MODE_CMD_MASK (0x7 << 19)
  745. #define MSDC1_MODE_CLK_MASK (0x7 << 22)
  746. #define MSDC1_MODE_DAT0_MASK (0x7 << 25)
  747. #define MSDC1_MODE_DAT1_MASK (0x7 << 28)
  748. #define MSDC1_MODE_DAT2_MASK (0x7 << 0 )
  749. #define MSDC1_MODE_DAT3_MASK (0x7 << 3 )
  750. /* MSDC1 IES mask*/
  751. #define MSDC1_IES_CMD_MASK (0x1 << 2 )
  752. #define MSDC1_IES_CLK_MASK (0x1 << 3 )
  753. #define MSDC1_IES_DAT_MASK (0x1 << 4 )
  754. #define MSDC1_IES_ALL_MASK (0x7 << 2 )
  755. /* MSDC1 SMT mask*/
  756. #define MSDC1_SMT_CMD_MASK (0x1 << 2 )
  757. #define MSDC1_SMT_CLK_MASK (0x1 << 3 )
  758. #define MSDC1_SMT_DAT_MASK (0x1 << 4 )
  759. #define MSDC1_SMT_ALL_MASK (0x7 << 2 )
  760. /* MSDC1 TDSEL mask*/
  761. #define MSDC1_TDSEL_CMD_MASK (0xF << 8 )
  762. #define MSDC1_TDSEL_CLK_MASK (0xF << 12)
  763. #define MSDC1_TDSEL_DAT_MASK (0xF << 16)
  764. #define MSDC1_TDSEL_ALL_MASK (0xFFF << 8)
  765. /* MSDC1 RDSEL mask*/
  766. #define MSDC1_RDSEL_CMD_MASK (0x1F << 12)
  767. #define MSDC1_RDSEL_CLK_MASK (0x1F << 18)
  768. #define MSDC1_RDSEL_DAT_MASK (0x1F << 24)
  769. #define MSDC1_RDSEL_ALL_MASK (0x7FFF <<12)
  770. /* MSDC1 SR mask*/
  771. #define MSDC1_SR_CMD_MASK (0x1 << 11)
  772. #define MSDC1_SR_CLK_MASK (0x1 << 15)
  773. #define MSDC1_SR_DAT_MASK (0x1 << 19)
  774. #define MSDC1_SR_ALL_MASK (0x111 <<11)
  775. /* MSDC1 DRV mask*/
  776. #define MSDC1_DRV_CMD_MASK (0x7 << 8 )
  777. #define MSDC1_DRV_CLK_MASK (0x7 << 12)
  778. #define MSDC1_DRV_DAT_MASK (0x7 << 16)
  779. #define MSDC1_DRV_ALL_MASK (0x777 << 8)
  780. /* MSDC1 PUPD mask*/
  781. #define MSDC1_PUPD_CMD_MASK (0x7 << 0 )
  782. #define MSDC1_PUPD_CLK_MASK (0x7 << 4 )
  783. #define MSDC1_PUPD_DAT0_MASK (0x7 << 8 )
  784. #define MSDC1_PUPD_DAT1_MASK (0x7 << 12)
  785. #define MSDC1_PUPD_DAT2_MASK (0x7 << 16)
  786. #define MSDC1_PUPD_DAT3_MASK (0x7 << 20)
  787. #define MSDC1_BIAS_TUNE_MASK (0xF << 24)
  788. #define MSDC1_PUPD_CMD_CLK_DAT_MASK (0x777777 << 0)
  789. /*--------------------------------------------------------------------------*/
  790. /* MSDC2 GPIO Related Register */
  791. /*--------------------------------------------------------------------------*/
  792. /* msdc2 related register base*/
  793. #define MSDC2_GPIO_MODE20_ADDR (GPIO_REG_BASE + 0x430)
  794. #define MSDC2_GPIO_MODE21_ADDR (GPIO_REG_BASE + 0x440)
  795. #define MSDC2_GPIO_IES_G0_ADDR (GPIO_REG_BASE + 0x800)
  796. #define MSDC2_GPIO_SMT_G0_ADDR (GPIO_REG_BASE + 0x810)
  797. #define MSDC2_GPIO_TDSEL0_G0_ADDR (GPIO_REG_BASE + 0x820)
  798. #define MSDC2_GPIO_RDSEL0_G0_ADDR (GPIO_REG_BASE + 0x828)
  799. #define MSDC2_GPIO_DRV0_G0_ADDR (GPIO_REG_BASE + 0x870)
  800. #define MSDC2_GPIO_PUPD0_G0_ADDR (GPIO_REG_BASE + 0x880)
  801. /* MSDC2 mode mask*/
  802. #define MSDC2_MODE_CMD_MASK (0x7 << 25)
  803. #define MSDC2_MODE_CLK_MASK (0x7 << 28)
  804. #define MSDC2_MODE_DAT0_MASK (0x7 << 0 )
  805. #define MSDC2_MODE_DAT1_MASK (0x7 << 3 )
  806. #define MSDC2_MODE_DAT2_MASK (0x7 << 6 )
  807. #define MSDC2_MODE_DAT3_MASK (0x7 << 9 )
  808. /* MSDC2 IES mask*/
  809. #define MSDC2_IES_CMD_MASK (0x1 << 2 )
  810. #define MSDC2_IES_CLK_MASK (0x1 << 3 )
  811. #define MSDC2_IES_DAT_MASK (0x1 << 4 )
  812. #define MSDC2_IES_ALL_MASK (0x7 << 2 )
  813. /* MSDC2 SMT mask*/
  814. #define MSDC2_SMT_CMD_MASK (0x1 << 2 )
  815. #define MSDC2_SMT_CLK_MASK (0x1 << 3 )
  816. #define MSDC2_SMT_DAT_MASK (0x1 << 4 )
  817. #define MSDC2_SMT_ALL_MASK (0x7 << 2 )
  818. /* MSDC2 TDSEL mask*/
  819. #define MSDC2_TDSEL_CMD_MASK (0xF << 8 )
  820. #define MSDC2_TDSEL_CLK_MASK (0xF << 12)
  821. #define MSDC2_TDSEL_DAT_MASK (0xF << 16)
  822. #define MSDC2_TDSEL_ALL_MASK (0xFFF << 8)
  823. /* MSDC2 RDSEL mask*/
  824. #define MSDC2_RDSEL_CMD_MASK (0x1F << 4 )
  825. #define MSDC2_RDSEL_CLK_MASK (0x1F << 10)
  826. #define MSDC2_RDSEL_DAT_MASK (0x1F << 16)
  827. #define MSDC2_RDSEL_ALL_MASK (0x7FFF <<4)
  828. /* MSDC2 SR mask*/
  829. #define MSDC2_SR_CMD_MASK (0x1 << 11)
  830. #define MSDC2_SR_CLK_MASK (0x1 << 15)
  831. #define MSDC2_SR_DAT_MASK (0x1 << 19)
  832. #define MSDC2_SR_ALL_MASK (0x111 <<11)
  833. /* MSDC2 DRV mask*/
  834. #define MSDC2_DRV_CMD_MASK (0x7 << 8 )
  835. #define MSDC2_DRV_CLK_MASK (0x7 << 12)
  836. #define MSDC2_DRV_DAT_MASK (0x7 << 16)
  837. #define MSDC2_DRV_ALL_MASK (0x777 << 8)
  838. /* MSDC2 PUPD mask*/
  839. #define MSDC2_PUPD_CMD_MASK (0x7 << 0 )
  840. #define MSDC2_PUPD_CLK_MASK (0x7 << 4 )
  841. #define MSDC2_PUPD_DAT0_MASK (0x7 << 8 )
  842. #define MSDC2_PUPD_DAT1_MASK (0x7 << 12)
  843. #define MSDC2_PUPD_DAT2_MASK (0x7 << 16)
  844. #define MSDC2_PUPD_DAT3_MASK (0x7 << 20)
  845. #define MSDC2_BIAS_TUNE_MASK (0xF << 24)
  846. #define MSDC2_PUPD_CMD_CLK_DAT_MASK (0x777777 << 0)
  847. /*
  848. MSDC Driving Strength Definition: specify as gear instead of driving
  849. */
  850. #define MSDC_DRVN_GEAR0 0x0
  851. #define MSDC_DRVN_GEAR1 0x1
  852. #define MSDC_DRVN_GEAR2 0x2
  853. #define MSDC_DRVN_GEAR3 0x3
  854. #define MSDC_DRVN_GEAR4 0x4
  855. #define MSDC_DRVN_GEAR5 0x5
  856. #define MSDC_DRVN_GEAR6 0x6
  857. #define MSDC_DRVN_GEAR7 0x7
  858. #define MSDC_DRVN_DONT_CARE 0x0
  859. typedef struct {
  860. int pio_bits; /* PIO width: 32, 16, or 8bits */
  861. int autocmd;
  862. int cmd23_flags;
  863. struct dma_config cfg;
  864. struct scatterlist sg[MAX_SG_POOL_SZ];
  865. int alloc_gpd;
  866. int alloc_bd;
  867. int rdsmpl;
  868. int wdsmpl;
  869. int rsmpl;
  870. int start_bit;
  871. gpd_t *active_head;
  872. gpd_t *active_tail;
  873. gpd_t *gpd_pool;
  874. bd_t *bd_pool;
  875. } msdc_priv_t;
  876. #define DMA_FLAG_NONE (0x00000000)
  877. #define DMA_FLAG_EN_CHKSUM (0x00000001)
  878. #define DMA_FLAG_PAD_BLOCK (0x00000002)
  879. #define DMA_FLAG_PAD_DWORD (0x00000004)
  880. #define MSDC_WRITE32(addr, data) mt_reg_sync_writel(data,addr)
  881. #define MSDC_READ32(addr) (*(volatile uint32*)(addr))
  882. #define MSDC_WRITE16(addr, data) mt_reg_sync_writew(data,addr)
  883. #define MSDC_READ16(addr) (*(volatile uint16*)(addr))
  884. #define MSDC_WRITE8(addr, data) mt_reg_sync_writeb(data,addr)
  885. #define MSDC_READ8(addr) (*(volatile uint8*)(addr))
  886. #define MSDC_SET_BIT32(addr,mask) \
  887. do { \
  888. unsigned int tv = MSDC_READ32(addr); \
  889. tv |=((u32)(mask)); \
  890. MSDC_WRITE32(addr,tv); \
  891. } while(0)
  892. #define MSDC_CLR_BIT32(addr,mask) \
  893. do { \
  894. unsigned int tv = MSDC_READ32(addr); \
  895. tv &= ~((u32)(mask)); \
  896. MSDC_WRITE32(addr,tv); \
  897. } while(0)
  898. #define MSDC_SET_BIT16(addr,mask) \
  899. do { \
  900. unsigned short tv = MSDC_READ16(addr); \
  901. tv |= ((u16)(mask)); \
  902. MSDC_WRITE16(addr,tv); \
  903. } while(0)
  904. #define MSDC_CLR_BIT16(addr,mask) \
  905. do { \
  906. unsigned short tv = MSDC_READ16(addr); \
  907. tv &= ~((u16)(mask)); \
  908. MSDC_WRITE16(addr,tv); \
  909. } while(0)
  910. #define MSDC_SET_FIELD(reg,field,val) \
  911. do { \
  912. volatile uint32 tv = MSDC_READ32(reg); \
  913. tv &= ~(field); \
  914. tv |= ((val) << (uffs(field) - 1)); \
  915. MSDC_WRITE32(reg,tv); \
  916. } while(0)
  917. #define MSDC_GET_FIELD(reg,field,val) \
  918. do { \
  919. volatile uint32 tv = MSDC_READ32(reg); \
  920. val = ((tv & (field)) >> (uffs(field) - 1)); \
  921. } while(0)
  922. #define MSDC_SET_FIELD_16(reg,field,val) \
  923. do { \
  924. volatile uint16 tv = MSDC_READ16(reg); \
  925. tv &= ~(field); \
  926. tv |= ((val) << (uffs(field) - 1)); \
  927. MSDC_WRITE16(reg,tv); \
  928. } while(0)
  929. #define MSDC_GET_FIELD_16(reg,field,val) \
  930. do { \
  931. volatile uint16 tv = MSDC_READ16(reg); \
  932. val = ((tv & (field)) >> (uffs(field) - 1)); \
  933. } while(0)
  934. #define MSDC_RETRY(expr,retry,cnt) \
  935. do { \
  936. uint32 t = cnt; \
  937. uint32 r = retry; \
  938. uint32 c = cnt; \
  939. while (r) { \
  940. if (!(expr)) break; \
  941. if (c-- == 0) { \
  942. r--; udelay(200); c = t; \
  943. } \
  944. } \
  945. BUG_ON(r == 0); \
  946. } while(0)
  947. /*sd card change voltage wait time= (1/freq) * SDC_VOL_CHG_CNT(default 0x145)*/
  948. #define msdc_set_vol_change_wait_count(count) \
  949. do { \
  950. MSDC_SET_FIELD(SDC_VOL_CHG,SDC_VOL_CHG_CNT, (count)); \
  951. } while(0)
  952. #define MSDC_RESET() \
  953. do { \
  954. MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_RST); \
  955. MSDC_RETRY(MSDC_READ32(MSDC_CFG) & MSDC_CFG_RST, 5, 1000); \
  956. } while(0)
  957. #define MSDC_CLR_INT() \
  958. do { \
  959. volatile uint32 val = MSDC_READ32(MSDC_INT); \
  960. MSDC_WRITE32(MSDC_INT, val); \
  961. if (MSDC_READ32(MSDC_INT)) { \
  962. MSG(ERR, "[ASSERT] MSDC_INT is NOT clear\n"); \
  963. } \
  964. } while(0)
  965. #define MSDC_CLR_FIFO() \
  966. do { \
  967. MSDC_SET_BIT32(MSDC_FIFOCS, MSDC_FIFOCS_CLR); \
  968. MSDC_RETRY(MSDC_READ32(MSDC_FIFOCS) & MSDC_FIFOCS_CLR, 5, 1000); \
  969. } while(0)
  970. #define MSDC_FIFO_WRITE32(val) MSDC_WRITE32(MSDC_TXDATA, val)
  971. #define MSDC_FIFO_READ32() MSDC_READ32(MSDC_RXDATA)
  972. #define MSDC_FIFO_WRITE16(val) MSDC_WRITE16(MSDC_TXDATA, val)
  973. #define MSDC_FIFO_READ16() MSDC_READ16(MSDC_RXDATA)
  974. #define MSDC_FIFO_WRITE8(val) MSDC_WRITE8(MSDC_TXDATA, val)
  975. #define MSDC_FIFO_READ8() MSDC_READ8(MSDC_RXDATA)
  976. #define MSDC_FIFO_WRITE(val) MSDC_FIFO_WRITE32(val)
  977. #define MSDC_FIFO_READ() MSDC_FIFO_READ32()
  978. #define MSDC_TXFIFOCNT() \
  979. ((MSDC_READ32(MSDC_FIFOCS) & MSDC_FIFOCS_TXCNT) >> 16)
  980. #define MSDC_RXFIFOCNT() \
  981. ((MSDC_READ32(MSDC_FIFOCS) & MSDC_FIFOCS_RXCNT) >> 0)
  982. #define MSDC_CARD_DETECTION_ON() MSDC_SET_BIT32(MSDC_PS, MSDC_PS_CDEN)
  983. #define MSDC_CARD_DETECTION_OFF() MSDC_CLR_BIT32(MSDC_PS, MSDC_PS_CDEN)
  984. #define MSDC_DMA_ON() MSDC_CLR_BIT32(MSDC_CFG, MSDC_CFG_PIO)
  985. #define MSDC_DMA_OFF() MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_PIO)
  986. #define SDC_IS_BUSY() (MSDC_READ32(SDC_STS) & SDC_STS_SDCBUSY)
  987. #define SDC_IS_CMD_BUSY() (MSDC_READ32(SDC_STS) & SDC_STS_CMDBUSY)
  988. #define SDC_SEND_CMD(cmd,arg) \
  989. do { \
  990. MSDC_WRITE32(SDC_ARG, (arg)); \
  991. MSDC_WRITE32(SDC_CMD, (cmd)); \
  992. } while(0)
  993. #define MSDC_INIT_GPD_EX(gpd,extlen,cmd,arg,blknum) \
  994. do { \
  995. ((gpd_t*)gpd)->extlen = extlen; \
  996. ((gpd_t*)gpd)->cmd = cmd; \
  997. ((gpd_t*)gpd)->arg = arg; \
  998. ((gpd_t*)gpd)->blknum = blknum; \
  999. }while(0)
  1000. #define MSDC_INIT_BD(bd, blkpad, dwpad, dptr, dlen) \
  1001. do { \
  1002. BUG_ON(dlen > 0xFFFFFFUL); \
  1003. ((bd_t*)bd)->blkpad = blkpad; \
  1004. ((bd_t*)bd)->dwpad = dwpad; \
  1005. ((bd_t*)bd)->ptr = (void*)dptr; \
  1006. ((bd_t*)bd)->buflen = dlen; \
  1007. }while(0)
  1008. typedef struct msdc_reg_control {
  1009. u32 addr;
  1010. u32 mask;
  1011. u32 value;
  1012. u32 default_value;
  1013. int (*restore_func)(int restore);
  1014. }MSDC_REG_CONTROL_T;
  1015. typedef enum MT65XX_POWER_VOL_TAG
  1016. {
  1017. VOL_DEFAULT,
  1018. VOL_0900 = 900,
  1019. VOL_1000 = 1000,
  1020. VOL_1100 = 1100,
  1021. VOL_1200 = 1200,
  1022. VOL_1300 = 1300,
  1023. VOL_1350 = 1350,
  1024. VOL_1500 = 1500,
  1025. VOL_1800 = 1800,
  1026. VOL_2000 = 2000,
  1027. VOL_2100 = 2100,
  1028. VOL_2500 = 2500,
  1029. VOL_2800 = 2800,
  1030. VOL_3000 = 3000,
  1031. VOL_3300 = 3300,
  1032. VOL_3400 = 3400,
  1033. VOL_3500 = 3500,
  1034. VOL_3600 = 3600
  1035. } MT65XX_POWER_VOLTAGE;
  1036. #ifdef MMC_PROFILING
  1037. static inline void msdc_timer_init(void)
  1038. {
  1039. /* clear. CLR[1]=1, EN[0]=0 */
  1040. MSDC_WRITE32(GPT_BASE + 0x30, 0x0);
  1041. MSDC_WRITE32(GPT_BASE + 0x30, 0x2);
  1042. MSDC_WRITE32(GPT_BASE + 0x38, 0);
  1043. MSDC_WRITE32(GPT_BASE + 0x3C, 32768);
  1044. /* 32678HZ RTC free run */
  1045. MSDC_WRITE32(GPT_BASE + 0x34, 0x30);
  1046. MSDC_WRITE32(GPT_BASE + 0x30, 0x32);
  1047. }
  1048. static inline void msdc_timer_start(void)
  1049. {
  1050. *(volatile unsigned int*)(GPT_BASE + 0x30) |= (1 << 0);
  1051. }
  1052. static inline void msdc_timer_stop(void)
  1053. {
  1054. *(volatile unsigned int*)(GPT_BASE + 0x30) &= ~(1 << 0);
  1055. }
  1056. static inline void msdc_timer_stop_clear(void)
  1057. {
  1058. *(volatile unsigned int*)(GPT_BASE + 0x30) &= ~(1 << 0); /* stop */
  1059. *(volatile unsigned int*)(GPT_BASE + 0x30) |= (1 << 1); /* clear */
  1060. }
  1061. static inline unsigned int msdc_timer_get_count(void)
  1062. {
  1063. return MSDC_READ32(GPT_BASE + 0x38);
  1064. }
  1065. #else
  1066. #define msdc_timer_init() do{}while(0)
  1067. #define msdc_timer_start() do{}while(0)
  1068. #define msdc_timer_stop() do{}while(0)
  1069. #define msdc_timer_stop_clear() do{}while(0)
  1070. #define msdc_timer_get_count() 0
  1071. #endif
  1072. #if defined(FPGA_PLATFORM)
  1073. #define msdc_set_sr(host, clk, cmd, dat, rst, ds)
  1074. #define msdc_set_rdtdsel(host, sd_18)
  1075. #define msdc_pin_pud(host, pin, mode, val)
  1076. #define msdc_set_smt(host, set_smt)
  1077. #define msdc_set_driving(host, msdc_cap, sd_1)
  1078. #endif
  1079. #if !defined(FPGA_PLATFORM)
  1080. typedef enum MT65XX_POWER_TAG {
  1081. MT6328_POWER_LDO_VAUX18=0,
  1082. MT6328_POWER_LDO_VTCXO_0,
  1083. MT6328_POWER_LDO_VTCXO_1,
  1084. MT6328_POWER_LDO_VAUD28,
  1085. MT6328_POWER_LDO_VCN28,
  1086. MT6328_POWER_LDO_VCAMA,
  1087. MT6328_POWER_LDO_VCN33,
  1088. MT6328_POWER_LDO_VUSB33,
  1089. MT6328_POWER_LDO_VEFUSE,
  1090. MT6328_POWER_LDO_VSIM1,
  1091. MT6328_POWER_LDO_VSIM2,
  1092. MT6328_POWER_LDO_VEMC33,
  1093. MT6328_POWER_LDO_VMCH,
  1094. MT6328_POWER_LDO_VTREF,
  1095. MT6328_POWER_LDO_VMC,
  1096. MT6328_POWER_LDO_VCAM_AF,
  1097. MT6328_POWER_LDO_VIO28,
  1098. MT6328_POWER_LDO_VGP1,
  1099. MT6328_POWER_LDO_VIBR,
  1100. MT6328_POWER_LDO_VCAMD,
  1101. MT6328_POWER_LDO_VRF18_0,
  1102. MT6328_POWER_LDO_VRF18_1,
  1103. MT6328_POWER_LDO_VIO18,
  1104. MT6328_POWER_LDO_VCN18,
  1105. MT6328_POWER_LDO_VCAM_IO,
  1106. MT6328_POWER_LDO_VSRAM,
  1107. MT6328_POWER_LDO_VM,
  1108. MT65XX_POWER_LDO_DEFAULT,
  1109. MT65XX_POWER_COUNT_END,
  1110. MT65XX_POWER_NONE = -1
  1111. } MT65XX_POWER;
  1112. typedef struct pwr_desc {
  1113. u32 pwr_io_id;
  1114. u32 pwr_io_val;
  1115. u32 *pwr_io_status;
  1116. u32 pwr_flash_id;
  1117. u32 pwr_flash_val;
  1118. u32 *pwr_flash_status;
  1119. }pwr_desc_t;
  1120. #endif
  1121. /* each PLL have different gears for select
  1122. * software can used mux interface from clock management module to select */
  1123. enum {
  1124. MSDC50_CLKSRC_26MHZ = 0,
  1125. MSDC50_CLKSRC_800MHZ,
  1126. MSDC50_CLKSRC_400MHZ,
  1127. MSDC50_CLKSRC_200MHZ,
  1128. MSDC50_CLKSRC_182MHZ,
  1129. MSDC50_CLKSRC_136MHZ,
  1130. MSDC50_CLKSRC_156MHZ,
  1131. MSDC50_CLKSRC_416MHZ,
  1132. MSDC50_CLKSRC_48MHZ,
  1133. MSDC50_CLKSRC_91MHZ,
  1134. MSDC50_CLKSRC_624MHZ
  1135. };
  1136. enum {
  1137. MSDC30_CLKSRC_26MHZ = 0,
  1138. MSDC30_CLKSRC_208MHZ,
  1139. MSDC30_CLKSRC_200MHZ,
  1140. MSDC30_CLKSRC_182MHZ,
  1141. MSDC30_CLKSRC_136MHZ,
  1142. MSDC30_CLKSRC_156MHZ,
  1143. MSDC30_CLKSRC_48MHZ,
  1144. MSDC30_CLKSRC_91MHZ
  1145. };
  1146. #define MSDC50_CLKSRC_DEFAULT MSDC50_CLKSRC_400MHZ
  1147. #define MSDC30_CLKSRC_DEFAULT MSDC30_CLKSRC_200MHZ
  1148. #define MSDC_RELIABLE_WRITE (0x1 << 0)
  1149. #define MSDC_PACKED (0x1 << 1)
  1150. #define MSDC_TAG_REQUEST (0x1 << 2)
  1151. #define MSDC_CONTEXT_ID (0x1 << 3)
  1152. #define MSDC_FORCED_PROG (0x1 << 4)
  1153. extern void msdc_dump_card_status(u32 card_status);
  1154. extern void msdc_dump_ocr_reg(u32 resp);
  1155. extern void msdc_dump_rca_resp(u32 resp);
  1156. extern void msdc_set_reliable_write(struct mmc_host *host, int on);
  1157. extern void msdc_set_autocmd23_feature(struct mmc_host *host, int on);
  1158. extern void msdc_set_autocmd(struct mmc_host *host, int cmd, int on);
  1159. extern void msdc_set_pio_bits(struct mmc_host *host, int bits);
  1160. extern void msdc_clr_fifo(struct mmc_host *host);
  1161. extern void msdc_intr_unmask(struct mmc_host *host, u32 bits);
  1162. extern void msdc_intr_mask(struct mmc_host *host, u32 bits);
  1163. extern int msdc_send_cmd(struct mmc_host *host, struct mmc_command *cmd);
  1164. extern int msdc_wait_rsp(struct mmc_host *host, struct mmc_command *cmd);
  1165. extern void msdc_abort(struct mmc_host *host);
  1166. extern void msdc_irq_deinit(struct mmc_host *host);
  1167. extern int msdc_init(int id, struct mmc_host *host, int clksrc, int mode);
  1168. extern int msdc_pio_bread(struct mmc_host *host, uchar *dst, ulong src, ulong nblks);
  1169. extern int msdc_pio_bwrite(struct mmc_host *host, ulong dst, uchar *src, ulong nblks);
  1170. extern int msdc_dma_bread(struct mmc_host *host, uchar *dst, ulong src, ulong nblks);
  1171. extern int msdc_dma_bwrite(struct mmc_host *host, ulong dst, uchar *src, ulong nblks);
  1172. extern int msdc_tune_bwrite(struct mmc_host *host, ulong dst, uchar *src, ulong nblks);
  1173. extern int msdc_tune_bread(struct mmc_host *host, uchar *dst, ulong src, ulong nblks);
  1174. extern int msdc_tune_cmdrsp(struct mmc_host *host, struct mmc_command *cmd);
  1175. extern void msdc_reset_tune_counter(struct mmc_host *host);
  1176. extern int msdc_abort_handler(struct mmc_host *host, int abort_card);
  1177. extern int msdc_tune_read(struct mmc_host *host);
  1178. extern void msdc_intr_sdio(struct mmc_host *host, int enable);
  1179. extern void msdc_intr_sdio_gap(struct mmc_host * host, int enable);
  1180. extern void msdc_config_clock(struct mmc_host *host, int ddr, u32 hz, u32 hs_timing);
  1181. extern int msdc_cmd_stop(struct mmc_host *host, struct mmc_command *cmd);
  1182. extern int msdc_pio_send_sandisk_fwid(struct mmc_host *host,uchar *src);
  1183. extern int msdc_pio_get_sandisk_fwid(struct mmc_host * host,uchar * src);
  1184. extern int msdc_dma_send_sandisk_fwid(struct mmc_host *host, uchar *buf,u32 opcode, ulong nblks);
  1185. extern void msdc_set_startbit(struct mmc_host *host, u8 start_bit);
  1186. extern void msdc_set_axi_burst_len(struct mmc_host *host, u8 len);
  1187. extern void msdc_set_axi_outstanding(struct mmc_host *host, u8 rw, u8 num);
  1188. extern void msdc_set_blklen(struct mmc_host *host, u32 blklen);
  1189. extern void msdc_set_timeout(struct mmc_host *host, u64 ns, u32 clks);
  1190. extern int msdc_pio_read(struct mmc_host *host, u32 *ptr, u32 size);
  1191. extern int msdc_tune_rw_hs400(struct mmc_host *host, uchar *dst, ulong src, ulong nblks, unsigned int rw);
  1192. extern int msdc_cmd(struct mmc_host *host, struct mmc_command *cmd);
  1193. extern void msdc_set_blknum(struct mmc_host *host, u32 blknum);
  1194. extern void msdc_config_bus(struct mmc_host *host, u32 width);
  1195. #if defined(MMC_MSDC_DRV_CTP) || defined(MMC_MSDC_DRV_LK)
  1196. extern void msdc_hard_reset(struct mmc_host *host);
  1197. #endif
  1198. #if defined(MMC_MSDC_DRV_CTP)
  1199. extern int msdc_register_partial_backup_and_reset(struct mmc_host* host);
  1200. extern int msdc_register_partial_restore(struct mmc_host* host);
  1201. #endif
  1202. #endif /* end of _MSDC_H_ */