omap_hsmmc.c 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106
  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 | CEN_DISABLE));
  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. start = get_timer(0);
  431. while ((readl(&mmc_base->pstate) & (DATI_MASK | CMDI_MASK)) != 0) {
  432. if (get_timer(0) - start > MAX_RETRY_MS) {
  433. printf("%s: timedout waiting on cmd inhibit to clear\n",
  434. __func__);
  435. return -ETIMEDOUT;
  436. }
  437. }
  438. writel(0xFFFFFFFF, &mmc_base->stat);
  439. start = get_timer(0);
  440. while (readl(&mmc_base->stat)) {
  441. if (get_timer(0) - start > MAX_RETRY_MS) {
  442. printf("%s: timedout waiting for STAT (%x) to clear\n",
  443. __func__, readl(&mmc_base->stat));
  444. return -ETIMEDOUT;
  445. }
  446. }
  447. /*
  448. * CMDREG
  449. * CMDIDX[13:8] : Command index
  450. * DATAPRNT[5] : Data Present Select
  451. * ENCMDIDX[4] : Command Index Check Enable
  452. * ENCMDCRC[3] : Command CRC Check Enable
  453. * RSPTYP[1:0]
  454. * 00 = No Response
  455. * 01 = Length 136
  456. * 10 = Length 48
  457. * 11 = Length 48 Check busy after response
  458. */
  459. /* Delay added before checking the status of frq change
  460. * retry not supported by mmc.c(core file)
  461. */
  462. if (cmd->cmdidx == SD_CMD_APP_SEND_SCR)
  463. udelay(50000); /* wait 50 ms */
  464. if (!(cmd->resp_type & MMC_RSP_PRESENT))
  465. flags = 0;
  466. else if (cmd->resp_type & MMC_RSP_136)
  467. flags = RSP_TYPE_LGHT136 | CICE_NOCHECK;
  468. else if (cmd->resp_type & MMC_RSP_BUSY)
  469. flags = RSP_TYPE_LGHT48B;
  470. else
  471. flags = RSP_TYPE_LGHT48;
  472. /* enable default flags */
  473. flags = flags | (CMD_TYPE_NORMAL | CICE_NOCHECK | CCCE_NOCHECK |
  474. MSBS_SGLEBLK | ACEN_DISABLE | BCE_DISABLE | DE_DISABLE);
  475. if (cmd->resp_type & MMC_RSP_CRC)
  476. flags |= CCCE_CHECK;
  477. if (cmd->resp_type & MMC_RSP_OPCODE)
  478. flags |= CICE_CHECK;
  479. if (data) {
  480. if ((cmd->cmdidx == MMC_CMD_READ_MULTIPLE_BLOCK) ||
  481. (cmd->cmdidx == MMC_CMD_WRITE_MULTIPLE_BLOCK)) {
  482. flags |= (MSBS_MULTIBLK | BCE_ENABLE);
  483. data->blocksize = 512;
  484. writel(data->blocksize | (data->blocks << 16),
  485. &mmc_base->blk);
  486. } else
  487. writel(data->blocksize | NBLK_STPCNT, &mmc_base->blk);
  488. if (data->flags & MMC_DATA_READ)
  489. flags |= (DP_DATA | DDIR_READ);
  490. else
  491. flags |= (DP_DATA | DDIR_WRITE);
  492. #ifndef CONFIG_OMAP34XX
  493. if ((priv->controller_flags & OMAP_HSMMC_USE_ADMA) &&
  494. !mmc_is_tuning_cmd(cmd->cmdidx)) {
  495. omap_hsmmc_prepare_data(mmc, data);
  496. flags |= DE_ENABLE;
  497. }
  498. #endif
  499. }
  500. writel(cmd->cmdarg, &mmc_base->arg);
  501. udelay(20); /* To fix "No status update" error on eMMC */
  502. writel((cmd->cmdidx << 24) | flags, &mmc_base->cmd);
  503. start = get_timer(0);
  504. do {
  505. mmc_stat = readl(&mmc_base->stat);
  506. if (get_timer(start) > MAX_RETRY_MS) {
  507. printf("%s : timeout: No status update\n", __func__);
  508. return -ETIMEDOUT;
  509. }
  510. } while (!mmc_stat);
  511. if ((mmc_stat & IE_CTO) != 0) {
  512. mmc_reset_controller_fsm(mmc_base, SYSCTL_SRC);
  513. return -ETIMEDOUT;
  514. } else if ((mmc_stat & ERRI_MASK) != 0)
  515. return -1;
  516. if (mmc_stat & CC_MASK) {
  517. writel(CC_MASK, &mmc_base->stat);
  518. if (cmd->resp_type & MMC_RSP_PRESENT) {
  519. if (cmd->resp_type & MMC_RSP_136) {
  520. /* response type 2 */
  521. cmd->response[3] = readl(&mmc_base->rsp10);
  522. cmd->response[2] = readl(&mmc_base->rsp32);
  523. cmd->response[1] = readl(&mmc_base->rsp54);
  524. cmd->response[0] = readl(&mmc_base->rsp76);
  525. } else
  526. /* response types 1, 1b, 3, 4, 5, 6 */
  527. cmd->response[0] = readl(&mmc_base->rsp10);
  528. }
  529. }
  530. #ifndef CONFIG_OMAP34XX
  531. if ((priv->controller_flags & OMAP_HSMMC_USE_ADMA) && data &&
  532. !mmc_is_tuning_cmd(cmd->cmdidx)) {
  533. u32 sz_mb, timeout;
  534. if (mmc_stat & IE_ADMAE) {
  535. omap_hsmmc_dma_cleanup(mmc);
  536. return -EIO;
  537. }
  538. sz_mb = DIV_ROUND_UP(data->blocksize * data->blocks, 1 << 20);
  539. timeout = sz_mb * DMA_TIMEOUT_PER_MB;
  540. if (timeout < MAX_RETRY_MS)
  541. timeout = MAX_RETRY_MS;
  542. start = get_timer(0);
  543. do {
  544. mmc_stat = readl(&mmc_base->stat);
  545. if (mmc_stat & TC_MASK) {
  546. writel(readl(&mmc_base->stat) | TC_MASK,
  547. &mmc_base->stat);
  548. break;
  549. }
  550. if (get_timer(start) > timeout) {
  551. printf("%s : DMA timeout: No status update\n",
  552. __func__);
  553. return -ETIMEDOUT;
  554. }
  555. } while (1);
  556. omap_hsmmc_dma_cleanup(mmc);
  557. return 0;
  558. }
  559. #endif
  560. if (data && (data->flags & MMC_DATA_READ)) {
  561. mmc_read_data(mmc_base, data->dest,
  562. data->blocksize * data->blocks);
  563. } else if (data && (data->flags & MMC_DATA_WRITE)) {
  564. mmc_write_data(mmc_base, data->src,
  565. data->blocksize * data->blocks);
  566. }
  567. return 0;
  568. }
  569. static int mmc_read_data(struct hsmmc *mmc_base, char *buf, unsigned int size)
  570. {
  571. unsigned int *output_buf = (unsigned int *)buf;
  572. unsigned int mmc_stat;
  573. unsigned int count;
  574. /*
  575. * Start Polled Read
  576. */
  577. count = (size > MMCSD_SECTOR_SIZE) ? MMCSD_SECTOR_SIZE : size;
  578. count /= 4;
  579. while (size) {
  580. ulong start = get_timer(0);
  581. do {
  582. mmc_stat = readl(&mmc_base->stat);
  583. if (get_timer(0) - start > MAX_RETRY_MS) {
  584. printf("%s: timedout waiting for status!\n",
  585. __func__);
  586. return -ETIMEDOUT;
  587. }
  588. } while (mmc_stat == 0);
  589. if ((mmc_stat & (IE_DTO | IE_DCRC | IE_DEB)) != 0)
  590. mmc_reset_controller_fsm(mmc_base, SYSCTL_SRD);
  591. if ((mmc_stat & ERRI_MASK) != 0)
  592. return 1;
  593. if (mmc_stat & BRR_MASK) {
  594. unsigned int k;
  595. writel(readl(&mmc_base->stat) | BRR_MASK,
  596. &mmc_base->stat);
  597. for (k = 0; k < count; k++) {
  598. *output_buf = readl(&mmc_base->data);
  599. output_buf++;
  600. }
  601. size -= (count*4);
  602. }
  603. if (mmc_stat & BWR_MASK)
  604. writel(readl(&mmc_base->stat) | BWR_MASK,
  605. &mmc_base->stat);
  606. if (mmc_stat & TC_MASK) {
  607. writel(readl(&mmc_base->stat) | TC_MASK,
  608. &mmc_base->stat);
  609. break;
  610. }
  611. }
  612. return 0;
  613. }
  614. static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,
  615. unsigned int size)
  616. {
  617. unsigned int *input_buf = (unsigned int *)buf;
  618. unsigned int mmc_stat;
  619. unsigned int count;
  620. /*
  621. * Start Polled Write
  622. */
  623. count = (size > MMCSD_SECTOR_SIZE) ? MMCSD_SECTOR_SIZE : size;
  624. count /= 4;
  625. while (size) {
  626. ulong start = get_timer(0);
  627. do {
  628. mmc_stat = readl(&mmc_base->stat);
  629. if (get_timer(0) - start > MAX_RETRY_MS) {
  630. printf("%s: timedout waiting for status!\n",
  631. __func__);
  632. return -ETIMEDOUT;
  633. }
  634. } while (mmc_stat == 0);
  635. if ((mmc_stat & (IE_DTO | IE_DCRC | IE_DEB)) != 0)
  636. mmc_reset_controller_fsm(mmc_base, SYSCTL_SRD);
  637. if ((mmc_stat & ERRI_MASK) != 0)
  638. return 1;
  639. if (mmc_stat & BWR_MASK) {
  640. unsigned int k;
  641. writel(readl(&mmc_base->stat) | BWR_MASK,
  642. &mmc_base->stat);
  643. for (k = 0; k < count; k++) {
  644. writel(*input_buf, &mmc_base->data);
  645. input_buf++;
  646. }
  647. size -= (count*4);
  648. }
  649. if (mmc_stat & BRR_MASK)
  650. writel(readl(&mmc_base->stat) | BRR_MASK,
  651. &mmc_base->stat);
  652. if (mmc_stat & TC_MASK) {
  653. writel(readl(&mmc_base->stat) | TC_MASK,
  654. &mmc_base->stat);
  655. break;
  656. }
  657. }
  658. return 0;
  659. }
  660. #if !CONFIG_IS_ENABLED(DM_MMC)
  661. static int omap_hsmmc_set_ios(struct mmc *mmc)
  662. {
  663. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  664. #else
  665. static int omap_hsmmc_set_ios(struct udevice *dev)
  666. {
  667. struct omap_hsmmc_data *priv = dev_get_priv(dev);
  668. struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
  669. struct mmc *mmc = upriv->mmc;
  670. #endif
  671. struct hsmmc *mmc_base;
  672. unsigned int dsor = 0;
  673. ulong start;
  674. mmc_base = priv->base_addr;
  675. /* configue bus width */
  676. switch (mmc->bus_width) {
  677. case 8:
  678. writel(readl(&mmc_base->con) | DTW_8_BITMODE,
  679. &mmc_base->con);
  680. break;
  681. case 4:
  682. writel(readl(&mmc_base->con) & ~DTW_8_BITMODE,
  683. &mmc_base->con);
  684. writel(readl(&mmc_base->hctl) | DTW_4_BITMODE,
  685. &mmc_base->hctl);
  686. break;
  687. case 1:
  688. default:
  689. writel(readl(&mmc_base->con) & ~DTW_8_BITMODE,
  690. &mmc_base->con);
  691. writel(readl(&mmc_base->hctl) & ~DTW_4_BITMODE,
  692. &mmc_base->hctl);
  693. break;
  694. }
  695. /* configure clock with 96Mhz system clock.
  696. */
  697. if (mmc->clock != 0) {
  698. dsor = (MMC_CLOCK_REFERENCE * 1000000 / mmc->clock);
  699. if ((MMC_CLOCK_REFERENCE * 1000000) / dsor > mmc->clock)
  700. dsor++;
  701. }
  702. mmc_reg_out(&mmc_base->sysctl, (ICE_MASK | DTO_MASK | CEN_MASK),
  703. (ICE_STOP | DTO_15THDTO | CEN_DISABLE));
  704. mmc_reg_out(&mmc_base->sysctl, ICE_MASK | CLKD_MASK,
  705. (dsor << CLKD_OFFSET) | ICE_OSCILLATE);
  706. start = get_timer(0);
  707. while ((readl(&mmc_base->sysctl) & ICS_MASK) == ICS_NOTREADY) {
  708. if (get_timer(0) - start > MAX_RETRY_MS) {
  709. printf("%s: timedout waiting for ics!\n", __func__);
  710. return -ETIMEDOUT;
  711. }
  712. }
  713. writel(readl(&mmc_base->sysctl) | CEN_ENABLE, &mmc_base->sysctl);
  714. return 0;
  715. }
  716. #ifdef OMAP_HSMMC_USE_GPIO
  717. #if CONFIG_IS_ENABLED(DM_MMC)
  718. static int omap_hsmmc_getcd(struct udevice *dev)
  719. {
  720. struct omap_hsmmc_data *priv = dev_get_priv(dev);
  721. int value;
  722. value = dm_gpio_get_value(&priv->cd_gpio);
  723. /* if no CD return as 1 */
  724. if (value < 0)
  725. return 1;
  726. if (priv->cd_inverted)
  727. return !value;
  728. return value;
  729. }
  730. static int omap_hsmmc_getwp(struct udevice *dev)
  731. {
  732. struct omap_hsmmc_data *priv = dev_get_priv(dev);
  733. int value;
  734. value = dm_gpio_get_value(&priv->wp_gpio);
  735. /* if no WP return as 0 */
  736. if (value < 0)
  737. return 0;
  738. return value;
  739. }
  740. #else
  741. static int omap_hsmmc_getcd(struct mmc *mmc)
  742. {
  743. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  744. int cd_gpio;
  745. /* if no CD return as 1 */
  746. cd_gpio = priv->cd_gpio;
  747. if (cd_gpio < 0)
  748. return 1;
  749. /* NOTE: assumes card detect signal is active-low */
  750. return !gpio_get_value(cd_gpio);
  751. }
  752. static int omap_hsmmc_getwp(struct mmc *mmc)
  753. {
  754. struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
  755. int wp_gpio;
  756. /* if no WP return as 0 */
  757. wp_gpio = priv->wp_gpio;
  758. if (wp_gpio < 0)
  759. return 0;
  760. /* NOTE: assumes write protect signal is active-high */
  761. return gpio_get_value(wp_gpio);
  762. }
  763. #endif
  764. #endif
  765. #if CONFIG_IS_ENABLED(DM_MMC)
  766. static const struct dm_mmc_ops omap_hsmmc_ops = {
  767. .send_cmd = omap_hsmmc_send_cmd,
  768. .set_ios = omap_hsmmc_set_ios,
  769. #ifdef OMAP_HSMMC_USE_GPIO
  770. .get_cd = omap_hsmmc_getcd,
  771. .get_wp = omap_hsmmc_getwp,
  772. #endif
  773. };
  774. #else
  775. static const struct mmc_ops omap_hsmmc_ops = {
  776. .send_cmd = omap_hsmmc_send_cmd,
  777. .set_ios = omap_hsmmc_set_ios,
  778. .init = omap_hsmmc_init_setup,
  779. #ifdef OMAP_HSMMC_USE_GPIO
  780. .getcd = omap_hsmmc_getcd,
  781. .getwp = omap_hsmmc_getwp,
  782. #endif
  783. };
  784. #endif
  785. #if !CONFIG_IS_ENABLED(DM_MMC)
  786. int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,
  787. int wp_gpio)
  788. {
  789. struct mmc *mmc;
  790. struct omap_hsmmc_data *priv;
  791. struct mmc_config *cfg;
  792. uint host_caps_val;
  793. priv = malloc(sizeof(*priv));
  794. if (priv == NULL)
  795. return -1;
  796. host_caps_val = MMC_MODE_4BIT | MMC_MODE_HS_52MHz | MMC_MODE_HS;
  797. switch (dev_index) {
  798. case 0:
  799. priv->base_addr = (struct hsmmc *)OMAP_HSMMC1_BASE;
  800. break;
  801. #ifdef OMAP_HSMMC2_BASE
  802. case 1:
  803. priv->base_addr = (struct hsmmc *)OMAP_HSMMC2_BASE;
  804. #if (defined(CONFIG_OMAP44XX) || defined(CONFIG_OMAP54XX) || \
  805. defined(CONFIG_DRA7XX) || defined(CONFIG_AM33XX) || \
  806. defined(CONFIG_AM43XX) || defined(CONFIG_SOC_KEYSTONE)) && \
  807. defined(CONFIG_HSMMC2_8BIT)
  808. /* Enable 8-bit interface for eMMC on OMAP4/5 or DRA7XX */
  809. host_caps_val |= MMC_MODE_8BIT;
  810. #endif
  811. break;
  812. #endif
  813. #ifdef OMAP_HSMMC3_BASE
  814. case 2:
  815. priv->base_addr = (struct hsmmc *)OMAP_HSMMC3_BASE;
  816. #if defined(CONFIG_DRA7XX) && defined(CONFIG_HSMMC3_8BIT)
  817. /* Enable 8-bit interface for eMMC on DRA7XX */
  818. host_caps_val |= MMC_MODE_8BIT;
  819. #endif
  820. break;
  821. #endif
  822. default:
  823. priv->base_addr = (struct hsmmc *)OMAP_HSMMC1_BASE;
  824. return 1;
  825. }
  826. #ifdef OMAP_HSMMC_USE_GPIO
  827. /* on error gpio values are set to -1, which is what we want */
  828. priv->cd_gpio = omap_mmc_setup_gpio_in(cd_gpio, "mmc_cd");
  829. priv->wp_gpio = omap_mmc_setup_gpio_in(wp_gpio, "mmc_wp");
  830. #endif
  831. cfg = &priv->cfg;
  832. cfg->name = "OMAP SD/MMC";
  833. cfg->ops = &omap_hsmmc_ops;
  834. cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
  835. cfg->host_caps = host_caps_val & ~host_caps_mask;
  836. cfg->f_min = 400000;
  837. if (f_max != 0)
  838. cfg->f_max = f_max;
  839. else {
  840. if (cfg->host_caps & MMC_MODE_HS) {
  841. if (cfg->host_caps & MMC_MODE_HS_52MHz)
  842. cfg->f_max = 52000000;
  843. else
  844. cfg->f_max = 26000000;
  845. } else
  846. cfg->f_max = 20000000;
  847. }
  848. cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
  849. #if defined(CONFIG_OMAP34XX)
  850. /*
  851. * Silicon revs 2.1 and older do not support multiblock transfers.
  852. */
  853. if ((get_cpu_family() == CPU_OMAP34XX) && (get_cpu_rev() <= CPU_3XX_ES21))
  854. cfg->b_max = 1;
  855. #endif
  856. mmc = mmc_create(cfg, priv);
  857. if (mmc == NULL)
  858. return -1;
  859. return 0;
  860. }
  861. #else
  862. #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
  863. static int omap_hsmmc_ofdata_to_platdata(struct udevice *dev)
  864. {
  865. struct omap_hsmmc_plat *plat = dev_get_platdata(dev);
  866. struct mmc_config *cfg = &plat->cfg;
  867. const void *fdt = gd->fdt_blob;
  868. int node = dev_of_offset(dev);
  869. int val;
  870. plat->base_addr = map_physmem(devfdt_get_addr(dev),
  871. sizeof(struct hsmmc *),
  872. MAP_NOCACHE);
  873. cfg->host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS;
  874. val = fdtdec_get_int(fdt, node, "bus-width", -1);
  875. if (val < 0) {
  876. printf("error: bus-width property missing\n");
  877. return -ENOENT;
  878. }
  879. switch (val) {
  880. case 0x8:
  881. cfg->host_caps |= MMC_MODE_8BIT;
  882. case 0x4:
  883. cfg->host_caps |= MMC_MODE_4BIT;
  884. break;
  885. default:
  886. printf("error: invalid bus-width property\n");
  887. return -ENOENT;
  888. }
  889. cfg->f_min = 400000;
  890. cfg->f_max = fdtdec_get_int(fdt, node, "max-frequency", 52000000);
  891. cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
  892. cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
  893. #ifdef OMAP_HSMMC_USE_GPIO
  894. plat->cd_inverted = fdtdec_get_bool(fdt, node, "cd-inverted");
  895. #endif
  896. return 0;
  897. }
  898. #endif
  899. #ifdef CONFIG_BLK
  900. static int omap_hsmmc_bind(struct udevice *dev)
  901. {
  902. struct omap_hsmmc_plat *plat = dev_get_platdata(dev);
  903. return mmc_bind(dev, &plat->mmc, &plat->cfg);
  904. }
  905. #endif
  906. static int omap_hsmmc_probe(struct udevice *dev)
  907. {
  908. struct omap_hsmmc_plat *plat = dev_get_platdata(dev);
  909. struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
  910. struct omap_hsmmc_data *priv = dev_get_priv(dev);
  911. struct mmc_config *cfg = &plat->cfg;
  912. struct mmc *mmc;
  913. cfg->name = "OMAP SD/MMC";
  914. priv->base_addr = plat->base_addr;
  915. #ifdef OMAP_HSMMC_USE_GPIO
  916. priv->cd_inverted = plat->cd_inverted;
  917. #endif
  918. #ifdef CONFIG_BLK
  919. mmc = &plat->mmc;
  920. #else
  921. mmc = mmc_create(cfg, priv);
  922. if (mmc == NULL)
  923. return -1;
  924. #endif
  925. #if defined(OMAP_HSMMC_USE_GPIO) && CONFIG_IS_ENABLED(OF_CONTROL)
  926. gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio, GPIOD_IS_IN);
  927. gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio, GPIOD_IS_IN);
  928. #endif
  929. mmc->dev = dev;
  930. upriv->mmc = mmc;
  931. return omap_hsmmc_init_setup(mmc);
  932. }
  933. #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
  934. static const struct udevice_id omap_hsmmc_ids[] = {
  935. { .compatible = "ti,omap3-hsmmc" },
  936. { .compatible = "ti,omap4-hsmmc" },
  937. { .compatible = "ti,am33xx-hsmmc" },
  938. { }
  939. };
  940. #endif
  941. U_BOOT_DRIVER(omap_hsmmc) = {
  942. .name = "omap_hsmmc",
  943. .id = UCLASS_MMC,
  944. #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
  945. .of_match = omap_hsmmc_ids,
  946. .ofdata_to_platdata = omap_hsmmc_ofdata_to_platdata,
  947. .platdata_auto_alloc_size = sizeof(struct omap_hsmmc_plat),
  948. #endif
  949. #ifdef CONFIG_BLK
  950. .bind = omap_hsmmc_bind,
  951. #endif
  952. .ops = &omap_hsmmc_ops,
  953. .probe = omap_hsmmc_probe,
  954. .priv_auto_alloc_size = sizeof(struct omap_hsmmc_data),
  955. .flags = DM_FLAG_PRE_RELOC,
  956. };
  957. #endif