drv_mmc.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. #ifndef DRV_MMC_H__
  2. #define DRV_MMC_H__
  3. #include <stdint.h>
  4. /* MSC configure */
  5. #define MMC_MSC_INTERRUPT_ENABLE 1 /* 0: disable, 1: enable. */
  6. //--------------------------------------------------------------------------
  7. // MSC Registers Offset Definition
  8. //--------------------------------------------------------------------------
  9. #define MSC_CTRL_OFFSET ( 0x00 ) // W, 16, 0x000, MSC Control register
  10. #define MSC_STAT_OFFSET ( 0x04 ) // R, 32, 0x00000040, MSC Status register
  11. #define MSC_CLKRT_OFFSET ( 0x08 ) // RW, 16, 0x0000, MSC Clock Rate register
  12. #define MSC_CMDAT_OFFSET ( 0x0C ) // RW, 32, 0x00000000, MSC Command and Data Control register
  13. #define MSC_RESTO_OFFSET ( 0x10 ) // RW, 16, 0x0040, MSC Response Time Out register
  14. #define MSC_RDTO_OFFSET ( 0x14 ) // RW, 16, 0xFFFF, MSC Read Time Out register
  15. #define MSC_BLKLEN_OFFSET ( 0x18 ) // RW, 16, 0x0000, MSC Block Length register
  16. #define MSC_NOB_OFFSET ( 0x1C ) // RW, 16, 0x0000, MSC Number of Block register
  17. #define MSC_SNOB_OFFSET ( 0x20 ) // R, 16, 0x????, MSC Number of Successfully-transferred Blocks register
  18. #define MSC_IMASK_OFFSET ( 0x24 ) // RW, 32, 0x000000FF, MSC Interrupt Mask register
  19. #define MSC_IREG_OFFSET ( 0x28 ) // RW, 16, 0x2000, MSC Interrupt register
  20. #define MSC_CMD_OFFSET ( 0x2C ) // RW, 8, 0x00, MSC Command Index register
  21. #define MSC_ARG_OFFSET ( 0x30 ) // RW, 32, 0x00000000, MSC Command Argument register
  22. #define MSC_RES_OFFSET ( 0x34 ) // R, 16, 0x????, MSC Response FIFO register
  23. #define MSC_RXFIFO_OFFSET ( 0x38 ) // R, 32, 0x????????, MSC Receive Data FIFO register
  24. #define MSC_TXFIFO_OFFSET ( 0x3C ) // W, 32, 0x????????, MSC Transmit Data FIFO register
  25. #define MSC_LPM_OFFSET ( 0x40 ) // RW, 32, 0x00000000, MSC Low Power Mode register
  26. #define MSC_DMAC_OFFSET ( 0x44 )
  27. #define MSC_DMANDA_OFFSET ( 0x48 )
  28. #define MSC_DMADA_OFFSET ( 0x4C )
  29. #define MSC_DMALEN_OFFSET ( 0x50 )
  30. #define MSC_DMACMD_OFFSET ( 0x54 )
  31. #define MSC_CTRL2_OFFSET ( 0x58 )
  32. #define MSC_RTCNT_OFFSET ( 0x5C )
  33. //--------------------------------------------------------------------------
  34. // MMC/SD Control Register field descriptions (MSC_CTRL)
  35. //--------------------------------------------------------------------------
  36. #define MSC_CTRL_CLOCK_CONTROL_MASK ( 3 << 0 )
  37. #define MSC_CTRL_CLOCK_DONOTHING ( 0 << 0 )
  38. #define MSC_CTRL_CLOCK_STOP ( 1 << 0 )
  39. #define MSC_CTRL_CLOCK_START ( 2 << 0 )
  40. #define MSC_CTRL_START_OP ( 1 << 2 )
  41. #define MSC_CTRL_RESET ( 1 << 3 )
  42. #define MSC_CTRL_STOP_RDWAIT ( 1 << 4 )
  43. #define MSC_CTRL_START_RDWAIT ( 1 << 5 )
  44. #define MSC_CTRL_EXIT_TRANSFER ( 1 << 6 )
  45. #define MSC_CTRL_EXIT_MULTIPLE ( 1 << 7 )
  46. #define MSC_CTRL_SEND_AS_CCSD ( 1 << 14 )
  47. #define MSC_CTRL_SEND_CCSD ( 1 << 15 )
  48. //--------------------------------------------------------------------------
  49. // MSC Status Register field descriptions (MSC_STAT)
  50. //--------------------------------------------------------------------------
  51. #define MSC_STAT_TIME_OUT_READ ( 1 << 0 )
  52. #define MSC_STAT_TIME_OUT_RES ( 1 << 1 )
  53. #define MSC_STAT_CRC_WRITE_ERR_MASK ( 3 << 2 )
  54. #define MSC_STAT_CRC_WRITE_NO_ERR ( 0 << 2 )
  55. #define MSC_STAT_CRC_WRITE_ERR ( 1 << 2 )
  56. #define MSC_STAT_CRC_WRITE_NO_STATUS ( 2 << 2 )
  57. #define MSC_STAT_CRC_READ_ERR ( 1 << 4 )
  58. #define MSC_CMDAT_RESP_FORMAT_MASK ( 7 << 0 )
  59. #define MSC_STAT_CRC_RES_ERR ( 1 << 5 )
  60. #define MSC_STAT_DATA_FIFO_EMPTY ( 1 << 6 )
  61. #define MSC_STAT_DATA_FIFO_FULL ( 1 << 7 )
  62. #define MSC_STAT_CLK_EN ( 1 << 8 )
  63. #define MSC_STAT_IS_READWAIT ( 1 << 9 )
  64. #define MSC_STAT_DATA_FIFO_AFULL ( 1 << 10 )
  65. #define MSC_STAT_END_CMD_RES ( 1 << 11 )
  66. #define MSC_STAT_DATA_TRAN_DONE ( 1 << 12 )
  67. #define MSC_STAT_PRG_DONE ( 1 << 13 )
  68. #define MSC_STAT_SDIO_INT_ACTIVE ( 1 << 14 )
  69. #define MSC_STAT_IS_RESETTING ( 1 << 15 )
  70. #define MSC_STAT_AUTO_CMD_DONE ( 1 << 31 )
  71. //--------------------------------------------------------------------------
  72. //MMC/SD Command and Data Control Register field descriptions (MSC_CMDAT)
  73. //--------------------------------------------------------------------------
  74. #define MSC_CMDAT_RESP_FORMAT_MASK ( 7 << 0 )
  75. #define MSC_CMDAT_RESPONSE_NONE ( 0 << 0 )/* No response */
  76. #define MSC_CMDAT_RESPONSE_R1 ( 1 << 0 )/* Format R1 and R1b */
  77. #define MSC_CMDAT_RESPONSE_R2 ( 2 << 0 )/* Format R2 */
  78. #define MSC_CMDAT_RESPONSE_R3 ( 3 << 0 )/* Format R3 */
  79. #define MSC_CMDAT_RESPONSE_R4 ( 4 << 0 )/* Format R4 */
  80. #define MSC_CMDAT_RESPONSE_R5 ( 5 << 0 )/* Format R5 */
  81. #define MSC_CMDAT_RESPONSE_R6 ( 6 << 0 )/* Format R6 */
  82. #define MSC_CMDAT_RESPONSE_R7 ( 7 << 0 )/* Format R7 */
  83. #define MSC_CMDAT_DATA_EN ( 1 << 3 )
  84. #define MSC_CMDAT_WRRD_MASK ( 1 << 4 )
  85. #define MSC_CMDAT_WRITE ( 1 << 4 )
  86. #define MSC_CMDAT_READ ( 0 << 4 )
  87. #define MSC_CMDAT_STREAM_BLOCK ( 1 << 5 )
  88. #define MSC_CMDAT_BUSY ( 1 << 6 )
  89. #define MSC_CMDAT_INIT ( 1 << 7 )
  90. #define MSC_CMDAT_DMA_EN ( 1 << 8 )
  91. #define MSC_CMDAT_BUS_WIDTH_MASK ( 3 << 9 )
  92. #define MSC_CMDAT_BUS_WIDTH_1BIT ( 0 << 9 )
  93. #define MSC_CMDAT_BUS_WIDTH_4BIT ( 2 << 9 )
  94. #define MSC_CMDAT_BUS_WIDTH_8BIT ( 3 << 9 )
  95. #define MSC_CMDAT_STOP_ABORT ( 1 << 11 )
  96. #define MSC_CMDAT_TTRG_MASK ( 3 << 12 )
  97. #define MSC_CMDAT_TTRG_08 ( 0 << 12 )
  98. #define MSC_CMDAT_TTRG_16 ( 1 << 12 )
  99. #define MSC_CMDAT_TTRG_24 ( 2 << 12 )
  100. #define MSC_CMDAT_RTRG_MASK ( 3 << 14 )
  101. #define MSC_CMDAT_RTRG_08 ( 0 << 14 )
  102. #define MSC_CMDAT_RTRG_16 ( 1 << 14 )
  103. #define MSC_CMDAT_RTRG_24 ( 2 << 14 )
  104. #define MSC_CMDAT_SEND_AS_STOP ( 1 << 16 )
  105. #define MSC_CMDAT_SDIO_PRDT ( 1 << 17 )
  106. #define MSC_CMDAT_READ_CEATA ( 1 << 30 )
  107. #define MSC_CMDAT_CCS_EXPECTED ( 1 << 31 )
  108. //--------------------------------------------------------------------------
  109. // IRQ Number descriptions
  110. //--------------------------------------------------------------------------
  111. #define MSC_DATA_TRAN_DONE ( 1 << 0 )
  112. #define MSC_PRG_DONE ( 1 << 1 )
  113. #define MSC_END_CMD_RES ( 1 << 2 )
  114. #define MSC_RXFIFO_RD_REQ ( 1 << 5 )
  115. #define MSC_TXFIFO_WR_REQ ( 1 << 6 )
  116. #define MSC_SDIO ( 1 << 7 )
  117. #define MSC_TIME_OUT_READ ( 1 << 8 )
  118. #define MSC_TIME_OUT_RES ( 1 << 9 )
  119. #define MSC_CRC_WRITE_ERR ( 1 << 10 )
  120. #define MSC_CRC_READ_ERR ( 1 << 11 )
  121. #define MSC_CRC_RES_ERR ( 1 << 12 )
  122. #define MSC_DATA_FIFO_EMP ( 1 << 13 )
  123. #define MSC_DATA_FIFO_FULL ( 1 << 14 )
  124. #define MSC_AUTO_CMD_DONE ( 1 << 15 )
  125. #define MSC_DMAEND ( 1 << 16 )
  126. #define MSC_BAR ( 1 << 17 )
  127. #define MSC_BAE ( 1 << 18 )
  128. #define MSC_BDE ( 1 << 19 )
  129. #define MSC_BCE ( 1 << 20 )
  130. #define MSC_WR_ALL_DONE ( 1 << 23 )
  131. #define MSC_PIN_LEVEL ( 1 << 24 )
  132. #define MSC_DMA_DATA_DONE ( 1 << 31 )
  133. /* MSC Interrupts Status Register (MSC_IREG) */
  134. #define IFLG_DMA_DATA_DONE (1 << 31)
  135. #define IFLG_WR_ALL_DONE (1 << 23)
  136. #define IFLG_AUTO_CMD23_DONE (1 << 30)
  137. #define IFLG_SVS (1 << 29)
  138. #define IFLG_PIN_LEVEL_SHF 24
  139. #define IFLG_PIN_LEVEL_MASK (0x1f << IFLG_PIN_LEVEL_SHF)
  140. #define IFLG_BCE (1 << 20)
  141. #define IFLG_BDE (1 << 19)
  142. #define IFLG_BAE (1 << 18)
  143. #define IFLG_BAR (1 << 17)
  144. #define IFLG_DMAEND (1 << 16)
  145. #define IFLG_AUTO_CMD12_DONE (1 << 15)
  146. #define IFLG_DATA_FIFO_FULL (1 << 14)
  147. #define IFLG_DATA_FIFO_EMP (1 << 13)
  148. #define IFLG_CRC_RES_ERR (1 << 12)
  149. #define IFLG_CRC_READ_ERR (1 << 11)
  150. #define IFLG_CRC_WRITE_ERR (1 << 10)
  151. #define IFLG_TIMEOUT_RES (1 << 9)
  152. #define IFLG_TIMEOUT_READ (1 << 8)
  153. #define IFLG_SDIO (1 << 7)
  154. #define IFLG_TXFIFO_WR_REQ (1 << 6)
  155. #define IFLG_RXFIFO_RD_REQ (1 << 5)
  156. #define IFLG_END_CMD_RES (1 << 2)
  157. #define IFLG_PRG_DONE (1 << 1)
  158. #define IFLG_DATA_TRAN_DONE (1 << 0)
  159. /* MSC Low Power Mode Register (MSC_LPM) */
  160. #define LPM_DRV_SEL_SHF 30
  161. #define LPM_DRV_SEL_MASK (0x3 << LPM_DRV_SEL_SHF)
  162. #define LPM_SMP_SEL (1 << 29)
  163. #define LPM_LPM (1 << 0)
  164. /* MSC DMA Control Register (MSC_DMAC) */
  165. #define DMAC_MODE_SEL (1 << 7)
  166. #define DMAC_AOFST_SHF 5
  167. #define DMAC_AOFST_MASK (0x3 << DMAC_AOFST_SHF)
  168. #define DMAC_AOFST_0 (0 << DMAC_AOFST_SHF)
  169. #define DMAC_AOFST_1 (1 << DMAC_AOFST_SHF)
  170. #define DMAC_AOFST_2 (2 << DMAC_AOFST_SHF)
  171. #define DMAC_AOFST_3 (3 << DMAC_AOFST_SHF)
  172. #define DMAC_ALIGNEN (1 << 4)
  173. #define DMAC_INCR_SHF 2
  174. #define DMAC_INCR_MASK (0x3 << DMAC_INCR_SHF)
  175. #define DMAC_INCR_16 (0 << DMAC_INCR_SHF)
  176. #define DMAC_INCR_32 (1 << DMAC_INCR_SHF)
  177. #define DMAC_INCR_64 (2 << DMAC_INCR_SHF)
  178. #define DMAC_DMASEL (1 << 1)
  179. #define DMAC_DMAEN (1 << 0)
  180. /* MSC DMA Command Register (MSC_DMACMD) */
  181. #define DMACMD_IDI_SHF 24
  182. #define DMACMD_IDI_MASK (0xff << DMACMD_IDI_SHF)
  183. #define DMACMD_ID_SHF 16
  184. #define DMACMD_ID_MASK (0xff << DMACMD_ID_SHF)
  185. #define DMACMD_OFFSET_SHF 9
  186. #define DMACMD_OFFSET_MASK (0x3 << DMACMD_OFFSET_SHF)
  187. #define DMACMD_ALIGN_EN (1 << 8)
  188. #define DMACMD_ENDI (1 << 1)
  189. #define DMACMD_LINK (1 << 0)
  190. /* Error codes */
  191. enum mmc_result_t {
  192. MMC_NO_RESPONSE = -1,
  193. MMC_NO_ERROR = 0,
  194. MMC_ERROR_OUT_OF_RANGE,
  195. MMC_ERROR_ADDRESS,
  196. MMC_ERROR_BLOCK_LEN,
  197. MMC_ERROR_ERASE_SEQ,
  198. MMC_ERROR_ERASE_PARAM,
  199. MMC_ERROR_WP_VIOLATION,
  200. MMC_ERROR_CARD_IS_LOCKED,
  201. MMC_ERROR_LOCK_UNLOCK_FAILED,
  202. MMC_ERROR_COM_CRC,
  203. MMC_ERROR_ILLEGAL_COMMAND,
  204. MMC_ERROR_CARD_ECC_FAILED,
  205. MMC_ERROR_CC,
  206. MMC_ERROR_GENERAL,
  207. MMC_ERROR_UNDERRUN,
  208. MMC_ERROR_OVERRUN,
  209. MMC_ERROR_CID_CSD_OVERWRITE,
  210. MMC_ERROR_STATE_MISMATCH,
  211. MMC_ERROR_HEADER_MISMATCH,
  212. MMC_ERROR_TIMEOUT,
  213. MMC_ERROR_CRC,
  214. MMC_ERROR_DRIVER_FAILURE,
  215. };
  216. struct jz47xx_sdio
  217. {
  218. struct rt_mmcsd_host *host;
  219. struct rt_mmcsd_req *req;
  220. struct rt_mmcsd_cmd *cmd;
  221. uint32_t hw_base;
  222. uint32_t msc_clock;
  223. uint32_t irqno;
  224. uint32_t flag;
  225. struct rt_completion completion;
  226. struct clk *clock;
  227. struct clk *clock_gate;
  228. int sdio_clk; /* clock for sdio */
  229. rt_uint32_t current_status;
  230. };
  231. #endif /* DRV_MMC_H__ */