omap_hsmmc.c 59.4 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
#include <linux/of.h>
32
#include <linux/of_irq.h>
33 34
#include <linux/of_gpio.h>
#include <linux/of_device.h>
35
#include <linux/omap-dmaengine.h>
36
#include <linux/mmc/host.h>
37
#include <linux/mmc/core.h>
A
Adrian Hunter 已提交
38
#include <linux/mmc/mmc.h>
39
#include <linux/mmc/slot-gpio.h>
40
#include <linux/io.h>
41
#include <linux/irq.h>
42 43
#include <linux/gpio.h>
#include <linux/regulator/consumer.h>
44
#include <linux/pinctrl/consumer.h>
45
#include <linux/pm_runtime.h>
46
#include <linux/platform_data/hsmmc-omap.h>
47 48

/* OMAP HSMMC Host Controller Registers */
49
#define OMAP_HSMMC_SYSSTATUS	0x0014
50
#define OMAP_HSMMC_CON		0x002C
51
#define OMAP_HSMMC_SDMASA	0x0100
52 53 54 55 56 57 58 59
#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
60
#define OMAP_HSMMC_PSTATE	0x0124
61 62 63 64 65
#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
66
#define OMAP_HSMMC_AC12		0x013C
67 68 69 70
#define OMAP_HSMMC_CAPA		0x0140

#define VS18			(1 << 26)
#define VS30			(1 << 25)
71
#define HSS			(1 << 21)
72 73
#define SDVS18			(0x5 << 9)
#define SDVS30			(0x6 << 9)
74
#define SDVS33			(0x7 << 9)
75
#define SDVS_MASK		0x00000E00
76 77 78 79 80 81 82 83
#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)
84
#define CLKD_MAX		0x3FF		/* max clock divisor: 1023 */
85 86 87 88 89
#define CLKD_MASK		0x0000FFC0
#define CLKD_SHIFT		6
#define DTO_MASK		0x000F0000
#define DTO_SHIFT		16
#define INIT_STREAM		(1 << 1)
90
#define ACEN_ACMD23		(2 << 2)
91 92
#define DP_SELECT		(1 << 21)
#define DDIR			(1 << 4)
93
#define DMAE			0x1
94 95 96
#define MSBS			(1 << 5)
#define BCE			(1 << 1)
#define FOUR_BIT		(1 << 1)
97
#define HSPE			(1 << 2)
98
#define IWE			(1 << 24)
B
Balaji T K 已提交
99
#define DDR			(1 << 19)
100 101
#define CLKEXTFREE		(1 << 16)
#define CTPL			(1 << 11)
102
#define DW8			(1 << 5)
103 104 105 106 107 108
#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)
109
#define SOFTRESET		(1 << 1)
110

111 112 113
/* PSTATE */
#define DLEV_DAT(x)		(1 << (20 + (x)))

114 115 116 117 118
/* 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)
119
#define CIRQ_EN			(1 << 8)
120 121 122 123 124 125 126 127
#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)
128
#define ACE_EN			(1 << 24)
129 130 131
#define CERR_EN			(1 << 28)
#define BADA_EN			(1 << 29)

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

136 137 138 139 140 141 142
#define CNI	(1 << 7)
#define ACIE	(1 << 4)
#define ACEB	(1 << 3)
#define ACCE	(1 << 2)
#define ACTO	(1 << 1)
#define ACNE	(1 << 0)

143
#define MMC_AUTOSUSPEND_DELAY	100
144 145
#define MMC_TIMEOUT_MS		20		/* 20 mSec */
#define MMC_TIMEOUT_US		20000		/* 20000 micro Sec */
146 147
#define OMAP_MMC_MIN_CLOCK	400000
#define OMAP_MMC_MAX_CLOCK	52000000
148
#define DRIVER_NAME		"omap_hsmmc"
149

150 151 152 153
#define VDD_1V8			1800000		/* 180000 uV */
#define VDD_3V0			3000000		/* 300000 uV */
#define VDD_165_195		(ffs(MMC_VDD_165_195) - 1)

154 155 156 157 158
/*
 * 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.
 */
159
#define mmc_pdata(host)		host->pdata
160 161 162 163 164 165 166 167 168 169

/*
 * 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)

170 171 172 173 174
struct omap_hsmmc_next {
	unsigned int	dma_len;
	s32		cookie;
};

D
Denis Karpov 已提交
175
struct omap_hsmmc_host {
176 177 178 179 180 181 182
	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;
183 184 185 186 187 188 189 190 191
	/*
	 * 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;
192 193
	struct	regulator	*pbias;
	bool			pbias_enabled;
194 195
	void	__iomem		*base;
	resource_size_t		mapbase;
196
	spinlock_t		irq_lock; /* Prevent races with irq handler */
197
	unsigned int		dma_len;
198
	unsigned int		dma_sg_idx;
199
	unsigned char		bus_mode;
200
	unsigned char		power_mode;
201
	int			suspended;
202 203 204 205
	u32			con;
	u32			hctl;
	u32			sysctl;
	u32			capa;
206
	int			irq;
207
	int			wake_irq;
208
	int			use_dma, dma_ch;
209 210
	struct dma_chan		*tx_chan;
	struct dma_chan		*rx_chan;
211
	int			response_busy;
212
	int			context_loss;
213 214
	int			protect_card;
	int			reqs_blocked;
215
	int			use_reg;
216
	int			req_in_progress;
217
	unsigned long		clk_rate;
218
	unsigned int		flags;
219 220 221
#define AUTO_CMD23		(1 << 0)        /* Auto CMD23 support */
#define HSMMC_SDIO_IRQ_ENABLED	(1 << 1)        /* SDIO irq enabled */
#define HSMMC_WAKE_IRQ_ENABLED	(1 << 2)
222
	struct omap_hsmmc_next	next_data;
223
	struct	omap_hsmmc_platform_data	*pdata;
224 225 226 227 228 229 230

	/* return MMC cover switch state, can be NULL if not supported.
	 *
	 * possible return values:
	 *   0 - closed
	 *   1 - open
	 */
231
	int (*get_cover_state)(struct device *dev);
232

233
	int (*card_detect)(struct device *dev);
234 235
};

236 237 238 239 240
struct omap_mmc_of_data {
	u32 reg_offset;
	u8 controller_flags;
};

B
Balaji T K 已提交
241 242
static void omap_hsmmc_start_dma_transfer(struct omap_hsmmc_host *host);

243
static int omap_hsmmc_card_detect(struct device *dev)
244
{
245
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);
246

247
	return mmc_gpio_get_cd(host->mmc);
248 249
}

250
static int omap_hsmmc_get_cover_state(struct device *dev)
251
{
252
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);
253

254
	return mmc_gpio_get_cd(host->mmc);
255 256
}

257 258
#ifdef CONFIG_REGULATOR

259
static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
260 261 262 263 264 265 266 267 268 269 270 271
{
	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;

272
	if (mmc_pdata(host)->before_set_reg)
273
		mmc_pdata(host)->before_set_reg(dev, power_on, vdd);
274

275 276 277 278 279 280 281 282 283
	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);
	}

284 285 286 287 288 289 290 291 292 293 294 295 296 297
	/*
	 * 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) {
298 299
		if (host->vcc)
			ret = mmc_regulator_set_ocr(host->mmc, host->vcc, vdd);
300 301 302
		/* Enable interface voltage rail, if needed */
		if (ret == 0 && host->vcc_aux) {
			ret = regulator_enable(host->vcc_aux);
303
			if (ret < 0 && host->vcc)
304 305
				ret = mmc_regulator_set_ocr(host->mmc,
							host->vcc, 0);
306 307
		}
	} else {
308
		/* Shut down the rail */
309 310
		if (host->vcc_aux)
			ret = regulator_disable(host->vcc_aux);
311
		if (host->vcc) {
312 313 314 315
			/* Then proceed to shut down the local regulator */
			ret = mmc_regulator_set_ocr(host->mmc,
						host->vcc, 0);
		}
316 317
	}

318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334
	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;
		}
	}

335
	if (mmc_pdata(host)->after_set_reg)
336
		mmc_pdata(host)->after_set_reg(dev, power_on, vdd);
337

338
error_set_power:
339 340 341 342 343 344
	return ret;
}

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

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

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

372 373 374
	reg = devm_regulator_get_optional(host->dev, "pbias");
	host->pbias = IS_ERR(reg) ? NULL : reg;

375
	/* For eMMC do not power off when not in sleep state */
376
	if (mmc_pdata(host)->no_regulator_off_init)
377 378 379 380 381 382 383
		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))) {
384
		int vdd = ffs(mmc_pdata(host)->ocr_mask) - 1;
385

386 387
		mmc_pdata(host)->set_power(host->dev, 1, vdd);
		mmc_pdata(host)->set_power(host->dev, 0, 0);
388 389 390 391 392 393 394
	}

	return 0;
}

static void omap_hsmmc_reg_put(struct omap_hsmmc_host *host)
{
395
	mmc_pdata(host)->set_power = NULL;
396 397
}

398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420
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

421
static irqreturn_t omap_hsmmc_detect(int irq, void *dev_id);
422
static irqreturn_t omap_hsmmc_cover_irq(int irq, void *dev_id);
423 424 425

static int omap_hsmmc_gpio_init(struct mmc_host *mmc,
				struct omap_hsmmc_host *host,
426
				struct omap_hsmmc_platform_data *pdata)
427 428 429
{
	int ret;

430
	if (pdata->cover && gpio_is_valid(pdata->switch_pin)) {
431
		ret = mmc_gpio_request_cd(mmc, pdata->switch_pin, 0);
432 433
		if (ret)
			return ret;
434 435 436 437 438 439 440 441 442 443

		host->get_cover_state = omap_hsmmc_get_cover_state;
		mmc_gpio_set_cd_isr(mmc, omap_hsmmc_cover_irq);
	} else if (!pdata->cover && gpio_is_valid(pdata->switch_pin)) {
		ret = mmc_gpio_request_cd(mmc, pdata->switch_pin, 0);
		if (ret)
			return ret;

		host->card_detect = omap_hsmmc_card_detect;
		mmc_gpio_set_cd_isr(mmc, omap_hsmmc_detect);
444
	}
445

446
	if (gpio_is_valid(pdata->gpio_wp)) {
447
		ret = mmc_gpio_request_ro(mmc, pdata->gpio_wp);
448
		if (ret)
449
			return ret;
450
	}
451 452 453 454

	return 0;
}

455 456 457 458 459 460 461 462 463
/*
 * 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);
}

464 465 466
/*
 * Stop clock to the card
 */
D
Denis Karpov 已提交
467
static void omap_hsmmc_stop_clock(struct omap_hsmmc_host *host)
468 469 470 471
{
	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 已提交
472
		dev_dbg(mmc_dev(host->mmc), "MMC Clock is not stopped\n");
473 474
}

A
Adrian Hunter 已提交
475 476
static void omap_hsmmc_enable_irq(struct omap_hsmmc_host *host,
				  struct mmc_command *cmd)
477
{
478 479
	u32 irq_mask = INT_EN_MASK;
	unsigned long flags;
480 481

	if (host->use_dma)
482
		irq_mask &= ~(BRR_EN | BWR_EN);
483

A
Adrian Hunter 已提交
484 485
	/* Disable timeout for erases */
	if (cmd->opcode == MMC_ERASE)
486
		irq_mask &= ~DTO_EN;
A
Adrian Hunter 已提交
487

488
	spin_lock_irqsave(&host->irq_lock, flags);
489 490
	OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
	OMAP_HSMMC_WRITE(host->base, ISE, irq_mask);
491 492 493 494

	/* latch pending CIRQ, but don't signal MMC core */
	if (host->flags & HSMMC_SDIO_IRQ_ENABLED)
		irq_mask |= CIRQ_EN;
495
	OMAP_HSMMC_WRITE(host->base, IE, irq_mask);
496
	spin_unlock_irqrestore(&host->irq_lock, flags);
497 498 499 500
}

static void omap_hsmmc_disable_irq(struct omap_hsmmc_host *host)
{
501 502 503 504 505 506 507 508 509
	u32 irq_mask = 0;
	unsigned long flags;

	spin_lock_irqsave(&host->irq_lock, flags);
	/* no transfer running but need to keep cirq if enabled */
	if (host->flags & HSMMC_SDIO_IRQ_ENABLED)
		irq_mask |= CIRQ_EN;
	OMAP_HSMMC_WRITE(host->base, ISE, irq_mask);
	OMAP_HSMMC_WRITE(host->base, IE, irq_mask);
510
	OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
511
	spin_unlock_irqrestore(&host->irq_lock, flags);
512 513
}

514
/* Calculate divisor for the given clock frequency */
515
static u16 calc_divisor(struct omap_hsmmc_host *host, struct mmc_ios *ios)
516 517 518 519
{
	u16 dsor = 0;

	if (ios->clock) {
520
		dsor = DIV_ROUND_UP(clk_get_rate(host->fclk), ios->clock);
521 522
		if (dsor > CLKD_MAX)
			dsor = CLKD_MAX;
523 524 525 526 527
	}

	return dsor;
}

528 529 530 531 532
static void omap_hsmmc_set_clock(struct omap_hsmmc_host *host)
{
	struct mmc_ios *ios = &host->mmc->ios;
	unsigned long regval;
	unsigned long timeout;
533
	unsigned long clkdiv;
534

535
	dev_vdbg(mmc_dev(host->mmc), "Set clock to %uHz\n", ios->clock);
536 537 538 539 540

	omap_hsmmc_stop_clock(host);

	regval = OMAP_HSMMC_READ(host->base, SYSCTL);
	regval = regval & ~(CLKD_MASK | DTO_MASK);
541 542
	clkdiv = calc_divisor(host, ios);
	regval = regval | (clkdiv << 6) | (DTO << 16);
543 544 545 546 547 548 549 550 551 552
	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();

553 554 555 556 557 558 559 560 561
	/*
	 * 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
	 */
562
	if ((mmc_pdata(host)->features & HSMMC_HAS_HSPE_SUPPORT) &&
563
	    (ios->timing != MMC_TIMING_MMC_DDR52) &&
564
	    (ios->timing != MMC_TIMING_UHS_DDR50) &&
565 566 567 568 569 570 571 572 573 574
	    ((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);
	}

575 576 577
	omap_hsmmc_start_clock(host);
}

578 579 580 581 582 583
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);
584 585
	if (ios->timing == MMC_TIMING_MMC_DDR52 ||
	    ios->timing == MMC_TIMING_UHS_DDR50)
B
Balaji T K 已提交
586 587 588
		con |= DDR;	/* configure in DDR mode */
	else
		con &= ~DDR;
589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617
	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);
}

618 619 620 621 622 623
#ifdef CONFIG_PM

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

630 631 632 633 634 635 636 637
	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++;

638
	if (host->pdata->controller_flags & OMAP_HSMMC_SUPPORTS_DUAL_VOLT) {
639 640 641 642 643 644 645 646 647 648 649
		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;
	}

650 651 652
	if (host->mmc->caps & MMC_CAP_SDIO_IRQ)
		hctl |= IWE;

653 654 655 656 657 658 659 660 661 662 663 664 665 666
	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))
		;

667 668 669
	OMAP_HSMMC_WRITE(host->base, ISE, 0);
	OMAP_HSMMC_WRITE(host->base, IE, 0);
	OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
670 671 672 673 674

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

675
	omap_hsmmc_set_bus_width(host);
676

677
	omap_hsmmc_set_clock(host);
678

679 680
	omap_hsmmc_set_bus_mode(host);

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

/*
 * Save the MMC host context (store the number of power state changes so far).
 */
D
Denis Karpov 已提交
690
static void omap_hsmmc_context_save(struct omap_hsmmc_host *host)
691
{
692 693 694 695
	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);
696 697 698 699
}

#else

D
Denis Karpov 已提交
700
static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host)
701 702 703 704
{
	return 0;
}

D
Denis Karpov 已提交
705
static void omap_hsmmc_context_save(struct omap_hsmmc_host *host)
706 707 708 709 710
{
}

#endif

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

720 721 722
	if (host->protect_card)
		return;

723
	disable_irq(host->irq);
724 725

	OMAP_HSMMC_WRITE(host->base, IE, INT_EN_MASK);
726 727 728 729 730
	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);
731 732
	while ((reg != CC_EN) && time_before(jiffies, timeout))
		reg = OMAP_HSMMC_READ(host->base, STAT) & CC_EN;
733 734 735

	OMAP_HSMMC_WRITE(host->base, CON,
		OMAP_HSMMC_READ(host->base, CON) & ~INIT_STREAM);
736 737 738 739

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

740 741 742 743
	enable_irq(host->irq);
}

static inline
D
Denis Karpov 已提交
744
int omap_hsmmc_cover_is_closed(struct omap_hsmmc_host *host)
745 746 747
{
	int r = 1;

748
	if (host->get_cover_state)
749
		r = host->get_cover_state(host->dev);
750 751 752 753
	return r;
}

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

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

D
Denis Karpov 已提交
764
static DEVICE_ATTR(cover_switch, S_IRUGO, omap_hsmmc_show_cover_switch, NULL);
765 766

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

773
	return sprintf(buf, "%s\n", mmc_pdata(host)->name);
774 775
}

D
Denis Karpov 已提交
776
static DEVICE_ATTR(slot_name, S_IRUGO, omap_hsmmc_show_slot_name, NULL);
777 778 779 780 781

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

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

A
Adrian Hunter 已提交
791
	omap_hsmmc_enable_irq(host, cmd);
792

793
	host->response_busy = 0;
794 795 796
	if (cmd->flags & MMC_RSP_PRESENT) {
		if (cmd->flags & MMC_RSP_136)
			resptype = 1;
797 798 799 800
		else if (cmd->flags & MMC_RSP_BUSY) {
			resptype = 3;
			host->response_busy = 1;
		} else
801 802 803 804 805 806 807 808 809 810 811 812 813
			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);

814 815 816 817 818
	if ((host->flags & AUTO_CMD23) && mmc_op_multi(cmd->opcode) &&
	    host->mrq->sbc) {
		cmdreg |= ACEN_ACMD23;
		OMAP_HSMMC_WRITE(host->base, SDMASA, host->mrq->sbc->arg);
	}
819 820 821 822 823 824 825 826 827
	if (data) {
		cmdreg |= DP_SELECT | MSBS | BCE;
		if (data->flags & MMC_DATA_READ)
			cmdreg |= DDIR;
		else
			cmdreg &= ~(DDIR);
	}

	if (host->use_dma)
828
		cmdreg |= DMAE;
829

830
	host->req_in_progress = 1;
831

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

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

845 846 847 848 849 850
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;
}

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

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

	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);
}

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

878 879 880 881 882 883 884
		/* 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;
		}

885
		omap_hsmmc_request_done(host, mrq);
886 887 888
		return;
	}

889 890 891 892 893 894 895
	host->data = NULL;

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

B
Balaji T K 已提交
896 897 898
	if (data->stop && (data->error || !host->mrq->sbc))
		omap_hsmmc_start_command(host, data->stop, NULL);
	else
899
		omap_hsmmc_request_done(host, data->mrq);
900 901 902 903 904 905
}

/*
 * Notify the core about command completion
 */
static void
D
Denis Karpov 已提交
906
omap_hsmmc_cmd_done(struct omap_hsmmc_host *host, struct mmc_command *cmd)
907
{
B
Balaji T K 已提交
908
	if (host->mrq->sbc && (host->cmd == host->mrq->sbc) &&
909
	    !host->mrq->sbc->error && !(host->flags & AUTO_CMD23)) {
910
		host->cmd = NULL;
B
Balaji T K 已提交
911 912 913 914 915 916
		omap_hsmmc_start_dma_transfer(host);
		omap_hsmmc_start_command(host, host->mrq->cmd,
						host->mrq->data);
		return;
	}

917 918
	host->cmd = NULL;

919 920 921 922 923 924 925 926 927 928 929 930
	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);
		}
	}
931
	if ((host->data == NULL && !host->response_busy) || cmd->error)
932
		omap_hsmmc_request_done(host, host->mrq);
933 934 935 936 937
}

/*
 * DMA clean up for command errors
 */
D
Denis Karpov 已提交
938
static void omap_hsmmc_dma_cleanup(struct omap_hsmmc_host *host, int errno)
939
{
940
	int dma_ch;
941
	unsigned long flags;
942

943
	host->data->error = errno;
944

945
	spin_lock_irqsave(&host->irq_lock, flags);
946 947
	dma_ch = host->dma_ch;
	host->dma_ch = -1;
948
	spin_unlock_irqrestore(&host->irq_lock, flags);
949 950

	if (host->use_dma && dma_ch != -1) {
951 952 953 954 955
		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 已提交
956
			omap_hsmmc_get_dma_dir(host, host->data));
957

958
		host->data->host_cookie = 0;
959 960 961 962 963 964 965 966
	}
	host->data = NULL;
}

/*
 * Readable error output
 */
#ifdef CONFIG_MMC_DEBUG
967
static void omap_hsmmc_dbg_report_irq(struct omap_hsmmc_host *host, u32 status)
968 969
{
	/* --- means reserved bit without definition at documentation */
D
Denis Karpov 已提交
970
	static const char *omap_hsmmc_status_bits[] = {
971 972 973 974
		"CC"  , "TC"  , "BGE", "---", "BWR" , "BRR" , "---" , "---" ,
		"CIRQ",	"OBI" , "---", "---", "---" , "---" , "---" , "ERRI",
		"CTO" , "CCRC", "CEB", "CIE", "DTO" , "DCRC", "DEB" , "---" ,
		"ACE" , "---" , "---", "---", "CERR", "BADA", "---" , "---"
975 976 977 978 979 980 981 982
	};
	char res[256];
	char *buf = res;
	int len, i;

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

D
Denis Karpov 已提交
983
	for (i = 0; i < ARRAY_SIZE(omap_hsmmc_status_bits); i++)
984
		if (status & (1 << i)) {
D
Denis Karpov 已提交
985
			len = sprintf(buf, " %s", omap_hsmmc_status_bits[i]);
986 987 988
			buf += len;
		}

989
	dev_vdbg(mmc_dev(host->mmc), "%s\n", res);
990
}
991 992 993 994 995
#else
static inline void omap_hsmmc_dbg_report_irq(struct omap_hsmmc_host *host,
					     u32 status)
{
}
996 997
#endif  /* CONFIG_MMC_DEBUG */

998 999 1000 1001 1002 1003 1004
/*
 * 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 已提交
1005 1006
static inline void omap_hsmmc_reset_controller_fsm(struct omap_hsmmc_host *host,
						   unsigned long bit)
1007 1008
{
	unsigned long i = 0;
1009
	unsigned long limit = MMC_TIMEOUT_US;
1010 1011 1012 1013

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

1014 1015 1016 1017
	/*
	 * OMAP4 ES2 and greater has an updated reset logic.
	 * Monitor a 0->1 transition first
	 */
1018
	if (mmc_pdata(host)->features & HSMMC_HAS_UPDATED_RESET) {
1019
		while ((!(OMAP_HSMMC_READ(host->base, SYSCTL) & bit))
1020
					&& (i++ < limit))
1021
			udelay(1);
1022 1023 1024
	}
	i = 0;

1025 1026
	while ((OMAP_HSMMC_READ(host->base, SYSCTL) & bit) &&
		(i++ < limit))
1027
		udelay(1);
1028 1029 1030 1031 1032 1033

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

1035 1036
static void hsmmc_command_incomplete(struct omap_hsmmc_host *host,
					int err, int end_cmd)
1037
{
1038
	if (end_cmd) {
1039
		omap_hsmmc_reset_controller_fsm(host, SRC);
1040 1041 1042
		if (host->cmd)
			host->cmd->error = err;
	}
1043 1044 1045 1046

	if (host->data) {
		omap_hsmmc_reset_controller_fsm(host, SRD);
		omap_hsmmc_dma_cleanup(host, err);
1047 1048
	} else if (host->mrq && host->mrq->cmd)
		host->mrq->cmd->error = err;
1049 1050
}

1051
static void omap_hsmmc_do_irq(struct omap_hsmmc_host *host, int status)
1052 1053
{
	struct mmc_data *data;
1054
	int end_cmd = 0, end_trans = 0;
1055
	int error = 0;
1056

1057
	data = host->data;
1058
	dev_vdbg(mmc_dev(host->mmc), "IRQ Status is %x\n", status);
1059

1060
	if (status & ERR_EN) {
1061
		omap_hsmmc_dbg_report_irq(host, status);
1062

1063
		if (status & (CTO_EN | CCRC_EN))
1064
			end_cmd = 1;
1065
		if (status & (CTO_EN | DTO_EN))
1066
			hsmmc_command_incomplete(host, -ETIMEDOUT, end_cmd);
1067
		else if (status & (CCRC_EN | DCRC_EN))
1068
			hsmmc_command_incomplete(host, -EILSEQ, end_cmd);
1069

1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083
		if (status & ACE_EN) {
			u32 ac12;
			ac12 = OMAP_HSMMC_READ(host->base, AC12);
			if (!(ac12 & ACNE) && host->mrq->sbc) {
				end_cmd = 1;
				if (ac12 & ACTO)
					error =  -ETIMEDOUT;
				else if (ac12 & (ACCE | ACEB | ACIE))
					error = -EILSEQ;
				host->mrq->sbc->error = error;
				hsmmc_command_incomplete(host, error, end_cmd);
			}
			dev_dbg(mmc_dev(host->mmc), "AC12 err: 0x%x\n", ac12);
		}
1084
		if (host->data || host->response_busy) {
1085
			end_trans = !end_cmd;
1086
			host->response_busy = 0;
1087 1088 1089
		}
	}

1090
	OMAP_HSMMC_WRITE(host->base, STAT, status);
1091
	if (end_cmd || ((status & CC_EN) && host->cmd))
D
Denis Karpov 已提交
1092
		omap_hsmmc_cmd_done(host, host->cmd);
1093
	if ((end_trans || (status & TC_EN)) && host->mrq)
D
Denis Karpov 已提交
1094
		omap_hsmmc_xfer_done(host, data);
1095
}
1096

1097 1098 1099 1100 1101 1102 1103 1104 1105
/*
 * 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);
1106 1107 1108 1109 1110 1111
	while (status & (INT_EN_MASK | CIRQ_EN)) {
		if (host->req_in_progress)
			omap_hsmmc_do_irq(host, status);

		if (status & CIRQ_EN)
			mmc_signal_sdio_irq(host->mmc);
1112

1113 1114
		/* Flush posted write */
		status = OMAP_HSMMC_READ(host->base, STAT);
1115
	}
1116

1117 1118 1119
	return IRQ_HANDLED;
}

1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135
static irqreturn_t omap_hsmmc_wake_irq(int irq, void *dev_id)
{
	struct omap_hsmmc_host *host = dev_id;

	/* cirq is level triggered, disable to avoid infinite loop */
	spin_lock(&host->irq_lock);
	if (host->flags & HSMMC_WAKE_IRQ_ENABLED) {
		disable_irq_nosync(host->wake_irq);
		host->flags &= ~HSMMC_WAKE_IRQ_ENABLED;
	}
	spin_unlock(&host->irq_lock);
	pm_request_resume(host->dev); /* no use counter */

	return IRQ_HANDLED;
}

D
Denis Karpov 已提交
1136
static void set_sd_bus_power(struct omap_hsmmc_host *host)
A
Adrian Hunter 已提交
1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148
{
	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();
	}
}

1149
/*
1150 1151 1152 1153 1154
 * 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.
1155
 */
D
Denis Karpov 已提交
1156
static int omap_hsmmc_switch_opcond(struct omap_hsmmc_host *host, int vdd)
1157 1158 1159 1160 1161
{
	u32 reg_val = 0;
	int ret;

	/* Disable the clocks */
1162
	pm_runtime_put_sync(host->dev);
1163
	if (host->dbclk)
1164
		clk_disable_unprepare(host->dbclk);
1165 1166

	/* Turn the power off */
1167
	ret = mmc_pdata(host)->set_power(host->dev, 0, 0);
1168 1169

	/* Turn the power ON with given VDD 1.8 or 3.0v */
1170
	if (!ret)
1171
		ret = mmc_pdata(host)->set_power(host->dev, 1, vdd);
1172
	pm_runtime_get_sync(host->dev);
1173
	if (host->dbclk)
1174
		clk_prepare_enable(host->dbclk);
1175

1176 1177 1178 1179 1180 1181
	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);
1182

1183 1184 1185
	/*
	 * 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 已提交
1186
	 * slot, omap_hsmmc_set_ios sets the VDD back to 3V on MMC_POWER_OFF.
1187
	 *
1188 1189 1190 1191 1192 1193 1194 1195 1196
	 * 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.
1197
	 */
1198
	if ((1 << vdd) <= MMC_VDD_23_24)
1199
		reg_val |= SDVS18;
1200 1201
	else
		reg_val |= SDVS30;
1202 1203

	OMAP_HSMMC_WRITE(host->base, HCTL, reg_val);
A
Adrian Hunter 已提交
1204
	set_sd_bus_power(host);
1205 1206 1207

	return 0;
err:
1208
	dev_err(mmc_dev(host->mmc), "Unable to switch operating voltage\n");
1209 1210 1211
	return ret;
}

1212 1213 1214
/* Protect the card while the cover is open */
static void omap_hsmmc_protect_card(struct omap_hsmmc_host *host)
{
1215
	if (!host->get_cover_state)
1216 1217 1218
		return;

	host->reqs_blocked = 0;
1219
	if (host->get_cover_state(host->dev)) {
1220
		if (host->protect_card) {
1221
			dev_info(host->dev, "%s: cover is closed, "
1222 1223 1224 1225 1226 1227
					 "card is now accessible\n",
					 mmc_hostname(host->mmc));
			host->protect_card = 0;
		}
	} else {
		if (!host->protect_card) {
1228
			dev_info(host->dev, "%s: cover is open, "
1229 1230 1231 1232 1233 1234 1235
					 "card is now inaccessible\n",
					 mmc_hostname(host->mmc));
			host->protect_card = 1;
		}
	}
}

1236
/*
1237
 * irq handler when (cell-phone) cover is mounted/removed
1238
 */
1239
static irqreturn_t omap_hsmmc_cover_irq(int irq, void *dev_id)
1240
{
1241
	struct omap_hsmmc_host *host = dev_id;
1242 1243 1244
	int carddetect;

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

1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267
	if (host->card_detect) {
		carddetect = host->card_detect(host->dev);
	} else {
		omap_hsmmc_protect_card(host);
		carddetect = -ENOSYS;
	}

	if (carddetect)
		mmc_detect_change(host->mmc, (HZ * 200) / 1000);
	else
		mmc_detect_change(host->mmc, (HZ * 50) / 1000);
	return IRQ_HANDLED;
}

/*
 * irq handler to notify the core about card insertion/removal
 */
static irqreturn_t omap_hsmmc_detect(int irq, void *dev_id)
{
	struct omap_hsmmc_host *host = dev_id;
	int carddetect;

1268
	if (host->card_detect)
1269
		carddetect = host->card_detect(host->dev);
1270 1271
	else {
		omap_hsmmc_protect_card(host);
1272
		carddetect = -ENOSYS;
1273
	}
1274

1275
	if (carddetect)
1276
		mmc_detect_change(host->mmc, (HZ * 200) / 1000);
1277
	else
1278 1279 1280 1281
		mmc_detect_change(host->mmc, (HZ * 50) / 1000);
	return IRQ_HANDLED;
}

1282
static void omap_hsmmc_dma_callback(void *param)
1283
{
1284 1285
	struct omap_hsmmc_host *host = param;
	struct dma_chan *chan;
1286
	struct mmc_data *data;
1287
	int req_in_progress;
1288

1289
	spin_lock_irq(&host->irq_lock);
1290
	if (host->dma_ch < 0) {
1291
		spin_unlock_irq(&host->irq_lock);
1292
		return;
1293
	}
1294

1295
	data = host->mrq->data;
1296
	chan = omap_hsmmc_get_dma_chan(host, data);
1297
	if (!data->host_cookie)
1298 1299
		dma_unmap_sg(chan->device->dev,
			     data->sg, data->sg_len,
1300
			     omap_hsmmc_get_dma_dir(host, data));
1301 1302

	req_in_progress = host->req_in_progress;
1303
	host->dma_ch = -1;
1304
	spin_unlock_irq(&host->irq_lock);
1305 1306 1307 1308 1309 1310 1311 1312

	/* 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);
	}
1313 1314
}

1315 1316
static int omap_hsmmc_pre_dma_transfer(struct omap_hsmmc_host *host,
				       struct mmc_data *data,
1317
				       struct omap_hsmmc_next *next,
1318
				       struct dma_chan *chan)
1319 1320 1321 1322 1323
{
	int dma_len;

	if (!next && data->host_cookie &&
	    data->host_cookie != host->next_data.cookie) {
1324
		dev_warn(host->dev, "[%s] invalid cookie: data->host_cookie %d"
1325 1326 1327 1328 1329 1330
		       " 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 */
1331
	if (next || data->host_cookie != host->next_data.cookie) {
1332
		dma_len = dma_map_sg(chan->device->dev, data->sg, data->sg_len,
1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352
				     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;
}

1353 1354 1355
/*
 * Routine to configure and start DMA for the MMC card
 */
B
Balaji T K 已提交
1356
static int omap_hsmmc_setup_dma_transfer(struct omap_hsmmc_host *host,
D
Denis Karpov 已提交
1357
					struct mmc_request *req)
1358
{
1359 1360 1361
	struct dma_slave_config cfg;
	struct dma_async_tx_descriptor *tx;
	int ret = 0, i;
1362
	struct mmc_data *data = req->data;
1363
	struct dma_chan *chan;
1364

1365
	/* Sanity check: all the SG entries must be aligned by block size. */
1366
	for (i = 0; i < data->sg_len; i++) {
1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378
		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;

1379
	BUG_ON(host->dma_ch != -1);
1380

1381 1382
	chan = omap_hsmmc_get_dma_chan(host, data);

1383 1384 1385 1386 1387 1388
	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;
1389

1390 1391
	ret = dmaengine_slave_config(chan, &cfg);
	if (ret)
1392
		return ret;
1393

1394
	ret = omap_hsmmc_pre_dma_transfer(host, data, NULL, chan);
1395 1396
	if (ret)
		return ret;
1397

1398 1399 1400 1401 1402 1403 1404 1405
	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;
	}
1406

1407 1408
	tx->callback = omap_hsmmc_dma_callback;
	tx->callback_param = host;
1409

1410 1411
	/* Does not fail */
	dmaengine_submit(tx);
1412

1413
	host->dma_ch = 1;
1414

1415 1416 1417
	return 0;
}

D
Denis Karpov 已提交
1418
static void set_data_timeout(struct omap_hsmmc_host *host,
1419 1420
			     unsigned int timeout_ns,
			     unsigned int timeout_clks)
1421 1422 1423 1424 1425 1426 1427 1428 1429
{
	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;

1430
	cycle_ns = 1000000000 / (host->clk_rate / clkd);
1431 1432
	timeout = timeout_ns / cycle_ns;
	timeout += timeout_clks;
1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454
	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);
}

B
Balaji T K 已提交
1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469
static void omap_hsmmc_start_dma_transfer(struct omap_hsmmc_host *host)
{
	struct mmc_request *req = host->mrq;
	struct dma_chan *chan;

	if (!req->data)
		return;
	OMAP_HSMMC_WRITE(host->base, BLK, (req->data->blksz)
				| (req->data->blocks << 16));
	set_data_timeout(host, req->data->timeout_ns,
				req->data->timeout_clks);
	chan = omap_hsmmc_get_dma_chan(host, req->data);
	dma_async_issue_pending(chan);
}

1470 1471 1472 1473
/*
 * Configure block length for MMC/SD cards and initiate the transfer.
 */
static int
D
Denis Karpov 已提交
1474
omap_hsmmc_prepare_data(struct omap_hsmmc_host *host, struct mmc_request *req)
1475 1476 1477 1478 1479 1480
{
	int ret;
	host->data = req->data;

	if (req->data == NULL) {
		OMAP_HSMMC_WRITE(host->base, BLK, 0);
1481 1482 1483 1484 1485 1486
		/*
		 * Set an arbitrary 100ms data timeout for commands with
		 * busy signal.
		 */
		if (req->cmd->flags & MMC_RSP_BUSY)
			set_data_timeout(host, 100000000U, 0);
1487 1488 1489 1490
		return 0;
	}

	if (host->use_dma) {
B
Balaji T K 已提交
1491
		ret = omap_hsmmc_setup_dma_transfer(host, req);
1492
		if (ret != 0) {
1493
			dev_err(mmc_dev(host->mmc), "MMC start dma failure\n");
1494 1495 1496 1497 1498 1499
			return ret;
		}
	}
	return 0;
}

1500 1501 1502 1503 1504 1505
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;

1506
	if (host->use_dma && data->host_cookie) {
1507 1508
		struct dma_chan *c = omap_hsmmc_get_dma_chan(host, data);

1509 1510
		dma_unmap_sg(c->device->dev, data->sg, data->sg_len,
			     omap_hsmmc_get_dma_dir(host, data));
1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524
		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 ;
	}

1525 1526 1527
	if (host->use_dma) {
		struct dma_chan *c = omap_hsmmc_get_dma_chan(host, mrq->data);

1528
		if (omap_hsmmc_pre_dma_transfer(host, mrq->data,
1529
						&host->next_data, c))
1530
			mrq->data->host_cookie = 0;
1531
	}
1532 1533
}

1534 1535 1536
/*
 * Request function. for read/write operation
 */
D
Denis Karpov 已提交
1537
static void omap_hsmmc_request(struct mmc_host *mmc, struct mmc_request *req)
1538
{
D
Denis Karpov 已提交
1539
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1540
	int err;
1541

1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562
	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;
1563 1564
	WARN_ON(host->mrq != NULL);
	host->mrq = req;
1565
	host->clk_rate = clk_get_rate(host->fclk);
D
Denis Karpov 已提交
1566
	err = omap_hsmmc_prepare_data(host, req);
1567 1568 1569 1570 1571 1572 1573 1574
	if (err) {
		req->cmd->error = err;
		if (req->data)
			req->data->error = err;
		host->mrq = NULL;
		mmc_request_done(mmc, req);
		return;
	}
1575
	if (req->sbc && !(host->flags & AUTO_CMD23)) {
B
Balaji T K 已提交
1576 1577 1578
		omap_hsmmc_start_command(host, req->sbc, NULL);
		return;
	}
1579

B
Balaji T K 已提交
1580
	omap_hsmmc_start_dma_transfer(host);
D
Denis Karpov 已提交
1581
	omap_hsmmc_start_command(host, req->cmd, req->data);
1582 1583 1584
}

/* Routine to configure clock values. Exposed API to core */
D
Denis Karpov 已提交
1585
static void omap_hsmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
1586
{
D
Denis Karpov 已提交
1587
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1588
	int do_send_init_stream = 0;
1589

1590
	pm_runtime_get_sync(host->dev);
1591

1592 1593 1594
	if (ios->power_mode != host->power_mode) {
		switch (ios->power_mode) {
		case MMC_POWER_OFF:
1595
			mmc_pdata(host)->set_power(host->dev, 0, 0);
1596 1597
			break;
		case MMC_POWER_UP:
1598
			mmc_pdata(host)->set_power(host->dev, 1, ios->vdd);
1599 1600 1601 1602 1603 1604
			break;
		case MMC_POWER_ON:
			do_send_init_stream = 1;
			break;
		}
		host->power_mode = ios->power_mode;
1605 1606
	}

1607 1608
	/* FIXME: set registers based only on changes to ios */

1609
	omap_hsmmc_set_bus_width(host);
1610

1611
	if (host->pdata->controller_flags & OMAP_HSMMC_SUPPORTS_DUAL_VOLT) {
1612 1613 1614
		/* Only MMC1 can interface at 3V without some flavor
		 * of external transceiver; but they all handle 1.8V.
		 */
1615
		if ((OMAP_HSMMC_READ(host->base, HCTL) & SDVSDET) &&
1616
			(ios->vdd == DUAL_VOLT_OCR_BIT)) {
1617 1618 1619 1620 1621 1622
				/*
				 * 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 已提交
1623 1624
			if (omap_hsmmc_switch_opcond(host, ios->vdd) != 0)
				dev_dbg(mmc_dev(host->mmc),
1625 1626 1627 1628
						"Switch operation failed\n");
		}
	}

1629
	omap_hsmmc_set_clock(host);
1630

1631
	if (do_send_init_stream)
1632 1633
		send_init_stream(host);

1634
	omap_hsmmc_set_bus_mode(host);
1635

1636
	pm_runtime_put_autosuspend(host->dev);
1637 1638 1639 1640
}

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

1643
	if (!host->card_detect)
1644
		return -ENOSYS;
1645
	return host->card_detect(host->dev);
1646 1647
}

1648 1649 1650 1651
static void omap_hsmmc_init_card(struct mmc_host *mmc, struct mmc_card *card)
{
	struct omap_hsmmc_host *host = mmc_priv(mmc);

1652 1653
	if (mmc_pdata(host)->init_card)
		mmc_pdata(host)->init_card(card);
1654 1655
}

1656 1657 1658
static void omap_hsmmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
{
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1659
	u32 irq_mask, con;
1660 1661 1662 1663
	unsigned long flags;

	spin_lock_irqsave(&host->irq_lock, flags);

1664
	con = OMAP_HSMMC_READ(host->base, CON);
1665 1666 1667 1668
	irq_mask = OMAP_HSMMC_READ(host->base, ISE);
	if (enable) {
		host->flags |= HSMMC_SDIO_IRQ_ENABLED;
		irq_mask |= CIRQ_EN;
1669
		con |= CTPL | CLKEXTFREE;
1670 1671 1672
	} else {
		host->flags &= ~HSMMC_SDIO_IRQ_ENABLED;
		irq_mask &= ~CIRQ_EN;
1673
		con &= ~(CTPL | CLKEXTFREE);
1674
	}
1675
	OMAP_HSMMC_WRITE(host->base, CON, con);
1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719
	OMAP_HSMMC_WRITE(host->base, IE, irq_mask);

	/*
	 * if enable, piggy back detection on current request
	 * but always disable immediately
	 */
	if (!host->req_in_progress || !enable)
		OMAP_HSMMC_WRITE(host->base, ISE, irq_mask);

	/* flush posted write */
	OMAP_HSMMC_READ(host->base, IE);

	spin_unlock_irqrestore(&host->irq_lock, flags);
}

static int omap_hsmmc_configure_wake_irq(struct omap_hsmmc_host *host)
{
	struct mmc_host *mmc = host->mmc;
	int ret;

	/*
	 * For omaps with wake-up path, wakeirq will be irq from pinctrl and
	 * for other omaps, wakeirq will be from GPIO (dat line remuxed to
	 * gpio). wakeirq is needed to detect sdio irq in runtime suspend state
	 * with functional clock disabled.
	 */
	if (!host->dev->of_node || !host->wake_irq)
		return -ENODEV;

	/* Prevent auto-enabling of IRQ */
	irq_set_status_flags(host->wake_irq, IRQ_NOAUTOEN);
	ret = devm_request_irq(host->dev, host->wake_irq, omap_hsmmc_wake_irq,
			       IRQF_TRIGGER_LOW | IRQF_ONESHOT,
			       mmc_hostname(mmc), host);
	if (ret) {
		dev_err(mmc_dev(host->mmc), "Unable to request wake IRQ\n");
		goto err;
	}

	/*
	 * Some omaps don't have wake-up path from deeper idle states
	 * and need to remux SDIO DAT1 to GPIO for wake-up from idle.
	 */
	if (host->pdata->controller_flags & OMAP_HSMMC_SWAKEUP_MISSING) {
1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738
		struct pinctrl *p = devm_pinctrl_get(host->dev);
		if (!p) {
			ret = -ENODEV;
			goto err_free_irq;
		}
		if (IS_ERR(pinctrl_lookup_state(p, PINCTRL_STATE_DEFAULT))) {
			dev_info(host->dev, "missing default pinctrl state\n");
			devm_pinctrl_put(p);
			ret = -EINVAL;
			goto err_free_irq;
		}

		if (IS_ERR(pinctrl_lookup_state(p, PINCTRL_STATE_IDLE))) {
			dev_info(host->dev, "missing idle pinctrl state\n");
			devm_pinctrl_put(p);
			ret = -EINVAL;
			goto err_free_irq;
		}
		devm_pinctrl_put(p);
1739 1740
	}

1741 1742
	OMAP_HSMMC_WRITE(host->base, HCTL,
			 OMAP_HSMMC_READ(host->base, HCTL) | IWE);
1743 1744
	return 0;

1745 1746
err_free_irq:
	devm_free_irq(host->dev, host->wake_irq, host);
1747 1748 1749 1750 1751 1752
err:
	dev_warn(host->dev, "no SDIO IRQ support, falling back to polling\n");
	host->wake_irq = 0;
	return ret;
}

D
Denis Karpov 已提交
1753
static void omap_hsmmc_conf_bus_power(struct omap_hsmmc_host *host)
1754 1755 1756 1757
{
	u32 hctl, capa, value;

	/* Only MMC1 supports 3.0V */
1758
	if (host->pdata->controller_flags & OMAP_HSMMC_SUPPORTS_DUAL_VOLT) {
1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772
		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 已提交
1773
	set_sd_bus_power(host);
1774 1775
}

D
Denis Karpov 已提交
1776
static int omap_hsmmc_enable_fclk(struct mmc_host *mmc)
1777
{
D
Denis Karpov 已提交
1778
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1779

1780 1781
	pm_runtime_get_sync(host->dev);

1782 1783 1784
	return 0;
}

1785
static int omap_hsmmc_disable_fclk(struct mmc_host *mmc)
1786
{
D
Denis Karpov 已提交
1787
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1788

1789 1790 1791
	pm_runtime_mark_last_busy(host->dev);
	pm_runtime_put_autosuspend(host->dev);

1792 1793 1794
	return 0;
}

1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805
static int omap_hsmmc_multi_io_quirk(struct mmc_card *card,
				     unsigned int direction, int blk_size)
{
	/* This controller can't do multiblock reads due to hw bugs */
	if (direction == MMC_DATA_READ)
		return 1;

	return blk_size;
}

static struct mmc_host_ops omap_hsmmc_ops = {
D
Denis Karpov 已提交
1806 1807
	.enable = omap_hsmmc_enable_fclk,
	.disable = omap_hsmmc_disable_fclk,
1808 1809
	.post_req = omap_hsmmc_post_req,
	.pre_req = omap_hsmmc_pre_req,
D
Denis Karpov 已提交
1810 1811
	.request = omap_hsmmc_request,
	.set_ios = omap_hsmmc_set_ios,
1812
	.get_cd = omap_hsmmc_get_cd,
1813
	.get_ro = mmc_gpio_get_ro,
1814
	.init_card = omap_hsmmc_init_card,
1815
	.enable_sdio_irq = omap_hsmmc_enable_sdio_irq,
1816 1817
};

1818 1819
#ifdef CONFIG_DEBUG_FS

D
Denis Karpov 已提交
1820
static int omap_hsmmc_regs_show(struct seq_file *s, void *data)
1821 1822
{
	struct mmc_host *mmc = s->private;
D
Denis Karpov 已提交
1823
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1824

1825 1826 1827
	seq_printf(s, "mmc%d:\n", mmc->index);
	seq_printf(s, "sdio irq mode\t%s\n",
		   (mmc->caps & MMC_CAP_SDIO_IRQ) ? "interrupt" : "polling");
1828

1829 1830 1831 1832 1833 1834
	if (mmc->caps & MMC_CAP_SDIO_IRQ) {
		seq_printf(s, "sdio irq \t%s\n",
			   (host->flags & HSMMC_SDIO_IRQ_ENABLED) ?  "enabled"
			   : "disabled");
	}
	seq_printf(s, "ctx_loss:\t%d\n", host->context_loss);
1835

1836 1837
	pm_runtime_get_sync(host->dev);
	seq_puts(s, "\nregs:\n");
1838 1839
	seq_printf(s, "CON:\t\t0x%08x\n",
			OMAP_HSMMC_READ(host->base, CON));
1840 1841
	seq_printf(s, "PSTATE:\t\t0x%08x\n",
		   OMAP_HSMMC_READ(host->base, PSTATE));
1842 1843 1844 1845 1846 1847 1848 1849 1850 1851
	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));
1852

1853 1854
	pm_runtime_mark_last_busy(host->dev);
	pm_runtime_put_autosuspend(host->dev);
1855

1856 1857 1858
	return 0;
}

D
Denis Karpov 已提交
1859
static int omap_hsmmc_regs_open(struct inode *inode, struct file *file)
1860
{
D
Denis Karpov 已提交
1861
	return single_open(file, omap_hsmmc_regs_show, inode->i_private);
1862 1863 1864
}

static const struct file_operations mmc_regs_fops = {
D
Denis Karpov 已提交
1865
	.open           = omap_hsmmc_regs_open,
1866 1867 1868 1869 1870
	.read           = seq_read,
	.llseek         = seq_lseek,
	.release        = single_release,
};

D
Denis Karpov 已提交
1871
static void omap_hsmmc_debugfs(struct mmc_host *mmc)
1872 1873 1874 1875 1876 1877 1878 1879
{
	if (mmc->debugfs_root)
		debugfs_create_file("regs", S_IRUSR, mmc->debugfs_root,
			mmc, &mmc_regs_fops);
}

#else

D
Denis Karpov 已提交
1880
static void omap_hsmmc_debugfs(struct mmc_host *mmc)
1881 1882 1883 1884 1885
{
}

#endif

1886
#ifdef CONFIG_OF
1887 1888 1889 1890 1891 1892 1893 1894
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,
};
1895 1896 1897 1898
static const struct omap_mmc_of_data am33xx_mmc_of_data = {
	.reg_offset = 0x100,
	.controller_flags = OMAP_HSMMC_SWAKEUP_MISSING,
};
1899 1900 1901 1902 1903

static const struct of_device_id omap_mmc_of_match[] = {
	{
		.compatible = "ti,omap2-hsmmc",
	},
1904 1905 1906 1907
	{
		.compatible = "ti,omap3-pre-es3-hsmmc",
		.data = &omap3_pre_es3_mmc_of_data,
	},
1908 1909 1910 1911 1912
	{
		.compatible = "ti,omap3-hsmmc",
	},
	{
		.compatible = "ti,omap4-hsmmc",
1913
		.data = &omap4_mmc_of_data,
1914
	},
1915 1916 1917 1918
	{
		.compatible = "ti,am33xx-hsmmc",
		.data = &am33xx_mmc_of_data,
	},
1919
	{},
1920
};
1921 1922
MODULE_DEVICE_TABLE(of, omap_mmc_of_match);

1923
static struct omap_hsmmc_platform_data *of_get_hsmmc_pdata(struct device *dev)
1924
{
1925
	struct omap_hsmmc_platform_data *pdata;
1926 1927 1928 1929
	struct device_node *np = dev->of_node;

	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
	if (!pdata)
1930
		return ERR_PTR(-ENOMEM); /* out of memory */
1931 1932 1933 1934

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

1935 1936
	pdata->switch_pin = -EINVAL;
	pdata->gpio_wp = -EINVAL;
1937 1938

	if (of_find_property(np, "ti,non-removable", NULL)) {
1939 1940
		pdata->nonremovable = true;
		pdata->no_regulator_off_init = true;
1941 1942 1943
	}

	if (of_find_property(np, "ti,needs-special-reset", NULL))
1944
		pdata->features |= HSMMC_HAS_UPDATED_RESET;
1945

1946
	if (of_find_property(np, "ti,needs-special-hs-handling", NULL))
1947
		pdata->features |= HSMMC_HAS_HSPE_SUPPORT;
1948

1949 1950 1951
	return pdata;
}
#else
1952
static inline struct omap_hsmmc_platform_data
1953 1954
			*of_get_hsmmc_pdata(struct device *dev)
{
1955
	return ERR_PTR(-EINVAL);
1956 1957 1958
}
#endif

B
Bill Pemberton 已提交
1959
static int omap_hsmmc_probe(struct platform_device *pdev)
1960
{
1961
	struct omap_hsmmc_platform_data *pdata = pdev->dev.platform_data;
1962
	struct mmc_host *mmc;
D
Denis Karpov 已提交
1963
	struct omap_hsmmc_host *host = NULL;
1964
	struct resource *res;
1965
	int ret, irq;
1966
	const struct of_device_id *match;
1967 1968
	dma_cap_mask_t mask;
	unsigned tx_req, rx_req;
1969
	const struct omap_mmc_of_data *data;
1970
	void __iomem *base;
1971 1972 1973 1974

	match = of_match_device(of_match_ptr(omap_mmc_of_match), &pdev->dev);
	if (match) {
		pdata = of_get_hsmmc_pdata(&pdev->dev);
1975 1976 1977 1978

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

1979
		if (match->data) {
1980 1981 1982
			data = match->data;
			pdata->reg_offset = data->reg_offset;
			pdata->controller_flags |= data->controller_flags;
1983 1984
		}
	}
1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995

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

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

1996 1997 1998
	base = devm_ioremap_resource(&pdev->dev, res);
	if (IS_ERR(base))
		return PTR_ERR(base);
1999

D
Denis Karpov 已提交
2000
	mmc = mmc_alloc_host(sizeof(struct omap_hsmmc_host), &pdev->dev);
2001 2002
	if (!mmc) {
		ret = -ENOMEM;
2003
		goto err;
2004 2005
	}

2006 2007 2008 2009
	ret = mmc_of_parse(mmc);
	if (ret)
		goto err1;

2010 2011 2012 2013 2014 2015 2016
	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;
2017
	host->mapbase	= res->start + pdata->reg_offset;
2018
	host->base	= base + pdata->reg_offset;
2019
	host->power_mode = MMC_POWER_OFF;
2020
	host->next_data.cookie = 1;
2021
	host->pbias_enabled = 0;
2022

2023
	ret = omap_hsmmc_gpio_init(mmc, host, pdata);
2024 2025 2026
	if (ret)
		goto err_gpio;

2027 2028
	platform_set_drvdata(pdev, host);

2029 2030 2031
	if (pdev->dev.of_node)
		host->wake_irq = irq_of_parse_and_map(pdev->dev.of_node, 1);

2032
	mmc->ops	= &omap_hsmmc_ops;
2033

2034 2035 2036 2037
	mmc->f_min = OMAP_MMC_MIN_CLOCK;

	if (pdata->max_freq > 0)
		mmc->f_max = pdata->max_freq;
2038
	else if (mmc->f_max == 0)
2039
		mmc->f_max = OMAP_MMC_MAX_CLOCK;
2040

2041
	spin_lock_init(&host->irq_lock);
2042

B
Balaji T K 已提交
2043
	host->fclk = devm_clk_get(&pdev->dev, "fck");
2044 2045 2046 2047 2048 2049
	if (IS_ERR(host->fclk)) {
		ret = PTR_ERR(host->fclk);
		host->fclk = NULL;
		goto err1;
	}

2050 2051
	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");
2052
		omap_hsmmc_ops.multi_io_quirk = omap_hsmmc_multi_io_quirk;
2053
	}
2054

2055 2056 2057 2058
	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);
2059

2060 2061
	omap_hsmmc_context_save(host);

B
Balaji T K 已提交
2062
	host->dbclk = devm_clk_get(&pdev->dev, "mmchsdb_fck");
2063 2064 2065 2066 2067
	/*
	 * MMC can still work without debounce clock.
	 */
	if (IS_ERR(host->dbclk)) {
		host->dbclk = NULL;
2068
	} else if (clk_prepare_enable(host->dbclk) != 0) {
2069 2070
		dev_warn(mmc_dev(host->mmc), "Failed to enable debounce clk\n");
		host->dbclk = NULL;
2071
	}
2072

2073 2074
	/* Since we do only SG emulation, we can have as many segs
	 * as we want. */
2075
	mmc->max_segs = 1024;
2076

2077 2078 2079 2080 2081
	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;

2082
	mmc->caps |= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
A
Adrian Hunter 已提交
2083
		     MMC_CAP_WAIT_WHILE_BUSY | MMC_CAP_ERASE;
2084

2085
	mmc->caps |= mmc_pdata(host)->caps;
2086
	if (mmc->caps & MMC_CAP_8_BIT_DATA)
2087 2088
		mmc->caps |= MMC_CAP_4_BIT_DATA;

2089
	if (mmc_pdata(host)->nonremovable)
2090 2091
		mmc->caps |= MMC_CAP_NONREMOVABLE;

2092
	mmc->pm_caps |= mmc_pdata(host)->pm_caps;
E
Eliad Peller 已提交
2093

D
Denis Karpov 已提交
2094
	omap_hsmmc_conf_bus_power(host);
2095

2096 2097 2098 2099 2100 2101 2102 2103
	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;
2104

2105 2106 2107 2108 2109 2110 2111
		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 已提交
2112
	}
2113

2114 2115 2116
	dma_cap_zero(mask);
	dma_cap_set(DMA_SLAVE, mask);

2117 2118 2119 2120
	host->rx_chan =
		dma_request_slave_channel_compat(mask, omap_dma_filter_fn,
						 &rx_req, &pdev->dev, "rx");

2121 2122
	if (!host->rx_chan) {
		dev_err(mmc_dev(host->mmc), "unable to obtain RX DMA engine channel %u\n", rx_req);
2123
		ret = -ENXIO;
2124 2125 2126
		goto err_irq;
	}

2127 2128 2129 2130
	host->tx_chan =
		dma_request_slave_channel_compat(mask, omap_dma_filter_fn,
						 &tx_req, &pdev->dev, "tx");

2131 2132
	if (!host->tx_chan) {
		dev_err(mmc_dev(host->mmc), "unable to obtain TX DMA engine channel %u\n", tx_req);
2133
		ret = -ENXIO;
2134
		goto err_irq;
2135
	}
2136 2137

	/* Request IRQ for MMC operations */
2138
	ret = devm_request_irq(&pdev->dev, host->irq, omap_hsmmc_irq, 0,
2139 2140
			mmc_hostname(mmc), host);
	if (ret) {
2141
		dev_err(mmc_dev(host->mmc), "Unable to grab HSMMC IRQ\n");
2142 2143 2144
		goto err_irq;
	}

2145
	if (omap_hsmmc_have_reg() && !mmc_pdata(host)->set_power) {
2146 2147
		ret = omap_hsmmc_reg_get(host);
		if (ret)
2148
			goto err_irq;
2149 2150 2151
		host->use_reg = 1;
	}

2152
	mmc->ocr_avail = mmc_pdata(host)->ocr_mask;
2153

2154
	omap_hsmmc_disable_irq(host);
2155

2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167
	/*
	 * For now, only support SDIO interrupt if we have a separate
	 * wake-up interrupt configured from device tree. This is because
	 * the wake-up interrupt is needed for idle state and some
	 * platforms need special quirks. And we don't want to add new
	 * legacy mux platform init code callbacks any longer as we
	 * are moving to DT based booting anyways.
	 */
	ret = omap_hsmmc_configure_wake_irq(host);
	if (!ret)
		mmc->caps |= MMC_CAP_SDIO_IRQ;

2168 2169
	omap_hsmmc_protect_card(host);

2170 2171
	mmc_add_host(mmc);

2172
	if (mmc_pdata(host)->name != NULL) {
2173 2174 2175 2176
		ret = device_create_file(&mmc->class_dev, &dev_attr_slot_name);
		if (ret < 0)
			goto err_slot_name;
	}
2177
	if (host->get_cover_state) {
2178
		ret = device_create_file(&mmc->class_dev,
2179
					 &dev_attr_cover_switch);
2180
		if (ret < 0)
2181
			goto err_slot_name;
2182 2183
	}

D
Denis Karpov 已提交
2184
	omap_hsmmc_debugfs(mmc);
2185 2186
	pm_runtime_mark_last_busy(host->dev);
	pm_runtime_put_autosuspend(host->dev);
2187

2188 2189 2190 2191
	return 0;

err_slot_name:
	mmc_remove_host(mmc);
2192 2193
	if (host->use_reg)
		omap_hsmmc_reg_put(host);
2194
err_irq:
2195 2196 2197 2198
	if (host->tx_chan)
		dma_release_channel(host->tx_chan);
	if (host->rx_chan)
		dma_release_channel(host->rx_chan);
2199
	pm_runtime_put_sync(host->dev);
2200
	pm_runtime_disable(host->dev);
B
Balaji T K 已提交
2201
	if (host->dbclk)
2202
		clk_disable_unprepare(host->dbclk);
2203
err1:
2204
err_gpio:
2205
	mmc_free_host(mmc);
2206 2207 2208 2209
err:
	return ret;
}

B
Bill Pemberton 已提交
2210
static int omap_hsmmc_remove(struct platform_device *pdev)
2211
{
D
Denis Karpov 已提交
2212
	struct omap_hsmmc_host *host = platform_get_drvdata(pdev);
2213

F
Felipe Balbi 已提交
2214 2215 2216 2217
	pm_runtime_get_sync(host->dev);
	mmc_remove_host(host->mmc);
	if (host->use_reg)
		omap_hsmmc_reg_put(host);
2218

2219 2220 2221 2222 2223
	if (host->tx_chan)
		dma_release_channel(host->tx_chan);
	if (host->rx_chan)
		dma_release_channel(host->rx_chan);

F
Felipe Balbi 已提交
2224 2225
	pm_runtime_put_sync(host->dev);
	pm_runtime_disable(host->dev);
B
Balaji T K 已提交
2226
	if (host->dbclk)
2227
		clk_disable_unprepare(host->dbclk);
2228

2229
	mmc_free_host(host->mmc);
F
Felipe Balbi 已提交
2230

2231 2232 2233 2234
	return 0;
}

#ifdef CONFIG_PM
2235
static int omap_hsmmc_suspend(struct device *dev)
2236
{
F
Felipe Balbi 已提交
2237
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);
2238

F
Felipe Balbi 已提交
2239
	if (!host)
2240 2241
		return 0;

F
Felipe Balbi 已提交
2242
	pm_runtime_get_sync(host->dev);
2243

F
Felipe Balbi 已提交
2244
	if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) {
2245 2246 2247
		OMAP_HSMMC_WRITE(host->base, ISE, 0);
		OMAP_HSMMC_WRITE(host->base, IE, 0);
		OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
F
Felipe Balbi 已提交
2248 2249
		OMAP_HSMMC_WRITE(host->base, HCTL,
				OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP);
2250
	}
F
Felipe Balbi 已提交
2251

2252 2253 2254 2255 2256
	/* do not wake up due to sdio irq */
	if ((host->mmc->caps & MMC_CAP_SDIO_IRQ) &&
	    !(host->mmc->pm_flags & MMC_PM_WAKE_SDIO_IRQ))
		disable_irq(host->wake_irq);

2257
	if (host->dbclk)
2258
		clk_disable_unprepare(host->dbclk);
2259

2260
	pm_runtime_put_sync(host->dev);
2261
	return 0;
2262 2263 2264
}

/* Routine to resume the MMC device */
2265
static int omap_hsmmc_resume(struct device *dev)
2266
{
F
Felipe Balbi 已提交
2267 2268 2269 2270
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);

	if (!host)
		return 0;
2271

F
Felipe Balbi 已提交
2272
	pm_runtime_get_sync(host->dev);
2273

2274
	if (host->dbclk)
2275
		clk_prepare_enable(host->dbclk);
2276

F
Felipe Balbi 已提交
2277 2278
	if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER))
		omap_hsmmc_conf_bus_power(host);
2279

F
Felipe Balbi 已提交
2280
	omap_hsmmc_protect_card(host);
2281

2282 2283 2284 2285
	if ((host->mmc->caps & MMC_CAP_SDIO_IRQ) &&
	    !(host->mmc->pm_flags & MMC_PM_WAKE_SDIO_IRQ))
		enable_irq(host->wake_irq);

F
Felipe Balbi 已提交
2286 2287
	pm_runtime_mark_last_busy(host->dev);
	pm_runtime_put_autosuspend(host->dev);
2288
	return 0;
2289 2290 2291
}

#else
D
Denis Karpov 已提交
2292
#define omap_hsmmc_suspend	NULL
2293
#define omap_hsmmc_resume	NULL
2294 2295
#endif

2296 2297 2298
static int omap_hsmmc_runtime_suspend(struct device *dev)
{
	struct omap_hsmmc_host *host;
2299
	unsigned long flags;
2300
	int ret = 0;
2301 2302 2303

	host = platform_get_drvdata(to_platform_device(dev));
	omap_hsmmc_context_save(host);
F
Felipe Balbi 已提交
2304
	dev_dbg(dev, "disabled\n");
2305

2306 2307 2308 2309 2310 2311
	spin_lock_irqsave(&host->irq_lock, flags);
	if ((host->mmc->caps & MMC_CAP_SDIO_IRQ) &&
	    (host->flags & HSMMC_SDIO_IRQ_ENABLED)) {
		/* disable sdio irq handling to prevent race */
		OMAP_HSMMC_WRITE(host->base, ISE, 0);
		OMAP_HSMMC_WRITE(host->base, IE, 0);
2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326

		if (!(OMAP_HSMMC_READ(host->base, PSTATE) & DLEV_DAT(1))) {
			/*
			 * dat1 line low, pending sdio irq
			 * race condition: possible irq handler running on
			 * multi-core, abort
			 */
			dev_dbg(dev, "pending sdio irq, abort suspend\n");
			OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
			OMAP_HSMMC_WRITE(host->base, ISE, CIRQ_EN);
			OMAP_HSMMC_WRITE(host->base, IE, CIRQ_EN);
			pm_runtime_mark_last_busy(dev);
			ret = -EBUSY;
			goto abort;
		}
2327

2328 2329
		pinctrl_pm_select_idle_state(dev);

2330 2331 2332
		WARN_ON(host->flags & HSMMC_WAKE_IRQ_ENABLED);
		enable_irq(host->wake_irq);
		host->flags |= HSMMC_WAKE_IRQ_ENABLED;
2333 2334
	} else {
		pinctrl_pm_select_idle_state(dev);
2335
	}
2336

2337
abort:
2338
	spin_unlock_irqrestore(&host->irq_lock, flags);
2339
	return ret;
2340 2341 2342 2343 2344
}

static int omap_hsmmc_runtime_resume(struct device *dev)
{
	struct omap_hsmmc_host *host;
2345
	unsigned long flags;
2346 2347 2348

	host = platform_get_drvdata(to_platform_device(dev));
	omap_hsmmc_context_restore(host);
F
Felipe Balbi 已提交
2349
	dev_dbg(dev, "enabled\n");
2350

2351 2352 2353 2354 2355 2356 2357 2358 2359
	spin_lock_irqsave(&host->irq_lock, flags);
	if ((host->mmc->caps & MMC_CAP_SDIO_IRQ) &&
	    (host->flags & HSMMC_SDIO_IRQ_ENABLED)) {
		/* sdio irq flag can't change while in runtime suspend */
		if (host->flags & HSMMC_WAKE_IRQ_ENABLED) {
			disable_irq_nosync(host->wake_irq);
			host->flags &= ~HSMMC_WAKE_IRQ_ENABLED;
		}

2360 2361 2362
		pinctrl_pm_select_default_state(host->dev);

		/* irq lost, if pinmux incorrect */
2363 2364 2365
		OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
		OMAP_HSMMC_WRITE(host->base, ISE, CIRQ_EN);
		OMAP_HSMMC_WRITE(host->base, IE, CIRQ_EN);
2366 2367
	} else {
		pinctrl_pm_select_default_state(host->dev);
2368 2369
	}
	spin_unlock_irqrestore(&host->irq_lock, flags);
2370 2371 2372
	return 0;
}

2373
static struct dev_pm_ops omap_hsmmc_dev_pm_ops = {
D
Denis Karpov 已提交
2374 2375
	.suspend	= omap_hsmmc_suspend,
	.resume		= omap_hsmmc_resume,
2376 2377
	.runtime_suspend = omap_hsmmc_runtime_suspend,
	.runtime_resume = omap_hsmmc_runtime_resume,
2378 2379 2380
};

static struct platform_driver omap_hsmmc_driver = {
2381
	.probe		= omap_hsmmc_probe,
B
Bill Pemberton 已提交
2382
	.remove		= omap_hsmmc_remove,
2383 2384
	.driver		= {
		.name = DRIVER_NAME,
2385
		.pm = &omap_hsmmc_dev_pm_ops,
2386
		.of_match_table = of_match_ptr(omap_mmc_of_match),
2387 2388 2389
	},
};

2390
module_platform_driver(omap_hsmmc_driver);
2391 2392 2393 2394
MODULE_DESCRIPTION("OMAP High Speed Multimedia Card driver");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:" DRIVER_NAME);
MODULE_AUTHOR("Texas Instruments Inc");