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

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

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

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

887
		omap_hsmmc_request_done(host, mrq);
888 889 890
		return;
	}

891 892 893 894 895 896 897
	host->data = NULL;

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

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

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

919 920
	host->cmd = NULL;

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

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

945
	host->data->error = errno;
946

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1062
	if (status & ERR_EN) {
1063
		omap_hsmmc_dbg_report_irq(host, status);
1064

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

1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085
		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);
		}
1086
		if (host->data || host->response_busy) {
1087
			end_trans = !end_cmd;
1088
			host->response_busy = 0;
1089 1090 1091
		}
	}

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

1099 1100 1101 1102 1103 1104 1105 1106 1107
/*
 * 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);
1108 1109 1110 1111 1112 1113
	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);
1114

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

1119 1120 1121
	return IRQ_HANDLED;
}

1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137
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 已提交
1138
static void set_sd_bus_power(struct omap_hsmmc_host *host)
A
Adrian Hunter 已提交
1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150
{
	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();
	}
}

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

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

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

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

1178 1179 1180 1181 1182 1183
	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);
1184

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

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

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

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

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

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

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

1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269
	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;

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

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

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

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

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

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

	/* 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);
1314 1315
		pm_runtime_mark_last_busy(host->dev);
		pm_runtime_put_autosuspend(host->dev);
1316
	}
1317 1318
}

1319 1320
static int omap_hsmmc_pre_dma_transfer(struct omap_hsmmc_host *host,
				       struct mmc_data *data,
1321
				       struct omap_hsmmc_next *next,
1322
				       struct dma_chan *chan)
1323 1324 1325 1326 1327
{
	int dma_len;

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

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

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

1383
	BUG_ON(host->dma_ch != -1);
1384

1385 1386
	chan = omap_hsmmc_get_dma_chan(host, data);

1387 1388 1389 1390 1391 1392
	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;
1393

1394 1395
	ret = dmaengine_slave_config(chan, &cfg);
	if (ret)
1396
		return ret;
1397

1398
	ret = omap_hsmmc_pre_dma_transfer(host, data, NULL, chan);
1399 1400
	if (ret)
		return ret;
1401

1402 1403 1404 1405 1406 1407 1408 1409
	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;
	}
1410

1411 1412
	tx->callback = omap_hsmmc_dma_callback;
	tx->callback_param = host;
1413

1414 1415
	/* Does not fail */
	dmaengine_submit(tx);
1416

1417
	host->dma_ch = 1;
1418

1419 1420 1421
	return 0;
}

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

1434
	cycle_ns = 1000000000 / (host->clk_rate / clkd);
1435 1436
	timeout = timeout_ns / cycle_ns;
	timeout += timeout_clks;
1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458
	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 已提交
1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473
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);
}

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

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

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

1504 1505 1506 1507 1508 1509
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;

1510
	if (host->use_dma && data->host_cookie) {
1511 1512
		struct dma_chan *c = omap_hsmmc_get_dma_chan(host, data);

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

1529 1530 1531
	if (host->use_dma) {
		struct dma_chan *c = omap_hsmmc_get_dma_chan(host, mrq->data);

1532
		if (omap_hsmmc_pre_dma_transfer(host, mrq->data,
1533
						&host->next_data, c))
1534
			mrq->data->host_cookie = 0;
1535
	}
1536 1537
}

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

1546 1547
	BUG_ON(host->req_in_progress);
	BUG_ON(host->dma_ch != -1);
1548
	pm_runtime_get_sync(host->dev);
1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564
	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);
1565 1566
		pm_runtime_mark_last_busy(host->dev);
		pm_runtime_put_autosuspend(host->dev);
1567 1568 1569
		return;
	} else if (host->reqs_blocked)
		host->reqs_blocked = 0;
1570 1571
	WARN_ON(host->mrq != NULL);
	host->mrq = req;
1572
	host->clk_rate = clk_get_rate(host->fclk);
D
Denis Karpov 已提交
1573
	err = omap_hsmmc_prepare_data(host, req);
1574 1575 1576 1577 1578 1579
	if (err) {
		req->cmd->error = err;
		if (req->data)
			req->data->error = err;
		host->mrq = NULL;
		mmc_request_done(mmc, req);
1580 1581
		pm_runtime_mark_last_busy(host->dev);
		pm_runtime_put_autosuspend(host->dev);
1582 1583
		return;
	}
1584
	if (req->sbc && !(host->flags & AUTO_CMD23)) {
B
Balaji T K 已提交
1585 1586 1587
		omap_hsmmc_start_command(host, req->sbc, NULL);
		return;
	}
1588

B
Balaji T K 已提交
1589
	omap_hsmmc_start_dma_transfer(host);
D
Denis Karpov 已提交
1590
	omap_hsmmc_start_command(host, req->cmd, req->data);
1591 1592 1593
}

/* Routine to configure clock values. Exposed API to core */
D
Denis Karpov 已提交
1594
static void omap_hsmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
1595
{
D
Denis Karpov 已提交
1596
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1597
	int do_send_init_stream = 0;
1598

1599
	pm_runtime_get_sync(host->dev);
1600

1601 1602 1603
	if (ios->power_mode != host->power_mode) {
		switch (ios->power_mode) {
		case MMC_POWER_OFF:
1604
			mmc_pdata(host)->set_power(host->dev, 0, 0);
1605 1606
			break;
		case MMC_POWER_UP:
1607
			mmc_pdata(host)->set_power(host->dev, 1, ios->vdd);
1608 1609 1610 1611 1612 1613
			break;
		case MMC_POWER_ON:
			do_send_init_stream = 1;
			break;
		}
		host->power_mode = ios->power_mode;
1614 1615
	}

1616 1617
	/* FIXME: set registers based only on changes to ios */

1618
	omap_hsmmc_set_bus_width(host);
1619

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

1638
	omap_hsmmc_set_clock(host);
1639

1640
	if (do_send_init_stream)
1641 1642
		send_init_stream(host);

1643
	omap_hsmmc_set_bus_mode(host);
1644

1645
	pm_runtime_put_autosuspend(host->dev);
1646 1647 1648 1649
}

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

1652
	if (!host->card_detect)
1653
		return -ENOSYS;
1654
	return host->card_detect(host->dev);
1655 1656
}

1657 1658 1659 1660
static void omap_hsmmc_init_card(struct mmc_host *mmc, struct mmc_card *card)
{
	struct omap_hsmmc_host *host = mmc_priv(mmc);

1661 1662
	if (mmc_pdata(host)->init_card)
		mmc_pdata(host)->init_card(card);
1663 1664
}

1665 1666 1667
static void omap_hsmmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
{
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1668
	u32 irq_mask, con;
1669 1670 1671 1672
	unsigned long flags;

	spin_lock_irqsave(&host->irq_lock, flags);

1673
	con = OMAP_HSMMC_READ(host->base, CON);
1674 1675 1676 1677
	irq_mask = OMAP_HSMMC_READ(host->base, ISE);
	if (enable) {
		host->flags |= HSMMC_SDIO_IRQ_ENABLED;
		irq_mask |= CIRQ_EN;
1678
		con |= CTPL | CLKEXTFREE;
1679 1680 1681
	} else {
		host->flags &= ~HSMMC_SDIO_IRQ_ENABLED;
		irq_mask &= ~CIRQ_EN;
1682
		con &= ~(CTPL | CLKEXTFREE);
1683
	}
1684
	OMAP_HSMMC_WRITE(host->base, CON, con);
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 1725 1726 1727 1728
	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) {
1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747
		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);
1748 1749
	}

1750 1751
	OMAP_HSMMC_WRITE(host->base, HCTL,
			 OMAP_HSMMC_READ(host->base, HCTL) | IWE);
1752 1753
	return 0;

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

D
Denis Karpov 已提交
1762
static void omap_hsmmc_conf_bus_power(struct omap_hsmmc_host *host)
1763 1764 1765 1766
{
	u32 hctl, capa, value;

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

1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795
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 = {
1796 1797
	.post_req = omap_hsmmc_post_req,
	.pre_req = omap_hsmmc_pre_req,
D
Denis Karpov 已提交
1798 1799
	.request = omap_hsmmc_request,
	.set_ios = omap_hsmmc_set_ios,
1800
	.get_cd = omap_hsmmc_get_cd,
1801
	.get_ro = mmc_gpio_get_ro,
1802
	.init_card = omap_hsmmc_init_card,
1803
	.enable_sdio_irq = omap_hsmmc_enable_sdio_irq,
1804 1805
};

1806 1807
#ifdef CONFIG_DEBUG_FS

D
Denis Karpov 已提交
1808
static int omap_hsmmc_regs_show(struct seq_file *s, void *data)
1809 1810
{
	struct mmc_host *mmc = s->private;
D
Denis Karpov 已提交
1811
	struct omap_hsmmc_host *host = mmc_priv(mmc);
1812

1813 1814 1815
	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");
1816

1817 1818 1819 1820 1821 1822
	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);
1823

1824 1825
	pm_runtime_get_sync(host->dev);
	seq_puts(s, "\nregs:\n");
1826 1827
	seq_printf(s, "CON:\t\t0x%08x\n",
			OMAP_HSMMC_READ(host->base, CON));
1828 1829
	seq_printf(s, "PSTATE:\t\t0x%08x\n",
		   OMAP_HSMMC_READ(host->base, PSTATE));
1830 1831 1832 1833 1834 1835 1836 1837 1838 1839
	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));
1840

1841 1842
	pm_runtime_mark_last_busy(host->dev);
	pm_runtime_put_autosuspend(host->dev);
1843

1844 1845 1846
	return 0;
}

D
Denis Karpov 已提交
1847
static int omap_hsmmc_regs_open(struct inode *inode, struct file *file)
1848
{
D
Denis Karpov 已提交
1849
	return single_open(file, omap_hsmmc_regs_show, inode->i_private);
1850 1851 1852
}

static const struct file_operations mmc_regs_fops = {
D
Denis Karpov 已提交
1853
	.open           = omap_hsmmc_regs_open,
1854 1855 1856 1857 1858
	.read           = seq_read,
	.llseek         = seq_lseek,
	.release        = single_release,
};

D
Denis Karpov 已提交
1859
static void omap_hsmmc_debugfs(struct mmc_host *mmc)
1860 1861 1862 1863 1864 1865 1866 1867
{
	if (mmc->debugfs_root)
		debugfs_create_file("regs", S_IRUSR, mmc->debugfs_root,
			mmc, &mmc_regs_fops);
}

#else

D
Denis Karpov 已提交
1868
static void omap_hsmmc_debugfs(struct mmc_host *mmc)
1869 1870 1871 1872 1873
{
}

#endif

1874
#ifdef CONFIG_OF
1875 1876 1877 1878 1879 1880 1881 1882
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,
};
1883 1884 1885 1886
static const struct omap_mmc_of_data am33xx_mmc_of_data = {
	.reg_offset = 0x100,
	.controller_flags = OMAP_HSMMC_SWAKEUP_MISSING,
};
1887 1888 1889 1890 1891

static const struct of_device_id omap_mmc_of_match[] = {
	{
		.compatible = "ti,omap2-hsmmc",
	},
1892 1893 1894 1895
	{
		.compatible = "ti,omap3-pre-es3-hsmmc",
		.data = &omap3_pre_es3_mmc_of_data,
	},
1896 1897 1898 1899 1900
	{
		.compatible = "ti,omap3-hsmmc",
	},
	{
		.compatible = "ti,omap4-hsmmc",
1901
		.data = &omap4_mmc_of_data,
1902
	},
1903 1904 1905 1906
	{
		.compatible = "ti,am33xx-hsmmc",
		.data = &am33xx_mmc_of_data,
	},
1907
	{},
1908
};
1909 1910
MODULE_DEVICE_TABLE(of, omap_mmc_of_match);

1911
static struct omap_hsmmc_platform_data *of_get_hsmmc_pdata(struct device *dev)
1912
{
1913
	struct omap_hsmmc_platform_data *pdata;
1914 1915 1916 1917
	struct device_node *np = dev->of_node;

	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
	if (!pdata)
1918
		return ERR_PTR(-ENOMEM); /* out of memory */
1919 1920 1921 1922

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

1923 1924
	pdata->switch_pin = -EINVAL;
	pdata->gpio_wp = -EINVAL;
1925 1926

	if (of_find_property(np, "ti,non-removable", NULL)) {
1927 1928
		pdata->nonremovable = true;
		pdata->no_regulator_off_init = true;
1929 1930 1931
	}

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

1934
	if (of_find_property(np, "ti,needs-special-hs-handling", NULL))
1935
		pdata->features |= HSMMC_HAS_HSPE_SUPPORT;
1936

1937 1938 1939
	return pdata;
}
#else
1940
static inline struct omap_hsmmc_platform_data
1941 1942
			*of_get_hsmmc_pdata(struct device *dev)
{
1943
	return ERR_PTR(-EINVAL);
1944 1945 1946
}
#endif

B
Bill Pemberton 已提交
1947
static int omap_hsmmc_probe(struct platform_device *pdev)
1948
{
1949
	struct omap_hsmmc_platform_data *pdata = pdev->dev.platform_data;
1950
	struct mmc_host *mmc;
D
Denis Karpov 已提交
1951
	struct omap_hsmmc_host *host = NULL;
1952
	struct resource *res;
1953
	int ret, irq;
1954
	const struct of_device_id *match;
1955 1956
	dma_cap_mask_t mask;
	unsigned tx_req, rx_req;
1957
	const struct omap_mmc_of_data *data;
1958
	void __iomem *base;
1959 1960 1961 1962

	match = of_match_device(of_match_ptr(omap_mmc_of_match), &pdev->dev);
	if (match) {
		pdata = of_get_hsmmc_pdata(&pdev->dev);
1963 1964 1965 1966

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

1967
		if (match->data) {
1968 1969 1970
			data = match->data;
			pdata->reg_offset = data->reg_offset;
			pdata->controller_flags |= data->controller_flags;
1971 1972
		}
	}
1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983

	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;

1984 1985 1986
	base = devm_ioremap_resource(&pdev->dev, res);
	if (IS_ERR(base))
		return PTR_ERR(base);
1987

D
Denis Karpov 已提交
1988
	mmc = mmc_alloc_host(sizeof(struct omap_hsmmc_host), &pdev->dev);
1989 1990
	if (!mmc) {
		ret = -ENOMEM;
1991
		goto err;
1992 1993
	}

1994 1995 1996 1997
	ret = mmc_of_parse(mmc);
	if (ret)
		goto err1;

1998 1999 2000 2001 2002 2003 2004
	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;
2005
	host->mapbase	= res->start + pdata->reg_offset;
2006
	host->base	= base + pdata->reg_offset;
2007
	host->power_mode = MMC_POWER_OFF;
2008
	host->next_data.cookie = 1;
2009
	host->pbias_enabled = 0;
2010

2011
	ret = omap_hsmmc_gpio_init(mmc, host, pdata);
2012 2013 2014
	if (ret)
		goto err_gpio;

2015 2016
	platform_set_drvdata(pdev, host);

2017 2018 2019
	if (pdev->dev.of_node)
		host->wake_irq = irq_of_parse_and_map(pdev->dev.of_node, 1);

2020
	mmc->ops	= &omap_hsmmc_ops;
2021

2022 2023 2024 2025
	mmc->f_min = OMAP_MMC_MIN_CLOCK;

	if (pdata->max_freq > 0)
		mmc->f_max = pdata->max_freq;
2026
	else if (mmc->f_max == 0)
2027
		mmc->f_max = OMAP_MMC_MAX_CLOCK;
2028

2029
	spin_lock_init(&host->irq_lock);
2030

B
Balaji T K 已提交
2031
	host->fclk = devm_clk_get(&pdev->dev, "fck");
2032 2033 2034 2035 2036 2037
	if (IS_ERR(host->fclk)) {
		ret = PTR_ERR(host->fclk);
		host->fclk = NULL;
		goto err1;
	}

2038 2039
	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");
2040
		omap_hsmmc_ops.multi_io_quirk = omap_hsmmc_multi_io_quirk;
2041
	}
2042

2043 2044 2045 2046
	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);
2047

2048 2049
	omap_hsmmc_context_save(host);

B
Balaji T K 已提交
2050
	host->dbclk = devm_clk_get(&pdev->dev, "mmchsdb_fck");
2051 2052 2053 2054 2055
	/*
	 * MMC can still work without debounce clock.
	 */
	if (IS_ERR(host->dbclk)) {
		host->dbclk = NULL;
2056
	} else if (clk_prepare_enable(host->dbclk) != 0) {
2057 2058
		dev_warn(mmc_dev(host->mmc), "Failed to enable debounce clk\n");
		host->dbclk = NULL;
2059
	}
2060

2061 2062
	/* Since we do only SG emulation, we can have as many segs
	 * as we want. */
2063
	mmc->max_segs = 1024;
2064

2065 2066 2067 2068 2069
	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;

2070
	mmc->caps |= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
A
Adrian Hunter 已提交
2071
		     MMC_CAP_WAIT_WHILE_BUSY | MMC_CAP_ERASE;
2072

2073
	mmc->caps |= mmc_pdata(host)->caps;
2074
	if (mmc->caps & MMC_CAP_8_BIT_DATA)
2075 2076
		mmc->caps |= MMC_CAP_4_BIT_DATA;

2077
	if (mmc_pdata(host)->nonremovable)
2078 2079
		mmc->caps |= MMC_CAP_NONREMOVABLE;

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

D
Denis Karpov 已提交
2082
	omap_hsmmc_conf_bus_power(host);
2083

2084 2085 2086 2087 2088 2089 2090 2091
	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;
2092

2093 2094 2095 2096 2097 2098 2099
		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 已提交
2100
	}
2101

2102 2103 2104
	dma_cap_zero(mask);
	dma_cap_set(DMA_SLAVE, mask);

2105 2106 2107 2108
	host->rx_chan =
		dma_request_slave_channel_compat(mask, omap_dma_filter_fn,
						 &rx_req, &pdev->dev, "rx");

2109 2110
	if (!host->rx_chan) {
		dev_err(mmc_dev(host->mmc), "unable to obtain RX DMA engine channel %u\n", rx_req);
2111
		ret = -ENXIO;
2112 2113 2114
		goto err_irq;
	}

2115 2116 2117 2118
	host->tx_chan =
		dma_request_slave_channel_compat(mask, omap_dma_filter_fn,
						 &tx_req, &pdev->dev, "tx");

2119 2120
	if (!host->tx_chan) {
		dev_err(mmc_dev(host->mmc), "unable to obtain TX DMA engine channel %u\n", tx_req);
2121
		ret = -ENXIO;
2122
		goto err_irq;
2123
	}
2124 2125

	/* Request IRQ for MMC operations */
2126
	ret = devm_request_irq(&pdev->dev, host->irq, omap_hsmmc_irq, 0,
2127 2128
			mmc_hostname(mmc), host);
	if (ret) {
2129
		dev_err(mmc_dev(host->mmc), "Unable to grab HSMMC IRQ\n");
2130 2131 2132
		goto err_irq;
	}

2133
	if (omap_hsmmc_have_reg() && !mmc_pdata(host)->set_power) {
2134 2135
		ret = omap_hsmmc_reg_get(host);
		if (ret)
2136
			goto err_irq;
2137 2138 2139
		host->use_reg = 1;
	}

2140
	mmc->ocr_avail = mmc_pdata(host)->ocr_mask;
2141

2142
	omap_hsmmc_disable_irq(host);
2143

2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155
	/*
	 * 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;

2156 2157
	omap_hsmmc_protect_card(host);

2158 2159
	mmc_add_host(mmc);

2160
	if (mmc_pdata(host)->name != NULL) {
2161 2162 2163 2164
		ret = device_create_file(&mmc->class_dev, &dev_attr_slot_name);
		if (ret < 0)
			goto err_slot_name;
	}
2165
	if (host->get_cover_state) {
2166
		ret = device_create_file(&mmc->class_dev,
2167
					 &dev_attr_cover_switch);
2168
		if (ret < 0)
2169
			goto err_slot_name;
2170 2171
	}

D
Denis Karpov 已提交
2172
	omap_hsmmc_debugfs(mmc);
2173 2174
	pm_runtime_mark_last_busy(host->dev);
	pm_runtime_put_autosuspend(host->dev);
2175

2176 2177 2178 2179
	return 0;

err_slot_name:
	mmc_remove_host(mmc);
2180 2181
	if (host->use_reg)
		omap_hsmmc_reg_put(host);
2182
err_irq:
2183 2184 2185 2186
	if (host->tx_chan)
		dma_release_channel(host->tx_chan);
	if (host->rx_chan)
		dma_release_channel(host->rx_chan);
2187
	pm_runtime_put_sync(host->dev);
2188
	pm_runtime_disable(host->dev);
B
Balaji T K 已提交
2189
	if (host->dbclk)
2190
		clk_disable_unprepare(host->dbclk);
2191
err1:
2192
err_gpio:
2193
	mmc_free_host(mmc);
2194 2195 2196 2197
err:
	return ret;
}

B
Bill Pemberton 已提交
2198
static int omap_hsmmc_remove(struct platform_device *pdev)
2199
{
D
Denis Karpov 已提交
2200
	struct omap_hsmmc_host *host = platform_get_drvdata(pdev);
2201

F
Felipe Balbi 已提交
2202 2203 2204 2205
	pm_runtime_get_sync(host->dev);
	mmc_remove_host(host->mmc);
	if (host->use_reg)
		omap_hsmmc_reg_put(host);
2206

2207 2208 2209 2210 2211
	if (host->tx_chan)
		dma_release_channel(host->tx_chan);
	if (host->rx_chan)
		dma_release_channel(host->rx_chan);

F
Felipe Balbi 已提交
2212 2213
	pm_runtime_put_sync(host->dev);
	pm_runtime_disable(host->dev);
B
Balaji T K 已提交
2214
	if (host->dbclk)
2215
		clk_disable_unprepare(host->dbclk);
2216

2217
	mmc_free_host(host->mmc);
F
Felipe Balbi 已提交
2218

2219 2220 2221
	return 0;
}

2222
#ifdef CONFIG_PM_SLEEP
2223
static int omap_hsmmc_suspend(struct device *dev)
2224
{
F
Felipe Balbi 已提交
2225
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);
2226

F
Felipe Balbi 已提交
2227
	if (!host)
2228 2229
		return 0;

F
Felipe Balbi 已提交
2230
	pm_runtime_get_sync(host->dev);
2231

F
Felipe Balbi 已提交
2232
	if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) {
2233 2234 2235
		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 已提交
2236 2237
		OMAP_HSMMC_WRITE(host->base, HCTL,
				OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP);
2238
	}
F
Felipe Balbi 已提交
2239

2240 2241 2242 2243 2244
	/* 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);

2245
	if (host->dbclk)
2246
		clk_disable_unprepare(host->dbclk);
2247

2248
	pm_runtime_put_sync(host->dev);
2249
	return 0;
2250 2251 2252
}

/* Routine to resume the MMC device */
2253
static int omap_hsmmc_resume(struct device *dev)
2254
{
F
Felipe Balbi 已提交
2255 2256 2257 2258
	struct omap_hsmmc_host *host = dev_get_drvdata(dev);

	if (!host)
		return 0;
2259

F
Felipe Balbi 已提交
2260
	pm_runtime_get_sync(host->dev);
2261

2262
	if (host->dbclk)
2263
		clk_prepare_enable(host->dbclk);
2264

F
Felipe Balbi 已提交
2265 2266
	if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER))
		omap_hsmmc_conf_bus_power(host);
2267

F
Felipe Balbi 已提交
2268
	omap_hsmmc_protect_card(host);
2269

2270 2271 2272 2273
	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 已提交
2274 2275
	pm_runtime_mark_last_busy(host->dev);
	pm_runtime_put_autosuspend(host->dev);
2276
	return 0;
2277 2278 2279
}
#endif

2280 2281 2282
static int omap_hsmmc_runtime_suspend(struct device *dev)
{
	struct omap_hsmmc_host *host;
2283
	unsigned long flags;
2284
	int ret = 0;
2285 2286 2287

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

2290 2291 2292 2293 2294 2295
	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);
2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310

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

2312 2313
		pinctrl_pm_select_idle_state(dev);

2314 2315 2316
		WARN_ON(host->flags & HSMMC_WAKE_IRQ_ENABLED);
		enable_irq(host->wake_irq);
		host->flags |= HSMMC_WAKE_IRQ_ENABLED;
2317 2318
	} else {
		pinctrl_pm_select_idle_state(dev);
2319
	}
2320

2321
abort:
2322
	spin_unlock_irqrestore(&host->irq_lock, flags);
2323
	return ret;
2324 2325 2326 2327 2328
}

static int omap_hsmmc_runtime_resume(struct device *dev)
{
	struct omap_hsmmc_host *host;
2329
	unsigned long flags;
2330 2331 2332

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

2335 2336 2337 2338 2339 2340 2341 2342 2343
	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;
		}

2344 2345 2346
		pinctrl_pm_select_default_state(host->dev);

		/* irq lost, if pinmux incorrect */
2347 2348 2349
		OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
		OMAP_HSMMC_WRITE(host->base, ISE, CIRQ_EN);
		OMAP_HSMMC_WRITE(host->base, IE, CIRQ_EN);
2350 2351
	} else {
		pinctrl_pm_select_default_state(host->dev);
2352 2353
	}
	spin_unlock_irqrestore(&host->irq_lock, flags);
2354 2355 2356
	return 0;
}

2357
static struct dev_pm_ops omap_hsmmc_dev_pm_ops = {
2358
	SET_SYSTEM_SLEEP_PM_OPS(omap_hsmmc_suspend, omap_hsmmc_resume)
2359 2360
	.runtime_suspend = omap_hsmmc_runtime_suspend,
	.runtime_resume = omap_hsmmc_runtime_resume,
2361 2362 2363
};

static struct platform_driver omap_hsmmc_driver = {
2364
	.probe		= omap_hsmmc_probe,
B
Bill Pemberton 已提交
2365
	.remove		= omap_hsmmc_remove,
2366 2367
	.driver		= {
		.name = DRIVER_NAME,
2368
		.pm = &omap_hsmmc_dev_pm_ops,
2369
		.of_match_table = of_match_ptr(omap_mmc_of_match),
2370 2371 2372
	},
};

2373
module_platform_driver(omap_hsmmc_driver);
2374 2375 2376 2377
MODULE_DESCRIPTION("OMAP High Speed Multimedia Card driver");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:" DRIVER_NAME);
MODULE_AUTHOR("Texas Instruments Inc");