omap_hsmmc.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842
  1. /*
  2. * (C) Copyright 2008
  3. * Texas Instruments, <www.ti.com>
  4. * Sukumar Ghorai <s-ghorai@ti.com>
  5. *
  6. * See file CREDITS for list of people who contributed to this
  7. * project.
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License as
  11. * published by the Free Software Foundation's version 2 of
  12. * the License.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  22. * MA 02111-1307 USA
  23. */
  24. #include <config.h>
  25. #include <common.h>
  26. #include <malloc.h>
  27. #include <mmc.h>
  28. #include <part.h>
  29. #include <i2c.h>
  30. #include <twl4030.h>
  31. #include <twl6030.h>
  32. #include <palmas.h>
  33. #include <asm/io.h>
  34. #include <asm/arch/mmc_host_def.h>
  35. #if !defined(CONFIG_SOC_KEYSTONE)
  36. #include <asm/gpio.h>
  37. #include <asm/arch/sys_proto.h>
  38. #endif
  39. #ifdef CONFIG_MMC_OMAP36XX_PINS
  40. #include <asm/arch/mux.h>
  41. #endif
  42. #include <dm.h>
  43. DECLARE_GLOBAL_DATA_PTR;
  44. /* simplify defines to OMAP_HSMMC_USE_GPIO */
  45. #if (defined(CONFIG_OMAP_GPIO) && !defined(CONFIG_SPL_BUILD)) || \
  46. (defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_GPIO_SUPPORT))
  47. #define OMAP_HSMMC_USE_GPIO
  48. #else
  49. #undef OMAP_HSMMC_USE_GPIO
  50. #endif
  51. /* common definitions for all OMAPs */
  52. #define SYSCTL_SRC (1 << 25)
  53. #define SYSCTL_SRD (1 << 26)
  54. struct omap_hsmmc_data {
  55. struct hsmmc *base_addr;
  56. struct mmc_config cfg;
  57. #ifdef OMAP_HSMMC_USE_GPIO
  58. #ifdef CONFIG_DM_MMC
  59. struct gpio_desc cd_gpio; /* Change Detect GPIO */
  60. struct gpio_desc wp_gpio; /* Write Protect GPIO */
  61. bool cd_inverted;
  62. #else
  63. int cd_gpio;
  64. int wp_gpio;
  65. #endif
  66. #endif
  67. };
  68. /* If we fail after 1 second wait, something is really bad */
  69. #define MAX_RETRY_MS 1000
  70. static int mmc_read_data(struct hsmmc *mmc_base, char *buf, unsigned int size);
  71. static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,
  72. unsigned int siz);
  73. static inline struct omap_hsmmc_data *omap_hsmmc_get_data(struct mmc *mmc)
  74. {
  75. #ifdef CONFIG_DM_MMC
  76. return dev_get_priv(mmc->dev);
  77. #else
  78. return (struct omap_hsmmc_data *)mmc->priv;
  79. #endif
  80. }
  81. #if defined(OMAP_HSMMC_USE_GPIO) && !defined(CONFIG_DM_MMC)
  82. static int omap_mmc_setup_gpio_in(int gpio, const char *label)
  83. {
  84. int ret;
  85. #ifndef CONFIG_DM_GPIO
  86. if (!gpio_is_valid(gpio))
  87. return -1;
  88. #endif
  89. ret = gpio_request(gpio, label);
  90. if (ret)
  91. return ret;
  92. ret = gpio_direction_input(gpio);
  93. if (ret)
  94. return ret;
  95. return gpio;
  96. }
  97. #endif
  98. static unsigned char mmc_board_init(struct mmc *mmc)
  99. {
  100. #if defined(CONFIG_OMAP34XX)
  101. t2_t *t2_base = (t2_t *)T2_BASE;
  102. struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
  103. u32 pbias_lite;
  104. #ifdef CONFIG_MMC_OMAP36XX_PINS
  105. u32 wkup_ctrl = readl(OMAP34XX_CTRL_WKUP_CTRL);
  106. #endif
  107. pbias_lite = readl(&t2_base->pbias_lite);
  108. pbias_lite &= ~(PBIASLITEPWRDNZ1 | PBIASLITEPWRDNZ0);
  109. #ifdef CONFIG_TARGET_OMAP3_CAIRO
  110. /* for cairo board, we need to set up 1.8 Volt bias level on MMC1 */
  111. pbias_lite &= ~PBIASLITEVMODE0;
  112. #endif
  113. #ifdef CONFIG_MMC_OMAP36XX_PINS
  114. if (get_cpu_family() == CPU_OMAP36XX) {
  115. /* Disable extended drain IO before changing PBIAS */
  116. wkup_ctrl &= ~OMAP34XX_CTRL_WKUP_CTRL_GPIO_IO_PWRDNZ;
  117. writel(wkup_ctrl, OMAP34XX_CTRL_WKUP_CTRL);
  118. }
  119. #endif
  120. writel(pbias_lite, &t2_base->pbias_lite);
  121. writel(pbias_lite | PBIASLITEPWRDNZ1 |
  122. PBIASSPEEDCTRL0 | PBIASLITEPWRDNZ0,
  123. &t2_base->pbias_lite);
  124. #ifdef CONFIG_MMC_OMAP36XX_PINS
  125. if (get_cpu_family() == CPU_OMAP36XX)
  126. /* Enable extended drain IO after changing PBIAS */
  127. writel(wkup_ctrl |
  128. OMAP34XX_CTRL_WKUP_CTRL_GPIO_IO_PWRDNZ,
  129. OMAP34XX_CTRL_WKUP_CTRL);
  130. #endif
  131. writel(readl(&t2_base->devconf0) | MMCSDIO1ADPCLKISEL,
  132. &t2_base->devconf0);
  133. writel(readl(&t2_base->devconf1) | MMCSDIO2ADPCLKISEL,
  134. &t2_base->devconf1);
  135. /* Change from default of 52MHz to 26MHz if necessary */
  136. if (!(mmc->cfg->host_caps & MMC_MODE_HS_52MHz))
  137. writel(readl(&t2_base->ctl_prog_io1) & ~CTLPROGIO1SPEEDCTRL,
  138. &t2_base->ctl_prog_io1);
  139. writel(readl(&prcm_base->fclken1_core) |
  140. EN_MMC1 | EN_MMC2 | EN_MMC3,
  141. &prcm_base->fclken1_core);
  142. writel(readl(&prcm_base->iclken1_core) |
  143. EN_MMC1 | EN_MMC2 | EN_MMC3,
  144. &prcm_base->iclken1_core);
  145. #endif
  146. #if defined(CONFIG_OMAP54XX) || defined(CONFIG_OMAP44XX)
  147. /* PBIAS config needed for MMC1 only */
  148. if (mmc->block_dev.devnum == 0)
  149. vmmc_pbias_config(LDO_VOLT_3V0);
  150. #endif
  151. return 0;
  152. }
  153. void mmc_init_stream(struct hsmmc *mmc_base)
  154. {
  155. ulong start;
  156. writel(readl(&mmc_base->con) | INIT_INITSTREAM, &mmc_base->con);
  157. writel(MMC_CMD0, &mmc_base->cmd);
  158. start = get_timer(0);
  159. while (!(readl(&mmc_base->stat) & CC_MASK)) {
  160. if (get_timer(0) - start > MAX_RETRY_MS) {
  161. printf("%s: timedout waiting for cc!\n", __func__);
  162. return;
  163. }
  164. }
  165. writel(CC_MASK, &mmc_base->stat)
  166. ;
  167. writel(MMC_CMD0, &mmc_base->cmd)
  168. ;
  169. start = get_timer(0);
  170. while (!(readl(&mmc_base->stat) & CC_MASK)) {
  171. if (get_timer(0) - start > MAX_RETRY_MS) {
  172. printf("%s: timedout waiting for cc2!\n", __func__);
  173. return;
  174. }
  175. }
  176. writel(readl(&mmc_base->con) & ~INIT_INITSTREAM, &mmc_base->con);
  177. }
  178. static int omap_hsmmc_init_setup(struct mmc *mmc)
  179. {
  180. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  181. struct hsmmc *mmc_base;
  182. unsigned int reg_val;
  183. unsigned int dsor;
  184. ulong start;
  185. mmc_base = priv->base_addr;
  186. mmc_board_init(mmc);
  187. writel(readl(&mmc_base->sysconfig) | MMC_SOFTRESET,
  188. &mmc_base->sysconfig);
  189. start = get_timer(0);
  190. while ((readl(&mmc_base->sysstatus) & RESETDONE) == 0) {
  191. if (get_timer(0) - start > MAX_RETRY_MS) {
  192. printf("%s: timedout waiting for cc2!\n", __func__);
  193. return -ETIMEDOUT;
  194. }
  195. }
  196. writel(readl(&mmc_base->sysctl) | SOFTRESETALL, &mmc_base->sysctl);
  197. start = get_timer(0);
  198. while ((readl(&mmc_base->sysctl) & SOFTRESETALL) != 0x0) {
  199. if (get_timer(0) - start > MAX_RETRY_MS) {
  200. printf("%s: timedout waiting for softresetall!\n",
  201. __func__);
  202. return -ETIMEDOUT;
  203. }
  204. }
  205. writel(DTW_1_BITMODE | SDBP_PWROFF | SDVS_3V0, &mmc_base->hctl);
  206. writel(readl(&mmc_base->capa) | VS30_3V0SUP | VS18_1V8SUP,
  207. &mmc_base->capa);
  208. reg_val = readl(&mmc_base->con) & RESERVED_MASK;
  209. writel(CTPL_MMC_SD | reg_val | WPP_ACTIVEHIGH | CDP_ACTIVEHIGH |
  210. MIT_CTO | DW8_1_4BITMODE | MODE_FUNC | STR_BLOCK |
  211. HR_NOHOSTRESP | INIT_NOINIT | NOOPENDRAIN, &mmc_base->con);
  212. dsor = 240;
  213. mmc_reg_out(&mmc_base->sysctl, (ICE_MASK | DTO_MASK | CEN_MASK),
  214. (ICE_STOP | DTO_15THDTO | CEN_DISABLE));
  215. mmc_reg_out(&mmc_base->sysctl, ICE_MASK | CLKD_MASK,
  216. (dsor << CLKD_OFFSET) | ICE_OSCILLATE);
  217. start = get_timer(0);
  218. while ((readl(&mmc_base->sysctl) & ICS_MASK) == ICS_NOTREADY) {
  219. if (get_timer(0) - start > MAX_RETRY_MS) {
  220. printf("%s: timedout waiting for ics!\n", __func__);
  221. return -ETIMEDOUT;
  222. }
  223. }
  224. writel(readl(&mmc_base->sysctl) | CEN_ENABLE, &mmc_base->sysctl);
  225. writel(readl(&mmc_base->hctl) | SDBP_PWRON, &mmc_base->hctl);
  226. writel(IE_BADA | IE_CERR | IE_DEB | IE_DCRC | IE_DTO | IE_CIE |
  227. IE_CEB | IE_CCRC | IE_CTO | IE_BRR | IE_BWR | IE_TC | IE_CC,
  228. &mmc_base->ie);
  229. mmc_init_stream(mmc_base);
  230. return 0;
  231. }
  232. /*
  233. * MMC controller internal finite state machine reset
  234. *
  235. * Used to reset command or data internal state machines, using respectively
  236. * SRC or SRD bit of SYSCTL register
  237. */
  238. static void mmc_reset_controller_fsm(struct hsmmc *mmc_base, u32 bit)
  239. {
  240. ulong start;
  241. mmc_reg_out(&mmc_base->sysctl, bit, bit);
  242. /*
  243. * CMD(DAT) lines reset procedures are slightly different
  244. * for OMAP3 and OMAP4(AM335x,OMAP5,DRA7xx).
  245. * According to OMAP3 TRM:
  246. * Set SRC(SRD) bit in MMCHS_SYSCTL register to 0x1 and wait until it
  247. * returns to 0x0.
  248. * According to OMAP4(AM335x,OMAP5,DRA7xx) TRMs, CMD(DATA) lines reset
  249. * procedure steps must be as follows:
  250. * 1. Initiate CMD(DAT) line reset by writing 0x1 to SRC(SRD) bit in
  251. * MMCHS_SYSCTL register (SD_SYSCTL for AM335x).
  252. * 2. Poll the SRC(SRD) bit until it is set to 0x1.
  253. * 3. Wait until the SRC (SRD) bit returns to 0x0
  254. * (reset procedure is completed).
  255. */
  256. #if defined(CONFIG_OMAP44XX) || defined(CONFIG_OMAP54XX) || \
  257. defined(CONFIG_AM33XX) || defined(CONFIG_AM43XX)
  258. if (!(readl(&mmc_base->sysctl) & bit)) {
  259. start = get_timer(0);
  260. while (!(readl(&mmc_base->sysctl) & bit)) {
  261. if (get_timer(0) - start > MAX_RETRY_MS)
  262. return;
  263. }
  264. }
  265. #endif
  266. start = get_timer(0);
  267. while ((readl(&mmc_base->sysctl) & bit) != 0) {
  268. if (get_timer(0) - start > MAX_RETRY_MS) {
  269. printf("%s: timedout waiting for sysctl %x to clear\n",
  270. __func__, bit);
  271. return;
  272. }
  273. }
  274. }
  275. static int omap_hsmmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
  276. struct mmc_data *data)
  277. {
  278. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  279. struct hsmmc *mmc_base;
  280. unsigned int flags, mmc_stat;
  281. ulong start;
  282. mmc_base = priv->base_addr;
  283. start = get_timer(0);
  284. while ((readl(&mmc_base->pstate) & (DATI_MASK | CMDI_MASK)) != 0) {
  285. if (get_timer(0) - start > MAX_RETRY_MS) {
  286. printf("%s: timedout waiting on cmd inhibit to clear\n",
  287. __func__);
  288. return -ETIMEDOUT;
  289. }
  290. }
  291. writel(0xFFFFFFFF, &mmc_base->stat);
  292. start = get_timer(0);
  293. while (readl(&mmc_base->stat)) {
  294. if (get_timer(0) - start > MAX_RETRY_MS) {
  295. printf("%s: timedout waiting for STAT (%x) to clear\n",
  296. __func__, readl(&mmc_base->stat));
  297. return -ETIMEDOUT;
  298. }
  299. }
  300. /*
  301. * CMDREG
  302. * CMDIDX[13:8] : Command index
  303. * DATAPRNT[5] : Data Present Select
  304. * ENCMDIDX[4] : Command Index Check Enable
  305. * ENCMDCRC[3] : Command CRC Check Enable
  306. * RSPTYP[1:0]
  307. * 00 = No Response
  308. * 01 = Length 136
  309. * 10 = Length 48
  310. * 11 = Length 48 Check busy after response
  311. */
  312. /* Delay added before checking the status of frq change
  313. * retry not supported by mmc.c(core file)
  314. */
  315. if (cmd->cmdidx == SD_CMD_APP_SEND_SCR)
  316. udelay(50000); /* wait 50 ms */
  317. if (!(cmd->resp_type & MMC_RSP_PRESENT))
  318. flags = 0;
  319. else if (cmd->resp_type & MMC_RSP_136)
  320. flags = RSP_TYPE_LGHT136 | CICE_NOCHECK;
  321. else if (cmd->resp_type & MMC_RSP_BUSY)
  322. flags = RSP_TYPE_LGHT48B;
  323. else
  324. flags = RSP_TYPE_LGHT48;
  325. /* enable default flags */
  326. flags = flags | (CMD_TYPE_NORMAL | CICE_NOCHECK | CCCE_NOCHECK |
  327. MSBS_SGLEBLK | ACEN_DISABLE | BCE_DISABLE | DE_DISABLE);
  328. if (cmd->resp_type & MMC_RSP_CRC)
  329. flags |= CCCE_CHECK;
  330. if (cmd->resp_type & MMC_RSP_OPCODE)
  331. flags |= CICE_CHECK;
  332. if (data) {
  333. if ((cmd->cmdidx == MMC_CMD_READ_MULTIPLE_BLOCK) ||
  334. (cmd->cmdidx == MMC_CMD_WRITE_MULTIPLE_BLOCK)) {
  335. flags |= (MSBS_MULTIBLK | BCE_ENABLE);
  336. data->blocksize = 512;
  337. writel(data->blocksize | (data->blocks << 16),
  338. &mmc_base->blk);
  339. } else
  340. writel(data->blocksize | NBLK_STPCNT, &mmc_base->blk);
  341. if (data->flags & MMC_DATA_READ)
  342. flags |= (DP_DATA | DDIR_READ);
  343. else
  344. flags |= (DP_DATA | DDIR_WRITE);
  345. }
  346. writel(cmd->cmdarg, &mmc_base->arg);
  347. udelay(20); /* To fix "No status update" error on eMMC */
  348. writel((cmd->cmdidx << 24) | flags, &mmc_base->cmd);
  349. start = get_timer(0);
  350. do {
  351. mmc_stat = readl(&mmc_base->stat);
  352. if (get_timer(0) - start > MAX_RETRY_MS) {
  353. printf("%s : timeout: No status update\n", __func__);
  354. return -ETIMEDOUT;
  355. }
  356. } while (!mmc_stat);
  357. if ((mmc_stat & IE_CTO) != 0) {
  358. mmc_reset_controller_fsm(mmc_base, SYSCTL_SRC);
  359. return -ETIMEDOUT;
  360. } else if ((mmc_stat & ERRI_MASK) != 0)
  361. return -1;
  362. if (mmc_stat & CC_MASK) {
  363. writel(CC_MASK, &mmc_base->stat);
  364. if (cmd->resp_type & MMC_RSP_PRESENT) {
  365. if (cmd->resp_type & MMC_RSP_136) {
  366. /* response type 2 */
  367. cmd->response[3] = readl(&mmc_base->rsp10);
  368. cmd->response[2] = readl(&mmc_base->rsp32);
  369. cmd->response[1] = readl(&mmc_base->rsp54);
  370. cmd->response[0] = readl(&mmc_base->rsp76);
  371. } else
  372. /* response types 1, 1b, 3, 4, 5, 6 */
  373. cmd->response[0] = readl(&mmc_base->rsp10);
  374. }
  375. }
  376. if (data && (data->flags & MMC_DATA_READ)) {
  377. mmc_read_data(mmc_base, data->dest,
  378. data->blocksize * data->blocks);
  379. } else if (data && (data->flags & MMC_DATA_WRITE)) {
  380. mmc_write_data(mmc_base, data->src,
  381. data->blocksize * data->blocks);
  382. }
  383. return 0;
  384. }
  385. static int mmc_read_data(struct hsmmc *mmc_base, char *buf, unsigned int size)
  386. {
  387. unsigned int *output_buf = (unsigned int *)buf;
  388. unsigned int mmc_stat;
  389. unsigned int count;
  390. /*
  391. * Start Polled Read
  392. */
  393. count = (size > MMCSD_SECTOR_SIZE) ? MMCSD_SECTOR_SIZE : size;
  394. count /= 4;
  395. while (size) {
  396. ulong start = get_timer(0);
  397. do {
  398. mmc_stat = readl(&mmc_base->stat);
  399. if (get_timer(0) - start > MAX_RETRY_MS) {
  400. printf("%s: timedout waiting for status!\n",
  401. __func__);
  402. return -ETIMEDOUT;
  403. }
  404. } while (mmc_stat == 0);
  405. if ((mmc_stat & (IE_DTO | IE_DCRC | IE_DEB)) != 0)
  406. mmc_reset_controller_fsm(mmc_base, SYSCTL_SRD);
  407. if ((mmc_stat & ERRI_MASK) != 0)
  408. return 1;
  409. if (mmc_stat & BRR_MASK) {
  410. unsigned int k;
  411. writel(readl(&mmc_base->stat) | BRR_MASK,
  412. &mmc_base->stat);
  413. for (k = 0; k < count; k++) {
  414. *output_buf = readl(&mmc_base->data);
  415. output_buf++;
  416. }
  417. size -= (count*4);
  418. }
  419. if (mmc_stat & BWR_MASK)
  420. writel(readl(&mmc_base->stat) | BWR_MASK,
  421. &mmc_base->stat);
  422. if (mmc_stat & TC_MASK) {
  423. writel(readl(&mmc_base->stat) | TC_MASK,
  424. &mmc_base->stat);
  425. break;
  426. }
  427. }
  428. return 0;
  429. }
  430. static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,
  431. unsigned int size)
  432. {
  433. unsigned int *input_buf = (unsigned int *)buf;
  434. unsigned int mmc_stat;
  435. unsigned int count;
  436. /*
  437. * Start Polled Write
  438. */
  439. count = (size > MMCSD_SECTOR_SIZE) ? MMCSD_SECTOR_SIZE : size;
  440. count /= 4;
  441. while (size) {
  442. ulong start = get_timer(0);
  443. do {
  444. mmc_stat = readl(&mmc_base->stat);
  445. if (get_timer(0) - start > MAX_RETRY_MS) {
  446. printf("%s: timedout waiting for status!\n",
  447. __func__);
  448. return -ETIMEDOUT;
  449. }
  450. } while (mmc_stat == 0);
  451. if ((mmc_stat & (IE_DTO | IE_DCRC | IE_DEB)) != 0)
  452. mmc_reset_controller_fsm(mmc_base, SYSCTL_SRD);
  453. if ((mmc_stat & ERRI_MASK) != 0)
  454. return 1;
  455. if (mmc_stat & BWR_MASK) {
  456. unsigned int k;
  457. writel(readl(&mmc_base->stat) | BWR_MASK,
  458. &mmc_base->stat);
  459. for (k = 0; k < count; k++) {
  460. writel(*input_buf, &mmc_base->data);
  461. input_buf++;
  462. }
  463. size -= (count*4);
  464. }
  465. if (mmc_stat & BRR_MASK)
  466. writel(readl(&mmc_base->stat) | BRR_MASK,
  467. &mmc_base->stat);
  468. if (mmc_stat & TC_MASK) {
  469. writel(readl(&mmc_base->stat) | TC_MASK,
  470. &mmc_base->stat);
  471. break;
  472. }
  473. }
  474. return 0;
  475. }
  476. static int omap_hsmmc_set_ios(struct mmc *mmc)
  477. {
  478. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  479. struct hsmmc *mmc_base;
  480. unsigned int dsor = 0;
  481. ulong start;
  482. mmc_base = priv->base_addr;
  483. /* configue bus width */
  484. switch (mmc->bus_width) {
  485. case 8:
  486. writel(readl(&mmc_base->con) | DTW_8_BITMODE,
  487. &mmc_base->con);
  488. break;
  489. case 4:
  490. writel(readl(&mmc_base->con) & ~DTW_8_BITMODE,
  491. &mmc_base->con);
  492. writel(readl(&mmc_base->hctl) | DTW_4_BITMODE,
  493. &mmc_base->hctl);
  494. break;
  495. case 1:
  496. default:
  497. writel(readl(&mmc_base->con) & ~DTW_8_BITMODE,
  498. &mmc_base->con);
  499. writel(readl(&mmc_base->hctl) & ~DTW_4_BITMODE,
  500. &mmc_base->hctl);
  501. break;
  502. }
  503. /* configure clock with 96Mhz system clock.
  504. */
  505. if (mmc->clock != 0) {
  506. dsor = (MMC_CLOCK_REFERENCE * 1000000 / mmc->clock);
  507. if ((MMC_CLOCK_REFERENCE * 1000000) / dsor > mmc->clock)
  508. dsor++;
  509. }
  510. mmc_reg_out(&mmc_base->sysctl, (ICE_MASK | DTO_MASK | CEN_MASK),
  511. (ICE_STOP | DTO_15THDTO | CEN_DISABLE));
  512. mmc_reg_out(&mmc_base->sysctl, ICE_MASK | CLKD_MASK,
  513. (dsor << CLKD_OFFSET) | ICE_OSCILLATE);
  514. start = get_timer(0);
  515. while ((readl(&mmc_base->sysctl) & ICS_MASK) == ICS_NOTREADY) {
  516. if (get_timer(0) - start > MAX_RETRY_MS) {
  517. printf("%s: timedout waiting for ics!\n", __func__);
  518. return -ETIMEDOUT;
  519. }
  520. }
  521. writel(readl(&mmc_base->sysctl) | CEN_ENABLE, &mmc_base->sysctl);
  522. return 0;
  523. }
  524. #ifdef OMAP_HSMMC_USE_GPIO
  525. #ifdef CONFIG_DM_MMC
  526. static int omap_hsmmc_getcd(struct mmc *mmc)
  527. {
  528. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  529. int value;
  530. value = dm_gpio_get_value(&priv->cd_gpio);
  531. /* if no CD return as 1 */
  532. if (value < 0)
  533. return 1;
  534. if (priv->cd_inverted)
  535. return !value;
  536. return value;
  537. }
  538. static int omap_hsmmc_getwp(struct mmc *mmc)
  539. {
  540. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  541. int value;
  542. value = dm_gpio_get_value(&priv->wp_gpio);
  543. /* if no WP return as 0 */
  544. if (value < 0)
  545. return 0;
  546. return value;
  547. }
  548. #else
  549. static int omap_hsmmc_getcd(struct mmc *mmc)
  550. {
  551. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  552. int cd_gpio;
  553. /* if no CD return as 1 */
  554. cd_gpio = priv->cd_gpio;
  555. if (cd_gpio < 0)
  556. return 1;
  557. /* NOTE: assumes card detect signal is active-low */
  558. return !gpio_get_value(cd_gpio);
  559. }
  560. static int omap_hsmmc_getwp(struct mmc *mmc)
  561. {
  562. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  563. int wp_gpio;
  564. /* if no WP return as 0 */
  565. wp_gpio = priv->wp_gpio;
  566. if (wp_gpio < 0)
  567. return 0;
  568. /* NOTE: assumes write protect signal is active-high */
  569. return gpio_get_value(wp_gpio);
  570. }
  571. #endif
  572. #endif
  573. static const struct mmc_ops omap_hsmmc_ops = {
  574. .send_cmd = omap_hsmmc_send_cmd,
  575. .set_ios = omap_hsmmc_set_ios,
  576. .init = omap_hsmmc_init_setup,
  577. #ifdef OMAP_HSMMC_USE_GPIO
  578. .getcd = omap_hsmmc_getcd,
  579. .getwp = omap_hsmmc_getwp,
  580. #endif
  581. };
  582. #ifndef CONFIG_DM_MMC
  583. int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,
  584. int wp_gpio)
  585. {
  586. struct mmc *mmc;
  587. struct omap_hsmmc_data *priv;
  588. struct mmc_config *cfg;
  589. uint host_caps_val;
  590. priv = malloc(sizeof(*priv));
  591. if (priv == NULL)
  592. return -1;
  593. host_caps_val = MMC_MODE_4BIT | MMC_MODE_HS_52MHz | MMC_MODE_HS;
  594. switch (dev_index) {
  595. case 0:
  596. priv->base_addr = (struct hsmmc *)OMAP_HSMMC1_BASE;
  597. break;
  598. #ifdef OMAP_HSMMC2_BASE
  599. case 1:
  600. priv->base_addr = (struct hsmmc *)OMAP_HSMMC2_BASE;
  601. #if (defined(CONFIG_OMAP44XX) || defined(CONFIG_OMAP54XX) || \
  602. defined(CONFIG_DRA7XX) || defined(CONFIG_AM33XX) || \
  603. defined(CONFIG_AM43XX) || defined(CONFIG_SOC_KEYSTONE)) && \
  604. defined(CONFIG_HSMMC2_8BIT)
  605. /* Enable 8-bit interface for eMMC on OMAP4/5 or DRA7XX */
  606. host_caps_val |= MMC_MODE_8BIT;
  607. #endif
  608. break;
  609. #endif
  610. #ifdef OMAP_HSMMC3_BASE
  611. case 2:
  612. priv->base_addr = (struct hsmmc *)OMAP_HSMMC3_BASE;
  613. #if defined(CONFIG_DRA7XX) && defined(CONFIG_HSMMC3_8BIT)
  614. /* Enable 8-bit interface for eMMC on DRA7XX */
  615. host_caps_val |= MMC_MODE_8BIT;
  616. #endif
  617. break;
  618. #endif
  619. default:
  620. priv->base_addr = (struct hsmmc *)OMAP_HSMMC1_BASE;
  621. return 1;
  622. }
  623. #ifdef OMAP_HSMMC_USE_GPIO
  624. /* on error gpio values are set to -1, which is what we want */
  625. priv->cd_gpio = omap_mmc_setup_gpio_in(cd_gpio, "mmc_cd");
  626. priv->wp_gpio = omap_mmc_setup_gpio_in(wp_gpio, "mmc_wp");
  627. #endif
  628. cfg = &priv->cfg;
  629. cfg->name = "OMAP SD/MMC";
  630. cfg->ops = &omap_hsmmc_ops;
  631. cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
  632. cfg->host_caps = host_caps_val & ~host_caps_mask;
  633. cfg->f_min = 400000;
  634. if (f_max != 0)
  635. cfg->f_max = f_max;
  636. else {
  637. if (cfg->host_caps & MMC_MODE_HS) {
  638. if (cfg->host_caps & MMC_MODE_HS_52MHz)
  639. cfg->f_max = 52000000;
  640. else
  641. cfg->f_max = 26000000;
  642. } else
  643. cfg->f_max = 20000000;
  644. }
  645. cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
  646. #if defined(CONFIG_OMAP34XX)
  647. /*
  648. * Silicon revs 2.1 and older do not support multiblock transfers.
  649. */
  650. if ((get_cpu_family() == CPU_OMAP34XX) && (get_cpu_rev() <= CPU_3XX_ES21))
  651. cfg->b_max = 1;
  652. #endif
  653. mmc = mmc_create(cfg, priv);
  654. if (mmc == NULL)
  655. return -1;
  656. return 0;
  657. }
  658. #else
  659. static int omap_hsmmc_ofdata_to_platdata(struct udevice *dev)
  660. {
  661. struct omap_hsmmc_data *priv = dev_get_priv(dev);
  662. const void *fdt = gd->fdt_blob;
  663. int node = dev_of_offset(dev);
  664. struct mmc_config *cfg;
  665. int val;
  666. priv->base_addr = map_physmem(dev_get_addr(dev), sizeof(struct hsmmc *),
  667. MAP_NOCACHE);
  668. cfg = &priv->cfg;
  669. cfg->host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS;
  670. val = fdtdec_get_int(fdt, node, "bus-width", -1);
  671. if (val < 0) {
  672. printf("error: bus-width property missing\n");
  673. return -ENOENT;
  674. }
  675. switch (val) {
  676. case 0x8:
  677. cfg->host_caps |= MMC_MODE_8BIT;
  678. case 0x4:
  679. cfg->host_caps |= MMC_MODE_4BIT;
  680. break;
  681. default:
  682. printf("error: invalid bus-width property\n");
  683. return -ENOENT;
  684. }
  685. cfg->f_min = 400000;
  686. cfg->f_max = fdtdec_get_int(fdt, node, "max-frequency", 52000000);
  687. cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
  688. cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
  689. #ifdef OMAP_HSMMC_USE_GPIO
  690. priv->cd_inverted = fdtdec_get_bool(fdt, node, "cd-inverted");
  691. #endif
  692. return 0;
  693. }
  694. static int omap_hsmmc_probe(struct udevice *dev)
  695. {
  696. struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
  697. struct omap_hsmmc_data *priv = dev_get_priv(dev);
  698. struct mmc_config *cfg;
  699. struct mmc *mmc;
  700. cfg = &priv->cfg;
  701. cfg->name = "OMAP SD/MMC";
  702. cfg->ops = &omap_hsmmc_ops;
  703. mmc = mmc_create(cfg, priv);
  704. if (mmc == NULL)
  705. return -1;
  706. #ifdef OMAP_HSMMC_USE_GPIO
  707. gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio, GPIOD_IS_IN);
  708. gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio, GPIOD_IS_IN);
  709. #endif
  710. mmc->dev = dev;
  711. upriv->mmc = mmc;
  712. return 0;
  713. }
  714. static const struct udevice_id omap_hsmmc_ids[] = {
  715. { .compatible = "ti,omap3-hsmmc" },
  716. { .compatible = "ti,omap4-hsmmc" },
  717. { .compatible = "ti,am33xx-hsmmc" },
  718. { }
  719. };
  720. U_BOOT_DRIVER(omap_hsmmc) = {
  721. .name = "omap_hsmmc",
  722. .id = UCLASS_MMC,
  723. .of_match = omap_hsmmc_ids,
  724. .ofdata_to_platdata = omap_hsmmc_ofdata_to_platdata,
  725. .probe = omap_hsmmc_probe,
  726. .priv_auto_alloc_size = sizeof(struct omap_hsmmc_data),
  727. };
  728. #endif