fsl_esdhc.c 27.7 KB
Newer Older
1
/*
2
 * Copyright 2007, 2010-2011 Freescale Semiconductor, Inc
3 4 5 6 7 8
 * Andy Fleming
 *
 * Based vaguely on the pxa mmc code:
 * (C) Copyright 2003
 * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
 *
9
 * SPDX-License-Identifier:	GPL-2.0+
10 11 12 13 14
 */

#include <config.h>
#include <common.h>
#include <command.h>
15
#include <errno.h>
16
#include <hwconfig.h>
17 18
#include <mmc.h>
#include <part.h>
19
#include <power/regulator.h>
20 21
#include <malloc.h>
#include <fsl_esdhc.h>
22
#include <fdt_support.h>
23
#include <asm/io.h>
P
Peng Fan 已提交
24 25
#include <dm.h>
#include <asm-generic/gpio.h>
26 27 28

DECLARE_GLOBAL_DATA_PTR;

29 30 31 32 33 34 35
#define SDHCI_IRQ_EN_BITS		(IRQSTATEN_CC | IRQSTATEN_TC | \
				IRQSTATEN_CINT | \
				IRQSTATEN_CTOE | IRQSTATEN_CCE | IRQSTATEN_CEBE | \
				IRQSTATEN_CIE | IRQSTATEN_DTOE | IRQSTATEN_DCE | \
				IRQSTATEN_DEBE | IRQSTATEN_BRR | IRQSTATEN_BWR | \
				IRQSTATEN_DINT)

36
struct fsl_esdhc {
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
	uint    dsaddr;		/* SDMA system address register */
	uint    blkattr;	/* Block attributes register */
	uint    cmdarg;		/* Command argument register */
	uint    xfertyp;	/* Transfer type register */
	uint    cmdrsp0;	/* Command response 0 register */
	uint    cmdrsp1;	/* Command response 1 register */
	uint    cmdrsp2;	/* Command response 2 register */
	uint    cmdrsp3;	/* Command response 3 register */
	uint    datport;	/* Buffer data port register */
	uint    prsstat;	/* Present state register */
	uint    proctl;		/* Protocol control register */
	uint    sysctl;		/* System Control Register */
	uint    irqstat;	/* Interrupt status register */
	uint    irqstaten;	/* Interrupt status enable register */
	uint    irqsigen;	/* Interrupt signal enable register */
	uint    autoc12err;	/* Auto CMD error status register */
	uint    hostcapblt;	/* Host controller capabilities register */
	uint    wml;		/* Watermark level register */
	uint    mixctrl;	/* For USDHC */
	char    reserved1[4];	/* reserved */
	uint    fevt;		/* Force event register */
	uint    admaes;		/* ADMA error status register */
	uint    adsaddr;	/* ADMA system address register */
60 61 62 63 64 65 66 67 68
	char    reserved2[4];
	uint    dllctrl;
	uint    dllstat;
	uint    clktunectrlstatus;
	char    reserved3[84];
	uint    vendorspec;
	uint    mmcboot;
	uint    vendorspec2;
	char	reserved4[48];
69 70
	uint    hostver;	/* Host controller version register */
	char    reserved5[4];	/* reserved */
71
	uint    dmaerraddr;	/* DMA error address register */
72
	char    reserved6[4];	/* reserved */
73 74
	uint    dmaerrattr;	/* DMA error attribute register */
	char    reserved7[4];	/* reserved */
75
	uint    hostcapblt2;	/* Host controller capabilities register 2 */
76
	char    reserved8[8];	/* reserved */
77
	uint    tcr;		/* Tuning control register */
78
	char    reserved9[28];	/* reserved */
79
	uint    sddirctl;	/* SD direction control register */
80
	char    reserved10[712];/* reserved */
81
	uint    scr;		/* eSDHC control register */
82 83
};

84 85 86 87 88
struct fsl_esdhc_plat {
	struct mmc_config cfg;
	struct mmc mmc;
};

P
Peng Fan 已提交
89 90 91 92 93 94 95 96 97 98 99
/**
 * struct fsl_esdhc_priv
 *
 * @esdhc_regs: registers of the sdhc controller
 * @sdhc_clk: Current clk of the sdhc controller
 * @bus_width: bus width, 1bit, 4bit or 8bit
 * @cfg: mmc config
 * @mmc: mmc
 * Following is used when Driver Model is enabled for MMC
 * @dev: pointer for the device
 * @non_removable: 0: removable; 1: non-removable
P
Peng Fan 已提交
100
 * @wp_enable: 1: enable checking wp; 0: no check
101
 * @vs18_enable: 1: use 1.8V voltage; 0: use 3.3V
P
Peng Fan 已提交
102
 * @cd_gpio: gpio for card detection
P
Peng Fan 已提交
103
 * @wp_gpio: gpio for write protection
P
Peng Fan 已提交
104 105 106 107 108 109 110 111
 */
struct fsl_esdhc_priv {
	struct fsl_esdhc *esdhc_regs;
	unsigned int sdhc_clk;
	unsigned int bus_width;
	struct mmc *mmc;
	struct udevice *dev;
	int non_removable;
P
Peng Fan 已提交
112
	int wp_enable;
113
	int vs18_enable;
114
#ifdef CONFIG_DM_GPIO
P
Peng Fan 已提交
115
	struct gpio_desc cd_gpio;
P
Peng Fan 已提交
116
	struct gpio_desc wp_gpio;
117
#endif
P
Peng Fan 已提交
118 119
};

120
/* Return the XFERTYP flags for a given command and data packet */
121
static uint esdhc_xfertyp(struct mmc_cmd *cmd, struct mmc_data *data)
122 123 124 125
{
	uint xfertyp = 0;

	if (data) {
126 127 128 129
		xfertyp |= XFERTYP_DPSEL;
#ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
		xfertyp |= XFERTYP_DMAEN;
#endif
130 131 132
		if (data->blocks > 1) {
			xfertyp |= XFERTYP_MSBSEL;
			xfertyp |= XFERTYP_BCEN;
133 134 135
#ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC111
			xfertyp |= XFERTYP_AC12EN;
#endif
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
		}

		if (data->flags & MMC_DATA_READ)
			xfertyp |= XFERTYP_DTDSEL;
	}

	if (cmd->resp_type & MMC_RSP_CRC)
		xfertyp |= XFERTYP_CCCEN;
	if (cmd->resp_type & MMC_RSP_OPCODE)
		xfertyp |= XFERTYP_CICEN;
	if (cmd->resp_type & MMC_RSP_136)
		xfertyp |= XFERTYP_RSPTYP_136;
	else if (cmd->resp_type & MMC_RSP_BUSY)
		xfertyp |= XFERTYP_RSPTYP_48_BUSY;
	else if (cmd->resp_type & MMC_RSP_PRESENT)
		xfertyp |= XFERTYP_RSPTYP_48;

153 154
	if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION)
		xfertyp |= XFERTYP_CMDTYP_ABORT;
155

156 157 158
	return XFERTYP_CMD(cmd->cmdidx) | xfertyp;
}

159 160 161 162
#ifdef CONFIG_SYS_FSL_ESDHC_USE_PIO
/*
 * PIO Read/Write Mode reduce the performace as DMA is not used in this mode.
 */
163 164
static void esdhc_pio_read_write(struct fsl_esdhc_priv *priv,
				 struct mmc_data *data)
165
{
P
Peng Fan 已提交
166
	struct fsl_esdhc *regs = priv->esdhc_regs;
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
	uint blocks;
	char *buffer;
	uint databuf;
	uint size;
	uint irqstat;
	uint timeout;

	if (data->flags & MMC_DATA_READ) {
		blocks = data->blocks;
		buffer = data->dest;
		while (blocks) {
			timeout = PIO_TIMEOUT;
			size = data->blocksize;
			irqstat = esdhc_read32(&regs->irqstat);
			while (!(esdhc_read32(&regs->prsstat) & PRSSTAT_BREN)
				&& --timeout);
			if (timeout <= 0) {
				printf("\nData Read Failed in PIO Mode.");
185
				return;
186 187 188 189 190 191 192 193 194 195 196 197 198
			}
			while (size && (!(irqstat & IRQSTAT_TC))) {
				udelay(100); /* Wait before last byte transfer complete */
				irqstat = esdhc_read32(&regs->irqstat);
				databuf = in_le32(&regs->datport);
				*((uint *)buffer) = databuf;
				buffer += 4;
				size -= 4;
			}
			blocks--;
		}
	} else {
		blocks = data->blocks;
199
		buffer = (char *)data->src;
200 201 202 203 204 205 206 207
		while (blocks) {
			timeout = PIO_TIMEOUT;
			size = data->blocksize;
			irqstat = esdhc_read32(&regs->irqstat);
			while (!(esdhc_read32(&regs->prsstat) & PRSSTAT_BWEN)
				&& --timeout);
			if (timeout <= 0) {
				printf("\nData Write Failed in PIO Mode.");
208
				return;
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
			}
			while (size && (!(irqstat & IRQSTAT_TC))) {
				udelay(100); /* Wait before last byte transfer complete */
				databuf = *((uint *)buffer);
				buffer += 4;
				size -= 4;
				irqstat = esdhc_read32(&regs->irqstat);
				out_le32(&regs->datport, databuf);
			}
			blocks--;
		}
	}
}
#endif

224 225
static int esdhc_setup_data(struct fsl_esdhc_priv *priv, struct mmc *mmc,
			    struct mmc_data *data)
226 227
{
	int timeout;
P
Peng Fan 已提交
228
	struct fsl_esdhc *regs = priv->esdhc_regs;
229
#if defined(CONFIG_FSL_LAYERSCAPE) || defined(CONFIG_S32V234)
230 231
	dma_addr_t addr;
#endif
232
	uint wml_value;
233 234 235 236

	wml_value = data->blocksize/4;

	if (data->flags & MMC_DATA_READ) {
237 238
		if (wml_value > WML_RD_WML_MAX)
			wml_value = WML_RD_WML_MAX_VAL;
239

240
		esdhc_clrsetbits32(&regs->wml, WML_RD_WML_MASK, wml_value);
241
#ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
242
#if defined(CONFIG_FSL_LAYERSCAPE) || defined(CONFIG_S32V234)
243 244 245 246 247 248
		addr = virt_to_phys((void *)(data->dest));
		if (upper_32_bits(addr))
			printf("Error found for upper 32 bits\n");
		else
			esdhc_write32(&regs->dsaddr, lower_32_bits(addr));
#else
249
		esdhc_write32(&regs->dsaddr, (u32)data->dest);
250
#endif
251
#endif
252
	} else {
253
#ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
254 255 256
		flush_dcache_range((ulong)data->src,
				   (ulong)data->src+data->blocks
					 *data->blocksize);
257
#endif
258 259
		if (wml_value > WML_WR_WML_MAX)
			wml_value = WML_WR_WML_MAX_VAL;
P
Peng Fan 已提交
260 261 262 263
		if (priv->wp_enable) {
			if ((esdhc_read32(&regs->prsstat) &
			    PRSSTAT_WPSPL) == 0) {
				printf("\nThe SD card is locked. Can not write to a locked card.\n\n");
264
				return -ETIMEDOUT;
P
Peng Fan 已提交
265
			}
266
		}
267 268 269

		esdhc_clrsetbits32(&regs->wml, WML_WR_WML_MASK,
					wml_value << 16);
270
#ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
271
#if defined(CONFIG_FSL_LAYERSCAPE) || defined(CONFIG_S32V234)
272 273 274 275 276 277
		addr = virt_to_phys((void *)(data->src));
		if (upper_32_bits(addr))
			printf("Error found for upper 32 bits\n");
		else
			esdhc_write32(&regs->dsaddr, lower_32_bits(addr));
#else
278
		esdhc_write32(&regs->dsaddr, (u32)data->src);
279
#endif
280
#endif
281 282
	}

283
	esdhc_write32(&regs->blkattr, data->blocks << 16 | data->blocksize);
284 285

	/* Calculate the timeout period for data transactions */
286 287 288 289 290
	/*
	 * 1)Timeout period = (2^(timeout+13)) SD Clock cycles
	 * 2)Timeout period should be minimum 0.250sec as per SD Card spec
	 *  So, Number of SD Clock cycles for 0.25sec should be minimum
	 *		(SD Clock/sec * 0.25 sec) SD Clock cycles
291
	 *		= (mmc->clock * 1/4) SD Clock cycles
292
	 * As 1) >=  2)
293
	 * => (2^(timeout+13)) >= mmc->clock * 1/4
294
	 * Taking log2 both the sides
295
	 * => timeout + 13 >= log2(mmc->clock/4)
296
	 * Rounding up to next power of 2
297 298
	 * => timeout + 13 = log2(mmc->clock/4) + 1
	 * => timeout + 13 = fls(mmc->clock/4)
299 300 301 302 303 304 305
	 *
	 * However, the MMC spec "It is strongly recommended for hosts to
	 * implement more than 500ms timeout value even if the card
	 * indicates the 250ms maximum busy length."  Even the previous
	 * value of 300ms is known to be insufficient for some cards.
	 * So, we use
	 * => timeout + 13 = fls(mmc->clock/2)
306
	 */
307
	timeout = fls(mmc->clock/2);
308 309 310 311 312 313 314 315
	timeout -= 13;

	if (timeout > 14)
		timeout = 14;

	if (timeout < 0)
		timeout = 0;

316 317 318 319 320
#ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC_A001
	if ((timeout == 4) || (timeout == 8) || (timeout == 12))
		timeout++;
#endif

321 322 323
#ifdef ESDHCI_QUIRK_BROKEN_TIMEOUT_VALUE
	timeout = 0xE;
#endif
324
	esdhc_clrsetbits32(&regs->sysctl, SYSCTL_TIMEOUT_MASK, timeout << 16);
325 326 327 328

	return 0;
}

329 330 331
static void check_and_invalidate_dcache_range
	(struct mmc_cmd *cmd,
	 struct mmc_data *data) {
332
	unsigned start = 0;
333
	unsigned end = 0;
334 335
	unsigned size = roundup(ARCH_DMA_MINALIGN,
				data->blocks*data->blocksize);
336
#if defined(CONFIG_FSL_LAYERSCAPE) || defined(CONFIG_S32V234)
337 338 339 340 341 342 343
	dma_addr_t addr;

	addr = virt_to_phys((void *)(data->dest));
	if (upper_32_bits(addr))
		printf("Error found for upper 32 bits\n");
	else
		start = lower_32_bits(addr);
344 345
#else
	start = (unsigned)data->dest;
346
#endif
347
	end = start + size;
348 349
	invalidate_dcache_range(start, end);
}
350

351 352 353 354
/*
 * Sends a command out on the bus.  Takes the mmc pointer,
 * a command pointer, and an optional data pointer.
 */
355 356
static int esdhc_send_cmd_common(struct fsl_esdhc_priv *priv, struct mmc *mmc,
				 struct mmc_cmd *cmd, struct mmc_data *data)
357
{
358
	int	err = 0;
359 360
	uint	xfertyp;
	uint	irqstat;
P
Peng Fan 已提交
361
	struct fsl_esdhc *regs = priv->esdhc_regs;
362

363 364 365 366 367
#ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC111
	if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION)
		return 0;
#endif

368
	esdhc_write32(&regs->irqstat, -1);
369 370 371 372

	sync();

	/* Wait for the bus to be idle */
373 374 375
	while ((esdhc_read32(&regs->prsstat) & PRSSTAT_CICHB) ||
			(esdhc_read32(&regs->prsstat) & PRSSTAT_CIDHB))
		;
376

377 378
	while (esdhc_read32(&regs->prsstat) & PRSSTAT_DLA)
		;
379 380 381 382 383 384 385 386 387 388

	/* Wait at least 8 SD clock cycles before the next command */
	/*
	 * Note: This is way more than 8 cycles, but 1ms seems to
	 * resolve timing issues with some cards
	 */
	udelay(1000);

	/* Set up for a data transfer if we have one */
	if (data) {
389
		err = esdhc_setup_data(priv, mmc, data);
390 391
		if(err)
			return err;
392 393 394

		if (data->flags & MMC_DATA_READ)
			check_and_invalidate_dcache_range(cmd, data);
395 396 397 398 399
	}

	/* Figure out the transfer arguments */
	xfertyp = esdhc_xfertyp(cmd, data);

400 401 402
	/* Mask all irqs */
	esdhc_write32(&regs->irqsigen, 0);

403
	/* Send the command */
404
	esdhc_write32(&regs->cmdarg, cmd->cmdarg);
405 406
#if defined(CONFIG_FSL_USDHC)
	esdhc_write32(&regs->mixctrl,
407 408
	(esdhc_read32(&regs->mixctrl) & 0xFFFFFF80) | (xfertyp & 0x7F)
			| (mmc->ddr_mode ? XFERTYP_DDREN : 0));
409 410
	esdhc_write32(&regs->xfertyp, xfertyp & 0xFFFF0000);
#else
411
	esdhc_write32(&regs->xfertyp, xfertyp);
412
#endif
413

414
	/* Wait for the command to complete */
415
	while (!(esdhc_read32(&regs->irqstat) & (IRQSTAT_CC | IRQSTAT_CTOE)))
416
		;
417

418
	irqstat = esdhc_read32(&regs->irqstat);
419

420
	if (irqstat & CMD_ERR) {
421
		err = -ECOMM;
422
		goto out;
423 424
	}

425
	if (irqstat & IRQSTAT_CTOE) {
426
		err = -ETIMEDOUT;
427 428
		goto out;
	}
429

430 431 432 433 434 435 436 437 438
	/* Switch voltage to 1.8V if CMD11 succeeded */
	if (cmd->cmdidx == SD_CMD_SWITCH_UHS18V) {
		esdhc_setbits32(&regs->vendorspec, ESDHC_VENDORSPEC_VSELECT);

		printf("Run CMD11 1.8V switch\n");
		/* Sleep for 5 ms - max time for card to switch to 1.8V */
		udelay(5000);
	}

439 440
	/* Workaround for ESDHC errata ENGcm03648 */
	if (!data && (cmd->resp_type & MMC_RSP_BUSY)) {
441
		int timeout = 6000;
442

443
		/* Poll on DATA0 line for cmd with busy signal for 600 ms */
444 445 446 447 448 449 450 451
		while (timeout > 0 && !(esdhc_read32(&regs->prsstat) &
					PRSSTAT_DAT0)) {
			udelay(100);
			timeout--;
		}

		if (timeout <= 0) {
			printf("Timeout waiting for DAT0 to go high!\n");
452
			err = -ETIMEDOUT;
453
			goto out;
454 455 456
		}
	}

457 458 459 460
	/* Copy the response to the response buffer */
	if (cmd->resp_type & MMC_RSP_136) {
		u32 cmdrsp3, cmdrsp2, cmdrsp1, cmdrsp0;

461 462 463 464
		cmdrsp3 = esdhc_read32(&regs->cmdrsp3);
		cmdrsp2 = esdhc_read32(&regs->cmdrsp2);
		cmdrsp1 = esdhc_read32(&regs->cmdrsp1);
		cmdrsp0 = esdhc_read32(&regs->cmdrsp0);
R
Rabin Vincent 已提交
465 466 467 468
		cmd->response[0] = (cmdrsp3 << 8) | (cmdrsp2 >> 24);
		cmd->response[1] = (cmdrsp2 << 8) | (cmdrsp1 >> 24);
		cmd->response[2] = (cmdrsp1 << 8) | (cmdrsp0 >> 24);
		cmd->response[3] = (cmdrsp0 << 8);
469
	} else
470
		cmd->response[0] = esdhc_read32(&regs->cmdrsp0);
471 472 473

	/* Wait until all of the blocks are transferred */
	if (data) {
474
#ifdef CONFIG_SYS_FSL_ESDHC_USE_PIO
475
		esdhc_pio_read_write(priv, data);
476
#else
477
		do {
478
			irqstat = esdhc_read32(&regs->irqstat);
479

480
			if (irqstat & IRQSTAT_DTOE) {
481
				err = -ETIMEDOUT;
482 483
				goto out;
			}
484

485
			if (irqstat & DATA_ERR) {
486
				err = -ECOMM;
487 488
				goto out;
			}
489
		} while ((irqstat & DATA_COMPLETE) != DATA_COMPLETE);
490

491 492 493 494 495
		/*
		 * Need invalidate the dcache here again to avoid any
		 * cache-fill during the DMA operations such as the
		 * speculative pre-fetching etc.
		 */
496 497
		if (data->flags & MMC_DATA_READ)
			check_and_invalidate_dcache_range(cmd, data);
498
#endif
499 500
	}

501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
out:
	/* Reset CMD and DATA portions on error */
	if (err) {
		esdhc_write32(&regs->sysctl, esdhc_read32(&regs->sysctl) |
			      SYSCTL_RSTC);
		while (esdhc_read32(&regs->sysctl) & SYSCTL_RSTC)
			;

		if (data) {
			esdhc_write32(&regs->sysctl,
				      esdhc_read32(&regs->sysctl) |
				      SYSCTL_RSTD);
			while ((esdhc_read32(&regs->sysctl) & SYSCTL_RSTD))
				;
		}
516 517 518 519

		/* If this was CMD11, then notify that power cycle is needed */
		if (cmd->cmdidx == SD_CMD_SWITCH_UHS18V)
			printf("CMD11 to switch to 1.8V mode failed, card requires power cycle.\n");
520 521
	}

522
	esdhc_write32(&regs->irqstat, -1);
523

524
	return err;
525 526
}

527
static void set_sysctl(struct fsl_esdhc_priv *priv, struct mmc *mmc, uint clock)
528
{
529 530 531 532 533 534 535
	int div = 1;
#ifdef ARCH_MXC
	int pre_div = 1;
#else
	int pre_div = 2;
#endif
	int ddr_pre_div = mmc->ddr_mode ? 2 : 1;
P
Peng Fan 已提交
536 537
	struct fsl_esdhc *regs = priv->esdhc_regs;
	int sdhc_clk = priv->sdhc_clk;
538 539
	uint clk;

540 541
	if (clock < mmc->cfg->f_min)
		clock = mmc->cfg->f_min;
542

543 544
	while (sdhc_clk / (16 * pre_div * ddr_pre_div) > clock && pre_div < 256)
		pre_div *= 2;
545

546 547
	while (sdhc_clk / (div * pre_div * ddr_pre_div) > clock && div < 16)
		div++;
548

549
	pre_div >>= 1;
550 551 552 553
	div -= 1;

	clk = (pre_div << 8) | (div << 4);

554
#ifdef CONFIG_FSL_USDHC
555
	esdhc_clrbits32(&regs->vendorspec, VENDORSPEC_CKEN);
556
#else
557
	esdhc_clrbits32(&regs->sysctl, SYSCTL_CKEN);
558
#endif
559 560

	esdhc_clrsetbits32(&regs->sysctl, SYSCTL_CLOCK_MASK, clk);
561 562 563

	udelay(10000);

564
#ifdef CONFIG_FSL_USDHC
565
	esdhc_setbits32(&regs->vendorspec, VENDORSPEC_PEREN | VENDORSPEC_CKEN);
566 567 568
#else
	esdhc_setbits32(&regs->sysctl, SYSCTL_PEREN | SYSCTL_CKEN);
#endif
569

570 571
}

572
#ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
573
static void esdhc_clock_control(struct fsl_esdhc_priv *priv, bool enable)
574
{
P
Peng Fan 已提交
575
	struct fsl_esdhc *regs = priv->esdhc_regs;
576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600
	u32 value;
	u32 time_out;

	value = esdhc_read32(&regs->sysctl);

	if (enable)
		value |= SYSCTL_CKEN;
	else
		value &= ~SYSCTL_CKEN;

	esdhc_write32(&regs->sysctl, value);

	time_out = 20;
	value = PRSSTAT_SDSTB;
	while (!(esdhc_read32(&regs->prsstat) & value)) {
		if (time_out == 0) {
			printf("fsl_esdhc: Internal clock never stabilised.\n");
			break;
		}
		time_out--;
		mdelay(1);
	}
}
#endif

601
static int esdhc_set_ios_common(struct fsl_esdhc_priv *priv, struct mmc *mmc)
602
{
P
Peng Fan 已提交
603
	struct fsl_esdhc *regs = priv->esdhc_regs;
604

605 606
#ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
	/* Select to use peripheral clock */
607
	esdhc_clock_control(priv, false);
608
	esdhc_setbits32(&regs->scr, ESDHCCTL_PCS);
609
	esdhc_clock_control(priv, true);
610
#endif
611
	/* Set the clock speed */
612
	set_sysctl(priv, mmc, mmc->clock);
613 614

	/* Set the bus width */
615
	esdhc_clrbits32(&regs->proctl, PROCTL_DTW_4 | PROCTL_DTW_8);
616 617

	if (mmc->bus_width == 4)
618
		esdhc_setbits32(&regs->proctl, PROCTL_DTW_4);
619
	else if (mmc->bus_width == 8)
620 621
		esdhc_setbits32(&regs->proctl, PROCTL_DTW_8);

622
	return 0;
623 624
}

625
static int esdhc_init_common(struct fsl_esdhc_priv *priv, struct mmc *mmc)
626
{
P
Peng Fan 已提交
627
	struct fsl_esdhc *regs = priv->esdhc_regs;
628
	ulong start;
629

630
	/* Reset the entire host controller */
631
	esdhc_setbits32(&regs->sysctl, SYSCTL_RSTA);
632 633

	/* Wait until the controller is available */
634 635 636 637 638
	start = get_timer(0);
	while ((esdhc_read32(&regs->sysctl) & SYSCTL_RSTA)) {
		if (get_timer(start) > 1000)
			return -ETIMEDOUT;
	}
639

640 641 642 643 644 645 646 647 648 649 650 651 652 653
#if defined(CONFIG_FSL_USDHC)
	/* RSTA doesn't reset MMC_BOOT register, so manually reset it */
	esdhc_write32(&regs->mmcboot, 0x0);
	/* Reset MIX_CTRL and CLK_TUNE_CTRL_STATUS regs to 0 */
	esdhc_write32(&regs->mixctrl, 0x0);
	esdhc_write32(&regs->clktunectrlstatus, 0x0);

	/* Put VEND_SPEC to default value */
	esdhc_write32(&regs->vendorspec, VENDORSPEC_INIT);

	/* Disable DLL_CTRL delay line */
	esdhc_write32(&regs->dllctrl, 0x0);
#endif

654
#ifndef ARCH_MXC
655
	/* Enable cache snooping */
656 657
	esdhc_write32(&regs->scr, 0x00000040);
#endif
658

659
#ifndef CONFIG_FSL_USDHC
660
	esdhc_setbits32(&regs->sysctl, SYSCTL_HCKEN | SYSCTL_IPGEN);
661 662
#else
	esdhc_setbits32(&regs->vendorspec, VENDORSPEC_HCKEN | VENDORSPEC_IPGEN);
663
#endif
664 665

	/* Set the initial clock speed */
666
	mmc_set_clock(mmc, 400000);
667 668

	/* Disable the BRR and BWR bits in IRQSTAT */
669
	esdhc_clrbits32(&regs->irqstaten, IRQSTATEN_BRR | IRQSTATEN_BWR);
670 671

	/* Put the PROCTL reg back to the default */
672
	esdhc_write32(&regs->proctl, PROCTL_INIT);
673

674 675
	/* Set timout to the maximum value */
	esdhc_clrsetbits32(&regs->sysctl, SYSCTL_TIMEOUT_MASK, 14 << 16);
676

677 678 679
	if (priv->vs18_enable)
		esdhc_setbits32(&regs->vendorspec, ESDHC_VENDORSPEC_VSELECT);

680 681
	return 0;
}
682

683
static int esdhc_getcd_common(struct fsl_esdhc_priv *priv)
684
{
P
Peng Fan 已提交
685
	struct fsl_esdhc *regs = priv->esdhc_regs;
686 687
	int timeout = 1000;

688 689 690 691
#ifdef CONFIG_ESDHC_DETECT_QUIRK
	if (CONFIG_ESDHC_DETECT_QUIRK)
		return 1;
#endif
P
Peng Fan 已提交
692 693 694 695

#ifdef CONFIG_DM_MMC
	if (priv->non_removable)
		return 1;
696
#ifdef CONFIG_DM_GPIO
P
Peng Fan 已提交
697 698
	if (dm_gpio_is_valid(&priv->cd_gpio))
		return dm_gpio_get_value(&priv->cd_gpio);
699
#endif
P
Peng Fan 已提交
700 701
#endif

702 703
	while (!(esdhc_read32(&regs->prsstat) & PRSSTAT_CINS) && --timeout)
		udelay(1000);
704

705
	return timeout > 0;
706 707
}

708
static int esdhc_reset(struct fsl_esdhc *regs)
709
{
710
	ulong start;
711 712

	/* reset the controller */
713
	esdhc_setbits32(&regs->sysctl, SYSCTL_RSTA);
714 715

	/* hardware clears the bit when it is done */
716 717 718 719 720 721 722 723 724
	start = get_timer(0);
	while ((esdhc_read32(&regs->sysctl) & SYSCTL_RSTA)) {
		if (get_timer(start) > 100) {
			printf("MMC/SD: Reset never completed.\n");
			return -ETIMEDOUT;
		}
	}

	return 0;
725 726
}

727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755
static int esdhc_getcd(struct mmc *mmc)
{
	struct fsl_esdhc_priv *priv = mmc->priv;

	return esdhc_getcd_common(priv);
}

static int esdhc_init(struct mmc *mmc)
{
	struct fsl_esdhc_priv *priv = mmc->priv;

	return esdhc_init_common(priv, mmc);
}

static int esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
			  struct mmc_data *data)
{
	struct fsl_esdhc_priv *priv = mmc->priv;

	return esdhc_send_cmd_common(priv, mmc, cmd, data);
}

static int esdhc_set_ios(struct mmc *mmc)
{
	struct fsl_esdhc_priv *priv = mmc->priv;

	return esdhc_set_ios_common(priv, mmc);
}

756
static const struct mmc_ops esdhc_ops = {
757 758
	.getcd		= esdhc_getcd,
	.init		= esdhc_init,
759 760 761 762
	.send_cmd	= esdhc_send_cmd,
	.set_ios	= esdhc_set_ios,
};

763 764
static int fsl_esdhc_init(struct fsl_esdhc_priv *priv,
			  struct fsl_esdhc_plat *plat)
765
{
766
	struct mmc_config *cfg;
767
	struct fsl_esdhc *regs;
768
	u32 caps, voltage_caps;
769
	int ret;
770

P
Peng Fan 已提交
771 772
	if (!priv)
		return -EINVAL;
773

P
Peng Fan 已提交
774
	regs = priv->esdhc_regs;
775

776
	/* First reset the eSDHC controller */
777 778 779
	ret = esdhc_reset(regs);
	if (ret)
		return ret;
780

781
#ifndef CONFIG_FSL_USDHC
782 783
	esdhc_setbits32(&regs->sysctl, SYSCTL_PEREN | SYSCTL_HCKEN
				| SYSCTL_IPGEN | SYSCTL_CKEN);
784 785 786
#else
	esdhc_setbits32(&regs->vendorspec, VENDORSPEC_PEREN |
			VENDORSPEC_HCKEN | VENDORSPEC_IPGEN | VENDORSPEC_CKEN);
787
#endif
788

789 790 791
	if (priv->vs18_enable)
		esdhc_setbits32(&regs->vendorspec, ESDHC_VENDORSPEC_VSELECT);

792
	writel(SDHCI_IRQ_EN_BITS, &regs->irqstaten);
793 794
	cfg = &plat->cfg;
	memset(cfg, '\0', sizeof(*cfg));
795

796
	voltage_caps = 0;
797
	caps = esdhc_read32(&regs->hostcapblt);
798 799 800 801 802

#ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC135
	caps = caps & ~(ESDHC_HOSTCAPBLT_SRS |
			ESDHC_HOSTCAPBLT_VS18 | ESDHC_HOSTCAPBLT_VS30);
#endif
803 804 805 806 807 808

/* T4240 host controller capabilities register should have VS33 bit */
#ifdef CONFIG_SYS_FSL_MMC_HAS_CAPBLT_VS33
	caps = caps | ESDHC_HOSTCAPBLT_VS33;
#endif

809
	if (caps & ESDHC_HOSTCAPBLT_VS18)
810
		voltage_caps |= MMC_VDD_165_195;
811
	if (caps & ESDHC_HOSTCAPBLT_VS30)
812
		voltage_caps |= MMC_VDD_29_30 | MMC_VDD_30_31;
813
	if (caps & ESDHC_HOSTCAPBLT_VS33)
814 815
		voltage_caps |= MMC_VDD_32_33 | MMC_VDD_33_34;

816 817
	cfg->name = "FSL_SDHC";
	cfg->ops = &esdhc_ops;
818
#ifdef CONFIG_SYS_SD_VOLTAGE
819
	cfg->voltages = CONFIG_SYS_SD_VOLTAGE;
820
#else
821
	cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
822
#endif
823
	if ((cfg->voltages & voltage_caps) == 0) {
824 825 826
		printf("voltage not supported by controller\n");
		return -1;
	}
827

P
Peng Fan 已提交
828
	if (priv->bus_width == 8)
829
		cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
P
Peng Fan 已提交
830
	else if (priv->bus_width == 4)
831
		cfg->host_caps = MMC_MODE_4BIT;
P
Peng Fan 已提交
832

833
	cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
834
#ifdef CONFIG_SYS_FSL_ESDHC_HAS_DDR_MODE
835
	cfg->host_caps |= MMC_MODE_DDR_52MHz;
836
#endif
837

P
Peng Fan 已提交
838 839
	if (priv->bus_width > 0) {
		if (priv->bus_width < 8)
840
			cfg->host_caps &= ~MMC_MODE_8BIT;
P
Peng Fan 已提交
841
		if (priv->bus_width < 4)
842
			cfg->host_caps &= ~MMC_MODE_4BIT;
843 844
	}

845
	if (caps & ESDHC_HOSTCAPBLT_HSS)
846
		cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
847

848 849
#ifdef CONFIG_ESDHC_DETECT_8_BIT_QUIRK
	if (CONFIG_ESDHC_DETECT_8_BIT_QUIRK)
850
		cfg->host_caps &= ~MMC_MODE_8BIT;
851 852
#endif

853 854
	cfg->f_min = 400000;
	cfg->f_max = min(priv->sdhc_clk, (u32)52000000);
855

856
	cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
857

P
Peng Fan 已提交
858 859 860
	return 0;
}

861 862 863 864 865 866 867 868 869 870 871
#ifndef CONFIG_DM_MMC
static int fsl_esdhc_cfg_to_priv(struct fsl_esdhc_cfg *cfg,
				 struct fsl_esdhc_priv *priv)
{
	if (!cfg || !priv)
		return -EINVAL;

	priv->esdhc_regs = (struct fsl_esdhc *)(unsigned long)(cfg->esdhc_base);
	priv->bus_width = cfg->max_bus_width;
	priv->sdhc_clk = cfg->sdhc_clk;
	priv->wp_enable  = cfg->wp_enable;
872
	priv->vs18_enable  = cfg->vs18_enable;
873 874 875 876

	return 0;
};

P
Peng Fan 已提交
877 878
int fsl_esdhc_initialize(bd_t *bis, struct fsl_esdhc_cfg *cfg)
{
879
	struct fsl_esdhc_plat *plat;
P
Peng Fan 已提交
880
	struct fsl_esdhc_priv *priv;
881
	struct mmc *mmc;
P
Peng Fan 已提交
882 883 884 885 886 887 888 889
	int ret;

	if (!cfg)
		return -EINVAL;

	priv = calloc(sizeof(struct fsl_esdhc_priv), 1);
	if (!priv)
		return -ENOMEM;
890 891 892 893 894
	plat = calloc(sizeof(struct fsl_esdhc_plat), 1);
	if (!plat) {
		free(priv);
		return -ENOMEM;
	}
P
Peng Fan 已提交
895 896 897 898

	ret = fsl_esdhc_cfg_to_priv(cfg, priv);
	if (ret) {
		debug("%s xlate failure\n", __func__);
899
		free(plat);
P
Peng Fan 已提交
900 901 902 903
		free(priv);
		return ret;
	}

904
	ret = fsl_esdhc_init(priv, plat);
P
Peng Fan 已提交
905 906
	if (ret) {
		debug("%s init failure\n", __func__);
907
		free(plat);
P
Peng Fan 已提交
908 909 910 911
		free(priv);
		return ret;
	}

912 913 914 915 916 917
	mmc = mmc_create(&plat->cfg, priv);
	if (!mmc)
		return -EIO;

	priv->mmc = mmc;

918 919 920 921 922
	return 0;
}

int fsl_esdhc_mmc_init(bd_t *bis)
{
923 924
	struct fsl_esdhc_cfg *cfg;

F
Fabio Estevam 已提交
925
	cfg = calloc(sizeof(struct fsl_esdhc_cfg), 1);
926
	cfg->esdhc_base = CONFIG_SYS_FSL_ESDHC_ADDR;
927
	cfg->sdhc_clk = gd->arch.sdhc_clk;
928
	return fsl_esdhc_initialize(bis, cfg);
929
}
930
#endif
931

932 933 934 935 936 937 938 939 940 941 942
#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
void mmc_adapter_card_type_ident(void)
{
	u8 card_id;
	u8 value;

	card_id = QIXIS_READ(present) & QIXIS_SDID_MASK;
	gd->arch.sdhc_adapter = card_id;

	switch (card_id) {
	case QIXIS_ESDHC_ADAPTER_TYPE_EMMC45:
943 944 945
		value = QIXIS_READ(brdcfg[5]);
		value |= (QIXIS_DAT4 | QIXIS_DAT5_6_7);
		QIXIS_WRITE(brdcfg[5], value);
946 947
		break;
	case QIXIS_ESDHC_ADAPTER_TYPE_SDMMC_LEGACY:
948 949 950
		value = QIXIS_READ(pwr_ctl[1]);
		value |= QIXIS_EVDD_BY_SDHC_VS;
		QIXIS_WRITE(pwr_ctl[1], value);
951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970
		break;
	case QIXIS_ESDHC_ADAPTER_TYPE_EMMC44:
		value = QIXIS_READ(brdcfg[5]);
		value |= (QIXIS_SDCLKIN | QIXIS_SDCLKOUT);
		QIXIS_WRITE(brdcfg[5], value);
		break;
	case QIXIS_ESDHC_ADAPTER_TYPE_RSV:
		break;
	case QIXIS_ESDHC_ADAPTER_TYPE_MMC:
		break;
	case QIXIS_ESDHC_ADAPTER_TYPE_SD:
		break;
	case QIXIS_ESDHC_NO_ADAPTER:
		break;
	default:
		break;
	}
}
#endif

971
#ifdef CONFIG_OF_LIBFDT
972
__weak int esdhc_status_fixup(void *blob, const char *compat)
973
{
974
#ifdef CONFIG_FSL_ESDHC_PIN_MUX
975
	if (!hwconfig("esdhc")) {
976
		do_fixup_by_compat(blob, compat, "status", "disabled",
977 978
				sizeof("disabled"), 1);
		return 1;
979
	}
980
#endif
981 982 983 984 985 986 987 988 989
	return 0;
}

void fdt_fixup_esdhc(void *blob, bd_t *bd)
{
	const char *compat = "fsl,esdhc";

	if (esdhc_status_fixup(blob, compat))
		return;
990

991 992 993 994
#ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
	do_fixup_by_compat_u32(blob, compat, "peripheral-frequency",
			       gd->arch.sdhc_clk, 1);
#else
995
	do_fixup_by_compat_u32(blob, compat, "clock-frequency",
996
			       gd->arch.sdhc_clk, 1);
997
#endif
998 999 1000 1001
#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
	do_fixup_by_compat_u32(blob, compat, "adapter-type",
			       (u32)(gd->arch.sdhc_adapter), 1);
#endif
1002
}
1003
#endif
P
Peng Fan 已提交
1004 1005 1006

#ifdef CONFIG_DM_MMC
#include <asm/arch/clock.h>
P
Peng Fan 已提交
1007 1008 1009 1010
__weak void init_clk_usdhc(u32 index)
{
}

P
Peng Fan 已提交
1011 1012 1013
static int fsl_esdhc_probe(struct udevice *dev)
{
	struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
1014
	struct fsl_esdhc_plat *plat = dev_get_platdata(dev);
P
Peng Fan 已提交
1015
	struct fsl_esdhc_priv *priv = dev_get_priv(dev);
1016
#ifdef CONFIG_DM_REGULATOR
1017
	struct udevice *vqmmc_dev;
1018
#endif
P
Peng Fan 已提交
1019 1020 1021 1022
	fdt_addr_t addr;
	unsigned int val;
	int ret;

1023
	addr = dev_read_addr(dev);
P
Peng Fan 已提交
1024 1025 1026 1027 1028 1029
	if (addr == FDT_ADDR_T_NONE)
		return -EINVAL;

	priv->esdhc_regs = (struct fsl_esdhc *)addr;
	priv->dev = dev;

1030
	val = dev_read_u32_default(dev, "bus-width", -1);
P
Peng Fan 已提交
1031 1032 1033 1034 1035 1036 1037
	if (val == 8)
		priv->bus_width = 8;
	else if (val == 4)
		priv->bus_width = 4;
	else
		priv->bus_width = 1;

1038
	if (dev_read_bool(dev, "non-removable")) {
P
Peng Fan 已提交
1039 1040 1041
		priv->non_removable = 1;
	 } else {
		priv->non_removable = 0;
1042
#ifdef CONFIG_DM_GPIO
1043 1044
		gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio,
				     GPIOD_IS_IN);
1045
#endif
P
Peng Fan 已提交
1046 1047
	}

P
Peng Fan 已提交
1048 1049
	priv->wp_enable = 1;

1050
#ifdef CONFIG_DM_GPIO
1051 1052
	ret = gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio,
				   GPIOD_IS_IN);
P
Peng Fan 已提交
1053 1054
	if (ret)
		priv->wp_enable = 0;
1055
#endif
1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078

	priv->vs18_enable = 0;

#ifdef CONFIG_DM_REGULATOR
	/*
	 * If emmc I/O has a fixed voltage at 1.8V, this must be provided,
	 * otherwise, emmc will work abnormally.
	 */
	ret = device_get_supply_regulator(dev, "vqmmc-supply", &vqmmc_dev);
	if (ret) {
		dev_dbg(dev, "no vqmmc-supply\n");
	} else {
		ret = regulator_set_enable(vqmmc_dev, true);
		if (ret) {
			dev_err(dev, "fail to enable vqmmc-supply\n");
			return ret;
		}

		if (regulator_get_value(vqmmc_dev) == 1800000)
			priv->vs18_enable = 1;
	}
#endif

P
Peng Fan 已提交
1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097
	/*
	 * TODO:
	 * Because lack of clk driver, if SDHC clk is not enabled,
	 * need to enable it first before this driver is invoked.
	 *
	 * we use MXC_ESDHC_CLK to get clk freq.
	 * If one would like to make this function work,
	 * the aliases should be provided in dts as this:
	 *
	 *  aliases {
	 *	mmc0 = &usdhc1;
	 *	mmc1 = &usdhc2;
	 *	mmc2 = &usdhc3;
	 *	mmc3 = &usdhc4;
	 *	};
	 * Then if your board only supports mmc2 and mmc3, but we can
	 * correctly get the seq as 2 and 3, then let mxc_get_clock
	 * work as expected.
	 */
P
Peng Fan 已提交
1098 1099 1100

	init_clk_usdhc(dev->seq);

P
Peng Fan 已提交
1101 1102 1103 1104 1105 1106
	priv->sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK + dev->seq);
	if (priv->sdhc_clk <= 0) {
		dev_err(dev, "Unable to get clk for %s\n", dev->name);
		return -EINVAL;
	}

1107
	ret = fsl_esdhc_init(priv, plat);
P
Peng Fan 已提交
1108 1109 1110 1111 1112 1113
	if (ret) {
		dev_err(dev, "fsl_esdhc_init failure\n");
		return ret;
	}

	upriv->mmc = priv->mmc;
P
Peng Fan 已提交
1114
	priv->mmc->dev = dev;
P
Peng Fan 已提交
1115 1116 1117 1118 1119 1120 1121 1122 1123 1124

	return 0;
}

static const struct udevice_id fsl_esdhc_ids[] = {
	{ .compatible = "fsl,imx6ul-usdhc", },
	{ .compatible = "fsl,imx6sx-usdhc", },
	{ .compatible = "fsl,imx6sl-usdhc", },
	{ .compatible = "fsl,imx6q-usdhc", },
	{ .compatible = "fsl,imx7d-usdhc", },
P
Peng Fan 已提交
1125
	{ .compatible = "fsl,imx7ulp-usdhc", },
1126
	{ .compatible = "fsl,esdhc", },
P
Peng Fan 已提交
1127 1128 1129 1130 1131 1132 1133 1134
	{ /* sentinel */ }
};

U_BOOT_DRIVER(fsl_esdhc) = {
	.name	= "fsl-esdhc-mmc",
	.id	= UCLASS_MMC,
	.of_match = fsl_esdhc_ids,
	.probe	= fsl_esdhc_probe,
1135
	.platdata_auto_alloc_size = sizeof(struct fsl_esdhc_plat),
P
Peng Fan 已提交
1136 1137 1138
	.priv_auto_alloc_size = sizeof(struct fsl_esdhc_priv),
};
#endif