fsl_esdhc.c 20.3 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 <hwconfig.h>
16 17 18 19 20
#include <mmc.h>
#include <part.h>
#include <malloc.h>
#include <mmc.h>
#include <fsl_esdhc.h>
21
#include <fdt_support.h>
22 23 24 25
#include <asm/io.h>

DECLARE_GLOBAL_DATA_PTR;

26 27 28 29 30 31 32
#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)

33
struct fsl_esdhc {
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
	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 */
57 58
	char    reserved2[100];	/* reserved */
	uint    vendorspec;	/* Vendor Specific register */
P
Peng Fan 已提交
59
	char    reserved3[56];	/* reserved */
60 61
	uint    hostver;	/* Host controller version register */
	char    reserved4[4];	/* reserved */
62
	uint    dmaerraddr;	/* DMA error address register */
63
	char    reserved5[4];	/* reserved */
64 65
	uint    dmaerrattr;	/* DMA error attribute register */
	char    reserved6[4];	/* reserved */
66
	uint    hostcapblt2;	/* Host controller capabilities register 2 */
67
	char    reserved7[8];	/* reserved */
68
	uint    tcr;		/* Tuning control register */
69
	char    reserved8[28];	/* reserved */
70
	uint    sddirctl;	/* SD direction control register */
71
	char    reserved9[712];	/* reserved */
72
	uint    scr;		/* eSDHC control register */
73 74 75
};

/* Return the XFERTYP flags for a given command and data packet */
76
static uint esdhc_xfertyp(struct mmc_cmd *cmd, struct mmc_data *data)
77 78 79 80
{
	uint xfertyp = 0;

	if (data) {
81 82 83 84
		xfertyp |= XFERTYP_DPSEL;
#ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
		xfertyp |= XFERTYP_DMAEN;
#endif
85 86 87
		if (data->blocks > 1) {
			xfertyp |= XFERTYP_MSBSEL;
			xfertyp |= XFERTYP_BCEN;
88 89 90
#ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC111
			xfertyp |= XFERTYP_AC12EN;
#endif
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
		}

		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;

108
#if defined(CONFIG_MX53) || defined(CONFIG_PPC_T4240) || \
109 110
	defined(CONFIG_LS102XA) || defined(CONFIG_FSL_LAYERSCAPE) || \
	defined(CONFIG_PPC_T4160)
111 112 113
	if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION)
		xfertyp |= XFERTYP_CMDTYP_ABORT;
#endif
114 115 116
	return XFERTYP_CMD(cmd->cmdidx) | xfertyp;
}

117 118 119 120
#ifdef CONFIG_SYS_FSL_ESDHC_USE_PIO
/*
 * PIO Read/Write Mode reduce the performace as DMA is not used in this mode.
 */
121
static void
122 123
esdhc_pio_read_write(struct mmc *mmc, struct mmc_data *data)
{
I
Ira Snyder 已提交
124 125
	struct fsl_esdhc_cfg *cfg = mmc->priv;
	struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
	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.");
144
				return;
145 146 147 148 149 150 151 152 153 154 155 156 157
			}
			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;
158
		buffer = (char *)data->src;
159 160 161 162 163 164 165 166
		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.");
167
				return;
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
			}
			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

183 184 185
static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
{
	int timeout;
186
	struct fsl_esdhc_cfg *cfg = mmc->priv;
187
	struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
188
#ifdef CONFIG_FSL_LAYERSCAPE
189 190
	dma_addr_t addr;
#endif
191
	uint wml_value;
192 193 194 195

	wml_value = data->blocksize/4;

	if (data->flags & MMC_DATA_READ) {
196 197
		if (wml_value > WML_RD_WML_MAX)
			wml_value = WML_RD_WML_MAX_VAL;
198

199
		esdhc_clrsetbits32(&regs->wml, WML_RD_WML_MASK, wml_value);
200
#ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
201
#ifdef CONFIG_FSL_LAYERSCAPE
202 203 204 205 206 207
		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
208
		esdhc_write32(&regs->dsaddr, (u32)data->dest);
209
#endif
210
#endif
211
	} else {
212
#ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
213 214 215
		flush_dcache_range((ulong)data->src,
				   (ulong)data->src+data->blocks
					 *data->blocksize);
216
#endif
217 218
		if (wml_value > WML_WR_WML_MAX)
			wml_value = WML_WR_WML_MAX_VAL;
219
		if ((esdhc_read32(&regs->prsstat) & PRSSTAT_WPSPL) == 0) {
220 221 222
			printf("\nThe SD card is locked. Can not write to a locked card.\n\n");
			return TIMEOUT;
		}
223 224 225

		esdhc_clrsetbits32(&regs->wml, WML_WR_WML_MASK,
					wml_value << 16);
226
#ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
227
#ifdef CONFIG_FSL_LAYERSCAPE
228 229 230 231 232 233
		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
234
		esdhc_write32(&regs->dsaddr, (u32)data->src);
235
#endif
236
#endif
237 238
	}

239
	esdhc_write32(&regs->blkattr, data->blocks << 16 | data->blocksize);
240 241

	/* Calculate the timeout period for data transactions */
242 243 244 245 246
	/*
	 * 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
247
	 *		= (mmc->clock * 1/4) SD Clock cycles
248
	 * As 1) >=  2)
249
	 * => (2^(timeout+13)) >= mmc->clock * 1/4
250
	 * Taking log2 both the sides
251
	 * => timeout + 13 >= log2(mmc->clock/4)
252
	 * Rounding up to next power of 2
253 254
	 * => timeout + 13 = log2(mmc->clock/4) + 1
	 * => timeout + 13 = fls(mmc->clock/4)
255
	 */
256
	timeout = fls(mmc->clock/4);
257 258 259 260 261 262 263 264
	timeout -= 13;

	if (timeout > 14)
		timeout = 14;

	if (timeout < 0)
		timeout = 0;

265 266 267 268 269
#ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC_A001
	if ((timeout == 4) || (timeout == 8) || (timeout == 12))
		timeout++;
#endif

270 271 272
#ifdef ESDHCI_QUIRK_BROKEN_TIMEOUT_VALUE
	timeout = 0xE;
#endif
273
	esdhc_clrsetbits32(&regs->sysctl, SYSCTL_TIMEOUT_MASK, timeout << 16);
274 275 276 277

	return 0;
}

278 279 280
static void check_and_invalidate_dcache_range
	(struct mmc_cmd *cmd,
	 struct mmc_data *data) {
281
#ifdef CONFIG_FSL_LAYERSCAPE
282 283
	unsigned start = 0;
#else
284
	unsigned start = (unsigned)data->dest ;
285
#endif
286 287 288
	unsigned size = roundup(ARCH_DMA_MINALIGN,
				data->blocks*data->blocksize);
	unsigned end = start+size ;
289
#ifdef CONFIG_FSL_LAYERSCAPE
290 291 292 293 294 295 296 297
	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);
#endif
298 299
	invalidate_dcache_range(start, end);
}
300

301 302 303 304 305 306 307
/*
 * Sends a command out on the bus.  Takes the mmc pointer,
 * a command pointer, and an optional data pointer.
 */
static int
esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
{
308
	int	err = 0;
309 310
	uint	xfertyp;
	uint	irqstat;
311
	struct fsl_esdhc_cfg *cfg = mmc->priv;
312
	volatile struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
313

314 315 316 317 318
#ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC111
	if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION)
		return 0;
#endif

319
	esdhc_write32(&regs->irqstat, -1);
320 321 322 323

	sync();

	/* Wait for the bus to be idle */
324 325 326
	while ((esdhc_read32(&regs->prsstat) & PRSSTAT_CICHB) ||
			(esdhc_read32(&regs->prsstat) & PRSSTAT_CIDHB))
		;
327

328 329
	while (esdhc_read32(&regs->prsstat) & PRSSTAT_DLA)
		;
330 331 332 333 334 335 336 337 338 339 340 341 342

	/* 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) {
		err = esdhc_setup_data(mmc, data);
		if(err)
			return err;
343 344 345

		if (data->flags & MMC_DATA_READ)
			check_and_invalidate_dcache_range(cmd, data);
346 347 348 349 350
	}

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

351 352 353
	/* Mask all irqs */
	esdhc_write32(&regs->irqsigen, 0);

354
	/* Send the command */
355
	esdhc_write32(&regs->cmdarg, cmd->cmdarg);
356 357
#if defined(CONFIG_FSL_USDHC)
	esdhc_write32(&regs->mixctrl,
358 359
	(esdhc_read32(&regs->mixctrl) & 0xFFFFFF80) | (xfertyp & 0x7F)
			| (mmc->ddr_mode ? XFERTYP_DDREN : 0));
360 361
	esdhc_write32(&regs->xfertyp, xfertyp & 0xFFFF0000);
#else
362
	esdhc_write32(&regs->xfertyp, xfertyp);
363
#endif
364

365
	/* Wait for the command to complete */
366
	while (!(esdhc_read32(&regs->irqstat) & (IRQSTAT_CC | IRQSTAT_CTOE)))
367
		;
368

369
	irqstat = esdhc_read32(&regs->irqstat);
370

371 372 373
	if (irqstat & CMD_ERR) {
		err = COMM_ERR;
		goto out;
374 375
	}

376 377 378 379
	if (irqstat & IRQSTAT_CTOE) {
		err = TIMEOUT;
		goto out;
	}
380

381 382 383 384 385 386 387 388 389
	/* 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);
	}

390 391
	/* Workaround for ESDHC errata ENGcm03648 */
	if (!data && (cmd->resp_type & MMC_RSP_BUSY)) {
392
		int timeout = 6000;
393

394
		/* Poll on DATA0 line for cmd with busy signal for 600 ms */
395 396 397 398 399 400 401 402
		while (timeout > 0 && !(esdhc_read32(&regs->prsstat) &
					PRSSTAT_DAT0)) {
			udelay(100);
			timeout--;
		}

		if (timeout <= 0) {
			printf("Timeout waiting for DAT0 to go high!\n");
403 404
			err = TIMEOUT;
			goto out;
405 406 407
		}
	}

408 409 410 411
	/* Copy the response to the response buffer */
	if (cmd->resp_type & MMC_RSP_136) {
		u32 cmdrsp3, cmdrsp2, cmdrsp1, cmdrsp0;

412 413 414 415
		cmdrsp3 = esdhc_read32(&regs->cmdrsp3);
		cmdrsp2 = esdhc_read32(&regs->cmdrsp2);
		cmdrsp1 = esdhc_read32(&regs->cmdrsp1);
		cmdrsp0 = esdhc_read32(&regs->cmdrsp0);
R
Rabin Vincent 已提交
416 417 418 419
		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);
420
	} else
421
		cmd->response[0] = esdhc_read32(&regs->cmdrsp0);
422 423 424

	/* Wait until all of the blocks are transferred */
	if (data) {
425 426 427
#ifdef CONFIG_SYS_FSL_ESDHC_USE_PIO
		esdhc_pio_read_write(mmc, data);
#else
428
		do {
429
			irqstat = esdhc_read32(&regs->irqstat);
430

431 432 433 434
			if (irqstat & IRQSTAT_DTOE) {
				err = TIMEOUT;
				goto out;
			}
435

436 437 438 439
			if (irqstat & DATA_ERR) {
				err = COMM_ERR;
				goto out;
			}
440
		} while ((irqstat & DATA_COMPLETE) != DATA_COMPLETE);
441

442 443 444 445 446
		/*
		 * Need invalidate the dcache here again to avoid any
		 * cache-fill during the DMA operations such as the
		 * speculative pre-fetching etc.
		 */
447 448
		if (data->flags & MMC_DATA_READ)
			check_and_invalidate_dcache_range(cmd, data);
449
#endif
450 451
	}

452 453 454 455 456 457 458 459 460 461 462 463 464 465 466
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))
				;
		}
467 468 469 470

		/* 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");
471 472
	}

473
	esdhc_write32(&regs->irqstat, -1);
474

475
	return err;
476 477
}

478
static void set_sysctl(struct mmc *mmc, uint clock)
479 480
{
	int div, pre_div;
481
	struct fsl_esdhc_cfg *cfg = mmc->priv;
482
	volatile struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
483
	int sdhc_clk = cfg->sdhc_clk;
484 485
	uint clk;

486 487
	if (clock < mmc->cfg->f_min)
		clock = mmc->cfg->f_min;
488

489 490 491 492 493 494 495 496 497 498 499
	if (sdhc_clk / 16 > clock) {
		for (pre_div = 2; pre_div < 256; pre_div *= 2)
			if ((sdhc_clk / pre_div) <= (clock * 16))
				break;
	} else
		pre_div = 2;

	for (div = 1; div <= 16; div++)
		if ((sdhc_clk / (div * pre_div)) <= clock)
			break;

500
	pre_div >>= mmc->ddr_mode ? 2 : 1;
501 502 503 504
	div -= 1;

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

505
	esdhc_clrbits32(&regs->sysctl, SYSCTL_CKEN);
506 507

	esdhc_clrsetbits32(&regs->sysctl, SYSCTL_CLOCK_MASK, clk);
508 509 510

	udelay(10000);

511
	clk = SYSCTL_PEREN | SYSCTL_CKEN;
512 513

	esdhc_setbits32(&regs->sysctl, clk);
514 515
}

516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545
#ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
static void esdhc_clock_control(struct mmc *mmc, bool enable)
{
	struct fsl_esdhc_cfg *cfg = mmc->priv;
	struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
	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

546 547
static void esdhc_set_ios(struct mmc *mmc)
{
548
	struct fsl_esdhc_cfg *cfg = mmc->priv;
549
	struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
550

551 552 553 554 555 556
#ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
	/* Select to use peripheral clock */
	esdhc_clock_control(mmc, false);
	esdhc_setbits32(&regs->scr, ESDHCCTL_PCS);
	esdhc_clock_control(mmc, true);
#endif
557 558 559 560
	/* Set the clock speed */
	set_sysctl(mmc, mmc->clock);

	/* Set the bus width */
561
	esdhc_clrbits32(&regs->proctl, PROCTL_DTW_4 | PROCTL_DTW_8);
562 563

	if (mmc->bus_width == 4)
564
		esdhc_setbits32(&regs->proctl, PROCTL_DTW_4);
565
	else if (mmc->bus_width == 8)
566 567
		esdhc_setbits32(&regs->proctl, PROCTL_DTW_8);

568 569 570 571
}

static int esdhc_init(struct mmc *mmc)
{
572
	struct fsl_esdhc_cfg *cfg = mmc->priv;
573
	struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
574 575
	int timeout = 1000;

576
	/* Reset the entire host controller */
577
	esdhc_setbits32(&regs->sysctl, SYSCTL_RSTA);
578 579 580 581

	/* Wait until the controller is available */
	while ((esdhc_read32(&regs->sysctl) & SYSCTL_RSTA) && --timeout)
		udelay(1000);
582

583
#ifndef ARCH_MXC
584
	/* Enable cache snooping */
585 586
	esdhc_write32(&regs->scr, 0x00000040);
#endif
587

588
	esdhc_setbits32(&regs->sysctl, SYSCTL_HCKEN | SYSCTL_IPGEN);
589 590

	/* Set the initial clock speed */
591
	mmc_set_clock(mmc, 400000);
592 593

	/* Disable the BRR and BWR bits in IRQSTAT */
594
	esdhc_clrbits32(&regs->irqstaten, IRQSTATEN_BRR | IRQSTATEN_BWR);
595 596

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

599 600
	/* Set timout to the maximum value */
	esdhc_clrsetbits32(&regs->sysctl, SYSCTL_TIMEOUT_MASK, 14 << 16);
601

602 603 604 605
#ifdef CONFIG_SYS_FSL_ESDHC_FORCE_VSELECT
	esdhc_setbits32(&regs->vendorspec, ESDHC_VENDORSPEC_VSELECT);
#endif

606 607
	return 0;
}
608

609 610
static int esdhc_getcd(struct mmc *mmc)
{
611
	struct fsl_esdhc_cfg *cfg = mmc->priv;
612 613 614
	struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
	int timeout = 1000;

615 616 617 618
#ifdef CONFIG_ESDHC_DETECT_QUIRK
	if (CONFIG_ESDHC_DETECT_QUIRK)
		return 1;
#endif
619 620
	while (!(esdhc_read32(&regs->prsstat) & PRSSTAT_CINS) && --timeout)
		udelay(1000);
621

622
	return timeout > 0;
623 624
}

625 626 627 628 629
static void esdhc_reset(struct fsl_esdhc *regs)
{
	unsigned long timeout = 100; /* wait max 100 ms */

	/* reset the controller */
630
	esdhc_setbits32(&regs->sysctl, SYSCTL_RSTA);
631 632 633 634 635 636 637 638

	/* hardware clears the bit when it is done */
	while ((esdhc_read32(&regs->sysctl) & SYSCTL_RSTA) && --timeout)
		udelay(1000);
	if (!timeout)
		printf("MMC/SD: Reset never completed.\n");
}

639 640 641 642 643 644 645
static const struct mmc_ops esdhc_ops = {
	.send_cmd	= esdhc_send_cmd,
	.set_ios	= esdhc_set_ios,
	.init		= esdhc_init,
	.getcd		= esdhc_getcd,
};

646
int fsl_esdhc_initialize(bd_t *bis, struct fsl_esdhc_cfg *cfg)
647
{
648
	struct fsl_esdhc *regs;
649
	struct mmc *mmc;
650
	u32 caps, voltage_caps;
651

652 653 654 655 656
	if (!cfg)
		return -1;

	regs = (struct fsl_esdhc *)cfg->esdhc_base;

657 658 659
	/* First reset the eSDHC controller */
	esdhc_reset(regs);

660 661 662
	esdhc_setbits32(&regs->sysctl, SYSCTL_PEREN | SYSCTL_HCKEN
				| SYSCTL_IPGEN | SYSCTL_CKEN);

663
	writel(SDHCI_IRQ_EN_BITS, &regs->irqstaten);
664 665
	memset(&cfg->cfg, 0, sizeof(cfg->cfg));

666
	voltage_caps = 0;
667
	caps = esdhc_read32(&regs->hostcapblt);
668 669 670 671 672

#ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC135
	caps = caps & ~(ESDHC_HOSTCAPBLT_SRS |
			ESDHC_HOSTCAPBLT_VS18 | ESDHC_HOSTCAPBLT_VS30);
#endif
673 674 675 676 677 678

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

679
	if (caps & ESDHC_HOSTCAPBLT_VS18)
680
		voltage_caps |= MMC_VDD_165_195;
681
	if (caps & ESDHC_HOSTCAPBLT_VS30)
682
		voltage_caps |= MMC_VDD_29_30 | MMC_VDD_30_31;
683
	if (caps & ESDHC_HOSTCAPBLT_VS33)
684 685
		voltage_caps |= MMC_VDD_32_33 | MMC_VDD_33_34;

686 687
	cfg->cfg.name = "FSL_SDHC";
	cfg->cfg.ops = &esdhc_ops;
688
#ifdef CONFIG_SYS_SD_VOLTAGE
689
	cfg->cfg.voltages = CONFIG_SYS_SD_VOLTAGE;
690
#else
691
	cfg->cfg.voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
692
#endif
693
	if ((cfg->cfg.voltages & voltage_caps) == 0) {
694 695 696
		printf("voltage not supported by controller\n");
		return -1;
	}
697

R
Rob Herring 已提交
698
	cfg->cfg.host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
699 700 701
#ifdef CONFIG_SYS_FSL_ESDHC_HAS_DDR_MODE
	cfg->cfg.host_caps |= MMC_MODE_DDR_52MHz;
#endif
702

703 704
	if (cfg->max_bus_width > 0) {
		if (cfg->max_bus_width < 8)
705
			cfg->cfg.host_caps &= ~MMC_MODE_8BIT;
706
		if (cfg->max_bus_width < 4)
707
			cfg->cfg.host_caps &= ~MMC_MODE_4BIT;
708 709
	}

710
	if (caps & ESDHC_HOSTCAPBLT_HSS)
711
		cfg->cfg.host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
712

713 714
#ifdef CONFIG_ESDHC_DETECT_8_BIT_QUIRK
	if (CONFIG_ESDHC_DETECT_8_BIT_QUIRK)
715
		cfg->cfg.host_caps &= ~MMC_MODE_8BIT;
716 717
#endif

718
	cfg->cfg.f_min = 400000;
719
	cfg->cfg.f_max = min(cfg->sdhc_clk, (u32)52000000);
720

721 722 723 724 725
	cfg->cfg.b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;

	mmc = mmc_create(&cfg->cfg, cfg);
	if (mmc == NULL)
		return -1;
726 727 728 729 730 731

	return 0;
}

int fsl_esdhc_mmc_init(bd_t *bis)
{
732 733
	struct fsl_esdhc_cfg *cfg;

F
Fabio Estevam 已提交
734
	cfg = calloc(sizeof(struct fsl_esdhc_cfg), 1);
735
	cfg->esdhc_base = CONFIG_SYS_FSL_ESDHC_ADDR;
736
	cfg->sdhc_clk = gd->arch.sdhc_clk;
737
	return fsl_esdhc_initialize(bis, cfg);
738
}
739

740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772
#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:
		break;
	case QIXIS_ESDHC_ADAPTER_TYPE_SDMMC_LEGACY:
		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

773
#ifdef CONFIG_OF_LIBFDT
774 775 776 777
void fdt_fixup_esdhc(void *blob, bd_t *bd)
{
	const char *compat = "fsl,esdhc";

778
#ifdef CONFIG_FSL_ESDHC_PIN_MUX
779
	if (!hwconfig("esdhc")) {
780 781 782
		do_fixup_by_compat(blob, compat, "status", "disabled",
				8 + 1, 1);
		return;
783
	}
784
#endif
785

786 787 788 789
#ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
	do_fixup_by_compat_u32(blob, compat, "peripheral-frequency",
			       gd->arch.sdhc_clk, 1);
#else
790
	do_fixup_by_compat_u32(blob, compat, "clock-frequency",
791
			       gd->arch.sdhc_clk, 1);
792
#endif
793 794 795 796
#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
	do_fixup_by_compat_u32(blob, compat, "adapter-type",
			       (u32)(gd->arch.sdhc_adapter), 1);
#endif
797 798
	do_fixup_by_compat(blob, compat, "status", "okay",
			   4 + 1, 1);
799
}
800
#endif