fsl_esdhc.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821
  1. /*
  2. * Copyright 2007, 2010-2011 Freescale Semiconductor, Inc
  3. * Andy Fleming
  4. *
  5. * Based vaguely on the pxa mmc code:
  6. * (C) Copyright 2003
  7. * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
  8. *
  9. * SPDX-License-Identifier: GPL-2.0+
  10. */
  11. #include <config.h>
  12. #include <common.h>
  13. #include <command.h>
  14. #include <hwconfig.h>
  15. #include <mmc.h>
  16. #include <part.h>
  17. #include <malloc.h>
  18. #include <mmc.h>
  19. #include <fsl_esdhc.h>
  20. #include <fdt_support.h>
  21. #include <asm/io.h>
  22. DECLARE_GLOBAL_DATA_PTR;
  23. #define SDHCI_IRQ_EN_BITS (IRQSTATEN_CC | IRQSTATEN_TC | \
  24. IRQSTATEN_CINT | \
  25. IRQSTATEN_CTOE | IRQSTATEN_CCE | IRQSTATEN_CEBE | \
  26. IRQSTATEN_CIE | IRQSTATEN_DTOE | IRQSTATEN_DCE | \
  27. IRQSTATEN_DEBE | IRQSTATEN_BRR | IRQSTATEN_BWR | \
  28. IRQSTATEN_DINT)
  29. struct fsl_esdhc {
  30. uint dsaddr; /* SDMA system address register */
  31. uint blkattr; /* Block attributes register */
  32. uint cmdarg; /* Command argument register */
  33. uint xfertyp; /* Transfer type register */
  34. uint cmdrsp0; /* Command response 0 register */
  35. uint cmdrsp1; /* Command response 1 register */
  36. uint cmdrsp2; /* Command response 2 register */
  37. uint cmdrsp3; /* Command response 3 register */
  38. uint datport; /* Buffer data port register */
  39. uint prsstat; /* Present state register */
  40. uint proctl; /* Protocol control register */
  41. uint sysctl; /* System Control Register */
  42. uint irqstat; /* Interrupt status register */
  43. uint irqstaten; /* Interrupt status enable register */
  44. uint irqsigen; /* Interrupt signal enable register */
  45. uint autoc12err; /* Auto CMD error status register */
  46. uint hostcapblt; /* Host controller capabilities register */
  47. uint wml; /* Watermark level register */
  48. uint mixctrl; /* For USDHC */
  49. char reserved1[4]; /* reserved */
  50. uint fevt; /* Force event register */
  51. uint admaes; /* ADMA error status register */
  52. uint adsaddr; /* ADMA system address register */
  53. char reserved2[100]; /* reserved */
  54. uint vendorspec; /* Vendor Specific register */
  55. char reserved3[56]; /* reserved */
  56. uint hostver; /* Host controller version register */
  57. char reserved4[4]; /* reserved */
  58. uint dmaerraddr; /* DMA error address register */
  59. char reserved5[4]; /* reserved */
  60. uint dmaerrattr; /* DMA error attribute register */
  61. char reserved6[4]; /* reserved */
  62. uint hostcapblt2; /* Host controller capabilities register 2 */
  63. char reserved7[8]; /* reserved */
  64. uint tcr; /* Tuning control register */
  65. char reserved8[28]; /* reserved */
  66. uint sddirctl; /* SD direction control register */
  67. char reserved9[712]; /* reserved */
  68. uint scr; /* eSDHC control register */
  69. };
  70. /* Return the XFERTYP flags for a given command and data packet */
  71. static uint esdhc_xfertyp(struct mmc_cmd *cmd, struct mmc_data *data)
  72. {
  73. uint xfertyp = 0;
  74. if (data) {
  75. xfertyp |= XFERTYP_DPSEL;
  76. #ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
  77. xfertyp |= XFERTYP_DMAEN;
  78. #endif
  79. if (data->blocks > 1) {
  80. xfertyp |= XFERTYP_MSBSEL;
  81. xfertyp |= XFERTYP_BCEN;
  82. #ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC111
  83. xfertyp |= XFERTYP_AC12EN;
  84. #endif
  85. }
  86. if (data->flags & MMC_DATA_READ)
  87. xfertyp |= XFERTYP_DTDSEL;
  88. }
  89. if (cmd->resp_type & MMC_RSP_CRC)
  90. xfertyp |= XFERTYP_CCCEN;
  91. if (cmd->resp_type & MMC_RSP_OPCODE)
  92. xfertyp |= XFERTYP_CICEN;
  93. if (cmd->resp_type & MMC_RSP_136)
  94. xfertyp |= XFERTYP_RSPTYP_136;
  95. else if (cmd->resp_type & MMC_RSP_BUSY)
  96. xfertyp |= XFERTYP_RSPTYP_48_BUSY;
  97. else if (cmd->resp_type & MMC_RSP_PRESENT)
  98. xfertyp |= XFERTYP_RSPTYP_48;
  99. if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION)
  100. xfertyp |= XFERTYP_CMDTYP_ABORT;
  101. return XFERTYP_CMD(cmd->cmdidx) | xfertyp;
  102. }
  103. #ifdef CONFIG_SYS_FSL_ESDHC_USE_PIO
  104. /*
  105. * PIO Read/Write Mode reduce the performace as DMA is not used in this mode.
  106. */
  107. static void
  108. esdhc_pio_read_write(struct mmc *mmc, struct mmc_data *data)
  109. {
  110. struct fsl_esdhc_cfg *cfg = mmc->priv;
  111. struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
  112. uint blocks;
  113. char *buffer;
  114. uint databuf;
  115. uint size;
  116. uint irqstat;
  117. uint timeout;
  118. if (data->flags & MMC_DATA_READ) {
  119. blocks = data->blocks;
  120. buffer = data->dest;
  121. while (blocks) {
  122. timeout = PIO_TIMEOUT;
  123. size = data->blocksize;
  124. irqstat = esdhc_read32(&regs->irqstat);
  125. while (!(esdhc_read32(&regs->prsstat) & PRSSTAT_BREN)
  126. && --timeout);
  127. if (timeout <= 0) {
  128. printf("\nData Read Failed in PIO Mode.");
  129. return;
  130. }
  131. while (size && (!(irqstat & IRQSTAT_TC))) {
  132. udelay(100); /* Wait before last byte transfer complete */
  133. irqstat = esdhc_read32(&regs->irqstat);
  134. databuf = in_le32(&regs->datport);
  135. *((uint *)buffer) = databuf;
  136. buffer += 4;
  137. size -= 4;
  138. }
  139. blocks--;
  140. }
  141. } else {
  142. blocks = data->blocks;
  143. buffer = (char *)data->src;
  144. while (blocks) {
  145. timeout = PIO_TIMEOUT;
  146. size = data->blocksize;
  147. irqstat = esdhc_read32(&regs->irqstat);
  148. while (!(esdhc_read32(&regs->prsstat) & PRSSTAT_BWEN)
  149. && --timeout);
  150. if (timeout <= 0) {
  151. printf("\nData Write Failed in PIO Mode.");
  152. return;
  153. }
  154. while (size && (!(irqstat & IRQSTAT_TC))) {
  155. udelay(100); /* Wait before last byte transfer complete */
  156. databuf = *((uint *)buffer);
  157. buffer += 4;
  158. size -= 4;
  159. irqstat = esdhc_read32(&regs->irqstat);
  160. out_le32(&regs->datport, databuf);
  161. }
  162. blocks--;
  163. }
  164. }
  165. }
  166. #endif
  167. static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
  168. {
  169. int timeout;
  170. struct fsl_esdhc_cfg *cfg = mmc->priv;
  171. struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
  172. #ifdef CONFIG_FSL_LAYERSCAPE
  173. dma_addr_t addr;
  174. #endif
  175. uint wml_value;
  176. wml_value = data->blocksize/4;
  177. if (data->flags & MMC_DATA_READ) {
  178. if (wml_value > WML_RD_WML_MAX)
  179. wml_value = WML_RD_WML_MAX_VAL;
  180. esdhc_clrsetbits32(&regs->wml, WML_RD_WML_MASK, wml_value);
  181. #ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
  182. #ifdef CONFIG_FSL_LAYERSCAPE
  183. addr = virt_to_phys((void *)(data->dest));
  184. if (upper_32_bits(addr))
  185. printf("Error found for upper 32 bits\n");
  186. else
  187. esdhc_write32(&regs->dsaddr, lower_32_bits(addr));
  188. #else
  189. esdhc_write32(&regs->dsaddr, (u32)data->dest);
  190. #endif
  191. #endif
  192. } else {
  193. #ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
  194. flush_dcache_range((ulong)data->src,
  195. (ulong)data->src+data->blocks
  196. *data->blocksize);
  197. #endif
  198. if (wml_value > WML_WR_WML_MAX)
  199. wml_value = WML_WR_WML_MAX_VAL;
  200. if ((esdhc_read32(&regs->prsstat) & PRSSTAT_WPSPL) == 0) {
  201. printf("\nThe SD card is locked. Can not write to a locked card.\n\n");
  202. return TIMEOUT;
  203. }
  204. esdhc_clrsetbits32(&regs->wml, WML_WR_WML_MASK,
  205. wml_value << 16);
  206. #ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
  207. #ifdef CONFIG_FSL_LAYERSCAPE
  208. addr = virt_to_phys((void *)(data->src));
  209. if (upper_32_bits(addr))
  210. printf("Error found for upper 32 bits\n");
  211. else
  212. esdhc_write32(&regs->dsaddr, lower_32_bits(addr));
  213. #else
  214. esdhc_write32(&regs->dsaddr, (u32)data->src);
  215. #endif
  216. #endif
  217. }
  218. esdhc_write32(&regs->blkattr, data->blocks << 16 | data->blocksize);
  219. /* Calculate the timeout period for data transactions */
  220. /*
  221. * 1)Timeout period = (2^(timeout+13)) SD Clock cycles
  222. * 2)Timeout period should be minimum 0.250sec as per SD Card spec
  223. * So, Number of SD Clock cycles for 0.25sec should be minimum
  224. * (SD Clock/sec * 0.25 sec) SD Clock cycles
  225. * = (mmc->clock * 1/4) SD Clock cycles
  226. * As 1) >= 2)
  227. * => (2^(timeout+13)) >= mmc->clock * 1/4
  228. * Taking log2 both the sides
  229. * => timeout + 13 >= log2(mmc->clock/4)
  230. * Rounding up to next power of 2
  231. * => timeout + 13 = log2(mmc->clock/4) + 1
  232. * => timeout + 13 = fls(mmc->clock/4)
  233. *
  234. * However, the MMC spec "It is strongly recommended for hosts to
  235. * implement more than 500ms timeout value even if the card
  236. * indicates the 250ms maximum busy length." Even the previous
  237. * value of 300ms is known to be insufficient for some cards.
  238. * So, we use
  239. * => timeout + 13 = fls(mmc->clock/2)
  240. */
  241. timeout = fls(mmc->clock/2);
  242. timeout -= 13;
  243. if (timeout > 14)
  244. timeout = 14;
  245. if (timeout < 0)
  246. timeout = 0;
  247. #ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC_A001
  248. if ((timeout == 4) || (timeout == 8) || (timeout == 12))
  249. timeout++;
  250. #endif
  251. #ifdef ESDHCI_QUIRK_BROKEN_TIMEOUT_VALUE
  252. timeout = 0xE;
  253. #endif
  254. esdhc_clrsetbits32(&regs->sysctl, SYSCTL_TIMEOUT_MASK, timeout << 16);
  255. return 0;
  256. }
  257. static void check_and_invalidate_dcache_range
  258. (struct mmc_cmd *cmd,
  259. struct mmc_data *data) {
  260. #ifdef CONFIG_FSL_LAYERSCAPE
  261. unsigned start = 0;
  262. #else
  263. unsigned start = (unsigned)data->dest ;
  264. #endif
  265. unsigned size = roundup(ARCH_DMA_MINALIGN,
  266. data->blocks*data->blocksize);
  267. unsigned end = start+size ;
  268. #ifdef CONFIG_FSL_LAYERSCAPE
  269. dma_addr_t addr;
  270. addr = virt_to_phys((void *)(data->dest));
  271. if (upper_32_bits(addr))
  272. printf("Error found for upper 32 bits\n");
  273. else
  274. start = lower_32_bits(addr);
  275. #endif
  276. invalidate_dcache_range(start, end);
  277. }
  278. /*
  279. * Sends a command out on the bus. Takes the mmc pointer,
  280. * a command pointer, and an optional data pointer.
  281. */
  282. static int
  283. esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
  284. {
  285. int err = 0;
  286. uint xfertyp;
  287. uint irqstat;
  288. struct fsl_esdhc_cfg *cfg = mmc->priv;
  289. volatile struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
  290. #ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC111
  291. if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION)
  292. return 0;
  293. #endif
  294. esdhc_write32(&regs->irqstat, -1);
  295. sync();
  296. /* Wait for the bus to be idle */
  297. while ((esdhc_read32(&regs->prsstat) & PRSSTAT_CICHB) ||
  298. (esdhc_read32(&regs->prsstat) & PRSSTAT_CIDHB))
  299. ;
  300. while (esdhc_read32(&regs->prsstat) & PRSSTAT_DLA)
  301. ;
  302. /* Wait at least 8 SD clock cycles before the next command */
  303. /*
  304. * Note: This is way more than 8 cycles, but 1ms seems to
  305. * resolve timing issues with some cards
  306. */
  307. udelay(1000);
  308. /* Set up for a data transfer if we have one */
  309. if (data) {
  310. err = esdhc_setup_data(mmc, data);
  311. if(err)
  312. return err;
  313. if (data->flags & MMC_DATA_READ)
  314. check_and_invalidate_dcache_range(cmd, data);
  315. }
  316. /* Figure out the transfer arguments */
  317. xfertyp = esdhc_xfertyp(cmd, data);
  318. /* Mask all irqs */
  319. esdhc_write32(&regs->irqsigen, 0);
  320. /* Send the command */
  321. esdhc_write32(&regs->cmdarg, cmd->cmdarg);
  322. #if defined(CONFIG_FSL_USDHC)
  323. esdhc_write32(&regs->mixctrl,
  324. (esdhc_read32(&regs->mixctrl) & 0xFFFFFF80) | (xfertyp & 0x7F)
  325. | (mmc->ddr_mode ? XFERTYP_DDREN : 0));
  326. esdhc_write32(&regs->xfertyp, xfertyp & 0xFFFF0000);
  327. #else
  328. esdhc_write32(&regs->xfertyp, xfertyp);
  329. #endif
  330. /* Wait for the command to complete */
  331. while (!(esdhc_read32(&regs->irqstat) & (IRQSTAT_CC | IRQSTAT_CTOE)))
  332. ;
  333. irqstat = esdhc_read32(&regs->irqstat);
  334. if (irqstat & CMD_ERR) {
  335. err = COMM_ERR;
  336. goto out;
  337. }
  338. if (irqstat & IRQSTAT_CTOE) {
  339. err = TIMEOUT;
  340. goto out;
  341. }
  342. /* Switch voltage to 1.8V if CMD11 succeeded */
  343. if (cmd->cmdidx == SD_CMD_SWITCH_UHS18V) {
  344. esdhc_setbits32(&regs->vendorspec, ESDHC_VENDORSPEC_VSELECT);
  345. printf("Run CMD11 1.8V switch\n");
  346. /* Sleep for 5 ms - max time for card to switch to 1.8V */
  347. udelay(5000);
  348. }
  349. /* Workaround for ESDHC errata ENGcm03648 */
  350. if (!data && (cmd->resp_type & MMC_RSP_BUSY)) {
  351. int timeout = 6000;
  352. /* Poll on DATA0 line for cmd with busy signal for 600 ms */
  353. while (timeout > 0 && !(esdhc_read32(&regs->prsstat) &
  354. PRSSTAT_DAT0)) {
  355. udelay(100);
  356. timeout--;
  357. }
  358. if (timeout <= 0) {
  359. printf("Timeout waiting for DAT0 to go high!\n");
  360. err = TIMEOUT;
  361. goto out;
  362. }
  363. }
  364. /* Copy the response to the response buffer */
  365. if (cmd->resp_type & MMC_RSP_136) {
  366. u32 cmdrsp3, cmdrsp2, cmdrsp1, cmdrsp0;
  367. cmdrsp3 = esdhc_read32(&regs->cmdrsp3);
  368. cmdrsp2 = esdhc_read32(&regs->cmdrsp2);
  369. cmdrsp1 = esdhc_read32(&regs->cmdrsp1);
  370. cmdrsp0 = esdhc_read32(&regs->cmdrsp0);
  371. cmd->response[0] = (cmdrsp3 << 8) | (cmdrsp2 >> 24);
  372. cmd->response[1] = (cmdrsp2 << 8) | (cmdrsp1 >> 24);
  373. cmd->response[2] = (cmdrsp1 << 8) | (cmdrsp0 >> 24);
  374. cmd->response[3] = (cmdrsp0 << 8);
  375. } else
  376. cmd->response[0] = esdhc_read32(&regs->cmdrsp0);
  377. /* Wait until all of the blocks are transferred */
  378. if (data) {
  379. #ifdef CONFIG_SYS_FSL_ESDHC_USE_PIO
  380. esdhc_pio_read_write(mmc, data);
  381. #else
  382. do {
  383. irqstat = esdhc_read32(&regs->irqstat);
  384. if (irqstat & IRQSTAT_DTOE) {
  385. err = TIMEOUT;
  386. goto out;
  387. }
  388. if (irqstat & DATA_ERR) {
  389. err = COMM_ERR;
  390. goto out;
  391. }
  392. } while ((irqstat & DATA_COMPLETE) != DATA_COMPLETE);
  393. /*
  394. * Need invalidate the dcache here again to avoid any
  395. * cache-fill during the DMA operations such as the
  396. * speculative pre-fetching etc.
  397. */
  398. if (data->flags & MMC_DATA_READ)
  399. check_and_invalidate_dcache_range(cmd, data);
  400. #endif
  401. }
  402. out:
  403. /* Reset CMD and DATA portions on error */
  404. if (err) {
  405. esdhc_write32(&regs->sysctl, esdhc_read32(&regs->sysctl) |
  406. SYSCTL_RSTC);
  407. while (esdhc_read32(&regs->sysctl) & SYSCTL_RSTC)
  408. ;
  409. if (data) {
  410. esdhc_write32(&regs->sysctl,
  411. esdhc_read32(&regs->sysctl) |
  412. SYSCTL_RSTD);
  413. while ((esdhc_read32(&regs->sysctl) & SYSCTL_RSTD))
  414. ;
  415. }
  416. /* If this was CMD11, then notify that power cycle is needed */
  417. if (cmd->cmdidx == SD_CMD_SWITCH_UHS18V)
  418. printf("CMD11 to switch to 1.8V mode failed, card requires power cycle.\n");
  419. }
  420. esdhc_write32(&regs->irqstat, -1);
  421. return err;
  422. }
  423. static void set_sysctl(struct mmc *mmc, uint clock)
  424. {
  425. int div, pre_div;
  426. struct fsl_esdhc_cfg *cfg = mmc->priv;
  427. volatile struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
  428. int sdhc_clk = cfg->sdhc_clk;
  429. uint clk;
  430. if (clock < mmc->cfg->f_min)
  431. clock = mmc->cfg->f_min;
  432. if (sdhc_clk / 16 > clock) {
  433. for (pre_div = 2; pre_div < 256; pre_div *= 2)
  434. if ((sdhc_clk / pre_div) <= (clock * 16))
  435. break;
  436. } else
  437. pre_div = 2;
  438. for (div = 1; div <= 16; div++)
  439. if ((sdhc_clk / (div * pre_div)) <= clock)
  440. break;
  441. pre_div >>= mmc->ddr_mode ? 2 : 1;
  442. div -= 1;
  443. clk = (pre_div << 8) | (div << 4);
  444. #ifdef CONFIG_FSL_USDHC
  445. esdhc_setbits32(&regs->sysctl, SYSCTL_RSTA);
  446. #else
  447. esdhc_clrbits32(&regs->sysctl, SYSCTL_CKEN);
  448. #endif
  449. esdhc_clrsetbits32(&regs->sysctl, SYSCTL_CLOCK_MASK, clk);
  450. udelay(10000);
  451. #ifdef CONFIG_FSL_USDHC
  452. esdhc_clrbits32(&regs->sysctl, SYSCTL_RSTA);
  453. #else
  454. esdhc_setbits32(&regs->sysctl, SYSCTL_PEREN | SYSCTL_CKEN);
  455. #endif
  456. }
  457. #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
  458. static void esdhc_clock_control(struct mmc *mmc, bool enable)
  459. {
  460. struct fsl_esdhc_cfg *cfg = mmc->priv;
  461. struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
  462. u32 value;
  463. u32 time_out;
  464. value = esdhc_read32(&regs->sysctl);
  465. if (enable)
  466. value |= SYSCTL_CKEN;
  467. else
  468. value &= ~SYSCTL_CKEN;
  469. esdhc_write32(&regs->sysctl, value);
  470. time_out = 20;
  471. value = PRSSTAT_SDSTB;
  472. while (!(esdhc_read32(&regs->prsstat) & value)) {
  473. if (time_out == 0) {
  474. printf("fsl_esdhc: Internal clock never stabilised.\n");
  475. break;
  476. }
  477. time_out--;
  478. mdelay(1);
  479. }
  480. }
  481. #endif
  482. static void esdhc_set_ios(struct mmc *mmc)
  483. {
  484. struct fsl_esdhc_cfg *cfg = mmc->priv;
  485. struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
  486. #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
  487. /* Select to use peripheral clock */
  488. esdhc_clock_control(mmc, false);
  489. esdhc_setbits32(&regs->scr, ESDHCCTL_PCS);
  490. esdhc_clock_control(mmc, true);
  491. #endif
  492. /* Set the clock speed */
  493. set_sysctl(mmc, mmc->clock);
  494. /* Set the bus width */
  495. esdhc_clrbits32(&regs->proctl, PROCTL_DTW_4 | PROCTL_DTW_8);
  496. if (mmc->bus_width == 4)
  497. esdhc_setbits32(&regs->proctl, PROCTL_DTW_4);
  498. else if (mmc->bus_width == 8)
  499. esdhc_setbits32(&regs->proctl, PROCTL_DTW_8);
  500. }
  501. static int esdhc_init(struct mmc *mmc)
  502. {
  503. struct fsl_esdhc_cfg *cfg = mmc->priv;
  504. struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
  505. int timeout = 1000;
  506. /* Reset the entire host controller */
  507. esdhc_setbits32(&regs->sysctl, SYSCTL_RSTA);
  508. /* Wait until the controller is available */
  509. while ((esdhc_read32(&regs->sysctl) & SYSCTL_RSTA) && --timeout)
  510. udelay(1000);
  511. #ifndef ARCH_MXC
  512. /* Enable cache snooping */
  513. esdhc_write32(&regs->scr, 0x00000040);
  514. #endif
  515. #ifndef CONFIG_FSL_USDHC
  516. esdhc_setbits32(&regs->sysctl, SYSCTL_HCKEN | SYSCTL_IPGEN);
  517. #endif
  518. /* Set the initial clock speed */
  519. mmc_set_clock(mmc, 400000);
  520. /* Disable the BRR and BWR bits in IRQSTAT */
  521. esdhc_clrbits32(&regs->irqstaten, IRQSTATEN_BRR | IRQSTATEN_BWR);
  522. /* Put the PROCTL reg back to the default */
  523. esdhc_write32(&regs->proctl, PROCTL_INIT);
  524. /* Set timout to the maximum value */
  525. esdhc_clrsetbits32(&regs->sysctl, SYSCTL_TIMEOUT_MASK, 14 << 16);
  526. #ifdef CONFIG_SYS_FSL_ESDHC_FORCE_VSELECT
  527. esdhc_setbits32(&regs->vendorspec, ESDHC_VENDORSPEC_VSELECT);
  528. #endif
  529. return 0;
  530. }
  531. static int esdhc_getcd(struct mmc *mmc)
  532. {
  533. struct fsl_esdhc_cfg *cfg = mmc->priv;
  534. struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
  535. int timeout = 1000;
  536. #ifdef CONFIG_ESDHC_DETECT_QUIRK
  537. if (CONFIG_ESDHC_DETECT_QUIRK)
  538. return 1;
  539. #endif
  540. while (!(esdhc_read32(&regs->prsstat) & PRSSTAT_CINS) && --timeout)
  541. udelay(1000);
  542. return timeout > 0;
  543. }
  544. static void esdhc_reset(struct fsl_esdhc *regs)
  545. {
  546. unsigned long timeout = 100; /* wait max 100 ms */
  547. /* reset the controller */
  548. esdhc_setbits32(&regs->sysctl, SYSCTL_RSTA);
  549. /* hardware clears the bit when it is done */
  550. while ((esdhc_read32(&regs->sysctl) & SYSCTL_RSTA) && --timeout)
  551. udelay(1000);
  552. if (!timeout)
  553. printf("MMC/SD: Reset never completed.\n");
  554. }
  555. static const struct mmc_ops esdhc_ops = {
  556. .send_cmd = esdhc_send_cmd,
  557. .set_ios = esdhc_set_ios,
  558. .init = esdhc_init,
  559. .getcd = esdhc_getcd,
  560. };
  561. int fsl_esdhc_initialize(bd_t *bis, struct fsl_esdhc_cfg *cfg)
  562. {
  563. struct fsl_esdhc *regs;
  564. struct mmc *mmc;
  565. u32 caps, voltage_caps;
  566. if (!cfg)
  567. return -1;
  568. regs = (struct fsl_esdhc *)cfg->esdhc_base;
  569. /* First reset the eSDHC controller */
  570. esdhc_reset(regs);
  571. #ifndef CONFIG_FSL_USDHC
  572. esdhc_setbits32(&regs->sysctl, SYSCTL_PEREN | SYSCTL_HCKEN
  573. | SYSCTL_IPGEN | SYSCTL_CKEN);
  574. #endif
  575. writel(SDHCI_IRQ_EN_BITS, &regs->irqstaten);
  576. memset(&cfg->cfg, 0, sizeof(cfg->cfg));
  577. voltage_caps = 0;
  578. caps = esdhc_read32(&regs->hostcapblt);
  579. #ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC135
  580. caps = caps & ~(ESDHC_HOSTCAPBLT_SRS |
  581. ESDHC_HOSTCAPBLT_VS18 | ESDHC_HOSTCAPBLT_VS30);
  582. #endif
  583. /* T4240 host controller capabilities register should have VS33 bit */
  584. #ifdef CONFIG_SYS_FSL_MMC_HAS_CAPBLT_VS33
  585. caps = caps | ESDHC_HOSTCAPBLT_VS33;
  586. #endif
  587. if (caps & ESDHC_HOSTCAPBLT_VS18)
  588. voltage_caps |= MMC_VDD_165_195;
  589. if (caps & ESDHC_HOSTCAPBLT_VS30)
  590. voltage_caps |= MMC_VDD_29_30 | MMC_VDD_30_31;
  591. if (caps & ESDHC_HOSTCAPBLT_VS33)
  592. voltage_caps |= MMC_VDD_32_33 | MMC_VDD_33_34;
  593. cfg->cfg.name = "FSL_SDHC";
  594. cfg->cfg.ops = &esdhc_ops;
  595. #ifdef CONFIG_SYS_SD_VOLTAGE
  596. cfg->cfg.voltages = CONFIG_SYS_SD_VOLTAGE;
  597. #else
  598. cfg->cfg.voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
  599. #endif
  600. if ((cfg->cfg.voltages & voltage_caps) == 0) {
  601. printf("voltage not supported by controller\n");
  602. return -1;
  603. }
  604. cfg->cfg.host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
  605. #ifdef CONFIG_SYS_FSL_ESDHC_HAS_DDR_MODE
  606. cfg->cfg.host_caps |= MMC_MODE_DDR_52MHz;
  607. #endif
  608. if (cfg->max_bus_width > 0) {
  609. if (cfg->max_bus_width < 8)
  610. cfg->cfg.host_caps &= ~MMC_MODE_8BIT;
  611. if (cfg->max_bus_width < 4)
  612. cfg->cfg.host_caps &= ~MMC_MODE_4BIT;
  613. }
  614. if (caps & ESDHC_HOSTCAPBLT_HSS)
  615. cfg->cfg.host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
  616. #ifdef CONFIG_ESDHC_DETECT_8_BIT_QUIRK
  617. if (CONFIG_ESDHC_DETECT_8_BIT_QUIRK)
  618. cfg->cfg.host_caps &= ~MMC_MODE_8BIT;
  619. #endif
  620. cfg->cfg.f_min = 400000;
  621. cfg->cfg.f_max = min(cfg->sdhc_clk, (u32)52000000);
  622. cfg->cfg.b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
  623. mmc = mmc_create(&cfg->cfg, cfg);
  624. if (mmc == NULL)
  625. return -1;
  626. return 0;
  627. }
  628. int fsl_esdhc_mmc_init(bd_t *bis)
  629. {
  630. struct fsl_esdhc_cfg *cfg;
  631. cfg = calloc(sizeof(struct fsl_esdhc_cfg), 1);
  632. cfg->esdhc_base = CONFIG_SYS_FSL_ESDHC_ADDR;
  633. cfg->sdhc_clk = gd->arch.sdhc_clk;
  634. return fsl_esdhc_initialize(bis, cfg);
  635. }
  636. #ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
  637. void mmc_adapter_card_type_ident(void)
  638. {
  639. u8 card_id;
  640. u8 value;
  641. card_id = QIXIS_READ(present) & QIXIS_SDID_MASK;
  642. gd->arch.sdhc_adapter = card_id;
  643. switch (card_id) {
  644. case QIXIS_ESDHC_ADAPTER_TYPE_EMMC45:
  645. value = QIXIS_READ(brdcfg[5]);
  646. value |= (QIXIS_DAT4 | QIXIS_DAT5_6_7);
  647. QIXIS_WRITE(brdcfg[5], value);
  648. break;
  649. case QIXIS_ESDHC_ADAPTER_TYPE_SDMMC_LEGACY:
  650. value = QIXIS_READ(pwr_ctl[1]);
  651. value |= QIXIS_EVDD_BY_SDHC_VS;
  652. QIXIS_WRITE(pwr_ctl[1], value);
  653. break;
  654. case QIXIS_ESDHC_ADAPTER_TYPE_EMMC44:
  655. value = QIXIS_READ(brdcfg[5]);
  656. value |= (QIXIS_SDCLKIN | QIXIS_SDCLKOUT);
  657. QIXIS_WRITE(brdcfg[5], value);
  658. break;
  659. case QIXIS_ESDHC_ADAPTER_TYPE_RSV:
  660. break;
  661. case QIXIS_ESDHC_ADAPTER_TYPE_MMC:
  662. break;
  663. case QIXIS_ESDHC_ADAPTER_TYPE_SD:
  664. break;
  665. case QIXIS_ESDHC_NO_ADAPTER:
  666. break;
  667. default:
  668. break;
  669. }
  670. }
  671. #endif
  672. #ifdef CONFIG_OF_LIBFDT
  673. void fdt_fixup_esdhc(void *blob, bd_t *bd)
  674. {
  675. const char *compat = "fsl,esdhc";
  676. #ifdef CONFIG_FSL_ESDHC_PIN_MUX
  677. if (!hwconfig("esdhc")) {
  678. do_fixup_by_compat(blob, compat, "status", "disabled",
  679. 8 + 1, 1);
  680. return;
  681. }
  682. #endif
  683. #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
  684. do_fixup_by_compat_u32(blob, compat, "peripheral-frequency",
  685. gd->arch.sdhc_clk, 1);
  686. #else
  687. do_fixup_by_compat_u32(blob, compat, "clock-frequency",
  688. gd->arch.sdhc_clk, 1);
  689. #endif
  690. #ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
  691. do_fixup_by_compat_u32(blob, compat, "adapter-type",
  692. (u32)(gd->arch.sdhc_adapter), 1);
  693. #endif
  694. do_fixup_by_compat(blob, compat, "status", "okay",
  695. 4 + 1, 1);
  696. }
  697. #endif