omap_hsmmc.c 28 KB

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