omap_hsmmc.c 54.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 * drivers/mmc/host/omap_hsmmc.c
 *
 * Driver for OMAP2430/3430 MMC controller.
 *
 * Copyright (C) 2007 Texas Instruments.
 *
 * Authors:
 *	Syed Mohammed Khasim	<x0khasim@ti.com>
 *	Madhusudhan		<madhu.cr@ti.com>
 *	Mohit Jalori		<mjalori@ti.com>
 *
 * This file is licensed under the terms of the GNU General Public License
 * version 2. This program is licensed "as is" without any warranty of any
 * kind, whether express or implied.
 */

#include <linux/module.h>
#include <linux/init.h>
20
#include <linux/kernel.h>
21
#include <linux/debugfs.h>
22
#include <linux/dmaengine.h>
23
#include <linux/seq_file.h>
24
#include <linux/sizes.h>
25 26 27 28 29 30
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/dma-mapping.h>
#include <linux/platform_device.h>
#include <linux/timer.h>
#include <linux/clk.h>
31 32 33
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/of_device.h>
R
Russell King 已提交
34
#include <linux/omap-dma.h>
35
#include <linux/mmc/host.h>
36
#include <linux/mmc/core.h>
A
Adrian Hunter 已提交
37
#include <linux/mmc/mmc.h>
38
#include <linux/io.h>
39 40
#include <linux/gpio.h>
#include <linux/regulator/consumer.h>
41
#include <linux/pinctrl/consumer.h>
42
#include <linux/pm_runtime.h>
43
#include <linux/platform_data/mmc-omap.h>
44 45

/* OMAP HSMMC Host Controller Registers */
46
#define OMAP_HSMMC_SYSSTATUS	0x0014
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
#define OMAP_HSMMC_CON		0x002C
#define OMAP_HSMMC_BLK		0x0104
#define OMAP_HSMMC_ARG		0x0108
#define OMAP_HSMMC_CMD		0x010C
#define OMAP_HSMMC_RSP10	0x0110
#define OMAP_HSMMC_RSP32	0x0114
#define OMAP_HSMMC_RSP54	0x0118
#define OMAP_HSMMC_RSP76	0x011C
#define OMAP_HSMMC_DATA		0x0120
#define OMAP_HSMMC_HCTL		0x0128
#define OMAP_HSMMC_SYSCTL	0x012C
#define OMAP_HSMMC_STAT		0x0130
#define OMAP_HSMMC_IE		0x0134
#define OMAP_HSMMC_ISE		0x0138
#define OMAP_HSMMC_CAPA		0x0140

#define VS18			(1 << 26)
#define VS30			(1 << 25)
65
#define HSS			(1 << 21)
66 67
#define SDVS18			(0x5 << 9)
#define SDVS30			(0x6 << 9)
68
#define SDVS33			(0x7 << 9)
69
#define SDVS_MASK		0x00000E00
70 71 72 73 74 75 76 77
#define SDVSCLR			0xFFFFF1FF
#define SDVSDET			0x00000400
#define AUTOIDLE		0x1
#define SDBP			(1 << 8)
#define DTO			0xe
#define ICE			0x1
#define ICS			0x2
#define CEN			(1 << 2)
78
#define CLKD_MAX		0x3FF		/* max clock divisor: 1023 */
79 80 81 82 83 84 85
#define CLKD_MASK		0x0000FFC0
#define CLKD_SHIFT		6
#define DTO_MASK		0x000F0000
#define DTO_SHIFT		16
#define INIT_STREAM		(1 << 1)
#define DP_SELECT		(1 << 21)
#define DDIR			(1 << 4)
86
#define DMAE			0x1
87 88 89
#define MSBS			(1 << 5)
#define BCE			(1 << 1)
#define FOUR_BIT		(1 << 1)
90
#define HSPE			(1 << 2)
B
Balaji T K 已提交
91
#define DDR			(1 << 19)
92
#define DW8			(1 << 5)
93 94 95 96 97 98
#define OD			0x1
#define STAT_CLEAR		0xFFFFFFFF
#define INIT_STREAM_CMD		0x00000000
#define DUAL_VOLT_OCR_BIT	7
#define SRC			(1 << 25)
#define SRD			(1 << 26)
99 100
#define SOFTRESET		(1 << 1)
#define RESETDONE		(1 << 0)
101

102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
/* Interrupt masks for IE and ISE register */
#define CC_EN			(1 << 0)
#define TC_EN			(1 << 1)
#define BWR_EN			(1 << 4)
#define BRR_EN			(1 << 5)
#define ERR_EN			(1 << 15)
#define CTO_EN			(1 << 16)
#define CCRC_EN			(1 << 17)
#define CEB_EN			(1 << 18)
#define CIE_EN			(1 << 19)
#define DTO_EN			(1 << 20)
#define DCRC_EN			(1 << 21)
#define DEB_EN			(1 << 22)
#define CERR_EN			(1 << 28)
#define BADA_EN			(1 << 29)

#define INT_EN_MASK		(BADA_EN | CERR_EN | DEB_EN | DCRC_EN |\
		DTO_EN | CIE_EN | CEB_EN | CCRC_EN | CTO_EN | \
		BRR_EN | BWR_EN | TC_EN | CC_EN)

122
#define MMC_AUTOSUSPEND_DELAY	100
123 124
#define MMC_TIMEOUT_MS		20		/* 20 mSec */
#define MMC_TIMEOUT_US		20000		/* 20000 micro Sec */
125 126
#define OMAP_MMC_MIN_CLOCK	400000
#define OMAP_MMC_MAX_CLOCK	52000000
127
#define DRIVER_NAME		"omap_hsmmc"
128

129 130 131 132
#define VDD_1V8			1800000		/* 180000 uV */
#define VDD_3V0			3000000		/* 300000 uV */
#define VDD_165_195		(ffs(MMC_VDD_165_195) - 1)

133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
/*
 * One controller can have multiple slots, like on some omap boards using
 * omap.c controller driver. Luckily this is not currently done on any known
 * omap_hsmmc.c device.
 */
#define mmc_slot(host)		(host->pdata->slots[host->slot_id])

/*
 * MMC Host controller read/write API's
 */
#define OMAP_HSMMC_READ(base, reg)	\
	__raw_readl((base) + OMAP_HSMMC_##reg)

#define OMAP_HSMMC_WRITE(base, reg, val) \
	__raw_writel((val), (base) + OMAP_HSMMC_##reg)

149 150 151 152 153
struct omap_hsmmc_next {
	unsigned int	dma_len;
	s32		cookie;
};

D
Denis Karpov 已提交
154
struct omap_hsmmc_host {
155 156 157 158 159 160 161
	struct	device		*dev;
	struct	mmc_host	*mmc;
	struct	mmc_request	*mrq;
	struct	mmc_command	*cmd;
	struct	mmc_data	*data;
	struct	clk		*fclk;
	struct	clk		*dbclk;
162 163 164 165 166 167 168 169 170
	/*
	 * vcc == configured supply
	 * vcc_aux == optional
	 *   -	MMC1, supply for DAT4..DAT7
	 *   -	MMC2/MMC2, external level shifter voltage supply, for
	 *	chip (SDIO, eMMC, etc) or transceiver (MMC2 only)
	 */
	struct	regulator	*vcc;
	struct	regulator	*vcc_aux;
171 172
	struct	regulator	*pbias;
	bool			pbias_enabled;
173 174
	void	__iomem		*base;
	resource_size_t		mapbase;
175
	spinlock_t		irq_lock; /* Prevent races with irq handler */
176
	unsigned int		dma_len;
177
	unsigned int		dma_sg_idx;
178
	unsigned char		bus_mode;
179
	unsigned char		power_mode;
180
	int			suspended;
181 182 183 184
	u32			con;
	u32			hctl;
	u32			sysctl;
	u32			capa;
185 186
	int			irq;
	int			use_dma, dma_ch;
187 188
	struct dma_chan		*tx_chan;
	struct dma_chan		*rx_chan;
189
	int			slot_id;
190
	int			response_busy;
191
	int			context_loss;
192 193
	int			protect_card;
	int			reqs_blocked;
194
	int			use_reg;
195
	int			req_in_progress;
196
	struct omap_hsmmc_next	next_data;
197 198 199
	struct	omap_mmc_platform_data	*pdata;
};

200 201 202 203 204
struct omap_mmc_of_data {
	u32 reg_offset;
	u8 controller_flags;
};

205 206
static int omap_hsmmc_card_detect(struct device *dev, int slot)
{
207 208
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);
	struct omap_mmc_platform_data *mmc = host->pdata;
209 210 211 212 213 214 215

	/* NOTE: assumes card detect signal is active-low */
	return !gpio_get_value_cansleep(mmc->slots[0].switch_pin);
}

static int omap_hsmmc_get_wp(struct device *dev, int slot)
{
216 217
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);
	struct omap_mmc_platform_data *mmc = host->pdata;
218 219 220 221 222 223 224

	/* NOTE: assumes write protect signal is active-high */
	return gpio_get_value_cansleep(mmc->slots[0].gpio_wp);
}

static int omap_hsmmc_get_cover_state(struct device *dev, int slot)
{
225 226
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);
	struct omap_mmc_platform_data *mmc = host->pdata;
227 228 229 230 231 232 233 234 235

	/* NOTE: assumes card detect signal is active-low */
	return !gpio_get_value_cansleep(mmc->slots[0].switch_pin);
}

#ifdef CONFIG_PM

static int omap_hsmmc_suspend_cdirq(struct device *dev, int slot)
{
236 237
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);
	struct omap_mmc_platform_data *mmc = host->pdata;
238 239 240 241 242 243 244

	disable_irq(mmc->slots[0].card_detect_irq);
	return 0;
}

static int omap_hsmmc_resume_cdirq(struct device *dev, int slot)
{
245 246
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);
	struct omap_mmc_platform_data *mmc = host->pdata;
247 248 249 250 251 252 253 254 255 256 257 258

	enable_irq(mmc->slots[0].card_detect_irq);
	return 0;
}

#else

#define omap_hsmmc_suspend_cdirq	NULL
#define omap_hsmmc_resume_cdirq		NULL

#endif

259 260
#ifdef CONFIG_REGULATOR

261
static int omap_hsmmc_set_power(struct device *dev, int slot, int power_on,
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
				   int vdd)
{
	struct omap_hsmmc_host *host =
		platform_get_drvdata(to_platform_device(dev));
	int ret = 0;

	/*
	 * If we don't see a Vcc regulator, assume it's a fixed
	 * voltage always-on regulator.
	 */
	if (!host->vcc)
		return 0;

	if (mmc_slot(host).before_set_reg)
		mmc_slot(host).before_set_reg(dev, slot, power_on, vdd);

278 279 280 281 282 283 284 285 286
	if (host->pbias) {
		if (host->pbias_enabled == 1) {
			ret = regulator_disable(host->pbias);
			if (!ret)
				host->pbias_enabled = 0;
		}
		regulator_set_voltage(host->pbias, VDD_3V0, VDD_3V0);
	}

287 288 289 290 291 292 293 294 295 296 297 298 299 300
	/*
	 * Assume Vcc regulator is used only to power the card ... OMAP
	 * VDDS is used to power the pins, optionally with a transceiver to
	 * support cards using voltages other than VDDS (1.8V nominal).  When a
	 * transceiver is used, DAT3..7 are muxed as transceiver control pins.
	 *
	 * In some cases this regulator won't support enable/disable;
	 * e.g. it's a fixed rail for a WLAN chip.
	 *
	 * In other cases vcc_aux switches interface power.  Example, for
	 * eMMC cards it represents VccQ.  Sometimes transceivers or SDIO
	 * chips/cards need an interface voltage rail too.
	 */
	if (power_on) {
301 302
		if (host->vcc)
			ret = mmc_regulator_set_ocr(host->mmc, host->vcc, vdd);
303 304 305
		/* Enable interface voltage rail, if needed */
		if (ret == 0 && host->vcc_aux) {
			ret = regulator_enable(host->vcc_aux);
306
			if (ret < 0 && host->vcc)
307 308
				ret = mmc_regulator_set_ocr(host->mmc,
							host->vcc, 0);
309 310
		}
	} else {
311
		/* Shut down the rail */
312 313
		if (host->vcc_aux)
			ret = regulator_disable(host->vcc_aux);
314
		if (host->vcc) {
315 316 317 318
			/* Then proceed to shut down the local regulator */
			ret = mmc_regulator_set_ocr(host->mmc,
						host->vcc, 0);
		}
319 320
	}

321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
	if (host->pbias) {
		if (vdd <= VDD_165_195)
			ret = regulator_set_voltage(host->pbias, VDD_1V8,
								VDD_1V8);
		else
			ret = regulator_set_voltage(host->pbias, VDD_3V0,
								VDD_3V0);
		if (ret < 0)
			goto error_set_power;

		if (host->pbias_enabled == 0) {
			ret = regulator_enable(host->pbias);
			if (!ret)
				host->pbias_enabled = 1;
		}
	}

338 339 340
	if (mmc_slot(host).after_set_reg)
		mmc_slot(host).after_set_reg(dev, slot, power_on, vdd);

341
error_set_power:
342 343 344 345 346 347
	return ret;
}

static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
{
	struct regulator *reg;
348
	int ocr_value = 0;
349

350
	reg = devm_regulator_get(host->dev, "vmmc");
351
	if (IS_ERR(reg)) {
352 353
		dev_err(host->dev, "unable to get vmmc regulator %ld\n",
			PTR_ERR(reg));
354
		return PTR_ERR(reg);
355 356
	} else {
		host->vcc = reg;
357 358 359 360 361
		ocr_value = mmc_regulator_get_ocrmask(reg);
		if (!mmc_slot(host).ocr_mask) {
			mmc_slot(host).ocr_mask = ocr_value;
		} else {
			if (!(mmc_slot(host).ocr_mask & ocr_value)) {
362
				dev_err(host->dev, "ocrmask %x is not supported\n",
363
					mmc_slot(host).ocr_mask);
364 365 366 367
				mmc_slot(host).ocr_mask = 0;
				return -EINVAL;
			}
		}
368 369
	}
	mmc_slot(host).set_power = omap_hsmmc_set_power;
370

371 372 373 374
	/* Allow an aux regulator */
	reg = devm_regulator_get_optional(host->dev, "vmmc_aux");
	host->vcc_aux = IS_ERR(reg) ? NULL : reg;

375 376 377
	reg = devm_regulator_get_optional(host->dev, "pbias");
	host->pbias = IS_ERR(reg) ? NULL : reg;

378 379 380 381 382 383 384 385 386 387 388 389 390
	/* For eMMC do not power off when not in sleep state */
	if (mmc_slot(host).no_regulator_off_init)
		return 0;
	/*
	 * To disable boot_on regulator, enable regulator
	 * to increase usecount and then disable it.
	 */
	if ((host->vcc && regulator_is_enabled(host->vcc) > 0) ||
	    (host->vcc_aux && regulator_is_enabled(host->vcc_aux))) {
		int vdd = ffs(mmc_slot(host).ocr_mask) - 1;

		mmc_slot(host).set_power(host->dev, host->slot_id, 1, vdd);
		mmc_slot(host).set_power(host->dev, host->slot_id, 0, 0);
391 392 393 394 395 396 397 398 399 400
	}

	return 0;
}

static void omap_hsmmc_reg_put(struct omap_hsmmc_host *host)
{
	mmc_slot(host).set_power = NULL;
}

401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474
static inline int omap_hsmmc_have_reg(void)
{
	return 1;
}

#else

static inline int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
{
	return -EINVAL;
}

static inline void omap_hsmmc_reg_put(struct omap_hsmmc_host *host)
{
}

static inline int omap_hsmmc_have_reg(void)
{
	return 0;
}

#endif

static int omap_hsmmc_gpio_init(struct omap_mmc_platform_data *pdata)
{
	int ret;

	if (gpio_is_valid(pdata->slots[0].switch_pin)) {
		if (pdata->slots[0].cover)
			pdata->slots[0].get_cover_state =
					omap_hsmmc_get_cover_state;
		else
			pdata->slots[0].card_detect = omap_hsmmc_card_detect;
		pdata->slots[0].card_detect_irq =
				gpio_to_irq(pdata->slots[0].switch_pin);
		ret = gpio_request(pdata->slots[0].switch_pin, "mmc_cd");
		if (ret)
			return ret;
		ret = gpio_direction_input(pdata->slots[0].switch_pin);
		if (ret)
			goto err_free_sp;
	} else
		pdata->slots[0].switch_pin = -EINVAL;

	if (gpio_is_valid(pdata->slots[0].gpio_wp)) {
		pdata->slots[0].get_ro = omap_hsmmc_get_wp;
		ret = gpio_request(pdata->slots[0].gpio_wp, "mmc_wp");
		if (ret)
			goto err_free_cd;
		ret = gpio_direction_input(pdata->slots[0].gpio_wp);
		if (ret)
			goto err_free_wp;
	} else
		pdata->slots[0].gpio_wp = -EINVAL;

	return 0;

err_free_wp:
	gpio_free(pdata->slots[0].gpio_wp);
err_free_cd:
	if (gpio_is_valid(pdata->slots[0].switch_pin))
err_free_sp:
		gpio_free(pdata->slots[0].switch_pin);
	return ret;
}

static void omap_hsmmc_gpio_free(struct omap_mmc_platform_data *pdata)
{
	if (gpio_is_valid(pdata->slots[0].gpio_wp))
		gpio_free(pdata->slots[0].gpio_wp);
	if (gpio_is_valid(pdata->slots[0].switch_pin))
		gpio_free(pdata->slots[0].switch_pin);
}

475 476 477 478 479 480 481 482 483
/*
 * Start clock to the card
 */
static void omap_hsmmc_start_clock(struct omap_hsmmc_host *host)
{
	OMAP_HSMMC_WRITE(host->base, SYSCTL,
		OMAP_HSMMC_READ(host->base, SYSCTL) | CEN);
}

484 485 486
/*
 * Stop clock to the card
 */
D
Denis Karpov 已提交
487
static void omap_hsmmc_stop_clock(struct omap_hsmmc_host *host)
488 489 490 491
{
	OMAP_HSMMC_WRITE(host->base, SYSCTL,
		OMAP_HSMMC_READ(host->base, SYSCTL) & ~CEN);
	if ((OMAP_HSMMC_READ(host->base, SYSCTL) & CEN) != 0x0)
M
Masanari Iida 已提交
492
		dev_dbg(mmc_dev(host->mmc), "MMC Clock is not stopped\n");
493 494
}

A
Adrian Hunter 已提交
495 496
static void omap_hsmmc_enable_irq(struct omap_hsmmc_host *host,
				  struct mmc_command *cmd)
497 498 499 500
{
	unsigned int irq_mask;

	if (host->use_dma)
501
		irq_mask = INT_EN_MASK & ~(BRR_EN | BWR_EN);
502 503 504
	else
		irq_mask = INT_EN_MASK;

A
Adrian Hunter 已提交
505 506
	/* Disable timeout for erases */
	if (cmd->opcode == MMC_ERASE)
507
		irq_mask &= ~DTO_EN;
A
Adrian Hunter 已提交
508

509 510 511 512 513 514 515 516 517 518 519 520
	OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
	OMAP_HSMMC_WRITE(host->base, ISE, irq_mask);
	OMAP_HSMMC_WRITE(host->base, IE, irq_mask);
}

static void omap_hsmmc_disable_irq(struct omap_hsmmc_host *host)
{
	OMAP_HSMMC_WRITE(host->base, ISE, 0);
	OMAP_HSMMC_WRITE(host->base, IE, 0);
	OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
}

521
/* Calculate divisor for the given clock frequency */
522
static u16 calc_divisor(struct omap_hsmmc_host *host, struct mmc_ios *ios)
523 524 525 526
{
	u16 dsor = 0;

	if (ios->clock) {
527
		dsor = DIV_ROUND_UP(clk_get_rate(host->fclk), ios->clock);
528 529
		if (dsor > CLKD_MAX)
			dsor = CLKD_MAX;
530 531 532 533 534
	}

	return dsor;
}

535 536 537 538 539
static void omap_hsmmc_set_clock(struct omap_hsmmc_host *host)
{
	struct mmc_ios *ios = &host->mmc->ios;
	unsigned long regval;
	unsigned long timeout;
540
	unsigned long clkdiv;
541

542
	dev_vdbg(mmc_dev(host->mmc), "Set clock to %uHz\n", ios->clock);
543 544 545 546 547

	omap_hsmmc_stop_clock(host);

	regval = OMAP_HSMMC_READ(host->base, SYSCTL);
	regval = regval & ~(CLKD_MASK | DTO_MASK);
548 549
	clkdiv = calc_divisor(host, ios);
	regval = regval | (clkdiv << 6) | (DTO << 16);
550 551 552 553 554 555 556 557 558 559
	OMAP_HSMMC_WRITE(host->base, SYSCTL, regval);
	OMAP_HSMMC_WRITE(host->base, SYSCTL,
		OMAP_HSMMC_READ(host->base, SYSCTL) | ICE);

	/* Wait till the ICS bit is set */
	timeout = jiffies + msecs_to_jiffies(MMC_TIMEOUT_MS);
	while ((OMAP_HSMMC_READ(host->base, SYSCTL) & ICS) != ICS
		&& time_before(jiffies, timeout))
		cpu_relax();

560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580
	/*
	 * Enable High-Speed Support
	 * Pre-Requisites
	 *	- Controller should support High-Speed-Enable Bit
	 *	- Controller should not be using DDR Mode
	 *	- Controller should advertise that it supports High Speed
	 *	  in capabilities register
	 *	- MMC/SD clock coming out of controller > 25MHz
	 */
	if ((mmc_slot(host).features & HSMMC_HAS_HSPE_SUPPORT) &&
	    (ios->timing != MMC_TIMING_UHS_DDR50) &&
	    ((OMAP_HSMMC_READ(host->base, CAPA) & HSS) == HSS)) {
		regval = OMAP_HSMMC_READ(host->base, HCTL);
		if (clkdiv && (clk_get_rate(host->fclk)/clkdiv) > 25000000)
			regval |= HSPE;
		else
			regval &= ~HSPE;

		OMAP_HSMMC_WRITE(host->base, HCTL, regval);
	}

581 582 583
	omap_hsmmc_start_clock(host);
}

584 585 586 587 588 589
static void omap_hsmmc_set_bus_width(struct omap_hsmmc_host *host)
{
	struct mmc_ios *ios = &host->mmc->ios;
	u32 con;

	con = OMAP_HSMMC_READ(host->base, CON);
B
Balaji T K 已提交
590 591 592 593
	if (ios->timing == MMC_TIMING_UHS_DDR50)
		con |= DDR;	/* configure in DDR mode */
	else
		con &= ~DDR;
594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622
	switch (ios->bus_width) {
	case MMC_BUS_WIDTH_8:
		OMAP_HSMMC_WRITE(host->base, CON, con | DW8);
		break;
	case MMC_BUS_WIDTH_4:
		OMAP_HSMMC_WRITE(host->base, CON, con & ~DW8);
		OMAP_HSMMC_WRITE(host->base, HCTL,
			OMAP_HSMMC_READ(host->base, HCTL) | FOUR_BIT);
		break;
	case MMC_BUS_WIDTH_1:
		OMAP_HSMMC_WRITE(host->base, CON, con & ~DW8);
		OMAP_HSMMC_WRITE(host->base, HCTL,
			OMAP_HSMMC_READ(host->base, HCTL) & ~FOUR_BIT);
		break;
	}
}

static void omap_hsmmc_set_bus_mode(struct omap_hsmmc_host *host)
{
	struct mmc_ios *ios = &host->mmc->ios;
	u32 con;

	con = OMAP_HSMMC_READ(host->base, CON);
	if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN)
		OMAP_HSMMC_WRITE(host->base, CON, con | OD);
	else
		OMAP_HSMMC_WRITE(host->base, CON, con & ~OD);
}

623 624 625 626 627 628
#ifdef CONFIG_PM

/*
 * Restore the MMC host context, if it was lost as result of a
 * power state change.
 */
D
Denis Karpov 已提交
629
static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host)
630 631
{
	struct mmc_ios *ios = &host->mmc->ios;
632
	u32 hctl, capa;
633 634
	unsigned long timeout;

635 636
	if (!OMAP_HSMMC_READ(host->base, SYSSTATUS) & RESETDONE)
		return 1;
637

638 639 640 641 642 643 644 645
	if (host->con == OMAP_HSMMC_READ(host->base, CON) &&
	    host->hctl == OMAP_HSMMC_READ(host->base, HCTL) &&
	    host->sysctl == OMAP_HSMMC_READ(host->base, SYSCTL) &&
	    host->capa == OMAP_HSMMC_READ(host->base, CAPA))
		return 0;

	host->context_loss++;

646
	if (host->pdata->controller_flags & OMAP_HSMMC_SUPPORTS_DUAL_VOLT) {
647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671
		if (host->power_mode != MMC_POWER_OFF &&
		    (1 << ios->vdd) <= MMC_VDD_23_24)
			hctl = SDVS18;
		else
			hctl = SDVS30;
		capa = VS30 | VS18;
	} else {
		hctl = SDVS18;
		capa = VS18;
	}

	OMAP_HSMMC_WRITE(host->base, HCTL,
			OMAP_HSMMC_READ(host->base, HCTL) | hctl);

	OMAP_HSMMC_WRITE(host->base, CAPA,
			OMAP_HSMMC_READ(host->base, CAPA) | capa);

	OMAP_HSMMC_WRITE(host->base, HCTL,
			OMAP_HSMMC_READ(host->base, HCTL) | SDBP);

	timeout = jiffies + msecs_to_jiffies(MMC_TIMEOUT_MS);
	while ((OMAP_HSMMC_READ(host->base, HCTL) & SDBP) != SDBP
		&& time_before(jiffies, timeout))
		;

672
	omap_hsmmc_disable_irq(host);
673 674 675 676 677

	/* Do not initialize card-specific things if the power is off */
	if (host->power_mode == MMC_POWER_OFF)
		goto out;

678
	omap_hsmmc_set_bus_width(host);
679

680
	omap_hsmmc_set_clock(host);
681

682 683
	omap_hsmmc_set_bus_mode(host);

684
out:
685 686
	dev_dbg(mmc_dev(host->mmc), "context is restored: restore count %d\n",
		host->context_loss);
687 688 689 690 691 692
	return 0;
}

/*
 * Save the MMC host context (store the number of power state changes so far).
 */
D
Denis Karpov 已提交
693
static void omap_hsmmc_context_save(struct omap_hsmmc_host *host)
694
{
695 696 697 698
	host->con =  OMAP_HSMMC_READ(host->base, CON);
	host->hctl = OMAP_HSMMC_READ(host->base, HCTL);
	host->sysctl =  OMAP_HSMMC_READ(host->base, SYSCTL);
	host->capa = OMAP_HSMMC_READ(host->base, CAPA);
699 700 701 702
}

#else

D
Denis Karpov 已提交
703
static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host)
704 705 706 707
{
	return 0;
}

D
Denis Karpov 已提交
708
static void omap_hsmmc_context_save(struct omap_hsmmc_host *host)
709 710 711 712 713
{
}

#endif

714 715 716 717
/*
 * Send init stream sequence to card
 * before sending IDLE command
 */
D
Denis Karpov 已提交
718
static void send_init_stream(struct omap_hsmmc_host *host)
719 720 721 722
{
	int reg = 0;
	unsigned long timeout;

723 724 725
	if (host->protect_card)
		return;

726
	disable_irq(host->irq);
727 728

	OMAP_HSMMC_WRITE(host->base, IE, INT_EN_MASK);
729 730 731 732 733
	OMAP_HSMMC_WRITE(host->base, CON,
		OMAP_HSMMC_READ(host->base, CON) | INIT_STREAM);
	OMAP_HSMMC_WRITE(host->base, CMD, INIT_STREAM_CMD);

	timeout = jiffies + msecs_to_jiffies(MMC_TIMEOUT_MS);
734 735
	while ((reg != CC_EN) && time_before(jiffies, timeout))
		reg = OMAP_HSMMC_READ(host->base, STAT) & CC_EN;
736 737 738

	OMAP_HSMMC_WRITE(host->base, CON,
		OMAP_HSMMC_READ(host->base, CON) & ~INIT_STREAM);
739 740 741 742

	OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
	OMAP_HSMMC_READ(host->base, STAT);

743 744 745 746
	enable_irq(host->irq);
}

static inline
D
Denis Karpov 已提交
747
int omap_hsmmc_cover_is_closed(struct omap_hsmmc_host *host)
748 749 750
{
	int r = 1;

D
Denis Karpov 已提交
751 752
	if (mmc_slot(host).get_cover_state)
		r = mmc_slot(host).get_cover_state(host->dev, host->slot_id);
753 754 755 756
	return r;
}

static ssize_t
D
Denis Karpov 已提交
757
omap_hsmmc_show_cover_switch(struct device *dev, struct device_attribute *attr,
758 759 760
			   char *buf)
{
	struct mmc_host *mmc = container_of(dev, struct mmc_host, class_dev);
D
Denis Karpov 已提交
761
	struct omap_hsmmc_host *host = mmc_priv(mmc);
762

D
Denis Karpov 已提交
763 764
	return sprintf(buf, "%s\n",
			omap_hsmmc_cover_is_closed(host) ? "closed" : "open");
765 766
}

D
Denis Karpov 已提交
767
static DEVICE_ATTR(cover_switch, S_IRUGO, omap_hsmmc_show_cover_switch, NULL);
768 769

static ssize_t
D
Denis Karpov 已提交
770
omap_hsmmc_show_slot_name(struct device *dev, struct device_attribute *attr,
771 772 773
			char *buf)
{
	struct mmc_host *mmc = container_of(dev, struct mmc_host, class_dev);
D
Denis Karpov 已提交
774
	struct omap_hsmmc_host *host = mmc_priv(mmc);
775

D
Denis Karpov 已提交
776
	return sprintf(buf, "%s\n", mmc_slot(host).name);
777 778
}

D
Denis Karpov 已提交
779
static DEVICE_ATTR(slot_name, S_IRUGO, omap_hsmmc_show_slot_name, NULL);
780 781 782 783 784

/*
 * Configure the response type and send the cmd.
 */
static void
D
Denis Karpov 已提交
785
omap_hsmmc_start_command(struct omap_hsmmc_host *host, struct mmc_command *cmd,
786 787 788 789
	struct mmc_data *data)
{
	int cmdreg = 0, resptype = 0, cmdtype = 0;

790
	dev_vdbg(mmc_dev(host->mmc), "%s: CMD%d, argument 0x%08x\n",
791 792 793
		mmc_hostname(host->mmc), cmd->opcode, cmd->arg);
	host->cmd = cmd;

A
Adrian Hunter 已提交
794
	omap_hsmmc_enable_irq(host, cmd);
795

796
	host->response_busy = 0;
797 798 799
	if (cmd->flags & MMC_RSP_PRESENT) {
		if (cmd->flags & MMC_RSP_136)
			resptype = 1;
800 801 802 803
		else if (cmd->flags & MMC_RSP_BUSY) {
			resptype = 3;
			host->response_busy = 1;
		} else
804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825
			resptype = 2;
	}

	/*
	 * Unlike OMAP1 controller, the cmdtype does not seem to be based on
	 * ac, bc, adtc, bcr. Only commands ending an open ended transfer need
	 * a val of 0x3, rest 0x0.
	 */
	if (cmd == host->mrq->stop)
		cmdtype = 0x3;

	cmdreg = (cmd->opcode << 24) | (resptype << 16) | (cmdtype << 22);

	if (data) {
		cmdreg |= DP_SELECT | MSBS | BCE;
		if (data->flags & MMC_DATA_READ)
			cmdreg |= DDIR;
		else
			cmdreg &= ~(DDIR);
	}

	if (host->use_dma)
826
		cmdreg |= DMAE;
827

828
	host->req_in_progress = 1;
829

830 831 832 833
	OMAP_HSMMC_WRITE(host->base, ARG, cmd->arg);
	OMAP_HSMMC_WRITE(host->base, CMD, cmdreg);
}

834
static int
D
Denis Karpov 已提交
835
omap_hsmmc_get_dma_dir(struct omap_hsmmc_host *host, struct mmc_data *data)
836 837 838 839 840 841 842
{
	if (data->flags & MMC_DATA_WRITE)
		return DMA_TO_DEVICE;
	else
		return DMA_FROM_DEVICE;
}

843 844 845 846 847 848
static struct dma_chan *omap_hsmmc_get_dma_chan(struct omap_hsmmc_host *host,
	struct mmc_data *data)
{
	return data->flags & MMC_DATA_WRITE ? host->tx_chan : host->rx_chan;
}

849 850 851
static void omap_hsmmc_request_done(struct omap_hsmmc_host *host, struct mmc_request *mrq)
{
	int dma_ch;
852
	unsigned long flags;
853

854
	spin_lock_irqsave(&host->irq_lock, flags);
855 856
	host->req_in_progress = 0;
	dma_ch = host->dma_ch;
857
	spin_unlock_irqrestore(&host->irq_lock, flags);
858 859 860 861 862 863 864 865 866

	omap_hsmmc_disable_irq(host);
	/* Do not complete the request if DMA is still in progress */
	if (mrq->data && host->use_dma && dma_ch != -1)
		return;
	host->mrq = NULL;
	mmc_request_done(host->mmc, mrq);
}

867 868 869 870
/*
 * Notify the transfer complete to MMC core
 */
static void
D
Denis Karpov 已提交
871
omap_hsmmc_xfer_done(struct omap_hsmmc_host *host, struct mmc_data *data)
872
{
873 874 875
	if (!data) {
		struct mmc_request *mrq = host->mrq;

876 877 878 879 880 881 882
		/* TC before CC from CMD6 - don't know why, but it happens */
		if (host->cmd && host->cmd->opcode == 6 &&
		    host->response_busy) {
			host->response_busy = 0;
			return;
		}

883
		omap_hsmmc_request_done(host, mrq);
884 885 886
		return;
	}

887 888 889 890 891 892 893
	host->data = NULL;

	if (!data->error)
		data->bytes_xfered += data->blocks * (data->blksz);
	else
		data->bytes_xfered = 0;

894
	if (!data->stop) {
895
		omap_hsmmc_request_done(host, data->mrq);
896
		return;
897
	}
898
	omap_hsmmc_start_command(host, data->stop, NULL);
899 900 901 902 903 904
}

/*
 * Notify the core about command completion
 */
static void
D
Denis Karpov 已提交
905
omap_hsmmc_cmd_done(struct omap_hsmmc_host *host, struct mmc_command *cmd)
906 907 908 909 910 911 912 913 914 915 916 917 918 919 920
{
	host->cmd = NULL;

	if (cmd->flags & MMC_RSP_PRESENT) {
		if (cmd->flags & MMC_RSP_136) {
			/* response type 2 */
			cmd->resp[3] = OMAP_HSMMC_READ(host->base, RSP10);
			cmd->resp[2] = OMAP_HSMMC_READ(host->base, RSP32);
			cmd->resp[1] = OMAP_HSMMC_READ(host->base, RSP54);
			cmd->resp[0] = OMAP_HSMMC_READ(host->base, RSP76);
		} else {
			/* response types 1, 1b, 3, 4, 5, 6 */
			cmd->resp[0] = OMAP_HSMMC_READ(host->base, RSP10);
		}
	}
921 922
	if ((host->data == NULL && !host->response_busy) || cmd->error)
		omap_hsmmc_request_done(host, cmd->mrq);
923 924 925 926 927
}

/*
 * DMA clean up for command errors
 */
D
Denis Karpov 已提交
928
static void omap_hsmmc_dma_cleanup(struct omap_hsmmc_host *host, int errno)
929
{
930
	int dma_ch;
931
	unsigned long flags;
932

933
	host->data->error = errno;
934

935
	spin_lock_irqsave(&host->irq_lock, flags);
936 937
	dma_ch = host->dma_ch;
	host->dma_ch = -1;
938
	spin_unlock_irqrestore(&host->irq_lock, flags);
939 940

	if (host->use_dma && dma_ch != -1) {
941 942 943 944 945
		struct dma_chan *chan = omap_hsmmc_get_dma_chan(host, host->data);

		dmaengine_terminate_all(chan);
		dma_unmap_sg(chan->device->dev,
			host->data->sg, host->data->sg_len,
D
Denis Karpov 已提交
946
			omap_hsmmc_get_dma_dir(host, host->data));
947

948
		host->data->host_cookie = 0;
949 950 951 952 953 954 955 956
	}
	host->data = NULL;
}

/*
 * Readable error output
 */
#ifdef CONFIG_MMC_DEBUG
957
static void omap_hsmmc_dbg_report_irq(struct omap_hsmmc_host *host, u32 status)
958 959
{
	/* --- means reserved bit without definition at documentation */
D
Denis Karpov 已提交
960
	static const char *omap_hsmmc_status_bits[] = {
961 962 963 964
		"CC"  , "TC"  , "BGE", "---", "BWR" , "BRR" , "---" , "---" ,
		"CIRQ",	"OBI" , "---", "---", "---" , "---" , "---" , "ERRI",
		"CTO" , "CCRC", "CEB", "CIE", "DTO" , "DCRC", "DEB" , "---" ,
		"ACE" , "---" , "---", "---", "CERR", "BADA", "---" , "---"
965 966 967 968 969 970 971 972
	};
	char res[256];
	char *buf = res;
	int len, i;

	len = sprintf(buf, "MMC IRQ 0x%x :", status);
	buf += len;

D
Denis Karpov 已提交
973
	for (i = 0; i < ARRAY_SIZE(omap_hsmmc_status_bits); i++)
974
		if (status & (1 << i)) {
D
Denis Karpov 已提交
975
			len = sprintf(buf, " %s", omap_hsmmc_status_bits[i]);
976 977 978
			buf += len;
		}

979
	dev_vdbg(mmc_dev(host->mmc), "%s\n", res);
980
}
981 982 983 984 985
#else
static inline void omap_hsmmc_dbg_report_irq(struct omap_hsmmc_host *host,
					     u32 status)
{
}
986 987
#endif  /* CONFIG_MMC_DEBUG */

988 989 990 991 992 993 994
/*
 * MMC controller internal state machines reset
 *
 * Used to reset command or data internal state machines, using respectively
 *  SRC or SRD bit of SYSCTL register
 * Can be called from interrupt context
 */
D
Denis Karpov 已提交
995 996
static inline void omap_hsmmc_reset_controller_fsm(struct omap_hsmmc_host *host,
						   unsigned long bit)
997 998
{
	unsigned long i = 0;
999
	unsigned long limit = MMC_TIMEOUT_US;
1000 1001 1002 1003

	OMAP_HSMMC_WRITE(host->base, SYSCTL,
			 OMAP_HSMMC_READ(host->base, SYSCTL) | bit);

1004 1005 1006 1007 1008
	/*
	 * OMAP4 ES2 and greater has an updated reset logic.
	 * Monitor a 0->1 transition first
	 */
	if (mmc_slot(host).features & HSMMC_HAS_UPDATED_RESET) {
1009
		while ((!(OMAP_HSMMC_READ(host->base, SYSCTL) & bit))
1010
					&& (i++ < limit))
1011
			udelay(1);
1012 1013 1014
	}
	i = 0;

1015 1016
	while ((OMAP_HSMMC_READ(host->base, SYSCTL) & bit) &&
		(i++ < limit))
1017
		udelay(1);
1018 1019 1020 1021 1022 1023

	if (OMAP_HSMMC_READ(host->base, SYSCTL) & bit)
		dev_err(mmc_dev(host->mmc),
			"Timeout waiting on controller reset in %s\n",
			__func__);
}
1024

1025 1026
static void hsmmc_command_incomplete(struct omap_hsmmc_host *host,
					int err, int end_cmd)
1027
{
1028
	if (end_cmd) {
1029
		omap_hsmmc_reset_controller_fsm(host, SRC);
1030 1031 1032
		if (host->cmd)
			host->cmd->error = err;
	}
1033 1034 1035 1036

	if (host->data) {
		omap_hsmmc_reset_controller_fsm(host, SRD);
		omap_hsmmc_dma_cleanup(host, err);
1037 1038
	} else if (host->mrq && host->mrq->cmd)
		host->mrq->cmd->error = err;
1039 1040
}

1041
static void omap_hsmmc_do_irq(struct omap_hsmmc_host *host, int status)
1042 1043
{
	struct mmc_data *data;
1044 1045
	int end_cmd = 0, end_trans = 0;

1046
	data = host->data;
1047
	dev_vdbg(mmc_dev(host->mmc), "IRQ Status is %x\n", status);
1048

1049
	if (status & ERR_EN) {
1050
		omap_hsmmc_dbg_report_irq(host, status);
1051

1052
		if (status & (CTO_EN | CCRC_EN))
1053
			end_cmd = 1;
1054
		if (status & (CTO_EN | DTO_EN))
1055
			hsmmc_command_incomplete(host, -ETIMEDOUT, end_cmd);
1056
		else if (status & (CCRC_EN | DCRC_EN))
1057
			hsmmc_command_incomplete(host, -EILSEQ, end_cmd);
1058 1059

		if (host->data || host->response_busy) {
1060
			end_trans = !end_cmd;
1061
			host->response_busy = 0;
1062 1063 1064
		}
	}

1065
	OMAP_HSMMC_WRITE(host->base, STAT, status);
1066
	if (end_cmd || ((status & CC_EN) && host->cmd))
D
Denis Karpov 已提交
1067
		omap_hsmmc_cmd_done(host, host->cmd);
1068
	if ((end_trans || (status & TC_EN)) && host->mrq)
D
Denis Karpov 已提交
1069
		omap_hsmmc_xfer_done(host, data);
1070
}
1071

1072 1073 1074 1075 1076 1077 1078 1079 1080
/*
 * MMC controller IRQ handler
 */
static irqreturn_t omap_hsmmc_irq(int irq, void *dev_id)
{
	struct omap_hsmmc_host *host = dev_id;
	int status;

	status = OMAP_HSMMC_READ(host->base, STAT);
1081
	while (status & INT_EN_MASK && host->req_in_progress) {
1082
		omap_hsmmc_do_irq(host, status);
1083

1084 1085
		/* Flush posted write */
		status = OMAP_HSMMC_READ(host->base, STAT);
1086
	}
1087

1088 1089 1090
	return IRQ_HANDLED;
}

D
Denis Karpov 已提交
1091
static void set_sd_bus_power(struct omap_hsmmc_host *host)
A
Adrian Hunter 已提交
1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103
{
	unsigned long i;

	OMAP_HSMMC_WRITE(host->base, HCTL,
			 OMAP_HSMMC_READ(host->base, HCTL) | SDBP);
	for (i = 0; i < loops_per_jiffy; i++) {
		if (OMAP_HSMMC_READ(host->base, HCTL) & SDBP)
			break;
		cpu_relax();
	}
}

1104
/*
1105 1106 1107 1108 1109
 * Switch MMC interface voltage ... only relevant for MMC1.
 *
 * MMC2 and MMC3 use fixed 1.8V levels, and maybe a transceiver.
 * The MMC2 transceiver controls are used instead of DAT4..DAT7.
 * Some chips, like eMMC ones, use internal transceivers.
1110
 */
D
Denis Karpov 已提交
1111
static int omap_hsmmc_switch_opcond(struct omap_hsmmc_host *host, int vdd)
1112 1113 1114 1115 1116
{
	u32 reg_val = 0;
	int ret;

	/* Disable the clocks */
1117
	pm_runtime_put_sync(host->dev);
1118
	if (host->dbclk)
1119
		clk_disable_unprepare(host->dbclk);
1120 1121 1122 1123 1124

	/* Turn the power off */
	ret = mmc_slot(host).set_power(host->dev, host->slot_id, 0, 0);

	/* Turn the power ON with given VDD 1.8 or 3.0v */
1125 1126 1127
	if (!ret)
		ret = mmc_slot(host).set_power(host->dev, host->slot_id, 1,
					       vdd);
1128
	pm_runtime_get_sync(host->dev);
1129
	if (host->dbclk)
1130
		clk_prepare_enable(host->dbclk);
1131

1132 1133 1134 1135 1136 1137
	if (ret != 0)
		goto err;

	OMAP_HSMMC_WRITE(host->base, HCTL,
		OMAP_HSMMC_READ(host->base, HCTL) & SDVSCLR);
	reg_val = OMAP_HSMMC_READ(host->base, HCTL);
1138

1139 1140 1141
	/*
	 * If a MMC dual voltage card is detected, the set_ios fn calls
	 * this fn with VDD bit set for 1.8V. Upon card removal from the
D
Denis Karpov 已提交
1142
	 * slot, omap_hsmmc_set_ios sets the VDD back to 3V on MMC_POWER_OFF.
1143
	 *
1144 1145 1146 1147 1148 1149 1150 1151 1152
	 * Cope with a bit of slop in the range ... per data sheets:
	 *  - "1.8V" for vdds_mmc1/vdds_mmc1a can be up to 2.45V max,
	 *    but recommended values are 1.71V to 1.89V
	 *  - "3.0V" for vdds_mmc1/vdds_mmc1a can be up to 3.5V max,
	 *    but recommended values are 2.7V to 3.3V
	 *
	 * Board setup code shouldn't permit anything very out-of-range.
	 * TWL4030-family VMMC1 and VSIM regulators are fine (avoiding the
	 * middle range) but VSIM can't power DAT4..DAT7 at more than 3V.
1153
	 */
1154
	if ((1 << vdd) <= MMC_VDD_23_24)
1155
		reg_val |= SDVS18;
1156 1157
	else
		reg_val |= SDVS30;
1158 1159

	OMAP_HSMMC_WRITE(host->base, HCTL, reg_val);
A
Adrian Hunter 已提交
1160
	set_sd_bus_power(host);
1161 1162 1163

	return 0;
err:
1164
	dev_err(mmc_dev(host->mmc), "Unable to switch operating voltage\n");
1165 1166 1167
	return ret;
}

1168 1169 1170 1171 1172 1173 1174 1175 1176
/* Protect the card while the cover is open */
static void omap_hsmmc_protect_card(struct omap_hsmmc_host *host)
{
	if (!mmc_slot(host).get_cover_state)
		return;

	host->reqs_blocked = 0;
	if (mmc_slot(host).get_cover_state(host->dev, host->slot_id)) {
		if (host->protect_card) {
1177
			dev_info(host->dev, "%s: cover is closed, "
1178 1179 1180 1181 1182 1183
					 "card is now accessible\n",
					 mmc_hostname(host->mmc));
			host->protect_card = 0;
		}
	} else {
		if (!host->protect_card) {
1184
			dev_info(host->dev, "%s: cover is open, "
1185 1186 1187 1188 1189 1190 1191
					 "card is now inaccessible\n",
					 mmc_hostname(host->mmc));
			host->protect_card = 1;
		}
	}
}

1192
/*
1193
 * irq handler to notify the core about card insertion/removal
1194
 */
1195
static irqreturn_t omap_hsmmc_detect(int irq, void *dev_id)
1196
{
1197
	struct omap_hsmmc_host *host = dev_id;
1198
	struct omap_mmc_slot_data *slot = &mmc_slot(host);
1199 1200 1201
	int carddetect;

	sysfs_notify(&host->mmc->class_dev.kobj, NULL, "cover_switch");
1202

D
Denis Karpov 已提交
1203
	if (slot->card_detect)
1204
		carddetect = slot->card_detect(host->dev, host->slot_id);
1205 1206
	else {
		omap_hsmmc_protect_card(host);
1207
		carddetect = -ENOSYS;
1208
	}
1209

1210
	if (carddetect)
1211
		mmc_detect_change(host->mmc, (HZ * 200) / 1000);
1212
	else
1213 1214 1215 1216
		mmc_detect_change(host->mmc, (HZ * 50) / 1000);
	return IRQ_HANDLED;
}

1217
static void omap_hsmmc_dma_callback(void *param)
1218
{
1219 1220
	struct omap_hsmmc_host *host = param;
	struct dma_chan *chan;
1221
	struct mmc_data *data;
1222
	int req_in_progress;
1223

1224
	spin_lock_irq(&host->irq_lock);
1225
	if (host->dma_ch < 0) {
1226
		spin_unlock_irq(&host->irq_lock);
1227
		return;
1228
	}
1229

1230
	data = host->mrq->data;
1231
	chan = omap_hsmmc_get_dma_chan(host, data);
1232
	if (!data->host_cookie)
1233 1234
		dma_unmap_sg(chan->device->dev,
			     data->sg, data->sg_len,
1235
			     omap_hsmmc_get_dma_dir(host, data));
1236 1237

	req_in_progress = host->req_in_progress;
1238
	host->dma_ch = -1;
1239
	spin_unlock_irq(&host->irq_lock);
1240 1241 1242 1243 1244 1245 1246 1247

	/* If DMA has finished after TC, complete the request */
	if (!req_in_progress) {
		struct mmc_request *mrq = host->mrq;

		host->mrq = NULL;
		mmc_request_done(host->mmc, mrq);
	}
1248 1249
}

1250 1251
static int omap_hsmmc_pre_dma_transfer(struct omap_hsmmc_host *host,
				       struct mmc_data *data,
1252
				       struct omap_hsmmc_next *next,
1253
				       struct dma_chan *chan)
1254 1255 1256 1257 1258
{
	int dma_len;

	if (!next && data->host_cookie &&
	    data->host_cookie != host->next_data.cookie) {
1259
		dev_warn(host->dev, "[%s] invalid cookie: data->host_cookie %d"
1260 1261 1262 1263 1264 1265
		       " host->next_data.cookie %d\n",
		       __func__, data->host_cookie, host->next_data.cookie);
		data->host_cookie = 0;
	}

	/* Check if next job is already prepared */
1266
	if (next || data->host_cookie != host->next_data.cookie) {
1267
		dma_len = dma_map_sg(chan->device->dev, data->sg, data->sg_len,
1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287
				     omap_hsmmc_get_dma_dir(host, data));

	} else {
		dma_len = host->next_data.dma_len;
		host->next_data.dma_len = 0;
	}


	if (dma_len == 0)
		return -EINVAL;

	if (next) {
		next->dma_len = dma_len;
		data->host_cookie = ++next->cookie < 0 ? 1 : next->cookie;
	} else
		host->dma_len = dma_len;

	return 0;
}

1288 1289 1290
/*
 * Routine to configure and start DMA for the MMC card
 */
D
Denis Karpov 已提交
1291 1292
static int omap_hsmmc_start_dma_transfer(struct omap_hsmmc_host *host,
					struct mmc_request *req)
1293
{
1294 1295 1296
	struct dma_slave_config cfg;
	struct dma_async_tx_descriptor *tx;
	int ret = 0, i;
1297
	struct mmc_data *data = req->data;
1298
	struct dma_chan *chan;
1299

1300
	/* Sanity check: all the SG entries must be aligned by block size. */
1301
	for (i = 0; i < data->sg_len; i++) {
1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313
		struct scatterlist *sgl;

		sgl = data->sg + i;
		if (sgl->length % data->blksz)
			return -EINVAL;
	}
	if ((data->blksz % 4) != 0)
		/* REVISIT: The MMC buffer increments only when MSB is written.
		 * Return error for blksz which is non multiple of four.
		 */
		return -EINVAL;

1314
	BUG_ON(host->dma_ch != -1);
1315

1316 1317
	chan = omap_hsmmc_get_dma_chan(host, data);

1318 1319 1320 1321 1322 1323
	cfg.src_addr = host->mapbase + OMAP_HSMMC_DATA;
	cfg.dst_addr = host->mapbase + OMAP_HSMMC_DATA;
	cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
	cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
	cfg.src_maxburst = data->blksz / 4;
	cfg.dst_maxburst = data->blksz / 4;
1324

1325 1326
	ret = dmaengine_slave_config(chan, &cfg);
	if (ret)
1327
		return ret;
1328

1329
	ret = omap_hsmmc_pre_dma_transfer(host, data, NULL, chan);
1330 1331
	if (ret)
		return ret;
1332

1333 1334 1335 1336 1337 1338 1339 1340
	tx = dmaengine_prep_slave_sg(chan, data->sg, data->sg_len,
		data->flags & MMC_DATA_WRITE ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM,
		DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
	if (!tx) {
		dev_err(mmc_dev(host->mmc), "prep_slave_sg() failed\n");
		/* FIXME: cleanup */
		return -1;
	}
1341

1342 1343
	tx->callback = omap_hsmmc_dma_callback;
	tx->callback_param = host;
1344

1345 1346
	/* Does not fail */
	dmaengine_submit(tx);
1347

1348
	host->dma_ch = 1;
1349

1350
	dma_async_issue_pending(chan);
1351 1352 1353 1354

	return 0;
}

D
Denis Karpov 已提交
1355
static void set_data_timeout(struct omap_hsmmc_host *host,
1356 1357
			     unsigned int timeout_ns,
			     unsigned int timeout_clks)
1358 1359 1360 1361 1362 1363 1364 1365 1366 1367
{
	unsigned int timeout, cycle_ns;
	uint32_t reg, clkd, dto = 0;

	reg = OMAP_HSMMC_READ(host->base, SYSCTL);
	clkd = (reg & CLKD_MASK) >> CLKD_SHIFT;
	if (clkd == 0)
		clkd = 1;

	cycle_ns = 1000000000 / (clk_get_rate(host->fclk) / clkd);
1368 1369
	timeout = timeout_ns / cycle_ns;
	timeout += timeout_clks;
1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395
	if (timeout) {
		while ((timeout & 0x80000000) == 0) {
			dto += 1;
			timeout <<= 1;
		}
		dto = 31 - dto;
		timeout <<= 1;
		if (timeout && dto)
			dto += 1;
		if (dto >= 13)
			dto -= 13;
		else
			dto = 0;
		if (dto > 14)
			dto = 14;
	}

	reg &= ~DTO_MASK;
	reg |= dto << DTO_SHIFT;
	OMAP_HSMMC_WRITE(host->base, SYSCTL, reg);
}

/*
 * Configure block length for MMC/SD cards and initiate the transfer.
 */
static int
D
Denis Karpov 已提交
1396
omap_hsmmc_prepare_data(struct omap_hsmmc_host *host, struct mmc_request *req)
1397 1398 1399 1400 1401 1402
{
	int ret;
	host->data = req->data;

	if (req->data == NULL) {
		OMAP_HSMMC_WRITE(host->base, BLK, 0);
1403 1404 1405 1406 1407 1408
		/*
		 * Set an arbitrary 100ms data timeout for commands with
		 * busy signal.
		 */
		if (req->cmd->flags & MMC_RSP_BUSY)
			set_data_timeout(host, 100000000U, 0);
1409 1410 1411 1412 1413
		return 0;
	}

	OMAP_HSMMC_WRITE(host->base, BLK, (req->data->blksz)
					| (req->data->blocks << 16));
1414
	set_data_timeout(host, req->data->timeout_ns, req->data->timeout_clks);
1415 1416

	if (host->use_dma) {
D
Denis Karpov 已提交
1417
		ret = omap_hsmmc_start_dma_transfer(host, req);
1418
		if (ret != 0) {
1419
			dev_err(mmc_dev(host->mmc), "MMC start dma failure\n");
1420 1421 1422 1423 1424 1425
			return ret;
		}
	}
	return 0;
}

1426 1427 1428 1429 1430 1431
static void omap_hsmmc_post_req(struct mmc_host *mmc, struct mmc_request *mrq,
				int err)
{
	struct omap_hsmmc_host *host = mmc_priv(mmc);
	struct mmc_data *data = mrq->data;

1432
	if (host->use_dma && data->host_cookie) {
1433 1434
		struct dma_chan *c = omap_hsmmc_get_dma_chan(host, data);

1435 1436
		dma_unmap_sg(c->device->dev, data->sg, data->sg_len,
			     omap_hsmmc_get_dma_dir(host, data));
1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450
		data->host_cookie = 0;
	}
}

static void omap_hsmmc_pre_req(struct mmc_host *mmc, struct mmc_request *mrq,
			       bool is_first_req)
{
	struct omap_hsmmc_host *host = mmc_priv(mmc);

	if (mrq->data->host_cookie) {
		mrq->data->host_cookie = 0;
		return ;
	}

1451 1452 1453
	if (host->use_dma) {
		struct dma_chan *c = omap_hsmmc_get_dma_chan(host, mrq->data);

1454
		if (omap_hsmmc_pre_dma_transfer(host, mrq->data,
1455
						&host->next_data, c))
1456
			mrq->data->host_cookie = 0;
1457
	}
1458 1459
}

1460 1461 1462
/*
 * Request function. for read/write operation
 */
D
Denis Karpov 已提交
1463
static void omap_hsmmc_request(struct mmc_host *mmc, struct mmc_request *req)
1464
{
D
Denis Karpov 已提交
1465
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1466
	int err;
1467

1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488
	BUG_ON(host->req_in_progress);
	BUG_ON(host->dma_ch != -1);
	if (host->protect_card) {
		if (host->reqs_blocked < 3) {
			/*
			 * Ensure the controller is left in a consistent
			 * state by resetting the command and data state
			 * machines.
			 */
			omap_hsmmc_reset_controller_fsm(host, SRD);
			omap_hsmmc_reset_controller_fsm(host, SRC);
			host->reqs_blocked += 1;
		}
		req->cmd->error = -EBADF;
		if (req->data)
			req->data->error = -EBADF;
		req->cmd->retries = 0;
		mmc_request_done(mmc, req);
		return;
	} else if (host->reqs_blocked)
		host->reqs_blocked = 0;
1489 1490
	WARN_ON(host->mrq != NULL);
	host->mrq = req;
D
Denis Karpov 已提交
1491
	err = omap_hsmmc_prepare_data(host, req);
1492 1493 1494 1495 1496 1497 1498 1499 1500
	if (err) {
		req->cmd->error = err;
		if (req->data)
			req->data->error = err;
		host->mrq = NULL;
		mmc_request_done(mmc, req);
		return;
	}

D
Denis Karpov 已提交
1501
	omap_hsmmc_start_command(host, req->cmd, req->data);
1502 1503 1504
}

/* Routine to configure clock values. Exposed API to core */
D
Denis Karpov 已提交
1505
static void omap_hsmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
1506
{
D
Denis Karpov 已提交
1507
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1508
	int do_send_init_stream = 0;
1509

1510
	pm_runtime_get_sync(host->dev);
1511

1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526
	if (ios->power_mode != host->power_mode) {
		switch (ios->power_mode) {
		case MMC_POWER_OFF:
			mmc_slot(host).set_power(host->dev, host->slot_id,
						 0, 0);
			break;
		case MMC_POWER_UP:
			mmc_slot(host).set_power(host->dev, host->slot_id,
						 1, ios->vdd);
			break;
		case MMC_POWER_ON:
			do_send_init_stream = 1;
			break;
		}
		host->power_mode = ios->power_mode;
1527 1528
	}

1529 1530
	/* FIXME: set registers based only on changes to ios */

1531
	omap_hsmmc_set_bus_width(host);
1532

1533
	if (host->pdata->controller_flags & OMAP_HSMMC_SUPPORTS_DUAL_VOLT) {
1534 1535 1536
		/* Only MMC1 can interface at 3V without some flavor
		 * of external transceiver; but they all handle 1.8V.
		 */
1537
		if ((OMAP_HSMMC_READ(host->base, HCTL) & SDVSDET) &&
1538
			(ios->vdd == DUAL_VOLT_OCR_BIT)) {
1539 1540 1541 1542 1543 1544
				/*
				 * The mmc_select_voltage fn of the core does
				 * not seem to set the power_mode to
				 * MMC_POWER_UP upon recalculating the voltage.
				 * vdd 1.8v.
				 */
D
Denis Karpov 已提交
1545 1546
			if (omap_hsmmc_switch_opcond(host, ios->vdd) != 0)
				dev_dbg(mmc_dev(host->mmc),
1547 1548 1549 1550
						"Switch operation failed\n");
		}
	}

1551
	omap_hsmmc_set_clock(host);
1552

1553
	if (do_send_init_stream)
1554 1555
		send_init_stream(host);

1556
	omap_hsmmc_set_bus_mode(host);
1557

1558
	pm_runtime_put_autosuspend(host->dev);
1559 1560 1561 1562
}

static int omap_hsmmc_get_cd(struct mmc_host *mmc)
{
D
Denis Karpov 已提交
1563
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1564

D
Denis Karpov 已提交
1565
	if (!mmc_slot(host).card_detect)
1566
		return -ENOSYS;
1567
	return mmc_slot(host).card_detect(host->dev, host->slot_id);
1568 1569 1570 1571
}

static int omap_hsmmc_get_ro(struct mmc_host *mmc)
{
D
Denis Karpov 已提交
1572
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1573

D
Denis Karpov 已提交
1574
	if (!mmc_slot(host).get_ro)
1575
		return -ENOSYS;
D
Denis Karpov 已提交
1576
	return mmc_slot(host).get_ro(host->dev, 0);
1577 1578
}

1579 1580 1581 1582 1583 1584 1585 1586
static void omap_hsmmc_init_card(struct mmc_host *mmc, struct mmc_card *card)
{
	struct omap_hsmmc_host *host = mmc_priv(mmc);

	if (mmc_slot(host).init_card)
		mmc_slot(host).init_card(card);
}

D
Denis Karpov 已提交
1587
static void omap_hsmmc_conf_bus_power(struct omap_hsmmc_host *host)
1588 1589 1590 1591
{
	u32 hctl, capa, value;

	/* Only MMC1 supports 3.0V */
1592
	if (host->pdata->controller_flags & OMAP_HSMMC_SUPPORTS_DUAL_VOLT) {
1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606
		hctl = SDVS30;
		capa = VS30 | VS18;
	} else {
		hctl = SDVS18;
		capa = VS18;
	}

	value = OMAP_HSMMC_READ(host->base, HCTL) & ~SDVS_MASK;
	OMAP_HSMMC_WRITE(host->base, HCTL, value | hctl);

	value = OMAP_HSMMC_READ(host->base, CAPA);
	OMAP_HSMMC_WRITE(host->base, CAPA, value | capa);

	/* Set SD bus power bit */
A
Adrian Hunter 已提交
1607
	set_sd_bus_power(host);
1608 1609
}

D
Denis Karpov 已提交
1610
static int omap_hsmmc_enable_fclk(struct mmc_host *mmc)
1611
{
D
Denis Karpov 已提交
1612
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1613

1614 1615
	pm_runtime_get_sync(host->dev);

1616 1617 1618
	return 0;
}

1619
static int omap_hsmmc_disable_fclk(struct mmc_host *mmc)
1620
{
D
Denis Karpov 已提交
1621
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1622

1623 1624 1625
	pm_runtime_mark_last_busy(host->dev);
	pm_runtime_put_autosuspend(host->dev);

1626 1627 1628
	return 0;
}

D
Denis Karpov 已提交
1629 1630 1631
static const struct mmc_host_ops omap_hsmmc_ops = {
	.enable = omap_hsmmc_enable_fclk,
	.disable = omap_hsmmc_disable_fclk,
1632 1633
	.post_req = omap_hsmmc_post_req,
	.pre_req = omap_hsmmc_pre_req,
D
Denis Karpov 已提交
1634 1635
	.request = omap_hsmmc_request,
	.set_ios = omap_hsmmc_set_ios,
1636 1637
	.get_cd = omap_hsmmc_get_cd,
	.get_ro = omap_hsmmc_get_ro,
1638
	.init_card = omap_hsmmc_init_card,
1639 1640 1641
	/* NYET -- enable_sdio_irq */
};

1642 1643
#ifdef CONFIG_DEBUG_FS

D
Denis Karpov 已提交
1644
static int omap_hsmmc_regs_show(struct seq_file *s, void *data)
1645 1646
{
	struct mmc_host *mmc = s->private;
D
Denis Karpov 已提交
1647
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1648

1649 1650
	seq_printf(s, "mmc%d:\n ctx_loss:\t%d\n\nregs:\n",
			mmc->index, host->context_loss);
1651

1652
	pm_runtime_get_sync(host->dev);
1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665

	seq_printf(s, "CON:\t\t0x%08x\n",
			OMAP_HSMMC_READ(host->base, CON));
	seq_printf(s, "HCTL:\t\t0x%08x\n",
			OMAP_HSMMC_READ(host->base, HCTL));
	seq_printf(s, "SYSCTL:\t\t0x%08x\n",
			OMAP_HSMMC_READ(host->base, SYSCTL));
	seq_printf(s, "IE:\t\t0x%08x\n",
			OMAP_HSMMC_READ(host->base, IE));
	seq_printf(s, "ISE:\t\t0x%08x\n",
			OMAP_HSMMC_READ(host->base, ISE));
	seq_printf(s, "CAPA:\t\t0x%08x\n",
			OMAP_HSMMC_READ(host->base, CAPA));
1666

1667 1668
	pm_runtime_mark_last_busy(host->dev);
	pm_runtime_put_autosuspend(host->dev);
1669

1670 1671 1672
	return 0;
}

D
Denis Karpov 已提交
1673
static int omap_hsmmc_regs_open(struct inode *inode, struct file *file)
1674
{
D
Denis Karpov 已提交
1675
	return single_open(file, omap_hsmmc_regs_show, inode->i_private);
1676 1677 1678
}

static const struct file_operations mmc_regs_fops = {
D
Denis Karpov 已提交
1679
	.open           = omap_hsmmc_regs_open,
1680 1681 1682 1683 1684
	.read           = seq_read,
	.llseek         = seq_lseek,
	.release        = single_release,
};

D
Denis Karpov 已提交
1685
static void omap_hsmmc_debugfs(struct mmc_host *mmc)
1686 1687 1688 1689 1690 1691 1692 1693
{
	if (mmc->debugfs_root)
		debugfs_create_file("regs", S_IRUSR, mmc->debugfs_root,
			mmc, &mmc_regs_fops);
}

#else

D
Denis Karpov 已提交
1694
static void omap_hsmmc_debugfs(struct mmc_host *mmc)
1695 1696 1697 1698 1699
{
}

#endif

1700
#ifdef CONFIG_OF
1701 1702 1703 1704 1705 1706 1707 1708
static const struct omap_mmc_of_data omap3_pre_es3_mmc_of_data = {
	/* See 35xx errata 2.1.1.128 in SPRZ278F */
	.controller_flags = OMAP_HSMMC_BROKEN_MULTIBLOCK_READ,
};

static const struct omap_mmc_of_data omap4_mmc_of_data = {
	.reg_offset = 0x100,
};
1709 1710 1711 1712 1713

static const struct of_device_id omap_mmc_of_match[] = {
	{
		.compatible = "ti,omap2-hsmmc",
	},
1714 1715 1716 1717
	{
		.compatible = "ti,omap3-pre-es3-hsmmc",
		.data = &omap3_pre_es3_mmc_of_data,
	},
1718 1719 1720 1721 1722
	{
		.compatible = "ti,omap3-hsmmc",
	},
	{
		.compatible = "ti,omap4-hsmmc",
1723
		.data = &omap4_mmc_of_data,
1724 1725
	},
	{},
1726
};
1727 1728 1729 1730 1731 1732
MODULE_DEVICE_TABLE(of, omap_mmc_of_match);

static struct omap_mmc_platform_data *of_get_hsmmc_pdata(struct device *dev)
{
	struct omap_mmc_platform_data *pdata;
	struct device_node *np = dev->of_node;
1733
	u32 bus_width, max_freq;
1734 1735 1736 1737 1738 1739
	int cd_gpio, wp_gpio;

	cd_gpio = of_get_named_gpio(np, "cd-gpios", 0);
	wp_gpio = of_get_named_gpio(np, "wp-gpios", 0);
	if (cd_gpio == -EPROBE_DEFER || wp_gpio == -EPROBE_DEFER)
		return ERR_PTR(-EPROBE_DEFER);
1740 1741 1742 1743 1744 1745 1746 1747 1748 1749

	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
	if (!pdata)
		return NULL; /* out of memory */

	if (of_find_property(np, "ti,dual-volt", NULL))
		pdata->controller_flags |= OMAP_HSMMC_SUPPORTS_DUAL_VOLT;

	/* This driver only supports 1 slot */
	pdata->nr_slots = 1;
1750 1751
	pdata->slots[0].switch_pin = cd_gpio;
	pdata->slots[0].gpio_wp = wp_gpio;
1752 1753 1754 1755 1756

	if (of_find_property(np, "ti,non-removable", NULL)) {
		pdata->slots[0].nonremovable = true;
		pdata->slots[0].no_regulator_off_init = true;
	}
A
Arnd Bergmann 已提交
1757
	of_property_read_u32(np, "bus-width", &bus_width);
1758 1759 1760 1761 1762 1763 1764 1765
	if (bus_width == 4)
		pdata->slots[0].caps |= MMC_CAP_4_BIT_DATA;
	else if (bus_width == 8)
		pdata->slots[0].caps |= MMC_CAP_8_BIT_DATA;

	if (of_find_property(np, "ti,needs-special-reset", NULL))
		pdata->slots[0].features |= HSMMC_HAS_UPDATED_RESET;

1766 1767 1768
	if (!of_property_read_u32(np, "max-frequency", &max_freq))
		pdata->max_freq = max_freq;

1769 1770 1771
	if (of_find_property(np, "ti,needs-special-hs-handling", NULL))
		pdata->slots[0].features |= HSMMC_HAS_HSPE_SUPPORT;

1772 1773 1774 1775 1776 1777
	if (of_find_property(np, "keep-power-in-suspend", NULL))
		pdata->slots[0].pm_caps |= MMC_PM_KEEP_POWER;

	if (of_find_property(np, "enable-sdio-wakeup", NULL))
		pdata->slots[0].pm_caps |= MMC_PM_WAKE_SDIO_IRQ;

1778 1779 1780 1781 1782 1783 1784 1785 1786 1787
	return pdata;
}
#else
static inline struct omap_mmc_platform_data
			*of_get_hsmmc_pdata(struct device *dev)
{
	return NULL;
}
#endif

B
Bill Pemberton 已提交
1788
static int omap_hsmmc_probe(struct platform_device *pdev)
1789 1790 1791
{
	struct omap_mmc_platform_data *pdata = pdev->dev.platform_data;
	struct mmc_host *mmc;
D
Denis Karpov 已提交
1792
	struct omap_hsmmc_host *host = NULL;
1793
	struct resource *res;
1794
	int ret, irq;
1795
	const struct of_device_id *match;
1796 1797
	dma_cap_mask_t mask;
	unsigned tx_req, rx_req;
1798
	struct pinctrl *pinctrl;
1799
	const struct omap_mmc_of_data *data;
1800 1801 1802 1803

	match = of_match_device(of_match_ptr(omap_mmc_of_match), &pdev->dev);
	if (match) {
		pdata = of_get_hsmmc_pdata(&pdev->dev);
1804 1805 1806 1807

		if (IS_ERR(pdata))
			return PTR_ERR(pdata);

1808
		if (match->data) {
1809 1810 1811
			data = match->data;
			pdata->reg_offset = data->reg_offset;
			pdata->controller_flags |= data->controller_flags;
1812 1813
		}
	}
1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829

	if (pdata == NULL) {
		dev_err(&pdev->dev, "Platform Data is missing\n");
		return -ENXIO;
	}

	if (pdata->nr_slots == 0) {
		dev_err(&pdev->dev, "No Slots\n");
		return -ENXIO;
	}

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	irq = platform_get_irq(pdev, 0);
	if (res == NULL || irq < 0)
		return -ENXIO;

1830
	res = request_mem_region(res->start, resource_size(res), pdev->name);
1831 1832 1833
	if (res == NULL)
		return -EBUSY;

1834 1835 1836 1837
	ret = omap_hsmmc_gpio_init(pdata);
	if (ret)
		goto err;

D
Denis Karpov 已提交
1838
	mmc = mmc_alloc_host(sizeof(struct omap_hsmmc_host), &pdev->dev);
1839 1840
	if (!mmc) {
		ret = -ENOMEM;
1841
		goto err_alloc;
1842 1843 1844 1845 1846 1847 1848 1849 1850 1851
	}

	host		= mmc_priv(mmc);
	host->mmc	= mmc;
	host->pdata	= pdata;
	host->dev	= &pdev->dev;
	host->use_dma	= 1;
	host->dma_ch	= -1;
	host->irq	= irq;
	host->slot_id	= 0;
1852
	host->mapbase	= res->start + pdata->reg_offset;
1853
	host->base	= ioremap(host->mapbase, SZ_4K);
1854
	host->power_mode = MMC_POWER_OFF;
1855
	host->next_data.cookie = 1;
1856
	host->pbias_enabled = 0;
1857 1858 1859

	platform_set_drvdata(pdev, host);

1860
	mmc->ops	= &omap_hsmmc_ops;
1861

1862 1863 1864 1865 1866 1867
	mmc->f_min = OMAP_MMC_MIN_CLOCK;

	if (pdata->max_freq > 0)
		mmc->f_max = pdata->max_freq;
	else
		mmc->f_max = OMAP_MMC_MAX_CLOCK;
1868

1869
	spin_lock_init(&host->irq_lock);
1870

1871
	host->fclk = clk_get(&pdev->dev, "fck");
1872 1873 1874 1875 1876 1877
	if (IS_ERR(host->fclk)) {
		ret = PTR_ERR(host->fclk);
		host->fclk = NULL;
		goto err1;
	}

1878 1879 1880 1881
	if (host->pdata->controller_flags & OMAP_HSMMC_BROKEN_MULTIBLOCK_READ) {
		dev_info(&pdev->dev, "multiblock reads disabled due to 35xx erratum 2.1.1.128; MMC read performance may suffer\n");
		mmc->caps2 |= MMC_CAP2_NO_MULTI_READ;
	}
1882

1883 1884 1885 1886
	pm_runtime_enable(host->dev);
	pm_runtime_get_sync(host->dev);
	pm_runtime_set_autosuspend_delay(host->dev, MMC_AUTOSUSPEND_DELAY);
	pm_runtime_use_autosuspend(host->dev);
1887

1888 1889
	omap_hsmmc_context_save(host);

1890 1891 1892 1893 1894 1895
	host->dbclk = clk_get(&pdev->dev, "mmchsdb_fck");
	/*
	 * MMC can still work without debounce clock.
	 */
	if (IS_ERR(host->dbclk)) {
		host->dbclk = NULL;
1896
	} else if (clk_prepare_enable(host->dbclk) != 0) {
1897 1898 1899
		dev_warn(mmc_dev(host->mmc), "Failed to enable debounce clk\n");
		clk_put(host->dbclk);
		host->dbclk = NULL;
1900
	}
1901

1902 1903
	/* Since we do only SG emulation, we can have as many segs
	 * as we want. */
1904
	mmc->max_segs = 1024;
1905

1906 1907 1908 1909 1910
	mmc->max_blk_size = 512;       /* Block Length at max can be 1024 */
	mmc->max_blk_count = 0xFFFF;    /* No. of Blocks is 16 bits */
	mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
	mmc->max_seg_size = mmc->max_req_size;

1911
	mmc->caps |= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
A
Adrian Hunter 已提交
1912
		     MMC_CAP_WAIT_WHILE_BUSY | MMC_CAP_ERASE;
1913

1914 1915
	mmc->caps |= mmc_slot(host).caps;
	if (mmc->caps & MMC_CAP_8_BIT_DATA)
1916 1917
		mmc->caps |= MMC_CAP_4_BIT_DATA;

D
Denis Karpov 已提交
1918
	if (mmc_slot(host).nonremovable)
1919 1920
		mmc->caps |= MMC_CAP_NONREMOVABLE;

E
Eliad Peller 已提交
1921 1922
	mmc->pm_caps = mmc_slot(host).pm_caps;

D
Denis Karpov 已提交
1923
	omap_hsmmc_conf_bus_power(host);
1924

1925 1926 1927 1928 1929 1930 1931 1932
	if (!pdev->dev.of_node) {
		res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx");
		if (!res) {
			dev_err(mmc_dev(host->mmc), "cannot get DMA TX channel\n");
			ret = -ENXIO;
			goto err_irq;
		}
		tx_req = res->start;
1933

1934 1935 1936 1937 1938 1939 1940
		res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx");
		if (!res) {
			dev_err(mmc_dev(host->mmc), "cannot get DMA RX channel\n");
			ret = -ENXIO;
			goto err_irq;
		}
		rx_req = res->start;
G
Grazvydas Ignotas 已提交
1941
	}
1942

1943 1944 1945
	dma_cap_zero(mask);
	dma_cap_set(DMA_SLAVE, mask);

1946 1947 1948 1949
	host->rx_chan =
		dma_request_slave_channel_compat(mask, omap_dma_filter_fn,
						 &rx_req, &pdev->dev, "rx");

1950 1951
	if (!host->rx_chan) {
		dev_err(mmc_dev(host->mmc), "unable to obtain RX DMA engine channel %u\n", rx_req);
1952
		ret = -ENXIO;
1953 1954 1955
		goto err_irq;
	}

1956 1957 1958 1959
	host->tx_chan =
		dma_request_slave_channel_compat(mask, omap_dma_filter_fn,
						 &tx_req, &pdev->dev, "tx");

1960 1961
	if (!host->tx_chan) {
		dev_err(mmc_dev(host->mmc), "unable to obtain TX DMA engine channel %u\n", tx_req);
1962
		ret = -ENXIO;
1963
		goto err_irq;
1964
	}
1965 1966

	/* Request IRQ for MMC operations */
Y
Yong Zhang 已提交
1967
	ret = request_irq(host->irq, omap_hsmmc_irq, 0,
1968 1969
			mmc_hostname(mmc), host);
	if (ret) {
1970
		dev_err(mmc_dev(host->mmc), "Unable to grab HSMMC IRQ\n");
1971 1972 1973 1974 1975
		goto err_irq;
	}

	if (pdata->init != NULL) {
		if (pdata->init(&pdev->dev) != 0) {
1976
			dev_err(mmc_dev(host->mmc),
D
Denis Karpov 已提交
1977
				"Unable to configure MMC IRQs\n");
1978 1979 1980
			goto err_irq_cd_init;
		}
	}
1981

1982
	if (omap_hsmmc_have_reg() && !mmc_slot(host).set_power) {
1983 1984 1985 1986 1987 1988
		ret = omap_hsmmc_reg_get(host);
		if (ret)
			goto err_reg;
		host->use_reg = 1;
	}

1989
	mmc->ocr_avail = mmc_slot(host).ocr_mask;
1990 1991

	/* Request IRQ for card detect */
1992
	if ((mmc_slot(host).card_detect_irq)) {
1993 1994 1995
		ret = request_threaded_irq(mmc_slot(host).card_detect_irq,
					   NULL,
					   omap_hsmmc_detect,
1996
					   IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1997
					   mmc_hostname(mmc), host);
1998
		if (ret) {
1999
			dev_err(mmc_dev(host->mmc),
2000 2001 2002
				"Unable to grab MMC CD IRQ\n");
			goto err_irq_cd;
		}
2003 2004
		pdata->suspend = omap_hsmmc_suspend_cdirq;
		pdata->resume = omap_hsmmc_resume_cdirq;
2005 2006
	}

2007
	omap_hsmmc_disable_irq(host);
2008

2009 2010 2011 2012 2013
	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR(pinctrl))
		dev_warn(&pdev->dev,
			"pins are not configured from the driver\n");

2014 2015
	omap_hsmmc_protect_card(host);

2016 2017
	mmc_add_host(mmc);

D
Denis Karpov 已提交
2018
	if (mmc_slot(host).name != NULL) {
2019 2020 2021 2022
		ret = device_create_file(&mmc->class_dev, &dev_attr_slot_name);
		if (ret < 0)
			goto err_slot_name;
	}
D
Denis Karpov 已提交
2023
	if (mmc_slot(host).card_detect_irq && mmc_slot(host).get_cover_state) {
2024 2025 2026
		ret = device_create_file(&mmc->class_dev,
					&dev_attr_cover_switch);
		if (ret < 0)
2027
			goto err_slot_name;
2028 2029
	}

D
Denis Karpov 已提交
2030
	omap_hsmmc_debugfs(mmc);
2031 2032
	pm_runtime_mark_last_busy(host->dev);
	pm_runtime_put_autosuspend(host->dev);
2033

2034 2035 2036 2037 2038
	return 0;

err_slot_name:
	mmc_remove_host(mmc);
	free_irq(mmc_slot(host).card_detect_irq, host);
2039 2040 2041 2042 2043 2044
err_irq_cd:
	if (host->use_reg)
		omap_hsmmc_reg_put(host);
err_reg:
	if (host->pdata->cleanup)
		host->pdata->cleanup(&pdev->dev);
2045 2046 2047
err_irq_cd_init:
	free_irq(host->irq, host);
err_irq:
2048 2049 2050 2051
	if (host->tx_chan)
		dma_release_channel(host->tx_chan);
	if (host->rx_chan)
		dma_release_channel(host->rx_chan);
2052
	pm_runtime_put_sync(host->dev);
2053
	pm_runtime_disable(host->dev);
2054
	clk_put(host->fclk);
2055
	if (host->dbclk) {
2056
		clk_disable_unprepare(host->dbclk);
2057 2058 2059 2060
		clk_put(host->dbclk);
	}
err1:
	iounmap(host->base);
2061 2062 2063
	mmc_free_host(mmc);
err_alloc:
	omap_hsmmc_gpio_free(pdata);
2064
err:
2065 2066 2067
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (res)
		release_mem_region(res->start, resource_size(res));
2068 2069 2070
	return ret;
}

B
Bill Pemberton 已提交
2071
static int omap_hsmmc_remove(struct platform_device *pdev)
2072
{
D
Denis Karpov 已提交
2073
	struct omap_hsmmc_host *host = platform_get_drvdata(pdev);
2074 2075
	struct resource *res;

F
Felipe Balbi 已提交
2076 2077 2078 2079 2080 2081 2082 2083 2084
	pm_runtime_get_sync(host->dev);
	mmc_remove_host(host->mmc);
	if (host->use_reg)
		omap_hsmmc_reg_put(host);
	if (host->pdata->cleanup)
		host->pdata->cleanup(&pdev->dev);
	free_irq(host->irq, host);
	if (mmc_slot(host).card_detect_irq)
		free_irq(mmc_slot(host).card_detect_irq, host);
2085

2086 2087 2088 2089 2090
	if (host->tx_chan)
		dma_release_channel(host->tx_chan);
	if (host->rx_chan)
		dma_release_channel(host->rx_chan);

F
Felipe Balbi 已提交
2091 2092 2093
	pm_runtime_put_sync(host->dev);
	pm_runtime_disable(host->dev);
	clk_put(host->fclk);
2094
	if (host->dbclk) {
2095
		clk_disable_unprepare(host->dbclk);
F
Felipe Balbi 已提交
2096
		clk_put(host->dbclk);
2097 2098
	}

2099
	omap_hsmmc_gpio_free(host->pdata);
F
Felipe Balbi 已提交
2100
	iounmap(host->base);
2101
	mmc_free_host(host->mmc);
F
Felipe Balbi 已提交
2102

2103 2104
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (res)
2105
		release_mem_region(res->start, resource_size(res));
2106 2107 2108 2109 2110

	return 0;
}

#ifdef CONFIG_PM
2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129
static int omap_hsmmc_prepare(struct device *dev)
{
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);

	if (host->pdata->suspend)
		return host->pdata->suspend(dev, host->slot_id);

	return 0;
}

static void omap_hsmmc_complete(struct device *dev)
{
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);

	if (host->pdata->resume)
		host->pdata->resume(dev, host->slot_id);

}

2130
static int omap_hsmmc_suspend(struct device *dev)
2131
{
F
Felipe Balbi 已提交
2132
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);
2133

F
Felipe Balbi 已提交
2134
	if (!host)
2135 2136
		return 0;

F
Felipe Balbi 已提交
2137
	pm_runtime_get_sync(host->dev);
2138

F
Felipe Balbi 已提交
2139 2140 2141 2142
	if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) {
		omap_hsmmc_disable_irq(host);
		OMAP_HSMMC_WRITE(host->base, HCTL,
				OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP);
2143
	}
F
Felipe Balbi 已提交
2144

2145
	if (host->dbclk)
2146
		clk_disable_unprepare(host->dbclk);
2147

2148
	pm_runtime_put_sync(host->dev);
2149
	return 0;
2150 2151 2152
}

/* Routine to resume the MMC device */
2153
static int omap_hsmmc_resume(struct device *dev)
2154
{
F
Felipe Balbi 已提交
2155 2156 2157 2158
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);

	if (!host)
		return 0;
2159

F
Felipe Balbi 已提交
2160
	pm_runtime_get_sync(host->dev);
2161

2162
	if (host->dbclk)
2163
		clk_prepare_enable(host->dbclk);
2164

F
Felipe Balbi 已提交
2165 2166
	if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER))
		omap_hsmmc_conf_bus_power(host);
2167

F
Felipe Balbi 已提交
2168
	omap_hsmmc_protect_card(host);
2169

F
Felipe Balbi 已提交
2170 2171
	pm_runtime_mark_last_busy(host->dev);
	pm_runtime_put_autosuspend(host->dev);
2172
	return 0;
2173 2174 2175
}

#else
2176 2177
#define omap_hsmmc_prepare	NULL
#define omap_hsmmc_complete	NULL
D
Denis Karpov 已提交
2178
#define omap_hsmmc_suspend	NULL
2179
#define omap_hsmmc_resume	NULL
2180 2181
#endif

2182 2183 2184 2185 2186 2187
static int omap_hsmmc_runtime_suspend(struct device *dev)
{
	struct omap_hsmmc_host *host;

	host = platform_get_drvdata(to_platform_device(dev));
	omap_hsmmc_context_save(host);
F
Felipe Balbi 已提交
2188
	dev_dbg(dev, "disabled\n");
2189 2190 2191 2192 2193 2194 2195 2196 2197 2198

	return 0;
}

static int omap_hsmmc_runtime_resume(struct device *dev)
{
	struct omap_hsmmc_host *host;

	host = platform_get_drvdata(to_platform_device(dev));
	omap_hsmmc_context_restore(host);
F
Felipe Balbi 已提交
2199
	dev_dbg(dev, "enabled\n");
2200 2201 2202 2203

	return 0;
}

2204
static struct dev_pm_ops omap_hsmmc_dev_pm_ops = {
D
Denis Karpov 已提交
2205 2206
	.suspend	= omap_hsmmc_suspend,
	.resume		= omap_hsmmc_resume,
2207 2208
	.prepare	= omap_hsmmc_prepare,
	.complete	= omap_hsmmc_complete,
2209 2210
	.runtime_suspend = omap_hsmmc_runtime_suspend,
	.runtime_resume = omap_hsmmc_runtime_resume,
2211 2212 2213
};

static struct platform_driver omap_hsmmc_driver = {
2214
	.probe		= omap_hsmmc_probe,
B
Bill Pemberton 已提交
2215
	.remove		= omap_hsmmc_remove,
2216 2217 2218
	.driver		= {
		.name = DRIVER_NAME,
		.owner = THIS_MODULE,
2219
		.pm = &omap_hsmmc_dev_pm_ops,
2220
		.of_match_table = of_match_ptr(omap_mmc_of_match),
2221 2222 2223
	},
};

2224
module_platform_driver(omap_hsmmc_driver);
2225 2226 2227 2228
MODULE_DESCRIPTION("OMAP High Speed Multimedia Card driver");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:" DRIVER_NAME);
MODULE_AUTHOR("Texas Instruments Inc");