mt_dump.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. #ifndef __EMMC_INIT__
  2. #define __EMMC_INIT__
  3. #include <linux/mmc/card.h>
  4. #include <linux/mm_types.h>
  5. #include <mt-plat/sd_misc.h>
  6. #define MTK_MMC_DUMP_DBG (0)
  7. #define MAX_POLLING_STATUS (50000)
  8. struct simp_mmc_card;
  9. struct simp_msdc_host;
  10. #define MSDC_PS_DAT0 (0x1 << 16) /* R */
  11. struct simp_mmc_host {
  12. int index;
  13. unsigned int f_min;
  14. unsigned int f_max;
  15. unsigned int f_init;
  16. u32 ocr_avail;
  17. u32 ocr_avail_sdio; /* SDIO-specific OCR */
  18. u32 ocr_avail_sd; /* SD-specific OCR */
  19. u32 ocr_avail_mmc; /* MMC-specific OCR */
  20. unsigned long caps; /* Host capabilities */
  21. unsigned int caps2; /* More host capabilities */
  22. /* host specific block data */
  23. unsigned int max_seg_size; /* see blk_queue_max_segment_size */
  24. unsigned short max_segs; /* see blk_queue_max_segments */
  25. unsigned short unused;
  26. unsigned int max_req_size; /* maximum number of bytes in one req */
  27. unsigned int max_blk_size; /* maximum size of one mmc block */
  28. unsigned int max_blk_count; /* maximum number of blocks in one req */
  29. unsigned int max_discard_to; /* max. discard timeout in ms */
  30. u32 ocr; /* the current OCR setting */
  31. struct simp_mmc_card *card; /* device attached to this host */
  32. unsigned int actual_clock; /* Actual HC clock rate */
  33. /* add msdc struct */
  34. struct simp_msdc_host *mtk_host;
  35. };
  36. struct simp_mmc_card {
  37. struct simp_mmc_host *host; /* the host this device belongs to */
  38. unsigned int rca; /* relative card address of device */
  39. unsigned int type; /* card type */
  40. unsigned int state; /* (our) card state */
  41. unsigned int quirks; /* card quirks */
  42. unsigned int erase_size; /* erase size in sectors */
  43. unsigned int erase_shift; /* if erase unit is power 2 */
  44. unsigned int pref_erase; /* in sectors */
  45. u8 erased_byte; /* value of erased bytes */
  46. u32 raw_cid[4]; /* raw card CID */
  47. u32 raw_csd[4]; /* raw card CSD */
  48. u32 raw_scr[2]; /* raw card SCR */
  49. struct mmc_cid cid; /* card identification */
  50. struct mmc_csd csd; /* card specific */
  51. struct mmc_ext_csd ext_csd; /* mmc v4 extended card specific */
  52. struct sd_scr scr; /* extra SD information */
  53. struct sd_ssr ssr; /* yet more SD information */
  54. struct sd_switch_caps sw_caps; /* switch (CMD6) caps */
  55. unsigned int sd_bus_speed; /* Bus Speed Mode set for the card */
  56. };
  57. struct simp_msdc_card {
  58. unsigned int rca; /* relative card address of device */
  59. unsigned int type; /* card type */
  60. unsigned short state; /* (our) card state */
  61. unsigned short file_system; /* FAT16/FAT32 */
  62. unsigned short card_cap; /* High Capcity/standard */
  63. };
  64. struct simp_msdc_host {
  65. struct simp_msdc_card *card;
  66. void __iomem *base; /* host base address */
  67. unsigned char id; /* host id number */
  68. unsigned int clk; /* host clock speed *//* clock value from clock source */
  69. unsigned int sclk; /* SD/MS clock speed *//* working clock */
  70. unsigned char clksrc; /* clock source */
  71. void *priv; /* private data */
  72. };
  73. typedef enum {
  74. MSDC_CLKSRC_200M = 0
  75. } CLK_SOURCE_T;
  76. enum {
  77. FAT16 = 0,
  78. FAT32 = 1,
  79. exFAT = 2,
  80. _RAW_ = 3,
  81. };
  82. enum {
  83. standard_capacity = 0,
  84. high_capacity = 1,
  85. extended_capacity = 2,
  86. };
  87. /* command define */
  88. #define CMD0 (0) /* GO_IDLE_STATE */
  89. #define CMD1 (1) /* mmc: SEND_OP_COND */
  90. #define CMD2 (2) /* mmc: ALL_SEND_CID */
  91. #define CMD3 (3) /* mmc: SET_RELATIVE_ADDR */
  92. #define CMD7 (7) /* mmc: SELECT/DESELECT_CARD */
  93. #define CMD8 (8) /* SEND_IF_COND */
  94. #define CMD9 (9) /* mmc: SEND_CSD */
  95. #define CMD10 (10) /* mmc: SEND_CID */
  96. #define CMD55 (55) /* APP_CMD */
  97. #define ACMD41 (41) /* SD_SEND_OP_COND */
  98. #define CMD13 (13) /* SEND_STATUS */
  99. #define ACMD42 (42) /* SET_CLR_CARD_DETECT */
  100. #define ACMD6 (6) /* SET_BUS_WIDTH */
  101. /* #define CMD16 (16) */ /* don't need CMD16 [Fix me] how to confirm block_len is 512 bytes */
  102. #define CMD17 (17)
  103. #define CMD18 (18)
  104. #define CMD24 (24)
  105. #define CMD25 (25)
  106. #define CMD12 (12)
  107. /* command argument */
  108. #define CMD0_ARG (0)
  109. #define CMD8_ARG_VOL_27_36 (0x100)
  110. #define CMD8_ARG_PATTERN (0x5a) /* or 0xAA */
  111. #define CMD8_ARG (CMD8_ARG_VOL_27_36 | CMD8_ARG_PATTERN)
  112. #define CMD55_ARG (phost->card->rca)
  113. #define ACMD41_ARG_HCS (1 << 30)
  114. #define ACMD41_ARG_VOL_27_36 (0xff8000)
  115. #define ACMD41_ARG_20 (ACMD41_ARG_VOL_27_36 | ACMD41_ARG_HCS)
  116. #define ACMD41_ARG_10 (ACMD41_ARG_VOL_27_36)
  117. #define CMD2_ARG (0)
  118. #define CMD3_ARG (0)
  119. #define CMD9_ARG (phost->card->rca)
  120. #define CMD10_ARG (phost->card->rca)
  121. #define CMD13_ARG (phost->card->rca)
  122. #define CMD7_ARG (phost->card->rca)
  123. #define ACMD42_ARG_CLR_CD (0)
  124. #define ACMD42_ARG_SET_CD (1)
  125. #define ACMD42_ARG (ACMD42_ARG_CLR_CD)
  126. #define ACMD6_ARG_BUS_WIDTH_4 (0x2)
  127. #define ACMD6_ARG (ACMD6_ARG_BUS_WIDTH_4)
  128. #define EXT_CSD_CMD_SET_NORMAL (1<<0)
  129. /* #define MMC_SWITCH_MODE_WRITE_BYTE (0x03) */
  130. /* #define EXT_CSD_BUS_WIDTH (183) */
  131. /* #define EXT_CSD_BUS_WIDTH_4 (1) */
  132. #define ACMD6_ARG_EMMC ((0x03 << 24) | (183 << 16) | (1 << 8) | (1<<0))
  133. #ifdef MTK_MSDC_USE_CACHE
  134. #define ACMD6_ARG_DISABLE_CACHE ((0x03 << 24) | (33 << 16) | (0 << 8) | (1<<0))
  135. #endif
  136. #define CMD17_ARG (data_address) /* in bytes units in a SDSC */
  137. #define CMD18_ARG (data_address) /* in block units in a SDHC (512 bytes) */
  138. #define CMD24_ARG (data_address)
  139. #define CMD25_ARG (data_address)
  140. #define CMD12_ARG (0)
  141. #define CMD8_RAW_EMMC CMD_RAW(8 , msdc_rsp[RESP_R1] , 1, 0, 512, 0) /* 0x88 -> R1 */
  142. #define CMD_RAW(cmd, rspt, dtyp, rw, len, stop) \
  143. ((cmd) | (rspt << 7) | (dtyp << 11) | (rw << 13) | (len << 16) | (stop << 14))
  144. /* compare the value with mt6573 [Fix me]*/
  145. #define CMD0_RAW CMD_RAW(0 , msdc_rsp[RESP_NONE], 0, 0, 0, 0)
  146. #define CMD1_RAW CMD_RAW(1 , msdc_rsp[RESP_R3], 0, 0, 0, 0)
  147. #define CMD2_RAW CMD_RAW(2 , msdc_rsp[RESP_R2], 0, 0, 0, 0)
  148. #define CMD3_RAW CMD_RAW(3 , msdc_rsp[RESP_R1], 0, 0, 0, 0)
  149. #define CMD7_RAW CMD_RAW(7 , msdc_rsp[RESP_R1], 0, 0, 0, 0)
  150. #define CMD8_RAW CMD_RAW(8 , msdc_rsp[RESP_R7] , 0, 0, 0, 0) /* 0x88 -> R1 */
  151. #define CMD9_RAW CMD_RAW(9 , msdc_rsp[RESP_R2] , 0, 0, 0, 0)
  152. #define CMD10_RAW CMD_RAW(10, msdc_rsp[RESP_R2] , 0, 0, 0, 0)
  153. #define CMD55_RAW CMD_RAW(55, msdc_rsp[RESP_R1] , 0, 0, 0, 0) /* R1 not R3! */
  154. #define ACMD41_RAW CMD_RAW(41, msdc_rsp[RESP_R3] , 0, 0, 0, 0)
  155. #define CMD13_RAW CMD_RAW(13, msdc_rsp[RESP_R1] , 0, 0, 0, 0)
  156. #define ACMD42_RAW CMD_RAW(42, msdc_rsp[RESP_R1] , 0, 0, 0, 0)
  157. #define ACMD6_RAW CMD_RAW(6 , msdc_rsp[RESP_R1] , 0, 0, 0, 0)
  158. #define ACMD6_RAW_EMMC CMD_RAW(6 , msdc_rsp[RESP_R1B] , 0, 0, 0, 0)
  159. /* block size always 512 [Fix me] */
  160. #define CMD17_RAW CMD_RAW(17, msdc_rsp[RESP_R1] , 1, 0, 512, 0) /* single + read + */
  161. #define CMD18_RAW CMD_RAW(18, msdc_rsp[RESP_R1] , 2, 0, 512, 0) /* multiple + read + */
  162. #define CMD24_RAW CMD_RAW(24, msdc_rsp[RESP_R1] , 1, 1, 512, 0) /* single + write + */
  163. #define CMD25_RAW CMD_RAW(25, msdc_rsp[RESP_R1] , 2, 1, 512, 0) /* multiple + write + */
  164. #define CMD12_RAW CMD_RAW(12, msdc_rsp[RESP_R1B] , 0, 0, 0, 1)
  165. /* command response */
  166. #define R3_OCR_POWER_UP_BIT (1 << 31)
  167. #define R3_OCR_CARD_CAPACITY_BIT (1 << 30)
  168. #define REG_VEMC33_VOLSEL (0x0A64)
  169. #define REG_VEMC33_EN (0x0A24)
  170. #define REG_VMC_VOLSEL (0x0A6A)
  171. #define REG_VMC_EN (0x0A20)
  172. #define REG_VMCH_VOLSEL (0x0A66)
  173. #define REG_VMCH_EN (0x0A1C)
  174. #define MASK_VEMC33_VOLSEL (0x3 << 4)
  175. #define MASK_VEMC33_EN (0x1 << 1)
  176. #define MASK_VMC_VOLSEL (0x3 << 4)
  177. #define MASK_VMC_EN (0x1 << 1)
  178. #define MASK_VMCH_VOLSEL (0x3 << 4)
  179. #define MASK_VMCH_EN (0x1 << 1)
  180. #define VEMC33_VOLSEL_3V3 (1)
  181. #define VMC_VOLSEL_1V8 (0)
  182. #define VMC_VOLSEL_3V3 (3)
  183. #define VMCH_VOLSEL_3V3 (2)
  184. extern void __iomem *gpio_reg_base;
  185. extern void __iomem *infracfg_ao_reg_base;
  186. extern void __iomem *infracfg_reg_base;
  187. extern void __iomem *pericfg_reg_base;
  188. extern void __iomem *emi_reg_base;
  189. extern void __iomem *toprgu_reg_base;
  190. extern void __iomem *apmixed_reg_base1;
  191. extern void __iomem *topckgen_reg_base;
  192. extern unsigned int sd_debug_zone[HOST_MAX_NUM];
  193. extern int simple_sd_ioctl_rw(struct msdc_ioctl *msdc_ctl);
  194. #ifdef FPGA_PLATFORM
  195. extern bool hwPowerOn_fpga(void);
  196. extern bool hwPowerSwitch_fpga(void);
  197. extern bool hwPowerDown_fpga(void);
  198. #else
  199. extern s32 pwrap_read_nochk(u32 adr, u32 *rdata);
  200. extern s32 pwrap_write_nochk(u32 adr, u32 wdata);
  201. #define msdc_power_set_field(reg, field, val) \
  202. do { \
  203. unsigned int tv; \
  204. pwrap_read_nochk(reg, &tv); \
  205. tv &= ~(field); \
  206. tv |= ((val) << (uffs((unsigned int)field) - 1)); \
  207. pwrap_write_nochk(reg, tv); \
  208. } while (0)
  209. #define msdc_power_get_field(reg, field, val) \
  210. do { \
  211. unsigned int tv; \
  212. pwrap_read_nochk(reg, &tv); \
  213. val = ((tv & (field)) >> (uffs((unsigned int)field) - 1)); \
  214. } while (0)
  215. #if 0
  216. static unsigned int simp_msdc_ldo_power(unsigned int on, MT65XX_POWER powerId,
  217. int voltage_uv)
  218. {
  219. /* Fixme: must realize access register directly */
  220. if (on)
  221. hwPowerOn(powerId, voltage_uv, "msdc");
  222. else
  223. hwPowerDown(powerId, "msdc");
  224. return SIMP_SUCCESS;
  225. }
  226. #endif
  227. #endif
  228. #endif /* end of __EMMC_INIT__ */