sdhi-shmobile.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. /*
  2. * SuperH Mobile SDHI
  3. *
  4. * Copyright (C) 2010 Magnus Damm
  5. * Copyright (C) 2010 Kuninori Morimoto
  6. * Copyright (C) 2010 Simon Horman
  7. *
  8. * This file is subject to the terms and conditions of the GNU General Public
  9. * License. See the file "COPYING" in the main directory of this archive
  10. * for more details.
  11. *
  12. * Parts inspired by u-boot
  13. */
  14. #include <linux/io.h>
  15. #include <linux/mmc/host.h>
  16. #include <linux/mmc/core.h>
  17. #include <linux/mmc/mmc.h>
  18. #include <linux/mmc/sd.h>
  19. #include <linux/mmc/tmio.h>
  20. #include <mach/sdhi.h>
  21. #define OCR_FASTBOOT (1<<29)
  22. #define OCR_HCS (1<<30)
  23. #define OCR_BUSY (1<<31)
  24. #define RESP_CMD12 0x00000030
  25. static inline u16 sd_ctrl_read16(void __iomem *base, int addr)
  26. {
  27. return __raw_readw(base + addr);
  28. }
  29. static inline u32 sd_ctrl_read32(void __iomem *base, int addr)
  30. {
  31. return __raw_readw(base + addr) |
  32. __raw_readw(base + addr + 2) << 16;
  33. }
  34. static inline void sd_ctrl_write16(void __iomem *base, int addr, u16 val)
  35. {
  36. __raw_writew(val, base + addr);
  37. }
  38. static inline void sd_ctrl_write32(void __iomem *base, int addr, u32 val)
  39. {
  40. __raw_writew(val, base + addr);
  41. __raw_writew(val >> 16, base + addr + 2);
  42. }
  43. #define ALL_ERROR (TMIO_STAT_CMD_IDX_ERR | TMIO_STAT_CRCFAIL | \
  44. TMIO_STAT_STOPBIT_ERR | TMIO_STAT_DATATIMEOUT | \
  45. TMIO_STAT_RXOVERFLOW | TMIO_STAT_TXUNDERRUN | \
  46. TMIO_STAT_CMDTIMEOUT | TMIO_STAT_ILL_ACCESS | \
  47. TMIO_STAT_ILL_FUNC)
  48. static int sdhi_intr(void __iomem *base)
  49. {
  50. unsigned long state = sd_ctrl_read32(base, CTL_STATUS);
  51. if (state & ALL_ERROR) {
  52. sd_ctrl_write32(base, CTL_STATUS, ~ALL_ERROR);
  53. sd_ctrl_write32(base, CTL_IRQ_MASK,
  54. ALL_ERROR |
  55. sd_ctrl_read32(base, CTL_IRQ_MASK));
  56. return -EINVAL;
  57. }
  58. if (state & TMIO_STAT_CMDRESPEND) {
  59. sd_ctrl_write32(base, CTL_STATUS, ~TMIO_STAT_CMDRESPEND);
  60. sd_ctrl_write32(base, CTL_IRQ_MASK,
  61. TMIO_STAT_CMDRESPEND |
  62. sd_ctrl_read32(base, CTL_IRQ_MASK));
  63. return 0;
  64. }
  65. if (state & TMIO_STAT_RXRDY) {
  66. sd_ctrl_write32(base, CTL_STATUS, ~TMIO_STAT_RXRDY);
  67. sd_ctrl_write32(base, CTL_IRQ_MASK,
  68. TMIO_STAT_RXRDY | TMIO_STAT_TXUNDERRUN |
  69. sd_ctrl_read32(base, CTL_IRQ_MASK));
  70. return 0;
  71. }
  72. if (state & TMIO_STAT_DATAEND) {
  73. sd_ctrl_write32(base, CTL_STATUS, ~TMIO_STAT_DATAEND);
  74. sd_ctrl_write32(base, CTL_IRQ_MASK,
  75. TMIO_STAT_DATAEND |
  76. sd_ctrl_read32(base, CTL_IRQ_MASK));
  77. return 0;
  78. }
  79. return -EAGAIN;
  80. }
  81. static int sdhi_boot_wait_resp_end(void __iomem *base)
  82. {
  83. int err = -EAGAIN, timeout = 10000000;
  84. while (timeout--) {
  85. err = sdhi_intr(base);
  86. if (err != -EAGAIN)
  87. break;
  88. udelay(1);
  89. }
  90. return err;
  91. }
  92. /* SDHI_CLK_CTRL */
  93. #define CLK_MMC_ENABLE (1 << 8)
  94. #define CLK_MMC_INIT (1 << 6) /* clk / 256 */
  95. static void sdhi_boot_mmc_clk_stop(void __iomem *base)
  96. {
  97. sd_ctrl_write16(base, CTL_CLK_AND_WAIT_CTL, 0x0000);
  98. msleep(10);
  99. sd_ctrl_write16(base, CTL_SD_CARD_CLK_CTL, ~CLK_MMC_ENABLE &
  100. sd_ctrl_read16(base, CTL_SD_CARD_CLK_CTL));
  101. msleep(10);
  102. }
  103. static void sdhi_boot_mmc_clk_start(void __iomem *base)
  104. {
  105. sd_ctrl_write16(base, CTL_SD_CARD_CLK_CTL, CLK_MMC_ENABLE |
  106. sd_ctrl_read16(base, CTL_SD_CARD_CLK_CTL));
  107. msleep(10);
  108. sd_ctrl_write16(base, CTL_CLK_AND_WAIT_CTL, CLK_MMC_ENABLE);
  109. msleep(10);
  110. }
  111. static void sdhi_boot_reset(void __iomem *base)
  112. {
  113. sd_ctrl_write16(base, CTL_RESET_SD, 0x0000);
  114. msleep(10);
  115. sd_ctrl_write16(base, CTL_RESET_SD, 0x0001);
  116. msleep(10);
  117. }
  118. /* Set MMC clock / power.
  119. * Note: This controller uses a simple divider scheme therefore it cannot
  120. * run a MMC card at full speed (20MHz). The max clock is 24MHz on SD, but as
  121. * MMC wont run that fast, it has to be clocked at 12MHz which is the next
  122. * slowest setting.
  123. */
  124. static int sdhi_boot_mmc_set_ios(void __iomem *base, struct mmc_ios *ios)
  125. {
  126. if (sd_ctrl_read32(base, CTL_STATUS) & TMIO_STAT_CMD_BUSY)
  127. return -EBUSY;
  128. if (ios->clock)
  129. sd_ctrl_write16(base, CTL_SD_CARD_CLK_CTL,
  130. ios->clock | CLK_MMC_ENABLE);
  131. /* Power sequence - OFF -> ON -> UP */
  132. switch (ios->power_mode) {
  133. case MMC_POWER_OFF: /* power down SD bus */
  134. sdhi_boot_mmc_clk_stop(base);
  135. break;
  136. case MMC_POWER_ON: /* power up SD bus */
  137. break;
  138. case MMC_POWER_UP: /* start bus clock */
  139. sdhi_boot_mmc_clk_start(base);
  140. break;
  141. }
  142. switch (ios->bus_width) {
  143. case MMC_BUS_WIDTH_1:
  144. sd_ctrl_write16(base, CTL_SD_MEM_CARD_OPT, 0x80e0);
  145. break;
  146. case MMC_BUS_WIDTH_4:
  147. sd_ctrl_write16(base, CTL_SD_MEM_CARD_OPT, 0x00e0);
  148. break;
  149. }
  150. /* Let things settle. delay taken from winCE driver */
  151. udelay(140);
  152. return 0;
  153. }
  154. /* These are the bitmasks the tmio chip requires to implement the MMC response
  155. * types. Note that R1 and R6 are the same in this scheme. */
  156. #define RESP_NONE 0x0300
  157. #define RESP_R1 0x0400
  158. #define RESP_R1B 0x0500
  159. #define RESP_R2 0x0600
  160. #define RESP_R3 0x0700
  161. #define DATA_PRESENT 0x0800
  162. #define TRANSFER_READ 0x1000
  163. static int sdhi_boot_request(void __iomem *base, struct mmc_command *cmd)
  164. {
  165. int err, c = cmd->opcode;
  166. switch (mmc_resp_type(cmd)) {
  167. case MMC_RSP_NONE: c |= RESP_NONE; break;
  168. case MMC_RSP_R1: c |= RESP_R1; break;
  169. case MMC_RSP_R1B: c |= RESP_R1B; break;
  170. case MMC_RSP_R2: c |= RESP_R2; break;
  171. case MMC_RSP_R3: c |= RESP_R3; break;
  172. default:
  173. return -EINVAL;
  174. }
  175. /* No interrupts so this may not be cleared */
  176. sd_ctrl_write32(base, CTL_STATUS, ~TMIO_STAT_CMDRESPEND);
  177. sd_ctrl_write32(base, CTL_IRQ_MASK, TMIO_STAT_CMDRESPEND |
  178. sd_ctrl_read32(base, CTL_IRQ_MASK));
  179. sd_ctrl_write32(base, CTL_ARG_REG, cmd->arg);
  180. sd_ctrl_write16(base, CTL_SD_CMD, c);
  181. sd_ctrl_write32(base, CTL_IRQ_MASK,
  182. ~(TMIO_STAT_CMDRESPEND | ALL_ERROR) &
  183. sd_ctrl_read32(base, CTL_IRQ_MASK));
  184. err = sdhi_boot_wait_resp_end(base);
  185. if (err)
  186. return err;
  187. cmd->resp[0] = sd_ctrl_read32(base, CTL_RESPONSE);
  188. return 0;
  189. }
  190. static int sdhi_boot_do_read_single(void __iomem *base, int high_capacity,
  191. unsigned long block, unsigned short *buf)
  192. {
  193. int err, i;
  194. /* CMD17 - Read */
  195. {
  196. struct mmc_command cmd;
  197. cmd.opcode = MMC_READ_SINGLE_BLOCK | \
  198. TRANSFER_READ | DATA_PRESENT;
  199. if (high_capacity)
  200. cmd.arg = block;
  201. else
  202. cmd.arg = block * TMIO_BBS;
  203. cmd.flags = MMC_RSP_R1;
  204. err = sdhi_boot_request(base, &cmd);
  205. if (err)
  206. return err;
  207. }
  208. sd_ctrl_write32(base, CTL_IRQ_MASK,
  209. ~(TMIO_STAT_DATAEND | TMIO_STAT_RXRDY |
  210. TMIO_STAT_TXUNDERRUN) &
  211. sd_ctrl_read32(base, CTL_IRQ_MASK));
  212. err = sdhi_boot_wait_resp_end(base);
  213. if (err)
  214. return err;
  215. sd_ctrl_write16(base, CTL_SD_XFER_LEN, TMIO_BBS);
  216. for (i = 0; i < TMIO_BBS / sizeof(*buf); i++)
  217. *buf++ = sd_ctrl_read16(base, RESP_CMD12);
  218. err = sdhi_boot_wait_resp_end(base);
  219. if (err)
  220. return err;
  221. return 0;
  222. }
  223. int sdhi_boot_do_read(void __iomem *base, int high_capacity,
  224. unsigned long offset, unsigned short count,
  225. unsigned short *buf)
  226. {
  227. unsigned long i;
  228. int err = 0;
  229. for (i = 0; i < count; i++) {
  230. err = sdhi_boot_do_read_single(base, high_capacity, offset + i,
  231. buf + (i * TMIO_BBS /
  232. sizeof(*buf)));
  233. if (err)
  234. return err;
  235. }
  236. return 0;
  237. }
  238. #define VOLTAGES (MMC_VDD_32_33 | MMC_VDD_33_34)
  239. int sdhi_boot_init(void __iomem *base)
  240. {
  241. bool sd_v2 = false, sd_v1_0 = false;
  242. unsigned short cid;
  243. int err, high_capacity = 0;
  244. sdhi_boot_mmc_clk_stop(base);
  245. sdhi_boot_reset(base);
  246. /* mmc0: clock 400000Hz busmode 1 powermode 2 cs 0 Vdd 21 width 0 timing 0 */
  247. {
  248. struct mmc_ios ios;
  249. ios.power_mode = MMC_POWER_ON;
  250. ios.bus_width = MMC_BUS_WIDTH_1;
  251. ios.clock = CLK_MMC_INIT;
  252. err = sdhi_boot_mmc_set_ios(base, &ios);
  253. if (err)
  254. return err;
  255. }
  256. /* CMD0 */
  257. {
  258. struct mmc_command cmd;
  259. msleep(1);
  260. cmd.opcode = MMC_GO_IDLE_STATE;
  261. cmd.arg = 0;
  262. cmd.flags = MMC_RSP_NONE;
  263. err = sdhi_boot_request(base, &cmd);
  264. if (err)
  265. return err;
  266. msleep(2);
  267. }
  268. /* CMD8 - Test for SD version 2 */
  269. {
  270. struct mmc_command cmd;
  271. cmd.opcode = SD_SEND_IF_COND;
  272. cmd.arg = (VOLTAGES != 0) << 8 | 0xaa;
  273. cmd.flags = MMC_RSP_R1;
  274. err = sdhi_boot_request(base, &cmd); /* Ignore error */
  275. if ((cmd.resp[0] & 0xff) == 0xaa)
  276. sd_v2 = true;
  277. }
  278. /* CMD55 - Get OCR (SD) */
  279. {
  280. int timeout = 1000;
  281. struct mmc_command cmd;
  282. cmd.arg = 0;
  283. do {
  284. cmd.opcode = MMC_APP_CMD;
  285. cmd.flags = MMC_RSP_R1;
  286. cmd.arg = 0;
  287. err = sdhi_boot_request(base, &cmd);
  288. if (err)
  289. break;
  290. cmd.opcode = SD_APP_OP_COND;
  291. cmd.flags = MMC_RSP_R3;
  292. cmd.arg = (VOLTAGES & 0xff8000);
  293. if (sd_v2)
  294. cmd.arg |= OCR_HCS;
  295. cmd.arg |= OCR_FASTBOOT;
  296. err = sdhi_boot_request(base, &cmd);
  297. if (err)
  298. break;
  299. msleep(1);
  300. } while((!(cmd.resp[0] & OCR_BUSY)) && --timeout);
  301. if (!err && timeout) {
  302. if (!sd_v2)
  303. sd_v1_0 = true;
  304. high_capacity = (cmd.resp[0] & OCR_HCS) == OCR_HCS;
  305. }
  306. }
  307. /* CMD1 - Get OCR (MMC) */
  308. if (!sd_v2 && !sd_v1_0) {
  309. int timeout = 1000;
  310. struct mmc_command cmd;
  311. do {
  312. cmd.opcode = MMC_SEND_OP_COND;
  313. cmd.arg = VOLTAGES | OCR_HCS;
  314. cmd.flags = MMC_RSP_R3;
  315. err = sdhi_boot_request(base, &cmd);
  316. if (err)
  317. return err;
  318. msleep(1);
  319. } while((!(cmd.resp[0] & OCR_BUSY)) && --timeout);
  320. if (!timeout)
  321. return -EAGAIN;
  322. high_capacity = (cmd.resp[0] & OCR_HCS) == OCR_HCS;
  323. }
  324. /* CMD2 - Get CID */
  325. {
  326. struct mmc_command cmd;
  327. cmd.opcode = MMC_ALL_SEND_CID;
  328. cmd.arg = 0;
  329. cmd.flags = MMC_RSP_R2;
  330. err = sdhi_boot_request(base, &cmd);
  331. if (err)
  332. return err;
  333. }
  334. /* CMD3
  335. * MMC: Set the relative address
  336. * SD: Get the relative address
  337. * Also puts the card into the standby state
  338. */
  339. {
  340. struct mmc_command cmd;
  341. cmd.opcode = MMC_SET_RELATIVE_ADDR;
  342. cmd.arg = 0;
  343. cmd.flags = MMC_RSP_R1;
  344. err = sdhi_boot_request(base, &cmd);
  345. if (err)
  346. return err;
  347. cid = cmd.resp[0] >> 16;
  348. }
  349. /* CMD9 - Get CSD */
  350. {
  351. struct mmc_command cmd;
  352. cmd.opcode = MMC_SEND_CSD;
  353. cmd.arg = cid << 16;
  354. cmd.flags = MMC_RSP_R2;
  355. err = sdhi_boot_request(base, &cmd);
  356. if (err)
  357. return err;
  358. }
  359. /* CMD7 - Select the card */
  360. {
  361. struct mmc_command cmd;
  362. cmd.opcode = MMC_SELECT_CARD;
  363. //cmd.arg = rca << 16;
  364. cmd.arg = cid << 16;
  365. //cmd.flags = MMC_RSP_R1B;
  366. cmd.flags = MMC_RSP_R1;
  367. err = sdhi_boot_request(base, &cmd);
  368. if (err)
  369. return err;
  370. }
  371. /* CMD16 - Set the block size */
  372. {
  373. struct mmc_command cmd;
  374. cmd.opcode = MMC_SET_BLOCKLEN;
  375. cmd.arg = TMIO_BBS;
  376. cmd.flags = MMC_RSP_R1;
  377. err = sdhi_boot_request(base, &cmd);
  378. if (err)
  379. return err;
  380. }
  381. return high_capacity;
  382. }