omap_hsmmc.c 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111
  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 <memalign.h>
  28. #include <mmc.h>
  29. #include <part.h>
  30. #include <i2c.h>
  31. #if defined(CONFIG_OMAP54XX) || defined(CONFIG_OMAP44XX)
  32. #include <palmas.h>
  33. #endif
  34. #include <asm/io.h>
  35. #include <asm/arch/mmc_host_def.h>
  36. #if !defined(CONFIG_SOC_KEYSTONE)
  37. #include <asm/gpio.h>
  38. #include <asm/arch/sys_proto.h>
  39. #endif
  40. #ifdef CONFIG_MMC_OMAP36XX_PINS
  41. #include <asm/arch/mux.h>
  42. #endif
  43. #include <dm.h>
  44. DECLARE_GLOBAL_DATA_PTR;
  45. /* simplify defines to OMAP_HSMMC_USE_GPIO */
  46. #if (defined(CONFIG_OMAP_GPIO) && !defined(CONFIG_SPL_BUILD)) || \
  47. (defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_GPIO_SUPPORT))
  48. #define OMAP_HSMMC_USE_GPIO
  49. #else
  50. #undef OMAP_HSMMC_USE_GPIO
  51. #endif
  52. /* common definitions for all OMAPs */
  53. #define SYSCTL_SRC (1 << 25)
  54. #define SYSCTL_SRD (1 << 26)
  55. struct omap_hsmmc_data {
  56. struct hsmmc *base_addr;
  57. #if !CONFIG_IS_ENABLED(DM_MMC)
  58. struct mmc_config cfg;
  59. #endif
  60. #ifdef OMAP_HSMMC_USE_GPIO
  61. #if CONFIG_IS_ENABLED(DM_MMC)
  62. struct gpio_desc cd_gpio; /* Change Detect GPIO */
  63. struct gpio_desc wp_gpio; /* Write Protect GPIO */
  64. bool cd_inverted;
  65. #else
  66. int cd_gpio;
  67. int wp_gpio;
  68. #endif
  69. #endif
  70. u8 controller_flags;
  71. #ifndef CONFIG_OMAP34XX
  72. struct omap_hsmmc_adma_desc *adma_desc_table;
  73. uint desc_slot;
  74. #endif
  75. };
  76. #ifndef CONFIG_OMAP34XX
  77. struct omap_hsmmc_adma_desc {
  78. u8 attr;
  79. u8 reserved;
  80. u16 len;
  81. u32 addr;
  82. };
  83. #define ADMA_MAX_LEN 63488
  84. /* Decriptor table defines */
  85. #define ADMA_DESC_ATTR_VALID BIT(0)
  86. #define ADMA_DESC_ATTR_END BIT(1)
  87. #define ADMA_DESC_ATTR_INT BIT(2)
  88. #define ADMA_DESC_ATTR_ACT1 BIT(4)
  89. #define ADMA_DESC_ATTR_ACT2 BIT(5)
  90. #define ADMA_DESC_TRANSFER_DATA ADMA_DESC_ATTR_ACT2
  91. #define ADMA_DESC_LINK_DESC (ADMA_DESC_ATTR_ACT1 | ADMA_DESC_ATTR_ACT2)
  92. #endif
  93. /* If we fail after 1 second wait, something is really bad */
  94. #define MAX_RETRY_MS 1000
  95. /* DMA transfers can take a long time if a lot a data is transferred.
  96. * The timeout must take in account the amount of data. Let's assume
  97. * that the time will never exceed 333 ms per MB (in other word we assume
  98. * that the bandwidth is always above 3MB/s).
  99. */
  100. #define DMA_TIMEOUT_PER_MB 333
  101. #define OMAP_HSMMC_USE_ADMA BIT(2)
  102. static int mmc_read_data(struct hsmmc *mmc_base, char *buf, unsigned int size);
  103. static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,
  104. unsigned int siz);
  105. static inline struct omap_hsmmc_data *omap_hsmmc_get_data(struct mmc *mmc)
  106. {
  107. #if CONFIG_IS_ENABLED(DM_MMC)
  108. return dev_get_priv(mmc->dev);
  109. #else
  110. return (struct omap_hsmmc_data *)mmc->priv;
  111. #endif
  112. }
  113. static inline struct mmc_config *omap_hsmmc_get_cfg(struct mmc *mmc)
  114. {
  115. #if CONFIG_IS_ENABLED(DM_MMC)
  116. struct omap_hsmmc_plat *plat = dev_get_platdata(mmc->dev);
  117. return &plat->cfg;
  118. #else
  119. return &((struct omap_hsmmc_data *)mmc->priv)->cfg;
  120. #endif
  121. }
  122. #if defined(OMAP_HSMMC_USE_GPIO) && !CONFIG_IS_ENABLED(DM_MMC)
  123. static int omap_mmc_setup_gpio_in(int gpio, const char *label)
  124. {
  125. int ret;
  126. #ifndef CONFIG_DM_GPIO
  127. if (!gpio_is_valid(gpio))
  128. return -1;
  129. #endif
  130. ret = gpio_request(gpio, label);
  131. if (ret)
  132. return ret;
  133. ret = gpio_direction_input(gpio);
  134. if (ret)
  135. return ret;
  136. return gpio;
  137. }
  138. #endif
  139. static unsigned char mmc_board_init(struct mmc *mmc)
  140. {
  141. #if defined(CONFIG_OMAP34XX)
  142. struct mmc_config *cfg = omap_hsmmc_get_cfg(mmc);
  143. t2_t *t2_base = (t2_t *)T2_BASE;
  144. struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
  145. u32 pbias_lite;
  146. #ifdef CONFIG_MMC_OMAP36XX_PINS
  147. u32 wkup_ctrl = readl(OMAP34XX_CTRL_WKUP_CTRL);
  148. #endif
  149. pbias_lite = readl(&t2_base->pbias_lite);
  150. pbias_lite &= ~(PBIASLITEPWRDNZ1 | PBIASLITEPWRDNZ0);
  151. #ifdef CONFIG_TARGET_OMAP3_CAIRO
  152. /* for cairo board, we need to set up 1.8 Volt bias level on MMC1 */
  153. pbias_lite &= ~PBIASLITEVMODE0;
  154. #endif
  155. #ifdef CONFIG_MMC_OMAP36XX_PINS
  156. if (get_cpu_family() == CPU_OMAP36XX) {
  157. /* Disable extended drain IO before changing PBIAS */
  158. wkup_ctrl &= ~OMAP34XX_CTRL_WKUP_CTRL_GPIO_IO_PWRDNZ;
  159. writel(wkup_ctrl, OMAP34XX_CTRL_WKUP_CTRL);
  160. }
  161. #endif
  162. writel(pbias_lite, &t2_base->pbias_lite);
  163. writel(pbias_lite | PBIASLITEPWRDNZ1 |
  164. PBIASSPEEDCTRL0 | PBIASLITEPWRDNZ0,
  165. &t2_base->pbias_lite);
  166. #ifdef CONFIG_MMC_OMAP36XX_PINS
  167. if (get_cpu_family() == CPU_OMAP36XX)
  168. /* Enable extended drain IO after changing PBIAS */
  169. writel(wkup_ctrl |
  170. OMAP34XX_CTRL_WKUP_CTRL_GPIO_IO_PWRDNZ,
  171. OMAP34XX_CTRL_WKUP_CTRL);
  172. #endif
  173. writel(readl(&t2_base->devconf0) | MMCSDIO1ADPCLKISEL,
  174. &t2_base->devconf0);
  175. writel(readl(&t2_base->devconf1) | MMCSDIO2ADPCLKISEL,
  176. &t2_base->devconf1);
  177. /* Change from default of 52MHz to 26MHz if necessary */
  178. if (!(cfg->host_caps & MMC_MODE_HS_52MHz))
  179. writel(readl(&t2_base->ctl_prog_io1) & ~CTLPROGIO1SPEEDCTRL,
  180. &t2_base->ctl_prog_io1);
  181. writel(readl(&prcm_base->fclken1_core) |
  182. EN_MMC1 | EN_MMC2 | EN_MMC3,
  183. &prcm_base->fclken1_core);
  184. writel(readl(&prcm_base->iclken1_core) |
  185. EN_MMC1 | EN_MMC2 | EN_MMC3,
  186. &prcm_base->iclken1_core);
  187. #endif
  188. #if defined(CONFIG_OMAP54XX) || defined(CONFIG_OMAP44XX)
  189. /* PBIAS config needed for MMC1 only */
  190. if (mmc_get_blk_desc(mmc)->devnum == 0)
  191. vmmc_pbias_config(LDO_VOLT_3V0);
  192. #endif
  193. return 0;
  194. }
  195. void mmc_init_stream(struct hsmmc *mmc_base)
  196. {
  197. ulong start;
  198. writel(readl(&mmc_base->con) | INIT_INITSTREAM, &mmc_base->con);
  199. writel(MMC_CMD0, &mmc_base->cmd);
  200. start = get_timer(0);
  201. while (!(readl(&mmc_base->stat) & CC_MASK)) {
  202. if (get_timer(0) - start > MAX_RETRY_MS) {
  203. printf("%s: timedout waiting for cc!\n", __func__);
  204. return;
  205. }
  206. }
  207. writel(CC_MASK, &mmc_base->stat)
  208. ;
  209. writel(MMC_CMD0, &mmc_base->cmd)
  210. ;
  211. start = get_timer(0);
  212. while (!(readl(&mmc_base->stat) & CC_MASK)) {
  213. if (get_timer(0) - start > MAX_RETRY_MS) {
  214. printf("%s: timedout waiting for cc2!\n", __func__);
  215. return;
  216. }
  217. }
  218. writel(readl(&mmc_base->con) & ~INIT_INITSTREAM, &mmc_base->con);
  219. }
  220. static int omap_hsmmc_init_setup(struct mmc *mmc)
  221. {
  222. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  223. struct hsmmc *mmc_base;
  224. unsigned int reg_val;
  225. unsigned int dsor;
  226. ulong start;
  227. mmc_base = priv->base_addr;
  228. mmc_board_init(mmc);
  229. writel(readl(&mmc_base->sysconfig) | MMC_SOFTRESET,
  230. &mmc_base->sysconfig);
  231. start = get_timer(0);
  232. while ((readl(&mmc_base->sysstatus) & RESETDONE) == 0) {
  233. if (get_timer(0) - start > MAX_RETRY_MS) {
  234. printf("%s: timedout waiting for cc2!\n", __func__);
  235. return -ETIMEDOUT;
  236. }
  237. }
  238. writel(readl(&mmc_base->sysctl) | SOFTRESETALL, &mmc_base->sysctl);
  239. start = get_timer(0);
  240. while ((readl(&mmc_base->sysctl) & SOFTRESETALL) != 0x0) {
  241. if (get_timer(0) - start > MAX_RETRY_MS) {
  242. printf("%s: timedout waiting for softresetall!\n",
  243. __func__);
  244. return -ETIMEDOUT;
  245. }
  246. }
  247. #ifndef CONFIG_OMAP34XX
  248. reg_val = readl(&mmc_base->hl_hwinfo);
  249. if (reg_val & MADMA_EN)
  250. priv->controller_flags |= OMAP_HSMMC_USE_ADMA;
  251. #endif
  252. writel(DTW_1_BITMODE | SDBP_PWROFF | SDVS_3V0, &mmc_base->hctl);
  253. writel(readl(&mmc_base->capa) | VS30_3V0SUP | VS18_1V8SUP,
  254. &mmc_base->capa);
  255. reg_val = readl(&mmc_base->con) & RESERVED_MASK;
  256. writel(CTPL_MMC_SD | reg_val | WPP_ACTIVEHIGH | CDP_ACTIVEHIGH |
  257. MIT_CTO | DW8_1_4BITMODE | MODE_FUNC | STR_BLOCK |
  258. HR_NOHOSTRESP | INIT_NOINIT | NOOPENDRAIN, &mmc_base->con);
  259. dsor = 240;
  260. mmc_reg_out(&mmc_base->sysctl, (ICE_MASK | DTO_MASK | CEN_MASK),
  261. (ICE_STOP | DTO_15THDTO));
  262. mmc_reg_out(&mmc_base->sysctl, ICE_MASK | CLKD_MASK,
  263. (dsor << CLKD_OFFSET) | ICE_OSCILLATE);
  264. start = get_timer(0);
  265. while ((readl(&mmc_base->sysctl) & ICS_MASK) == ICS_NOTREADY) {
  266. if (get_timer(0) - start > MAX_RETRY_MS) {
  267. printf("%s: timedout waiting for ics!\n", __func__);
  268. return -ETIMEDOUT;
  269. }
  270. }
  271. writel(readl(&mmc_base->sysctl) | CEN_ENABLE, &mmc_base->sysctl);
  272. writel(readl(&mmc_base->hctl) | SDBP_PWRON, &mmc_base->hctl);
  273. writel(IE_BADA | IE_CERR | IE_DEB | IE_DCRC | IE_DTO | IE_CIE |
  274. IE_CEB | IE_CCRC | IE_ADMAE | IE_CTO | IE_BRR | IE_BWR | IE_TC |
  275. IE_CC, &mmc_base->ie);
  276. mmc_init_stream(mmc_base);
  277. return 0;
  278. }
  279. /*
  280. * MMC controller internal finite state machine reset
  281. *
  282. * Used to reset command or data internal state machines, using respectively
  283. * SRC or SRD bit of SYSCTL register
  284. */
  285. static void mmc_reset_controller_fsm(struct hsmmc *mmc_base, u32 bit)
  286. {
  287. ulong start;
  288. mmc_reg_out(&mmc_base->sysctl, bit, bit);
  289. /*
  290. * CMD(DAT) lines reset procedures are slightly different
  291. * for OMAP3 and OMAP4(AM335x,OMAP5,DRA7xx).
  292. * According to OMAP3 TRM:
  293. * Set SRC(SRD) bit in MMCHS_SYSCTL register to 0x1 and wait until it
  294. * returns to 0x0.
  295. * According to OMAP4(AM335x,OMAP5,DRA7xx) TRMs, CMD(DATA) lines reset
  296. * procedure steps must be as follows:
  297. * 1. Initiate CMD(DAT) line reset by writing 0x1 to SRC(SRD) bit in
  298. * MMCHS_SYSCTL register (SD_SYSCTL for AM335x).
  299. * 2. Poll the SRC(SRD) bit until it is set to 0x1.
  300. * 3. Wait until the SRC (SRD) bit returns to 0x0
  301. * (reset procedure is completed).
  302. */
  303. #if defined(CONFIG_OMAP44XX) || defined(CONFIG_OMAP54XX) || \
  304. defined(CONFIG_AM33XX) || defined(CONFIG_AM43XX)
  305. if (!(readl(&mmc_base->sysctl) & bit)) {
  306. start = get_timer(0);
  307. while (!(readl(&mmc_base->sysctl) & bit)) {
  308. if (get_timer(0) - start > MAX_RETRY_MS)
  309. return;
  310. }
  311. }
  312. #endif
  313. start = get_timer(0);
  314. while ((readl(&mmc_base->sysctl) & bit) != 0) {
  315. if (get_timer(0) - start > MAX_RETRY_MS) {
  316. printf("%s: timedout waiting for sysctl %x to clear\n",
  317. __func__, bit);
  318. return;
  319. }
  320. }
  321. }
  322. #ifndef CONFIG_OMAP34XX
  323. static void omap_hsmmc_adma_desc(struct mmc *mmc, char *buf, u16 len, bool end)
  324. {
  325. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  326. struct omap_hsmmc_adma_desc *desc;
  327. u8 attr;
  328. desc = &priv->adma_desc_table[priv->desc_slot];
  329. attr = ADMA_DESC_ATTR_VALID | ADMA_DESC_TRANSFER_DATA;
  330. if (!end)
  331. priv->desc_slot++;
  332. else
  333. attr |= ADMA_DESC_ATTR_END;
  334. desc->len = len;
  335. desc->addr = (u32)buf;
  336. desc->reserved = 0;
  337. desc->attr = attr;
  338. }
  339. static void omap_hsmmc_prepare_adma_table(struct mmc *mmc,
  340. struct mmc_data *data)
  341. {
  342. uint total_len = data->blocksize * data->blocks;
  343. uint desc_count = DIV_ROUND_UP(total_len, ADMA_MAX_LEN);
  344. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  345. int i = desc_count;
  346. char *buf;
  347. priv->desc_slot = 0;
  348. priv->adma_desc_table = (struct omap_hsmmc_adma_desc *)
  349. memalign(ARCH_DMA_MINALIGN, desc_count *
  350. sizeof(struct omap_hsmmc_adma_desc));
  351. if (data->flags & MMC_DATA_READ)
  352. buf = data->dest;
  353. else
  354. buf = (char *)data->src;
  355. while (--i) {
  356. omap_hsmmc_adma_desc(mmc, buf, ADMA_MAX_LEN, false);
  357. buf += ADMA_MAX_LEN;
  358. total_len -= ADMA_MAX_LEN;
  359. }
  360. omap_hsmmc_adma_desc(mmc, buf, total_len, true);
  361. flush_dcache_range((long)priv->adma_desc_table,
  362. (long)priv->adma_desc_table +
  363. ROUND(desc_count *
  364. sizeof(struct omap_hsmmc_adma_desc),
  365. ARCH_DMA_MINALIGN));
  366. }
  367. static void omap_hsmmc_prepare_data(struct mmc *mmc, struct mmc_data *data)
  368. {
  369. struct hsmmc *mmc_base;
  370. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  371. u32 val;
  372. char *buf;
  373. mmc_base = priv->base_addr;
  374. omap_hsmmc_prepare_adma_table(mmc, data);
  375. if (data->flags & MMC_DATA_READ)
  376. buf = data->dest;
  377. else
  378. buf = (char *)data->src;
  379. val = readl(&mmc_base->hctl);
  380. val |= DMA_SELECT;
  381. writel(val, &mmc_base->hctl);
  382. val = readl(&mmc_base->con);
  383. val |= DMA_MASTER;
  384. writel(val, &mmc_base->con);
  385. writel((u32)priv->adma_desc_table, &mmc_base->admasal);
  386. flush_dcache_range((u32)buf,
  387. (u32)buf +
  388. ROUND(data->blocksize * data->blocks,
  389. ARCH_DMA_MINALIGN));
  390. }
  391. static void omap_hsmmc_dma_cleanup(struct mmc *mmc)
  392. {
  393. struct hsmmc *mmc_base;
  394. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  395. u32 val;
  396. mmc_base = priv->base_addr;
  397. val = readl(&mmc_base->con);
  398. val &= ~DMA_MASTER;
  399. writel(val, &mmc_base->con);
  400. val = readl(&mmc_base->hctl);
  401. val &= ~DMA_SELECT;
  402. writel(val, &mmc_base->hctl);
  403. kfree(priv->adma_desc_table);
  404. }
  405. #else
  406. #define omap_hsmmc_adma_desc
  407. #define omap_hsmmc_prepare_adma_table
  408. #define omap_hsmmc_prepare_data
  409. #define omap_hsmmc_dma_cleanup
  410. #endif
  411. #if !CONFIG_IS_ENABLED(DM_MMC)
  412. static int omap_hsmmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
  413. struct mmc_data *data)
  414. {
  415. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  416. #else
  417. static int omap_hsmmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
  418. struct mmc_data *data)
  419. {
  420. struct omap_hsmmc_data *priv = dev_get_priv(dev);
  421. #ifndef CONFIG_OMAP34XX
  422. struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
  423. struct mmc *mmc = upriv->mmc;
  424. #endif
  425. #endif
  426. struct hsmmc *mmc_base;
  427. unsigned int flags, mmc_stat;
  428. ulong start;
  429. mmc_base = priv->base_addr;
  430. if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION)
  431. return 0;
  432. start = get_timer(0);
  433. while ((readl(&mmc_base->pstate) & (DATI_MASK | CMDI_MASK)) != 0) {
  434. if (get_timer(0) - start > MAX_RETRY_MS) {
  435. printf("%s: timedout waiting on cmd inhibit to clear\n",
  436. __func__);
  437. return -ETIMEDOUT;
  438. }
  439. }
  440. writel(0xFFFFFFFF, &mmc_base->stat);
  441. start = get_timer(0);
  442. while (readl(&mmc_base->stat)) {
  443. if (get_timer(0) - start > MAX_RETRY_MS) {
  444. printf("%s: timedout waiting for STAT (%x) to clear\n",
  445. __func__, readl(&mmc_base->stat));
  446. return -ETIMEDOUT;
  447. }
  448. }
  449. /*
  450. * CMDREG
  451. * CMDIDX[13:8] : Command index
  452. * DATAPRNT[5] : Data Present Select
  453. * ENCMDIDX[4] : Command Index Check Enable
  454. * ENCMDCRC[3] : Command CRC Check Enable
  455. * RSPTYP[1:0]
  456. * 00 = No Response
  457. * 01 = Length 136
  458. * 10 = Length 48
  459. * 11 = Length 48 Check busy after response
  460. */
  461. /* Delay added before checking the status of frq change
  462. * retry not supported by mmc.c(core file)
  463. */
  464. if (cmd->cmdidx == SD_CMD_APP_SEND_SCR)
  465. udelay(50000); /* wait 50 ms */
  466. if (!(cmd->resp_type & MMC_RSP_PRESENT))
  467. flags = 0;
  468. else if (cmd->resp_type & MMC_RSP_136)
  469. flags = RSP_TYPE_LGHT136 | CICE_NOCHECK;
  470. else if (cmd->resp_type & MMC_RSP_BUSY)
  471. flags = RSP_TYPE_LGHT48B;
  472. else
  473. flags = RSP_TYPE_LGHT48;
  474. /* enable default flags */
  475. flags = flags | (CMD_TYPE_NORMAL | CICE_NOCHECK | CCCE_NOCHECK |
  476. MSBS_SGLEBLK);
  477. flags &= ~(ACEN_ENABLE | BCE_ENABLE | DE_ENABLE);
  478. if (cmd->resp_type & MMC_RSP_CRC)
  479. flags |= CCCE_CHECK;
  480. if (cmd->resp_type & MMC_RSP_OPCODE)
  481. flags |= CICE_CHECK;
  482. if (data) {
  483. if ((cmd->cmdidx == MMC_CMD_READ_MULTIPLE_BLOCK) ||
  484. (cmd->cmdidx == MMC_CMD_WRITE_MULTIPLE_BLOCK)) {
  485. flags |= (MSBS_MULTIBLK | BCE_ENABLE | ACEN_ENABLE);
  486. data->blocksize = 512;
  487. writel(data->blocksize | (data->blocks << 16),
  488. &mmc_base->blk);
  489. } else
  490. writel(data->blocksize | NBLK_STPCNT, &mmc_base->blk);
  491. if (data->flags & MMC_DATA_READ)
  492. flags |= (DP_DATA | DDIR_READ);
  493. else
  494. flags |= (DP_DATA | DDIR_WRITE);
  495. #ifndef CONFIG_OMAP34XX
  496. if ((priv->controller_flags & OMAP_HSMMC_USE_ADMA) &&
  497. !mmc_is_tuning_cmd(cmd->cmdidx)) {
  498. omap_hsmmc_prepare_data(mmc, data);
  499. flags |= DE_ENABLE;
  500. }
  501. #endif
  502. }
  503. writel(cmd->cmdarg, &mmc_base->arg);
  504. udelay(20); /* To fix "No status update" error on eMMC */
  505. writel((cmd->cmdidx << 24) | flags, &mmc_base->cmd);
  506. start = get_timer(0);
  507. do {
  508. mmc_stat = readl(&mmc_base->stat);
  509. if (get_timer(start) > MAX_RETRY_MS) {
  510. printf("%s : timeout: No status update\n", __func__);
  511. return -ETIMEDOUT;
  512. }
  513. } while (!mmc_stat);
  514. if ((mmc_stat & IE_CTO) != 0) {
  515. mmc_reset_controller_fsm(mmc_base, SYSCTL_SRC);
  516. return -ETIMEDOUT;
  517. } else if ((mmc_stat & ERRI_MASK) != 0)
  518. return -1;
  519. if (mmc_stat & CC_MASK) {
  520. writel(CC_MASK, &mmc_base->stat);
  521. if (cmd->resp_type & MMC_RSP_PRESENT) {
  522. if (cmd->resp_type & MMC_RSP_136) {
  523. /* response type 2 */
  524. cmd->response[3] = readl(&mmc_base->rsp10);
  525. cmd->response[2] = readl(&mmc_base->rsp32);
  526. cmd->response[1] = readl(&mmc_base->rsp54);
  527. cmd->response[0] = readl(&mmc_base->rsp76);
  528. } else
  529. /* response types 1, 1b, 3, 4, 5, 6 */
  530. cmd->response[0] = readl(&mmc_base->rsp10);
  531. }
  532. }
  533. #ifndef CONFIG_OMAP34XX
  534. if ((priv->controller_flags & OMAP_HSMMC_USE_ADMA) && data &&
  535. !mmc_is_tuning_cmd(cmd->cmdidx)) {
  536. u32 sz_mb, timeout;
  537. if (mmc_stat & IE_ADMAE) {
  538. omap_hsmmc_dma_cleanup(mmc);
  539. return -EIO;
  540. }
  541. sz_mb = DIV_ROUND_UP(data->blocksize * data->blocks, 1 << 20);
  542. timeout = sz_mb * DMA_TIMEOUT_PER_MB;
  543. if (timeout < MAX_RETRY_MS)
  544. timeout = MAX_RETRY_MS;
  545. start = get_timer(0);
  546. do {
  547. mmc_stat = readl(&mmc_base->stat);
  548. if (mmc_stat & TC_MASK) {
  549. writel(readl(&mmc_base->stat) | TC_MASK,
  550. &mmc_base->stat);
  551. break;
  552. }
  553. if (get_timer(start) > timeout) {
  554. printf("%s : DMA timeout: No status update\n",
  555. __func__);
  556. return -ETIMEDOUT;
  557. }
  558. } while (1);
  559. omap_hsmmc_dma_cleanup(mmc);
  560. return 0;
  561. }
  562. #endif
  563. if (data && (data->flags & MMC_DATA_READ)) {
  564. mmc_read_data(mmc_base, data->dest,
  565. data->blocksize * data->blocks);
  566. } else if (data && (data->flags & MMC_DATA_WRITE)) {
  567. mmc_write_data(mmc_base, data->src,
  568. data->blocksize * data->blocks);
  569. }
  570. return 0;
  571. }
  572. static int mmc_read_data(struct hsmmc *mmc_base, char *buf, unsigned int size)
  573. {
  574. unsigned int *output_buf = (unsigned int *)buf;
  575. unsigned int mmc_stat;
  576. unsigned int count;
  577. /*
  578. * Start Polled Read
  579. */
  580. count = (size > MMCSD_SECTOR_SIZE) ? MMCSD_SECTOR_SIZE : size;
  581. count /= 4;
  582. while (size) {
  583. ulong start = get_timer(0);
  584. do {
  585. mmc_stat = readl(&mmc_base->stat);
  586. if (get_timer(0) - start > MAX_RETRY_MS) {
  587. printf("%s: timedout waiting for status!\n",
  588. __func__);
  589. return -ETIMEDOUT;
  590. }
  591. } while (mmc_stat == 0);
  592. if ((mmc_stat & (IE_DTO | IE_DCRC | IE_DEB)) != 0)
  593. mmc_reset_controller_fsm(mmc_base, SYSCTL_SRD);
  594. if ((mmc_stat & ERRI_MASK) != 0)
  595. return 1;
  596. if (mmc_stat & BRR_MASK) {
  597. unsigned int k;
  598. writel(readl(&mmc_base->stat) | BRR_MASK,
  599. &mmc_base->stat);
  600. for (k = 0; k < count; k++) {
  601. *output_buf = readl(&mmc_base->data);
  602. output_buf++;
  603. }
  604. size -= (count*4);
  605. }
  606. if (mmc_stat & BWR_MASK)
  607. writel(readl(&mmc_base->stat) | BWR_MASK,
  608. &mmc_base->stat);
  609. if (mmc_stat & TC_MASK) {
  610. writel(readl(&mmc_base->stat) | TC_MASK,
  611. &mmc_base->stat);
  612. break;
  613. }
  614. }
  615. return 0;
  616. }
  617. static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,
  618. unsigned int size)
  619. {
  620. unsigned int *input_buf = (unsigned int *)buf;
  621. unsigned int mmc_stat;
  622. unsigned int count;
  623. /*
  624. * Start Polled Write
  625. */
  626. count = (size > MMCSD_SECTOR_SIZE) ? MMCSD_SECTOR_SIZE : size;
  627. count /= 4;
  628. while (size) {
  629. ulong start = get_timer(0);
  630. do {
  631. mmc_stat = readl(&mmc_base->stat);
  632. if (get_timer(0) - start > MAX_RETRY_MS) {
  633. printf("%s: timedout waiting for status!\n",
  634. __func__);
  635. return -ETIMEDOUT;
  636. }
  637. } while (mmc_stat == 0);
  638. if ((mmc_stat & (IE_DTO | IE_DCRC | IE_DEB)) != 0)
  639. mmc_reset_controller_fsm(mmc_base, SYSCTL_SRD);
  640. if ((mmc_stat & ERRI_MASK) != 0)
  641. return 1;
  642. if (mmc_stat & BWR_MASK) {
  643. unsigned int k;
  644. writel(readl(&mmc_base->stat) | BWR_MASK,
  645. &mmc_base->stat);
  646. for (k = 0; k < count; k++) {
  647. writel(*input_buf, &mmc_base->data);
  648. input_buf++;
  649. }
  650. size -= (count*4);
  651. }
  652. if (mmc_stat & BRR_MASK)
  653. writel(readl(&mmc_base->stat) | BRR_MASK,
  654. &mmc_base->stat);
  655. if (mmc_stat & TC_MASK) {
  656. writel(readl(&mmc_base->stat) | TC_MASK,
  657. &mmc_base->stat);
  658. break;
  659. }
  660. }
  661. return 0;
  662. }
  663. #if !CONFIG_IS_ENABLED(DM_MMC)
  664. static int omap_hsmmc_set_ios(struct mmc *mmc)
  665. {
  666. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  667. #else
  668. static int omap_hsmmc_set_ios(struct udevice *dev)
  669. {
  670. struct omap_hsmmc_data *priv = dev_get_priv(dev);
  671. struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
  672. struct mmc *mmc = upriv->mmc;
  673. #endif
  674. struct hsmmc *mmc_base;
  675. unsigned int dsor = 0;
  676. ulong start;
  677. mmc_base = priv->base_addr;
  678. /* configue bus width */
  679. switch (mmc->bus_width) {
  680. case 8:
  681. writel(readl(&mmc_base->con) | DTW_8_BITMODE,
  682. &mmc_base->con);
  683. break;
  684. case 4:
  685. writel(readl(&mmc_base->con) & ~DTW_8_BITMODE,
  686. &mmc_base->con);
  687. writel(readl(&mmc_base->hctl) | DTW_4_BITMODE,
  688. &mmc_base->hctl);
  689. break;
  690. case 1:
  691. default:
  692. writel(readl(&mmc_base->con) & ~DTW_8_BITMODE,
  693. &mmc_base->con);
  694. writel(readl(&mmc_base->hctl) & ~DTW_4_BITMODE,
  695. &mmc_base->hctl);
  696. break;
  697. }
  698. /* configure clock with 96Mhz system clock.
  699. */
  700. if (mmc->clock != 0) {
  701. dsor = (MMC_CLOCK_REFERENCE * 1000000 / mmc->clock);
  702. if ((MMC_CLOCK_REFERENCE * 1000000) / dsor > mmc->clock)
  703. dsor++;
  704. }
  705. mmc_reg_out(&mmc_base->sysctl, (ICE_MASK | DTO_MASK | CEN_MASK),
  706. (ICE_STOP | DTO_15THDTO));
  707. mmc_reg_out(&mmc_base->sysctl, ICE_MASK | CLKD_MASK,
  708. (dsor << CLKD_OFFSET) | ICE_OSCILLATE);
  709. start = get_timer(0);
  710. while ((readl(&mmc_base->sysctl) & ICS_MASK) == ICS_NOTREADY) {
  711. if (get_timer(0) - start > MAX_RETRY_MS) {
  712. printf("%s: timedout waiting for ics!\n", __func__);
  713. return -ETIMEDOUT;
  714. }
  715. }
  716. writel(readl(&mmc_base->sysctl) | CEN_ENABLE, &mmc_base->sysctl);
  717. return 0;
  718. }
  719. #ifdef OMAP_HSMMC_USE_GPIO
  720. #if CONFIG_IS_ENABLED(DM_MMC)
  721. static int omap_hsmmc_getcd(struct udevice *dev)
  722. {
  723. struct omap_hsmmc_data *priv = dev_get_priv(dev);
  724. int value;
  725. value = dm_gpio_get_value(&priv->cd_gpio);
  726. /* if no CD return as 1 */
  727. if (value < 0)
  728. return 1;
  729. if (priv->cd_inverted)
  730. return !value;
  731. return value;
  732. }
  733. static int omap_hsmmc_getwp(struct udevice *dev)
  734. {
  735. struct omap_hsmmc_data *priv = dev_get_priv(dev);
  736. int value;
  737. value = dm_gpio_get_value(&priv->wp_gpio);
  738. /* if no WP return as 0 */
  739. if (value < 0)
  740. return 0;
  741. return value;
  742. }
  743. #else
  744. static int omap_hsmmc_getcd(struct mmc *mmc)
  745. {
  746. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  747. int cd_gpio;
  748. /* if no CD return as 1 */
  749. cd_gpio = priv->cd_gpio;
  750. if (cd_gpio < 0)
  751. return 1;
  752. /* NOTE: assumes card detect signal is active-low */
  753. return !gpio_get_value(cd_gpio);
  754. }
  755. static int omap_hsmmc_getwp(struct mmc *mmc)
  756. {
  757. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  758. int wp_gpio;
  759. /* if no WP return as 0 */
  760. wp_gpio = priv->wp_gpio;
  761. if (wp_gpio < 0)
  762. return 0;
  763. /* NOTE: assumes write protect signal is active-high */
  764. return gpio_get_value(wp_gpio);
  765. }
  766. #endif
  767. #endif
  768. #if CONFIG_IS_ENABLED(DM_MMC)
  769. static const struct dm_mmc_ops omap_hsmmc_ops = {
  770. .send_cmd = omap_hsmmc_send_cmd,
  771. .set_ios = omap_hsmmc_set_ios,
  772. #ifdef OMAP_HSMMC_USE_GPIO
  773. .get_cd = omap_hsmmc_getcd,
  774. .get_wp = omap_hsmmc_getwp,
  775. #endif
  776. };
  777. #else
  778. static const struct mmc_ops omap_hsmmc_ops = {
  779. .send_cmd = omap_hsmmc_send_cmd,
  780. .set_ios = omap_hsmmc_set_ios,
  781. .init = omap_hsmmc_init_setup,
  782. #ifdef OMAP_HSMMC_USE_GPIO
  783. .getcd = omap_hsmmc_getcd,
  784. .getwp = omap_hsmmc_getwp,
  785. #endif
  786. };
  787. #endif
  788. #if !CONFIG_IS_ENABLED(DM_MMC)
  789. int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,
  790. int wp_gpio)
  791. {
  792. struct mmc *mmc;
  793. struct omap_hsmmc_data *priv;
  794. struct mmc_config *cfg;
  795. uint host_caps_val;
  796. priv = malloc(sizeof(*priv));
  797. if (priv == NULL)
  798. return -1;
  799. host_caps_val = MMC_MODE_4BIT | MMC_MODE_HS_52MHz | MMC_MODE_HS;
  800. switch (dev_index) {
  801. case 0:
  802. priv->base_addr = (struct hsmmc *)OMAP_HSMMC1_BASE;
  803. break;
  804. #ifdef OMAP_HSMMC2_BASE
  805. case 1:
  806. priv->base_addr = (struct hsmmc *)OMAP_HSMMC2_BASE;
  807. #if (defined(CONFIG_OMAP44XX) || defined(CONFIG_OMAP54XX) || \
  808. defined(CONFIG_DRA7XX) || defined(CONFIG_AM33XX) || \
  809. defined(CONFIG_AM43XX) || defined(CONFIG_SOC_KEYSTONE)) && \
  810. defined(CONFIG_HSMMC2_8BIT)
  811. /* Enable 8-bit interface for eMMC on OMAP4/5 or DRA7XX */
  812. host_caps_val |= MMC_MODE_8BIT;
  813. #endif
  814. break;
  815. #endif
  816. #ifdef OMAP_HSMMC3_BASE
  817. case 2:
  818. priv->base_addr = (struct hsmmc *)OMAP_HSMMC3_BASE;
  819. #if defined(CONFIG_DRA7XX) && defined(CONFIG_HSMMC3_8BIT)
  820. /* Enable 8-bit interface for eMMC on DRA7XX */
  821. host_caps_val |= MMC_MODE_8BIT;
  822. #endif
  823. break;
  824. #endif
  825. default:
  826. priv->base_addr = (struct hsmmc *)OMAP_HSMMC1_BASE;
  827. return 1;
  828. }
  829. #ifdef OMAP_HSMMC_USE_GPIO
  830. /* on error gpio values are set to -1, which is what we want */
  831. priv->cd_gpio = omap_mmc_setup_gpio_in(cd_gpio, "mmc_cd");
  832. priv->wp_gpio = omap_mmc_setup_gpio_in(wp_gpio, "mmc_wp");
  833. #endif
  834. cfg = &priv->cfg;
  835. cfg->name = "OMAP SD/MMC";
  836. cfg->ops = &omap_hsmmc_ops;
  837. cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
  838. cfg->host_caps = host_caps_val & ~host_caps_mask;
  839. cfg->f_min = 400000;
  840. if (f_max != 0)
  841. cfg->f_max = f_max;
  842. else {
  843. if (cfg->host_caps & MMC_MODE_HS) {
  844. if (cfg->host_caps & MMC_MODE_HS_52MHz)
  845. cfg->f_max = 52000000;
  846. else
  847. cfg->f_max = 26000000;
  848. } else
  849. cfg->f_max = 20000000;
  850. }
  851. cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
  852. #if defined(CONFIG_OMAP34XX)
  853. /*
  854. * Silicon revs 2.1 and older do not support multiblock transfers.
  855. */
  856. if ((get_cpu_family() == CPU_OMAP34XX) && (get_cpu_rev() <= CPU_3XX_ES21))
  857. cfg->b_max = 1;
  858. #endif
  859. mmc = mmc_create(cfg, priv);
  860. if (mmc == NULL)
  861. return -1;
  862. return 0;
  863. }
  864. #else
  865. #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
  866. static int omap_hsmmc_ofdata_to_platdata(struct udevice *dev)
  867. {
  868. struct omap_hsmmc_plat *plat = dev_get_platdata(dev);
  869. struct mmc_config *cfg = &plat->cfg;
  870. const void *fdt = gd->fdt_blob;
  871. int node = dev_of_offset(dev);
  872. int val;
  873. plat->base_addr = map_physmem(devfdt_get_addr(dev),
  874. sizeof(struct hsmmc *),
  875. MAP_NOCACHE);
  876. cfg->host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS;
  877. val = fdtdec_get_int(fdt, node, "bus-width", -1);
  878. if (val < 0) {
  879. printf("error: bus-width property missing\n");
  880. return -ENOENT;
  881. }
  882. switch (val) {
  883. case 0x8:
  884. cfg->host_caps |= MMC_MODE_8BIT;
  885. case 0x4:
  886. cfg->host_caps |= MMC_MODE_4BIT;
  887. break;
  888. default:
  889. printf("error: invalid bus-width property\n");
  890. return -ENOENT;
  891. }
  892. cfg->f_min = 400000;
  893. cfg->f_max = fdtdec_get_int(fdt, node, "max-frequency", 52000000);
  894. cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
  895. cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
  896. #ifdef OMAP_HSMMC_USE_GPIO
  897. plat->cd_inverted = fdtdec_get_bool(fdt, node, "cd-inverted");
  898. #endif
  899. return 0;
  900. }
  901. #endif
  902. #ifdef CONFIG_BLK
  903. static int omap_hsmmc_bind(struct udevice *dev)
  904. {
  905. struct omap_hsmmc_plat *plat = dev_get_platdata(dev);
  906. return mmc_bind(dev, &plat->mmc, &plat->cfg);
  907. }
  908. #endif
  909. static int omap_hsmmc_probe(struct udevice *dev)
  910. {
  911. struct omap_hsmmc_plat *plat = dev_get_platdata(dev);
  912. struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
  913. struct omap_hsmmc_data *priv = dev_get_priv(dev);
  914. struct mmc_config *cfg = &plat->cfg;
  915. struct mmc *mmc;
  916. cfg->name = "OMAP SD/MMC";
  917. priv->base_addr = plat->base_addr;
  918. #ifdef OMAP_HSMMC_USE_GPIO
  919. priv->cd_inverted = plat->cd_inverted;
  920. #endif
  921. #ifdef CONFIG_BLK
  922. mmc = &plat->mmc;
  923. #else
  924. mmc = mmc_create(cfg, priv);
  925. if (mmc == NULL)
  926. return -1;
  927. #endif
  928. #if defined(OMAP_HSMMC_USE_GPIO) && CONFIG_IS_ENABLED(OF_CONTROL)
  929. gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio, GPIOD_IS_IN);
  930. gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio, GPIOD_IS_IN);
  931. #endif
  932. mmc->dev = dev;
  933. upriv->mmc = mmc;
  934. return omap_hsmmc_init_setup(mmc);
  935. }
  936. #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
  937. static const struct udevice_id omap_hsmmc_ids[] = {
  938. { .compatible = "ti,omap3-hsmmc" },
  939. { .compatible = "ti,omap4-hsmmc" },
  940. { .compatible = "ti,am33xx-hsmmc" },
  941. { }
  942. };
  943. #endif
  944. U_BOOT_DRIVER(omap_hsmmc) = {
  945. .name = "omap_hsmmc",
  946. .id = UCLASS_MMC,
  947. #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
  948. .of_match = omap_hsmmc_ids,
  949. .ofdata_to_platdata = omap_hsmmc_ofdata_to_platdata,
  950. .platdata_auto_alloc_size = sizeof(struct omap_hsmmc_plat),
  951. #endif
  952. #ifdef CONFIG_BLK
  953. .bind = omap_hsmmc_bind,
  954. #endif
  955. .ops = &omap_hsmmc_ops,
  956. .probe = omap_hsmmc_probe,
  957. .priv_auto_alloc_size = sizeof(struct omap_hsmmc_data),
  958. .flags = DM_FLAG_PRE_RELOC,
  959. };
  960. #endif