msdc.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2015. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #ifndef _MSDC_H_
  32. #define _MSDC_H_
  33. #include "cust_msdc.h"
  34. #include "msdc_cfg.h"
  35. #include "msdc_utils.h"
  36. #include "mmc_core.h"
  37. #include "msdc_irq.h"
  38. #include "mmc_test.h"
  39. #if defined(MMC_MSDC_DRV_PRELOADER)
  40. #include "platform.h"
  41. #include "pll.h"
  42. #include "sync_write.h"
  43. #endif
  44. #if defined(MMC_MSDC_DRV_LK)
  45. #include "sync_write.h"
  46. #include "mt_reg_base.h"
  47. #endif
  48. #if defined(MMC_MSDC_DRV_CTP)
  49. #include "reg_base.H"
  50. #include "intrCtrl.h"
  51. #endif
  52. #include "msdc_dma.h"
  53. #if defined(FEATURE_MMC_SW_CMDQ)
  54. #include "mmc_cmdq.h"
  55. #endif
  56. //#define MTK_MSDC_DUMP_FIFO
  57. /*--------------------------------------------------------------------------*/
  58. /* Common Definition */
  59. /*--------------------------------------------------------------------------*/
  60. #define MSDC_FIFO_SZ (128)
  61. #define MSDC_FIFO_THD (64)
  62. #define MSDC_MS (0)
  63. #define MSDC_SDMMC (1)
  64. #define MSDC_MODE_UNKNOWN (0)
  65. #define MSDC_MODE_PIO (1)
  66. #define MSDC_MODE_DMA_BASIC (2)
  67. #define MSDC_MODE_DMA_DESC (3)
  68. #define MSDC_MODE_DMA_ENHANCED (4)
  69. #if defined(MSDC_MODE_DEFAULT_PIO)
  70. #define MSDC_MODE_DEFAULT MSDC_MODE_PIO
  71. #elif defined(MSDC_MODE_DEFAULT_DMA_BASIC)
  72. #define MSDC_MODE_DEFAULT MSDC_MODE_DMA_BASIC
  73. #elif defined(MSDC_MODE_DEFAULT_DMA_DESC)
  74. #define MSDC_MODE_DEFAULT MSDC_MODE_DMA_DESC
  75. #elif defined(MSDC_MODE_DEFAULT_DMA_ENHANCED)
  76. #define MSDC_MODE_DEFAULT MSDC_MODE_DMA_ENHANCED
  77. #else
  78. #define MSDC_MODE_DEFAULT MSDC_MODE_UNKNOWN
  79. #endif
  80. #define MSDC_BUS_1BITS (0)
  81. #define MSDC_BUS_4BITS (1)
  82. #define MSDC_BUS_8BITS (2)
  83. #define MSDC_BRUST_8B (3)
  84. #define MSDC_BRUST_16B (4)
  85. #define MSDC_BRUST_32B (5)
  86. #define MSDC_BRUST_64B (6)
  87. #define MSDC_AUTOCMD12 (0x0001)
  88. #define MSDC_AUTOCMD23 (0x0002)
  89. #define MSDC_AUTOCMD19 (0x0003)
  90. #define MSDC_PATH_USE_DELAY_LINE (0)
  91. #define MSDC_PATH_USE_ASYNC_FIFO (1)
  92. #define TYPE_CMD_RESP_EDGE (0)
  93. #define TYPE_WRITE_CRC_EDGE (1)
  94. #define TYPE_READ_DATA_EDGE (2)
  95. #define TYPE_WRITE_DATA_EDGE (3)
  96. #define START_AT_RISING (0x0)
  97. #define START_AT_FALLING (0x1)
  98. #define START_AT_RISING_AND_FALLING (0x2)
  99. #define START_AT_RISING_OR_FALLING (0x3)
  100. /* Tuning Parameter */
  101. #define DEFAULT_DEBOUNCE (8) /* 8 cycles */
  102. #define DEFAULT_DTOC (40) /* data timeout counter. 65536x40 sclk. */
  103. #define DEFAULT_WDOD (0) /* write data output delay. no delay. */
  104. #define DEFAULT_BSYDLY (8) /* card busy delay. 8 extend sclk */
  105. /* Timeout Parameter */
  106. #define TMO_IN_CLK_2POWER 20 /* 2^20=1048576 */
  107. #define EMMC_BOOT_TMO_IN_CLK_2POWER 16 /* 2^16=65536 */
  108. #include "msdc_reg.h"
  109. #include "msdc_io.h"
  110. typedef struct {
  111. int pio_bits; /* PIO width: 32, 16, or 8bits */
  112. int autocmd;
  113. int cmd23_flags;
  114. struct dma_config cfg;
  115. struct scatterlist sg[MAX_SG_POOL_SZ];
  116. int alloc_gpd;
  117. int alloc_bd;
  118. int rdsmpl;
  119. int wdsmpl;
  120. int rsmpl;
  121. int start_bit;
  122. int tuning_mode;
  123. gpd_t *active_head;
  124. gpd_t *active_tail;
  125. gpd_t *gpd_pool;
  126. bd_t *bd_pool;
  127. } msdc_priv_t;
  128. #define DMA_FLAG_NONE (0x00000000)
  129. #define DMA_FLAG_EN_CHKSUM (0x00000001)
  130. #define DMA_FLAG_PAD_BLOCK (0x00000002)
  131. #define DMA_FLAG_PAD_DWORD (0x00000004)
  132. #define MSDC_WRITE32(addr, data) (*(volatile uint32*)(addr) = (uint32)(data))
  133. #define MSDC_READ32(addr) (*(volatile uint32*)(addr))
  134. #define MSDC_WRITE16(addr, data) (*(volatile uint16*)(addr) = (uint16)(data))
  135. #define MSDC_READ16(addr) (*(volatile uint16*)(addr))
  136. #define MSDC_WRITE8(addr, data) (*(volatile uint8*)(addr) = (uint8)(data))
  137. #define MSDC_READ8(addr) (*(volatile uint8*)(addr))
  138. #define MSDC_SET_BIT32(addr, mask) \
  139. do { \
  140. unsigned int tv = MSDC_READ32(addr); \
  141. tv |=((u32)(mask)); \
  142. MSDC_WRITE32(addr, tv); \
  143. } while(0)
  144. #define MSDC_CLR_BIT32(addr, mask) \
  145. do { \
  146. unsigned int tv = MSDC_READ32(addr); \
  147. tv &= ~((u32)(mask)); \
  148. MSDC_WRITE32(addr, tv); \
  149. } while(0)
  150. #define MSDC_SET_BIT16(addr, mask) \
  151. do { \
  152. unsigned short tv = MSDC_READ16(addr); \
  153. tv |= ((u16)(mask)); \
  154. MSDC_WRITE16(addr, tv); \
  155. } while(0)
  156. #define MSDC_CLR_BIT16(addr, mask) \
  157. do { \
  158. unsigned short tv = MSDC_READ16(addr); \
  159. tv &= ~((u16)(mask)); \
  160. MSDC_WRITE16(addr, tv); \
  161. } while(0)
  162. #define MSDC_SET_FIELD(reg, field, val) \
  163. do { \
  164. volatile uint32 tv = MSDC_READ32(reg); \
  165. tv &= ~(field); \
  166. tv |= ((val) << (uffs(field) - 1)); \
  167. MSDC_WRITE32(reg, tv); \
  168. } while(0)
  169. #define MSDC_GET_FIELD(reg, field, val) \
  170. do { \
  171. volatile uint32 tv = MSDC_READ32(reg); \
  172. val = ((tv & (field)) >> (uffs(field) - 1)); \
  173. } while(0)
  174. #define MSDC_SET_FIELD_16(reg, field, val) \
  175. do { \
  176. volatile uint16 tv = MSDC_READ16(reg); \
  177. tv &= ~(field); \
  178. tv |= ((val) << (uffs(field) - 1)); \
  179. MSDC_WRITE16(reg, tv); \
  180. } while(0)
  181. #define MSDC_GET_FIELD_16(reg, field, val) \
  182. do { \
  183. volatile uint16 tv = MSDC_READ16(reg); \
  184. val = ((tv & (field)) >> (uffs(field) - 1)); \
  185. } while(0)
  186. #define MSDC_RETRY(expr, retry, cnt) \
  187. do { \
  188. uint32 t = cnt; \
  189. uint32 r = retry; \
  190. uint32 c = cnt; \
  191. while (r) { \
  192. if (!(expr)) break; \
  193. if (c-- == 0) { \
  194. r--; udelay(200); c = t; \
  195. } \
  196. } \
  197. BUG_ON(r == 0); \
  198. } while(0)
  199. /*sd card change voltage wait time= (1/freq) * SDC_VOL_CHG_CNT(default 0x145)*/
  200. #define msdc_set_vol_change_wait_count(count) \
  201. do { \
  202. MSDC_SET_FIELD(SDC_VOL_CHG,SDC_VOL_CHG_CNT, (count)); \
  203. } while(0)
  204. #define MSDC_RESET() \
  205. do { \
  206. MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_RST); \
  207. MSDC_RETRY(MSDC_READ32(MSDC_CFG) & MSDC_CFG_RST, 5, 1000); \
  208. } while(0)
  209. #define MSDC_CLR_INT() \
  210. do { \
  211. volatile uint32 val = MSDC_READ32(MSDC_INT); \
  212. MSDC_WRITE32(MSDC_INT, val); \
  213. if (MSDC_READ32(MSDC_INT)) { \
  214. MSG(ERR, "[ASSERT] MSDC_INT is NOT clear\n"); \
  215. } \
  216. } while(0)
  217. #define MSDC_CLR_FIFO() \
  218. do { \
  219. MSDC_SET_BIT32(MSDC_FIFOCS, MSDC_FIFOCS_CLR); \
  220. MSDC_RETRY(MSDC_READ32(MSDC_FIFOCS) & MSDC_FIFOCS_CLR, 5, 1000); \
  221. } while(0)
  222. #define MSDC_FIFO_WRITE32(val) MSDC_WRITE32(MSDC_TXDATA, val)
  223. #define MSDC_FIFO_READ32() MSDC_READ32(MSDC_RXDATA)
  224. #define MSDC_FIFO_WRITE16(val) MSDC_WRITE16(MSDC_TXDATA, val)
  225. #define MSDC_FIFO_READ16() MSDC_READ16(MSDC_RXDATA)
  226. #define MSDC_FIFO_WRITE8(val) MSDC_WRITE8(MSDC_TXDATA, val)
  227. #define MSDC_FIFO_READ8() MSDC_READ8(MSDC_RXDATA)
  228. #define MSDC_FIFO_WRITE(val) MSDC_FIFO_WRITE32(val)
  229. #define MSDC_FIFO_READ() MSDC_FIFO_READ32()
  230. #define MSDC_TXFIFOCNT() \
  231. ((MSDC_READ32(MSDC_FIFOCS) & MSDC_FIFOCS_TXCNT) >> 16)
  232. #define MSDC_RXFIFOCNT() \
  233. ((MSDC_READ32(MSDC_FIFOCS) & MSDC_FIFOCS_RXCNT) >> 0)
  234. #define MSDC_CARD_DETECTION_ON() MSDC_SET_BIT32(MSDC_PS, MSDC_PS_CDEN)
  235. #define MSDC_CARD_DETECTION_OFF() MSDC_CLR_BIT32(MSDC_PS, MSDC_PS_CDEN)
  236. #define MSDC_DMA_ON() MSDC_CLR_BIT32(MSDC_CFG, MSDC_CFG_PIO)
  237. #define MSDC_DMA_OFF() MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_PIO)
  238. #define SDC_IS_BUSY() (MSDC_READ32(SDC_STS) & SDC_STS_SDCBUSY)
  239. #define SDC_IS_CMD_BUSY() (MSDC_READ32(SDC_STS) & SDC_STS_CMDBUSY)
  240. #define SDC_SEND_CMD(cmd,arg) \
  241. do { \
  242. MSDC_WRITE32(SDC_ARG, (arg)); \
  243. MSDC_WRITE32(SDC_CMD, (cmd)); \
  244. } while(0)
  245. #define MSDC_INIT_GPD_EX(gpd,extlen,cmd,arg,blknum) \
  246. do { \
  247. ((gpd_t*)gpd)->extlen = extlen; \
  248. ((gpd_t*)gpd)->cmd = cmd; \
  249. ((gpd_t*)gpd)->arg = arg; \
  250. ((gpd_t*)gpd)->blknum = blknum; \
  251. }while(0)
  252. #define MSDC_INIT_BD(bd, blkpad, dwpad, dptr, dlen) \
  253. do { \
  254. BUG_ON(dlen > 0xFFFFFFUL); \
  255. ((bd_t*)bd)->blkpad = blkpad; \
  256. ((bd_t*)bd)->dwpad = dwpad; \
  257. ((bd_t*)bd)->ptr = (void*)dptr; \
  258. ((bd_t*)bd)->buflen = dlen; \
  259. }while(0)
  260. typedef struct msdc_reg_control {
  261. u32 addr;
  262. u32 mask;
  263. u32 value;
  264. u32 default_value;
  265. int (*restore_func)(int restore);
  266. } MSDC_REG_CONTROL_T;
  267. #ifdef MMC_PROFILING
  268. static inline void msdc_timer_init(void)
  269. {
  270. /* clear. CLR[1]=1, EN[0]=0 */
  271. MSDC_WRITE32(GPT_BASE + 0x30, 0x0);
  272. MSDC_WRITE32(GPT_BASE + 0x30, 0x2);
  273. MSDC_WRITE32(GPT_BASE + 0x38, 0);
  274. MSDC_WRITE32(GPT_BASE + 0x3C, 32768);
  275. /* 32678HZ RTC free run */
  276. MSDC_WRITE32(GPT_BASE + 0x34, 0x30);
  277. MSDC_WRITE32(GPT_BASE + 0x30, 0x32);
  278. }
  279. static inline void msdc_timer_start(void)
  280. {
  281. *(volatile unsigned int*)(GPT_BASE + 0x30) |= (1 << 0);
  282. }
  283. static inline void msdc_timer_stop(void)
  284. {
  285. *(volatile unsigned int*)(GPT_BASE + 0x30) &= ~(1 << 0);
  286. }
  287. static inline void msdc_timer_stop_clear(void)
  288. {
  289. *(volatile unsigned int*)(GPT_BASE + 0x30) &= ~(1 << 0); /* stop */
  290. *(volatile unsigned int*)(GPT_BASE + 0x30) |= (1 << 1); /* clear */
  291. }
  292. static inline unsigned int msdc_timer_get_count(void)
  293. {
  294. return MSDC_READ32(GPT_BASE + 0x38);
  295. }
  296. #else
  297. #define msdc_timer_init() do{}while(0)
  298. #define msdc_timer_start() do{}while(0)
  299. #define msdc_timer_stop() do{}while(0)
  300. #define msdc_timer_stop_clear() do{}while(0)
  301. #define msdc_timer_get_count() 0
  302. #endif
  303. #define MSDC_RELIABLE_WRITE (0x1 << 0)
  304. #define MSDC_PACKED (0x1 << 1)
  305. #define MSDC_TAG_REQUEST (0x1 << 2)
  306. #define MSDC_CONTEXT_ID (0x1 << 3)
  307. #define MSDC_FORCED_PROG (0x1 << 4)
  308. extern void msdc_dump_card_status(u32 card_status);
  309. extern void msdc_dump_ocr_reg(u32 resp);
  310. extern void msdc_dump_rca_resp(u32 resp);
  311. extern void msdc_set_reliable_write(struct mmc_host *host, int on);
  312. extern void msdc_set_autocmd23_feature(struct mmc_host *host, int on);
  313. extern void msdc_set_autocmd(struct mmc_host *host, int cmd, int on);
  314. extern void msdc_set_pio_bits(struct mmc_host *host, int bits);
  315. extern void msdc_clr_fifo(struct mmc_host *host);
  316. extern void msdc_intr_unmask(struct mmc_host *host, u32 bits);
  317. extern void msdc_intr_mask(struct mmc_host *host, u32 bits);
  318. extern int msdc_send_cmd(struct mmc_host *host, struct mmc_command *cmd);
  319. extern int msdc_wait_rsp(struct mmc_host *host, struct mmc_command *cmd);
  320. extern void msdc_abort(struct mmc_host *host);
  321. extern void msdc_irq_deinit(struct mmc_host *host);
  322. extern int msdc_init(int id, struct mmc_host *host, int clksrc, int mode);
  323. extern int msdc_pio_bread(struct mmc_host *host, uchar *dst, ulong src, ulong nblks);
  324. extern int msdc_pio_bwrite(struct mmc_host *host, ulong dst, uchar *src, ulong nblks);
  325. extern int msdc_dma_bread(struct mmc_host *host, uchar *dst, ulong src, ulong nblks);
  326. extern int msdc_dma_bwrite(struct mmc_host *host, ulong dst, uchar *src, ulong nblks);
  327. extern int msdc_tune_bwrite(struct mmc_host *host, ulong dst, uchar *src, ulong nblks);
  328. extern int msdc_tune_bread(struct mmc_host *host, uchar *dst, ulong src, ulong nblks);
  329. extern int msdc_tune_cmdrsp(struct mmc_host *host, struct mmc_command *cmd);
  330. extern void msdc_reset_tune_counter(struct mmc_host *host);
  331. extern int msdc_abort_handler(struct mmc_host *host, int abort_card);
  332. extern int msdc_tune_read(struct mmc_host *host);
  333. extern void msdc_intr_sdio(struct mmc_host *host, int enable);
  334. extern void msdc_intr_sdio_gap(struct mmc_host * host, int enable);
  335. extern void msdc_config_clock(struct mmc_host *host, int ddr, u32 hz, u32 hs_timing);
  336. extern int msdc_cmd_stop(struct mmc_host *host, struct mmc_command *cmd);
  337. extern int msdc_pio_send_sandisk_fwid(struct mmc_host *host,uchar *src);
  338. extern int msdc_pio_get_sandisk_fwid(struct mmc_host * host,uchar * src);
  339. extern int msdc_dma_send_sandisk_fwid(struct mmc_host *host, uchar *buf,u32 opcode, ulong nblks);
  340. extern void msdc_set_startbit(struct mmc_host *host, u8 start_bit);
  341. extern void msdc_set_axi_burst_len(struct mmc_host *host, u8 len);
  342. extern void msdc_set_axi_outstanding(struct mmc_host *host, u8 rw, u8 num);
  343. extern void msdc_enable_dcm(struct mmc_host *host, int on, u8 div1, u8 div2);
  344. extern void msdc_set_blklen(struct mmc_host *host, u32 blklen);
  345. extern void msdc_set_timeout(struct mmc_host *host, u64 ns, u32 clks);
  346. extern int msdc_pio_read(struct mmc_host *host, u32 *ptr, u32 size);
  347. extern void msdc_set_dmode(struct mmc_host *host, int mode);
  348. extern int msdc_tune_rw_hs400(struct mmc_host *host, uchar *dst, ulong src, ulong nblks, unsigned int rw);
  349. extern int msdc_cmd(struct mmc_host *host, struct mmc_command *cmd);
  350. extern void msdc_set_blknum(struct mmc_host *host, u32 blknum);
  351. extern void msdc_config_bus(struct mmc_host *host, u32 width);
  352. extern int msdc_get_dmode(struct mmc_host *host);
  353. extern int msdc_get_wp_err(struct mmc_host *host);
  354. extern void msdc_dump_register(struct mmc_host *host);
  355. extern void msdc_emmc_hard_reset(struct mmc_host *host);
  356. #if defined(MMC_MSDC_DRV_CTP) || defined(MMC_MSDC_DRV_LK)
  357. extern void msdc_hard_reset(struct mmc_host *host);
  358. #endif
  359. #if defined(MMC_MSDC_DRV_CTP)
  360. extern int msdc_register_partial_backup_and_reset(struct mmc_host* host);
  361. extern int msdc_register_partial_restore(struct mmc_host* host);
  362. #endif
  363. #endif /* end of _MSDC_H_ */