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