omap_hsmmc.c 60.0 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

	/* To handle board related suspend/resume functionality for MMC */
226 227
	int (*suspend)(struct device *dev);
	int (*resume)(struct device *dev);
228 229 230 231 232 233 234

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

	/* Card detection IRQs */
	int card_detect_irq;

240 241
	int (*card_detect)(struct device *dev);
	int (*get_ro)(struct device *dev);
242

243 244
};

245 246 247 248 249
struct omap_mmc_of_data {
	u32 reg_offset;
	u8 controller_flags;
};

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

252
static int omap_hsmmc_card_detect(struct device *dev)
253
{
254
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);
255

256
	return mmc_gpio_get_cd(host->mmc);
257 258
}

259
static int omap_hsmmc_get_wp(struct device *dev)
260
{
261
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);
262

263
	return mmc_gpio_get_ro(host->mmc);
264 265
}

266
static int omap_hsmmc_get_cover_state(struct device *dev)
267
{
268
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);
269

270
	return mmc_gpio_get_cd(host->mmc);
271 272
}

273 274
#ifdef CONFIG_REGULATOR

275
static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
276 277 278 279 280 281 282 283 284 285 286 287
{
	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;

288
	if (mmc_pdata(host)->before_set_reg)
289
		mmc_pdata(host)->before_set_reg(dev, power_on, vdd);
290

291 292 293 294 295 296 297 298 299
	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);
	}

300 301 302 303 304 305 306 307 308 309 310 311 312 313
	/*
	 * 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) {
314 315
		if (host->vcc)
			ret = mmc_regulator_set_ocr(host->mmc, host->vcc, vdd);
316 317 318
		/* Enable interface voltage rail, if needed */
		if (ret == 0 && host->vcc_aux) {
			ret = regulator_enable(host->vcc_aux);
319
			if (ret < 0 && host->vcc)
320 321
				ret = mmc_regulator_set_ocr(host->mmc,
							host->vcc, 0);
322 323
		}
	} else {
324
		/* Shut down the rail */
325 326
		if (host->vcc_aux)
			ret = regulator_disable(host->vcc_aux);
327
		if (host->vcc) {
328 329 330 331
			/* Then proceed to shut down the local regulator */
			ret = mmc_regulator_set_ocr(host->mmc,
						host->vcc, 0);
		}
332 333
	}

334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350
	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;
		}
	}

351
	if (mmc_pdata(host)->after_set_reg)
352
		mmc_pdata(host)->after_set_reg(dev, power_on, vdd);
353

354
error_set_power:
355 356 357 358 359 360
	return ret;
}

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

363
	reg = devm_regulator_get(host->dev, "vmmc");
364
	if (IS_ERR(reg)) {
365 366
		dev_err(host->dev, "unable to get vmmc regulator %ld\n",
			PTR_ERR(reg));
367
		return PTR_ERR(reg);
368 369
	} else {
		host->vcc = reg;
370
		ocr_value = mmc_regulator_get_ocrmask(reg);
371 372
		if (!mmc_pdata(host)->ocr_mask) {
			mmc_pdata(host)->ocr_mask = ocr_value;
373
		} else {
374
			if (!(mmc_pdata(host)->ocr_mask & ocr_value)) {
375
				dev_err(host->dev, "ocrmask %x is not supported\n",
376 377
					mmc_pdata(host)->ocr_mask);
				mmc_pdata(host)->ocr_mask = 0;
378 379 380
				return -EINVAL;
			}
		}
381
	}
382
	mmc_pdata(host)->set_power = omap_hsmmc_set_power;
383

384 385 386 387
	/* Allow an aux regulator */
	reg = devm_regulator_get_optional(host->dev, "vmmc_aux");
	host->vcc_aux = IS_ERR(reg) ? NULL : reg;

388 389 390
	reg = devm_regulator_get_optional(host->dev, "pbias");
	host->pbias = IS_ERR(reg) ? NULL : reg;

391
	/* For eMMC do not power off when not in sleep state */
392
	if (mmc_pdata(host)->no_regulator_off_init)
393 394 395 396 397 398 399
		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))) {
400
		int vdd = ffs(mmc_pdata(host)->ocr_mask) - 1;
401

402 403
		mmc_pdata(host)->set_power(host->dev, 1, vdd);
		mmc_pdata(host)->set_power(host->dev, 0, 0);
404 405 406 407 408 409 410
	}

	return 0;
}

static void omap_hsmmc_reg_put(struct omap_hsmmc_host *host)
{
411
	mmc_pdata(host)->set_power = NULL;
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
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

437 438 439 440
static irqreturn_t omap_hsmmc_detect(int irq, void *dev_id);

static int omap_hsmmc_gpio_init(struct mmc_host *mmc,
				struct omap_hsmmc_host *host,
441
				struct omap_hsmmc_platform_data *pdata)
442 443 444
{
	int ret;

445 446
	if (gpio_is_valid(pdata->switch_pin)) {
		if (pdata->cover)
447 448
			host->get_cover_state =
				omap_hsmmc_get_cover_state;
449
		else
450 451
			host->card_detect = omap_hsmmc_card_detect;
		host->card_detect_irq =
452
				gpio_to_irq(pdata->switch_pin);
453 454
		mmc_gpio_set_cd_isr(mmc, omap_hsmmc_detect);
		ret = mmc_gpio_request_cd(mmc, pdata->switch_pin, 0);
455 456
		if (ret)
			return ret;
457 458 459
	} else {
		pdata->switch_pin = -EINVAL;
	}
460

461
	if (gpio_is_valid(pdata->gpio_wp)) {
462
		host->get_ro = omap_hsmmc_get_wp;
463
		ret = mmc_gpio_request_ro(mmc, pdata->gpio_wp);
464
		if (ret)
465
			return ret;
466 467 468
	} else {
		pdata->gpio_wp = -EINVAL;
	}
469 470 471 472

	return 0;
}

473 474 475 476 477 478 479 480 481
/*
 * 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);
}

482 483 484
/*
 * Stop clock to the card
 */
D
Denis Karpov 已提交
485
static void omap_hsmmc_stop_clock(struct omap_hsmmc_host *host)
486 487 488 489
{
	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 已提交
490
		dev_dbg(mmc_dev(host->mmc), "MMC Clock is not stopped\n");
491 492
}

A
Adrian Hunter 已提交
493 494
static void omap_hsmmc_enable_irq(struct omap_hsmmc_host *host,
				  struct mmc_command *cmd)
495
{
496 497
	u32 irq_mask = INT_EN_MASK;
	unsigned long flags;
498 499

	if (host->use_dma)
500
		irq_mask &= ~(BRR_EN | BWR_EN);
501

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

506
	spin_lock_irqsave(&host->irq_lock, flags);
507 508
	OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
	OMAP_HSMMC_WRITE(host->base, ISE, irq_mask);
509 510 511 512

	/* latch pending CIRQ, but don't signal MMC core */
	if (host->flags & HSMMC_SDIO_IRQ_ENABLED)
		irq_mask |= CIRQ_EN;
513
	OMAP_HSMMC_WRITE(host->base, IE, irq_mask);
514
	spin_unlock_irqrestore(&host->irq_lock, flags);
515 516 517 518
}

static void omap_hsmmc_disable_irq(struct omap_hsmmc_host *host)
{
519 520 521 522 523 524 525 526 527
	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);
528
	OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
529
	spin_unlock_irqrestore(&host->irq_lock, flags);
530 531
}

532
/* Calculate divisor for the given clock frequency */
533
static u16 calc_divisor(struct omap_hsmmc_host *host, struct mmc_ios *ios)
534 535 536 537
{
	u16 dsor = 0;

	if (ios->clock) {
538
		dsor = DIV_ROUND_UP(clk_get_rate(host->fclk), ios->clock);
539 540
		if (dsor > CLKD_MAX)
			dsor = CLKD_MAX;
541 542 543 544 545
	}

	return dsor;
}

546 547 548 549 550
static void omap_hsmmc_set_clock(struct omap_hsmmc_host *host)
{
	struct mmc_ios *ios = &host->mmc->ios;
	unsigned long regval;
	unsigned long timeout;
551
	unsigned long clkdiv;
552

553
	dev_vdbg(mmc_dev(host->mmc), "Set clock to %uHz\n", ios->clock);
554 555 556 557 558

	omap_hsmmc_stop_clock(host);

	regval = OMAP_HSMMC_READ(host->base, SYSCTL);
	regval = regval & ~(CLKD_MASK | DTO_MASK);
559 560
	clkdiv = calc_divisor(host, ios);
	regval = regval | (clkdiv << 6) | (DTO << 16);
561 562 563 564 565 566 567 568 569 570
	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();

571 572 573 574 575 576 577 578 579
	/*
	 * 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
	 */
580
	if ((mmc_pdata(host)->features & HSMMC_HAS_HSPE_SUPPORT) &&
581
	    (ios->timing != MMC_TIMING_MMC_DDR52) &&
582
	    (ios->timing != MMC_TIMING_UHS_DDR50) &&
583 584 585 586 587 588 589 590 591 592
	    ((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);
	}

593 594 595
	omap_hsmmc_start_clock(host);
}

596 597 598 599 600 601
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);
602 603
	if (ios->timing == MMC_TIMING_MMC_DDR52 ||
	    ios->timing == MMC_TIMING_UHS_DDR50)
B
Balaji T K 已提交
604 605 606
		con |= DDR;	/* configure in DDR mode */
	else
		con &= ~DDR;
607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635
	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);
}

636 637 638 639 640 641
#ifdef CONFIG_PM

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

648 649 650 651 652 653 654 655
	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++;

656
	if (host->pdata->controller_flags & OMAP_HSMMC_SUPPORTS_DUAL_VOLT) {
657 658 659 660 661 662 663 664 665 666 667
		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;
	}

668 669 670
	if (host->mmc->caps & MMC_CAP_SDIO_IRQ)
		hctl |= IWE;

671 672 673 674 675 676 677 678 679 680 681 682 683 684
	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))
		;

685 686 687
	OMAP_HSMMC_WRITE(host->base, ISE, 0);
	OMAP_HSMMC_WRITE(host->base, IE, 0);
	OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
688 689 690 691 692

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

693
	omap_hsmmc_set_bus_width(host);
694

695
	omap_hsmmc_set_clock(host);
696

697 698
	omap_hsmmc_set_bus_mode(host);

699
out:
700 701
	dev_dbg(mmc_dev(host->mmc), "context is restored: restore count %d\n",
		host->context_loss);
702 703 704 705 706 707
	return 0;
}

/*
 * Save the MMC host context (store the number of power state changes so far).
 */
D
Denis Karpov 已提交
708
static void omap_hsmmc_context_save(struct omap_hsmmc_host *host)
709
{
710 711 712 713
	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);
714 715 716 717
}

#else

D
Denis Karpov 已提交
718
static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host)
719 720 721 722
{
	return 0;
}

D
Denis Karpov 已提交
723
static void omap_hsmmc_context_save(struct omap_hsmmc_host *host)
724 725 726 727 728
{
}

#endif

729 730 731 732
/*
 * Send init stream sequence to card
 * before sending IDLE command
 */
D
Denis Karpov 已提交
733
static void send_init_stream(struct omap_hsmmc_host *host)
734 735 736 737
{
	int reg = 0;
	unsigned long timeout;

738 739 740
	if (host->protect_card)
		return;

741
	disable_irq(host->irq);
742 743

	OMAP_HSMMC_WRITE(host->base, IE, INT_EN_MASK);
744 745 746 747 748
	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);
749 750
	while ((reg != CC_EN) && time_before(jiffies, timeout))
		reg = OMAP_HSMMC_READ(host->base, STAT) & CC_EN;
751 752 753

	OMAP_HSMMC_WRITE(host->base, CON,
		OMAP_HSMMC_READ(host->base, CON) & ~INIT_STREAM);
754 755 756 757

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

758 759 760 761
	enable_irq(host->irq);
}

static inline
D
Denis Karpov 已提交
762
int omap_hsmmc_cover_is_closed(struct omap_hsmmc_host *host)
763 764 765
{
	int r = 1;

766
	if (host->get_cover_state)
767
		r = host->get_cover_state(host->dev);
768 769 770 771
	return r;
}

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

D
Denis Karpov 已提交
778 779
	return sprintf(buf, "%s\n",
			omap_hsmmc_cover_is_closed(host) ? "closed" : "open");
780 781
}

D
Denis Karpov 已提交
782
static DEVICE_ATTR(cover_switch, S_IRUGO, omap_hsmmc_show_cover_switch, NULL);
783 784

static ssize_t
D
Denis Karpov 已提交
785
omap_hsmmc_show_slot_name(struct device *dev, struct device_attribute *attr,
786 787 788
			char *buf)
{
	struct mmc_host *mmc = container_of(dev, struct mmc_host, class_dev);
D
Denis Karpov 已提交
789
	struct omap_hsmmc_host *host = mmc_priv(mmc);
790

791
	return sprintf(buf, "%s\n", mmc_pdata(host)->name);
792 793
}

D
Denis Karpov 已提交
794
static DEVICE_ATTR(slot_name, S_IRUGO, omap_hsmmc_show_slot_name, NULL);
795 796 797 798 799

/*
 * Configure the response type and send the cmd.
 */
static void
D
Denis Karpov 已提交
800
omap_hsmmc_start_command(struct omap_hsmmc_host *host, struct mmc_command *cmd,
801 802 803 804
	struct mmc_data *data)
{
	int cmdreg = 0, resptype = 0, cmdtype = 0;

805
	dev_vdbg(mmc_dev(host->mmc), "%s: CMD%d, argument 0x%08x\n",
806 807 808
		mmc_hostname(host->mmc), cmd->opcode, cmd->arg);
	host->cmd = cmd;

A
Adrian Hunter 已提交
809
	omap_hsmmc_enable_irq(host, cmd);
810

811
	host->response_busy = 0;
812 813 814
	if (cmd->flags & MMC_RSP_PRESENT) {
		if (cmd->flags & MMC_RSP_136)
			resptype = 1;
815 816 817 818
		else if (cmd->flags & MMC_RSP_BUSY) {
			resptype = 3;
			host->response_busy = 1;
		} else
819 820 821 822 823 824 825 826 827 828 829 830 831
			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);

832 833 834 835 836
	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);
	}
837 838 839 840 841 842 843 844 845
	if (data) {
		cmdreg |= DP_SELECT | MSBS | BCE;
		if (data->flags & MMC_DATA_READ)
			cmdreg |= DDIR;
		else
			cmdreg &= ~(DDIR);
	}

	if (host->use_dma)
846
		cmdreg |= DMAE;
847

848
	host->req_in_progress = 1;
849

850 851 852 853
	OMAP_HSMMC_WRITE(host->base, ARG, cmd->arg);
	OMAP_HSMMC_WRITE(host->base, CMD, cmdreg);
}

854
static int
D
Denis Karpov 已提交
855
omap_hsmmc_get_dma_dir(struct omap_hsmmc_host *host, struct mmc_data *data)
856 857 858 859 860 861 862
{
	if (data->flags & MMC_DATA_WRITE)
		return DMA_TO_DEVICE;
	else
		return DMA_FROM_DEVICE;
}

863 864 865 866 867 868
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;
}

869 870 871
static void omap_hsmmc_request_done(struct omap_hsmmc_host *host, struct mmc_request *mrq)
{
	int dma_ch;
872
	unsigned long flags;
873

874
	spin_lock_irqsave(&host->irq_lock, flags);
875 876
	host->req_in_progress = 0;
	dma_ch = host->dma_ch;
877
	spin_unlock_irqrestore(&host->irq_lock, flags);
878 879 880 881 882 883 884 885 886

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

887 888 889 890
/*
 * Notify the transfer complete to MMC core
 */
static void
D
Denis Karpov 已提交
891
omap_hsmmc_xfer_done(struct omap_hsmmc_host *host, struct mmc_data *data)
892
{
893 894 895
	if (!data) {
		struct mmc_request *mrq = host->mrq;

896 897 898 899 900 901 902
		/* 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;
		}

903
		omap_hsmmc_request_done(host, mrq);
904 905 906
		return;
	}

907 908 909 910 911 912 913
	host->data = NULL;

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

B
Balaji T K 已提交
914 915 916
	if (data->stop && (data->error || !host->mrq->sbc))
		omap_hsmmc_start_command(host, data->stop, NULL);
	else
917
		omap_hsmmc_request_done(host, data->mrq);
918 919 920 921 922 923
}

/*
 * Notify the core about command completion
 */
static void
D
Denis Karpov 已提交
924
omap_hsmmc_cmd_done(struct omap_hsmmc_host *host, struct mmc_command *cmd)
925
{
B
Balaji T K 已提交
926
	if (host->mrq->sbc && (host->cmd == host->mrq->sbc) &&
927
	    !host->mrq->sbc->error && !(host->flags & AUTO_CMD23)) {
928
		host->cmd = NULL;
B
Balaji T K 已提交
929 930 931 932 933 934
		omap_hsmmc_start_dma_transfer(host);
		omap_hsmmc_start_command(host, host->mrq->cmd,
						host->mrq->data);
		return;
	}

935 936
	host->cmd = NULL;

937 938 939 940 941 942 943 944 945 946 947 948
	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);
		}
	}
949
	if ((host->data == NULL && !host->response_busy) || cmd->error)
950
		omap_hsmmc_request_done(host, host->mrq);
951 952 953 954 955
}

/*
 * DMA clean up for command errors
 */
D
Denis Karpov 已提交
956
static void omap_hsmmc_dma_cleanup(struct omap_hsmmc_host *host, int errno)
957
{
958
	int dma_ch;
959
	unsigned long flags;
960

961
	host->data->error = errno;
962

963
	spin_lock_irqsave(&host->irq_lock, flags);
964 965
	dma_ch = host->dma_ch;
	host->dma_ch = -1;
966
	spin_unlock_irqrestore(&host->irq_lock, flags);
967 968

	if (host->use_dma && dma_ch != -1) {
969 970 971 972 973
		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 已提交
974
			omap_hsmmc_get_dma_dir(host, host->data));
975

976
		host->data->host_cookie = 0;
977 978 979 980 981 982 983 984
	}
	host->data = NULL;
}

/*
 * Readable error output
 */
#ifdef CONFIG_MMC_DEBUG
985
static void omap_hsmmc_dbg_report_irq(struct omap_hsmmc_host *host, u32 status)
986 987
{
	/* --- means reserved bit without definition at documentation */
D
Denis Karpov 已提交
988
	static const char *omap_hsmmc_status_bits[] = {
989 990 991 992
		"CC"  , "TC"  , "BGE", "---", "BWR" , "BRR" , "---" , "---" ,
		"CIRQ",	"OBI" , "---", "---", "---" , "---" , "---" , "ERRI",
		"CTO" , "CCRC", "CEB", "CIE", "DTO" , "DCRC", "DEB" , "---" ,
		"ACE" , "---" , "---", "---", "CERR", "BADA", "---" , "---"
993 994 995 996 997 998 999 1000
	};
	char res[256];
	char *buf = res;
	int len, i;

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

D
Denis Karpov 已提交
1001
	for (i = 0; i < ARRAY_SIZE(omap_hsmmc_status_bits); i++)
1002
		if (status & (1 << i)) {
D
Denis Karpov 已提交
1003
			len = sprintf(buf, " %s", omap_hsmmc_status_bits[i]);
1004 1005 1006
			buf += len;
		}

1007
	dev_vdbg(mmc_dev(host->mmc), "%s\n", res);
1008
}
1009 1010 1011 1012 1013
#else
static inline void omap_hsmmc_dbg_report_irq(struct omap_hsmmc_host *host,
					     u32 status)
{
}
1014 1015
#endif  /* CONFIG_MMC_DEBUG */

1016 1017 1018 1019 1020 1021 1022
/*
 * 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 已提交
1023 1024
static inline void omap_hsmmc_reset_controller_fsm(struct omap_hsmmc_host *host,
						   unsigned long bit)
1025 1026
{
	unsigned long i = 0;
1027
	unsigned long limit = MMC_TIMEOUT_US;
1028 1029 1030 1031

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

1032 1033 1034 1035
	/*
	 * OMAP4 ES2 and greater has an updated reset logic.
	 * Monitor a 0->1 transition first
	 */
1036
	if (mmc_pdata(host)->features & HSMMC_HAS_UPDATED_RESET) {
1037
		while ((!(OMAP_HSMMC_READ(host->base, SYSCTL) & bit))
1038
					&& (i++ < limit))
1039
			udelay(1);
1040 1041 1042
	}
	i = 0;

1043 1044
	while ((OMAP_HSMMC_READ(host->base, SYSCTL) & bit) &&
		(i++ < limit))
1045
		udelay(1);
1046 1047 1048 1049 1050 1051

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

1053 1054
static void hsmmc_command_incomplete(struct omap_hsmmc_host *host,
					int err, int end_cmd)
1055
{
1056
	if (end_cmd) {
1057
		omap_hsmmc_reset_controller_fsm(host, SRC);
1058 1059 1060
		if (host->cmd)
			host->cmd->error = err;
	}
1061 1062 1063 1064

	if (host->data) {
		omap_hsmmc_reset_controller_fsm(host, SRD);
		omap_hsmmc_dma_cleanup(host, err);
1065 1066
	} else if (host->mrq && host->mrq->cmd)
		host->mrq->cmd->error = err;
1067 1068
}

1069
static void omap_hsmmc_do_irq(struct omap_hsmmc_host *host, int status)
1070 1071
{
	struct mmc_data *data;
1072
	int end_cmd = 0, end_trans = 0;
1073
	int error = 0;
1074

1075
	data = host->data;
1076
	dev_vdbg(mmc_dev(host->mmc), "IRQ Status is %x\n", status);
1077

1078
	if (status & ERR_EN) {
1079
		omap_hsmmc_dbg_report_irq(host, status);
1080

1081
		if (status & (CTO_EN | CCRC_EN))
1082
			end_cmd = 1;
1083
		if (status & (CTO_EN | DTO_EN))
1084
			hsmmc_command_incomplete(host, -ETIMEDOUT, end_cmd);
1085
		else if (status & (CCRC_EN | DCRC_EN))
1086
			hsmmc_command_incomplete(host, -EILSEQ, end_cmd);
1087

1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101
		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);
		}
1102
		if (host->data || host->response_busy) {
1103
			end_trans = !end_cmd;
1104
			host->response_busy = 0;
1105 1106 1107
		}
	}

1108
	OMAP_HSMMC_WRITE(host->base, STAT, status);
1109
	if (end_cmd || ((status & CC_EN) && host->cmd))
D
Denis Karpov 已提交
1110
		omap_hsmmc_cmd_done(host, host->cmd);
1111
	if ((end_trans || (status & TC_EN)) && host->mrq)
D
Denis Karpov 已提交
1112
		omap_hsmmc_xfer_done(host, data);
1113
}
1114

1115 1116 1117 1118 1119 1120 1121 1122 1123
/*
 * 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);
1124 1125 1126 1127 1128 1129
	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);
1130

1131 1132
		/* Flush posted write */
		status = OMAP_HSMMC_READ(host->base, STAT);
1133
	}
1134

1135 1136 1137
	return IRQ_HANDLED;
}

1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153
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 已提交
1154
static void set_sd_bus_power(struct omap_hsmmc_host *host)
A
Adrian Hunter 已提交
1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166
{
	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();
	}
}

1167
/*
1168 1169 1170 1171 1172
 * 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.
1173
 */
D
Denis Karpov 已提交
1174
static int omap_hsmmc_switch_opcond(struct omap_hsmmc_host *host, int vdd)
1175 1176 1177 1178 1179
{
	u32 reg_val = 0;
	int ret;

	/* Disable the clocks */
1180
	pm_runtime_put_sync(host->dev);
1181
	if (host->dbclk)
1182
		clk_disable_unprepare(host->dbclk);
1183 1184

	/* Turn the power off */
1185
	ret = mmc_pdata(host)->set_power(host->dev, 0, 0);
1186 1187

	/* Turn the power ON with given VDD 1.8 or 3.0v */
1188
	if (!ret)
1189
		ret = mmc_pdata(host)->set_power(host->dev, 1, vdd);
1190
	pm_runtime_get_sync(host->dev);
1191
	if (host->dbclk)
1192
		clk_prepare_enable(host->dbclk);
1193

1194 1195 1196 1197 1198 1199
	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);
1200

1201 1202 1203
	/*
	 * 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 已提交
1204
	 * slot, omap_hsmmc_set_ios sets the VDD back to 3V on MMC_POWER_OFF.
1205
	 *
1206 1207 1208 1209 1210 1211 1212 1213 1214
	 * 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.
1215
	 */
1216
	if ((1 << vdd) <= MMC_VDD_23_24)
1217
		reg_val |= SDVS18;
1218 1219
	else
		reg_val |= SDVS30;
1220 1221

	OMAP_HSMMC_WRITE(host->base, HCTL, reg_val);
A
Adrian Hunter 已提交
1222
	set_sd_bus_power(host);
1223 1224 1225

	return 0;
err:
1226
	dev_err(mmc_dev(host->mmc), "Unable to switch operating voltage\n");
1227 1228 1229
	return ret;
}

1230 1231 1232
/* Protect the card while the cover is open */
static void omap_hsmmc_protect_card(struct omap_hsmmc_host *host)
{
1233
	if (!host->get_cover_state)
1234 1235 1236
		return;

	host->reqs_blocked = 0;
1237
	if (host->get_cover_state(host->dev)) {
1238
		if (host->protect_card) {
1239
			dev_info(host->dev, "%s: cover is closed, "
1240 1241 1242 1243 1244 1245
					 "card is now accessible\n",
					 mmc_hostname(host->mmc));
			host->protect_card = 0;
		}
	} else {
		if (!host->protect_card) {
1246
			dev_info(host->dev, "%s: cover is open, "
1247 1248 1249 1250 1251 1252 1253
					 "card is now inaccessible\n",
					 mmc_hostname(host->mmc));
			host->protect_card = 1;
		}
	}
}

1254
/*
1255
 * irq handler to notify the core about card insertion/removal
1256
 */
1257
static irqreturn_t omap_hsmmc_detect(int irq, void *dev_id)
1258
{
1259
	struct omap_hsmmc_host *host = dev_id;
1260 1261 1262
	int carddetect;

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

1264
	if (host->card_detect)
1265
		carddetect = host->card_detect(host->dev);
1266 1267
	else {
		omap_hsmmc_protect_card(host);
1268
		carddetect = -ENOSYS;
1269
	}
1270

1271
	if (carddetect)
1272
		mmc_detect_change(host->mmc, (HZ * 200) / 1000);
1273
	else
1274 1275 1276 1277
		mmc_detect_change(host->mmc, (HZ * 50) / 1000);
	return IRQ_HANDLED;
}

1278
static void omap_hsmmc_dma_callback(void *param)
1279
{
1280 1281
	struct omap_hsmmc_host *host = param;
	struct dma_chan *chan;
1282
	struct mmc_data *data;
1283
	int req_in_progress;
1284

1285
	spin_lock_irq(&host->irq_lock);
1286
	if (host->dma_ch < 0) {
1287
		spin_unlock_irq(&host->irq_lock);
1288
		return;
1289
	}
1290

1291
	data = host->mrq->data;
1292
	chan = omap_hsmmc_get_dma_chan(host, data);
1293
	if (!data->host_cookie)
1294 1295
		dma_unmap_sg(chan->device->dev,
			     data->sg, data->sg_len,
1296
			     omap_hsmmc_get_dma_dir(host, data));
1297 1298

	req_in_progress = host->req_in_progress;
1299
	host->dma_ch = -1;
1300
	spin_unlock_irq(&host->irq_lock);
1301 1302 1303 1304 1305 1306 1307 1308

	/* 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);
	}
1309 1310
}

1311 1312
static int omap_hsmmc_pre_dma_transfer(struct omap_hsmmc_host *host,
				       struct mmc_data *data,
1313
				       struct omap_hsmmc_next *next,
1314
				       struct dma_chan *chan)
1315 1316 1317 1318 1319
{
	int dma_len;

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

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

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

1375
	BUG_ON(host->dma_ch != -1);
1376

1377 1378
	chan = omap_hsmmc_get_dma_chan(host, data);

1379 1380 1381 1382 1383 1384
	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;
1385

1386 1387
	ret = dmaengine_slave_config(chan, &cfg);
	if (ret)
1388
		return ret;
1389

1390
	ret = omap_hsmmc_pre_dma_transfer(host, data, NULL, chan);
1391 1392
	if (ret)
		return ret;
1393

1394 1395 1396 1397 1398 1399 1400 1401
	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;
	}
1402

1403 1404
	tx->callback = omap_hsmmc_dma_callback;
	tx->callback_param = host;
1405

1406 1407
	/* Does not fail */
	dmaengine_submit(tx);
1408

1409
	host->dma_ch = 1;
1410

1411 1412 1413
	return 0;
}

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

1426
	cycle_ns = 1000000000 / (host->clk_rate / clkd);
1427 1428
	timeout = timeout_ns / cycle_ns;
	timeout += timeout_clks;
1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450
	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 已提交
1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465
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);
}

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

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

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

1496 1497 1498 1499 1500 1501
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;

1502
	if (host->use_dma && data->host_cookie) {
1503 1504
		struct dma_chan *c = omap_hsmmc_get_dma_chan(host, data);

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

1521 1522 1523
	if (host->use_dma) {
		struct dma_chan *c = omap_hsmmc_get_dma_chan(host, mrq->data);

1524
		if (omap_hsmmc_pre_dma_transfer(host, mrq->data,
1525
						&host->next_data, c))
1526
			mrq->data->host_cookie = 0;
1527
	}
1528 1529
}

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

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

B
Balaji T K 已提交
1576
	omap_hsmmc_start_dma_transfer(host);
D
Denis Karpov 已提交
1577
	omap_hsmmc_start_command(host, req->cmd, req->data);
1578 1579 1580
}

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

1586
	pm_runtime_get_sync(host->dev);
1587

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

1603 1604
	/* FIXME: set registers based only on changes to ios */

1605
	omap_hsmmc_set_bus_width(host);
1606

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

1625
	omap_hsmmc_set_clock(host);
1626

1627
	if (do_send_init_stream)
1628 1629
		send_init_stream(host);

1630
	omap_hsmmc_set_bus_mode(host);
1631

1632
	pm_runtime_put_autosuspend(host->dev);
1633 1634 1635 1636
}

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

1639
	if (!host->card_detect)
1640
		return -ENOSYS;
1641
	return host->card_detect(host->dev);
1642 1643 1644 1645
}

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

1648
	if (!host->get_ro)
1649
		return -ENOSYS;
1650
	return host->get_ro(host->dev);
1651 1652
}

1653 1654 1655 1656
static void omap_hsmmc_init_card(struct mmc_host *mmc, struct mmc_card *card)
{
	struct omap_hsmmc_host *host = mmc_priv(mmc);

1657 1658
	if (mmc_pdata(host)->init_card)
		mmc_pdata(host)->init_card(card);
1659 1660
}

1661 1662 1663
static void omap_hsmmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
{
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1664
	u32 irq_mask, con;
1665 1666 1667 1668
	unsigned long flags;

	spin_lock_irqsave(&host->irq_lock, flags);

1669
	con = OMAP_HSMMC_READ(host->base, CON);
1670 1671 1672 1673
	irq_mask = OMAP_HSMMC_READ(host->base, ISE);
	if (enable) {
		host->flags |= HSMMC_SDIO_IRQ_ENABLED;
		irq_mask |= CIRQ_EN;
1674
		con |= CTPL | CLKEXTFREE;
1675 1676 1677
	} else {
		host->flags &= ~HSMMC_SDIO_IRQ_ENABLED;
		irq_mask &= ~CIRQ_EN;
1678
		con &= ~(CTPL | CLKEXTFREE);
1679
	}
1680
	OMAP_HSMMC_WRITE(host->base, CON, con);
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 1720 1721 1722 1723 1724
	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) {
1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743
		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);
1744 1745
	}

1746 1747
	OMAP_HSMMC_WRITE(host->base, HCTL,
			 OMAP_HSMMC_READ(host->base, HCTL) | IWE);
1748 1749
	return 0;

1750 1751
err_free_irq:
	devm_free_irq(host->dev, host->wake_irq, host);
1752 1753 1754 1755 1756 1757
err:
	dev_warn(host->dev, "no SDIO IRQ support, falling back to polling\n");
	host->wake_irq = 0;
	return ret;
}

D
Denis Karpov 已提交
1758
static void omap_hsmmc_conf_bus_power(struct omap_hsmmc_host *host)
1759 1760 1761 1762
{
	u32 hctl, capa, value;

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

D
Denis Karpov 已提交
1781
static int omap_hsmmc_enable_fclk(struct mmc_host *mmc)
1782
{
D
Denis Karpov 已提交
1783
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1784

1785 1786
	pm_runtime_get_sync(host->dev);

1787 1788 1789
	return 0;
}

1790
static int omap_hsmmc_disable_fclk(struct mmc_host *mmc)
1791
{
D
Denis Karpov 已提交
1792
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1793

1794 1795 1796
	pm_runtime_mark_last_busy(host->dev);
	pm_runtime_put_autosuspend(host->dev);

1797 1798 1799
	return 0;
}

1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810
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 已提交
1811 1812
	.enable = omap_hsmmc_enable_fclk,
	.disable = omap_hsmmc_disable_fclk,
1813 1814
	.post_req = omap_hsmmc_post_req,
	.pre_req = omap_hsmmc_pre_req,
D
Denis Karpov 已提交
1815 1816
	.request = omap_hsmmc_request,
	.set_ios = omap_hsmmc_set_ios,
1817 1818
	.get_cd = omap_hsmmc_get_cd,
	.get_ro = omap_hsmmc_get_ro,
1819
	.init_card = omap_hsmmc_init_card,
1820
	.enable_sdio_irq = omap_hsmmc_enable_sdio_irq,
1821 1822
};

1823 1824
#ifdef CONFIG_DEBUG_FS

D
Denis Karpov 已提交
1825
static int omap_hsmmc_regs_show(struct seq_file *s, void *data)
1826 1827
{
	struct mmc_host *mmc = s->private;
D
Denis Karpov 已提交
1828
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1829

1830 1831 1832
	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");
1833

1834 1835 1836 1837 1838 1839
	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);
1840

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

1858 1859
	pm_runtime_mark_last_busy(host->dev);
	pm_runtime_put_autosuspend(host->dev);
1860

1861 1862 1863
	return 0;
}

D
Denis Karpov 已提交
1864
static int omap_hsmmc_regs_open(struct inode *inode, struct file *file)
1865
{
D
Denis Karpov 已提交
1866
	return single_open(file, omap_hsmmc_regs_show, inode->i_private);
1867 1868 1869
}

static const struct file_operations mmc_regs_fops = {
D
Denis Karpov 已提交
1870
	.open           = omap_hsmmc_regs_open,
1871 1872 1873 1874 1875
	.read           = seq_read,
	.llseek         = seq_lseek,
	.release        = single_release,
};

D
Denis Karpov 已提交
1876
static void omap_hsmmc_debugfs(struct mmc_host *mmc)
1877 1878 1879 1880 1881 1882 1883 1884
{
	if (mmc->debugfs_root)
		debugfs_create_file("regs", S_IRUSR, mmc->debugfs_root,
			mmc, &mmc_regs_fops);
}

#else

D
Denis Karpov 已提交
1885
static void omap_hsmmc_debugfs(struct mmc_host *mmc)
1886 1887 1888 1889 1890
{
}

#endif

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

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

1928
static struct omap_hsmmc_platform_data *of_get_hsmmc_pdata(struct device *dev)
1929
{
1930
	struct omap_hsmmc_platform_data *pdata;
1931
	struct device_node *np = dev->of_node;
1932
	u32 bus_width, max_freq;
1933 1934 1935 1936 1937 1938
	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);
1939 1940 1941

	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
	if (!pdata)
1942
		return ERR_PTR(-ENOMEM); /* out of memory */
1943 1944 1945 1946

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

1947 1948
	pdata->switch_pin = cd_gpio;
	pdata->gpio_wp = wp_gpio;
1949 1950

	if (of_find_property(np, "ti,non-removable", NULL)) {
1951 1952
		pdata->nonremovable = true;
		pdata->no_regulator_off_init = true;
1953
	}
A
Arnd Bergmann 已提交
1954
	of_property_read_u32(np, "bus-width", &bus_width);
1955
	if (bus_width == 4)
1956
		pdata->caps |= MMC_CAP_4_BIT_DATA;
1957
	else if (bus_width == 8)
1958
		pdata->caps |= MMC_CAP_8_BIT_DATA;
1959 1960

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

1963 1964 1965
	if (!of_property_read_u32(np, "max-frequency", &max_freq))
		pdata->max_freq = max_freq;

1966
	if (of_find_property(np, "ti,needs-special-hs-handling", NULL))
1967
		pdata->features |= HSMMC_HAS_HSPE_SUPPORT;
1968

1969
	if (of_find_property(np, "keep-power-in-suspend", NULL))
1970
		pdata->pm_caps |= MMC_PM_KEEP_POWER;
1971 1972

	if (of_find_property(np, "enable-sdio-wakeup", NULL))
1973
		pdata->pm_caps |= MMC_PM_WAKE_SDIO_IRQ;
1974

1975 1976 1977
	return pdata;
}
#else
1978
static inline struct omap_hsmmc_platform_data
1979 1980
			*of_get_hsmmc_pdata(struct device *dev)
{
1981
	return ERR_PTR(-EINVAL);
1982 1983 1984
}
#endif

B
Bill Pemberton 已提交
1985
static int omap_hsmmc_probe(struct platform_device *pdev)
1986
{
1987
	struct omap_hsmmc_platform_data *pdata = pdev->dev.platform_data;
1988
	struct mmc_host *mmc;
D
Denis Karpov 已提交
1989
	struct omap_hsmmc_host *host = NULL;
1990
	struct resource *res;
1991
	int ret, irq;
1992
	const struct of_device_id *match;
1993 1994
	dma_cap_mask_t mask;
	unsigned tx_req, rx_req;
1995
	const struct omap_mmc_of_data *data;
1996
	void __iomem *base;
1997 1998 1999 2000

	match = of_match_device(of_match_ptr(omap_mmc_of_match), &pdev->dev);
	if (match) {
		pdata = of_get_hsmmc_pdata(&pdev->dev);
2001 2002 2003 2004

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

2005
		if (match->data) {
2006 2007 2008
			data = match->data;
			pdata->reg_offset = data->reg_offset;
			pdata->controller_flags |= data->controller_flags;
2009 2010
		}
	}
2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021

	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;

2022 2023 2024
	base = devm_ioremap_resource(&pdev->dev, res);
	if (IS_ERR(base))
		return PTR_ERR(base);
2025

D
Denis Karpov 已提交
2026
	mmc = mmc_alloc_host(sizeof(struct omap_hsmmc_host), &pdev->dev);
2027 2028
	if (!mmc) {
		ret = -ENOMEM;
2029
		goto err;
2030 2031 2032 2033 2034 2035 2036 2037 2038
	}

	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;
2039
	host->mapbase	= res->start + pdata->reg_offset;
2040
	host->base	= base + pdata->reg_offset;
2041
	host->power_mode = MMC_POWER_OFF;
2042
	host->next_data.cookie = 1;
2043
	host->pbias_enabled = 0;
2044

2045
	ret = omap_hsmmc_gpio_init(mmc, host, pdata);
2046 2047 2048
	if (ret)
		goto err_gpio;

2049 2050
	platform_set_drvdata(pdev, host);

2051 2052 2053
	if (pdev->dev.of_node)
		host->wake_irq = irq_of_parse_and_map(pdev->dev.of_node, 1);

2054
	mmc->ops	= &omap_hsmmc_ops;
2055

2056 2057 2058 2059 2060 2061
	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;
2062

2063
	spin_lock_init(&host->irq_lock);
2064

B
Balaji T K 已提交
2065
	host->fclk = devm_clk_get(&pdev->dev, "fck");
2066 2067 2068 2069 2070 2071
	if (IS_ERR(host->fclk)) {
		ret = PTR_ERR(host->fclk);
		host->fclk = NULL;
		goto err1;
	}

2072 2073
	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");
2074
		omap_hsmmc_ops.multi_io_quirk = omap_hsmmc_multi_io_quirk;
2075
	}
2076

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

2082 2083
	omap_hsmmc_context_save(host);

B
Balaji T K 已提交
2084
	host->dbclk = devm_clk_get(&pdev->dev, "mmchsdb_fck");
2085 2086 2087 2088 2089
	/*
	 * MMC can still work without debounce clock.
	 */
	if (IS_ERR(host->dbclk)) {
		host->dbclk = NULL;
2090
	} else if (clk_prepare_enable(host->dbclk) != 0) {
2091 2092
		dev_warn(mmc_dev(host->mmc), "Failed to enable debounce clk\n");
		host->dbclk = NULL;
2093
	}
2094

2095 2096
	/* Since we do only SG emulation, we can have as many segs
	 * as we want. */
2097
	mmc->max_segs = 1024;
2098

2099 2100 2101 2102 2103
	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;

2104
	mmc->caps |= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
A
Adrian Hunter 已提交
2105
		     MMC_CAP_WAIT_WHILE_BUSY | MMC_CAP_ERASE;
2106

2107
	mmc->caps |= mmc_pdata(host)->caps;
2108
	if (mmc->caps & MMC_CAP_8_BIT_DATA)
2109 2110
		mmc->caps |= MMC_CAP_4_BIT_DATA;

2111
	if (mmc_pdata(host)->nonremovable)
2112 2113
		mmc->caps |= MMC_CAP_NONREMOVABLE;

2114
	mmc->pm_caps = mmc_pdata(host)->pm_caps;
E
Eliad Peller 已提交
2115

D
Denis Karpov 已提交
2116
	omap_hsmmc_conf_bus_power(host);
2117

2118 2119 2120 2121 2122 2123 2124 2125
	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;
2126

2127 2128 2129 2130 2131 2132 2133
		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 已提交
2134
	}
2135

2136 2137 2138
	dma_cap_zero(mask);
	dma_cap_set(DMA_SLAVE, mask);

2139 2140 2141 2142
	host->rx_chan =
		dma_request_slave_channel_compat(mask, omap_dma_filter_fn,
						 &rx_req, &pdev->dev, "rx");

2143 2144
	if (!host->rx_chan) {
		dev_err(mmc_dev(host->mmc), "unable to obtain RX DMA engine channel %u\n", rx_req);
2145
		ret = -ENXIO;
2146 2147 2148
		goto err_irq;
	}

2149 2150 2151 2152
	host->tx_chan =
		dma_request_slave_channel_compat(mask, omap_dma_filter_fn,
						 &tx_req, &pdev->dev, "tx");

2153 2154
	if (!host->tx_chan) {
		dev_err(mmc_dev(host->mmc), "unable to obtain TX DMA engine channel %u\n", tx_req);
2155
		ret = -ENXIO;
2156
		goto err_irq;
2157
	}
2158 2159

	/* Request IRQ for MMC operations */
2160
	ret = devm_request_irq(&pdev->dev, host->irq, omap_hsmmc_irq, 0,
2161 2162
			mmc_hostname(mmc), host);
	if (ret) {
2163
		dev_err(mmc_dev(host->mmc), "Unable to grab HSMMC IRQ\n");
2164 2165 2166
		goto err_irq;
	}

2167
	if (omap_hsmmc_have_reg() && !mmc_pdata(host)->set_power) {
2168 2169
		ret = omap_hsmmc_reg_get(host);
		if (ret)
2170
			goto err_irq;
2171 2172 2173
		host->use_reg = 1;
	}

2174
	mmc->ocr_avail = mmc_pdata(host)->ocr_mask;
2175

2176
	omap_hsmmc_disable_irq(host);
2177

2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189
	/*
	 * 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;

2190 2191
	omap_hsmmc_protect_card(host);

2192 2193
	mmc_add_host(mmc);

2194
	if (mmc_pdata(host)->name != NULL) {
2195 2196 2197 2198
		ret = device_create_file(&mmc->class_dev, &dev_attr_slot_name);
		if (ret < 0)
			goto err_slot_name;
	}
2199
	if (host->card_detect_irq && host->get_cover_state) {
2200 2201 2202
		ret = device_create_file(&mmc->class_dev,
					&dev_attr_cover_switch);
		if (ret < 0)
2203
			goto err_slot_name;
2204 2205
	}

D
Denis Karpov 已提交
2206
	omap_hsmmc_debugfs(mmc);
2207 2208
	pm_runtime_mark_last_busy(host->dev);
	pm_runtime_put_autosuspend(host->dev);
2209

2210 2211 2212 2213
	return 0;

err_slot_name:
	mmc_remove_host(mmc);
2214 2215
	if (host->use_reg)
		omap_hsmmc_reg_put(host);
2216
err_irq:
2217 2218 2219 2220
	if (host->tx_chan)
		dma_release_channel(host->tx_chan);
	if (host->rx_chan)
		dma_release_channel(host->rx_chan);
2221
	pm_runtime_put_sync(host->dev);
2222
	pm_runtime_disable(host->dev);
B
Balaji T K 已提交
2223
	if (host->dbclk)
2224
		clk_disable_unprepare(host->dbclk);
2225
err1:
2226
err_gpio:
2227
	mmc_free_host(mmc);
2228 2229 2230 2231
err:
	return ret;
}

B
Bill Pemberton 已提交
2232
static int omap_hsmmc_remove(struct platform_device *pdev)
2233
{
D
Denis Karpov 已提交
2234
	struct omap_hsmmc_host *host = platform_get_drvdata(pdev);
2235

F
Felipe Balbi 已提交
2236 2237 2238 2239
	pm_runtime_get_sync(host->dev);
	mmc_remove_host(host->mmc);
	if (host->use_reg)
		omap_hsmmc_reg_put(host);
2240

2241 2242 2243 2244 2245
	if (host->tx_chan)
		dma_release_channel(host->tx_chan);
	if (host->rx_chan)
		dma_release_channel(host->rx_chan);

F
Felipe Balbi 已提交
2246 2247
	pm_runtime_put_sync(host->dev);
	pm_runtime_disable(host->dev);
B
Balaji T K 已提交
2248
	if (host->dbclk)
2249
		clk_disable_unprepare(host->dbclk);
2250

2251
	mmc_free_host(host->mmc);
F
Felipe Balbi 已提交
2252

2253 2254 2255 2256
	return 0;
}

#ifdef CONFIG_PM
2257
static int omap_hsmmc_suspend(struct device *dev)
2258
{
F
Felipe Balbi 已提交
2259
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);
2260

F
Felipe Balbi 已提交
2261
	if (!host)
2262 2263
		return 0;

F
Felipe Balbi 已提交
2264
	pm_runtime_get_sync(host->dev);
2265

F
Felipe Balbi 已提交
2266
	if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) {
2267 2268 2269
		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 已提交
2270 2271
		OMAP_HSMMC_WRITE(host->base, HCTL,
				OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP);
2272
	}
F
Felipe Balbi 已提交
2273

2274 2275 2276 2277 2278
	/* 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);

2279
	if (host->dbclk)
2280
		clk_disable_unprepare(host->dbclk);
2281

2282
	pm_runtime_put_sync(host->dev);
2283
	return 0;
2284 2285 2286
}

/* Routine to resume the MMC device */
2287
static int omap_hsmmc_resume(struct device *dev)
2288
{
F
Felipe Balbi 已提交
2289 2290 2291 2292
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);

	if (!host)
		return 0;
2293

F
Felipe Balbi 已提交
2294
	pm_runtime_get_sync(host->dev);
2295

2296
	if (host->dbclk)
2297
		clk_prepare_enable(host->dbclk);
2298

F
Felipe Balbi 已提交
2299 2300
	if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER))
		omap_hsmmc_conf_bus_power(host);
2301

F
Felipe Balbi 已提交
2302
	omap_hsmmc_protect_card(host);
2303

2304 2305 2306 2307
	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 已提交
2308 2309
	pm_runtime_mark_last_busy(host->dev);
	pm_runtime_put_autosuspend(host->dev);
2310
	return 0;
2311 2312 2313
}

#else
D
Denis Karpov 已提交
2314
#define omap_hsmmc_suspend	NULL
2315
#define omap_hsmmc_resume	NULL
2316 2317
#endif

2318 2319 2320
static int omap_hsmmc_runtime_suspend(struct device *dev)
{
	struct omap_hsmmc_host *host;
2321
	unsigned long flags;
2322
	int ret = 0;
2323 2324 2325

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

2328 2329 2330 2331 2332 2333
	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);
2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348

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

2350 2351
		pinctrl_pm_select_idle_state(dev);

2352 2353 2354
		WARN_ON(host->flags & HSMMC_WAKE_IRQ_ENABLED);
		enable_irq(host->wake_irq);
		host->flags |= HSMMC_WAKE_IRQ_ENABLED;
2355 2356
	} else {
		pinctrl_pm_select_idle_state(dev);
2357
	}
2358

2359
abort:
2360
	spin_unlock_irqrestore(&host->irq_lock, flags);
2361
	return ret;
2362 2363 2364 2365 2366
}

static int omap_hsmmc_runtime_resume(struct device *dev)
{
	struct omap_hsmmc_host *host;
2367
	unsigned long flags;
2368 2369 2370

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

2373 2374 2375 2376 2377 2378 2379 2380 2381
	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;
		}

2382 2383 2384
		pinctrl_pm_select_default_state(host->dev);

		/* irq lost, if pinmux incorrect */
2385 2386 2387
		OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
		OMAP_HSMMC_WRITE(host->base, ISE, CIRQ_EN);
		OMAP_HSMMC_WRITE(host->base, IE, CIRQ_EN);
2388 2389
	} else {
		pinctrl_pm_select_default_state(host->dev);
2390 2391
	}
	spin_unlock_irqrestore(&host->irq_lock, flags);
2392 2393 2394
	return 0;
}

2395
static struct dev_pm_ops omap_hsmmc_dev_pm_ops = {
D
Denis Karpov 已提交
2396 2397
	.suspend	= omap_hsmmc_suspend,
	.resume		= omap_hsmmc_resume,
2398 2399
	.runtime_suspend = omap_hsmmc_runtime_suspend,
	.runtime_resume = omap_hsmmc_runtime_resume,
2400 2401 2402
};

static struct platform_driver omap_hsmmc_driver = {
2403
	.probe		= omap_hsmmc_probe,
B
Bill Pemberton 已提交
2404
	.remove		= omap_hsmmc_remove,
2405 2406
	.driver		= {
		.name = DRIVER_NAME,
2407
		.pm = &omap_hsmmc_dev_pm_ops,
2408
		.of_match_table = of_match_ptr(omap_mmc_of_match),
2409 2410 2411
	},
};

2412
module_platform_driver(omap_hsmmc_driver);
2413 2414 2415 2416
MODULE_DESCRIPTION("OMAP High Speed Multimedia Card driver");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:" DRIVER_NAME);
MODULE_AUTHOR("Texas Instruments Inc");