omap.c 36.7 KB
Newer Older
C
Carlos Aguiar 已提交
1
/*
P
Pierre Ossman 已提交
2
 *  linux/drivers/mmc/host/omap.c
C
Carlos Aguiar 已提交
3 4
 *
 *  Copyright (C) 2004 Nokia Corporation
A
Al Viro 已提交
5
 *  Written by Tuukka Tikkanen and Juha Yrjölä<juha.yrjola@nokia.com>
C
Carlos Aguiar 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18 19
 *  Misc hacks here and there by Tony Lindgren <tony@atomide.com>
 *  Other hacks (DMA, SD, etc) by David Brownell
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/ioport.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
R
Russell King 已提交
20
#include <linux/dmaengine.h>
C
Carlos Aguiar 已提交
21 22 23 24
#include <linux/dma-mapping.h>
#include <linux/delay.h>
#include <linux/spinlock.h>
#include <linux/timer.h>
25
#include <linux/of.h>
C
Carlos Aguiar 已提交
26 27
#include <linux/mmc/host.h>
#include <linux/mmc/card.h>
J
Jarkko Nikula 已提交
28
#include <linux/mmc/mmc.h>
C
Carlos Aguiar 已提交
29
#include <linux/clk.h>
J
Jens Axboe 已提交
30
#include <linux/scatterlist.h>
31
#include <linux/slab.h>
32
#include <linux/platform_data/mmc-omap.h>
C
Carlos Aguiar 已提交
33 34


35
#define	OMAP_MMC_REG_CMD	0x00
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
#define	OMAP_MMC_REG_ARGL	0x01
#define	OMAP_MMC_REG_ARGH	0x02
#define	OMAP_MMC_REG_CON	0x03
#define	OMAP_MMC_REG_STAT	0x04
#define	OMAP_MMC_REG_IE		0x05
#define	OMAP_MMC_REG_CTO	0x06
#define	OMAP_MMC_REG_DTO	0x07
#define	OMAP_MMC_REG_DATA	0x08
#define	OMAP_MMC_REG_BLEN	0x09
#define	OMAP_MMC_REG_NBLK	0x0a
#define	OMAP_MMC_REG_BUF	0x0b
#define	OMAP_MMC_REG_SDIO	0x0d
#define	OMAP_MMC_REG_REV	0x0f
#define	OMAP_MMC_REG_RSP0	0x10
#define	OMAP_MMC_REG_RSP1	0x11
#define	OMAP_MMC_REG_RSP2	0x12
#define	OMAP_MMC_REG_RSP3	0x13
#define	OMAP_MMC_REG_RSP4	0x14
#define	OMAP_MMC_REG_RSP5	0x15
#define	OMAP_MMC_REG_RSP6	0x16
#define	OMAP_MMC_REG_RSP7	0x17
#define	OMAP_MMC_REG_IOSR	0x18
#define	OMAP_MMC_REG_SYSC	0x19
#define	OMAP_MMC_REG_SYSS	0x1a
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74

#define	OMAP_MMC_STAT_CARD_ERR		(1 << 14)
#define	OMAP_MMC_STAT_CARD_IRQ		(1 << 13)
#define	OMAP_MMC_STAT_OCR_BUSY		(1 << 12)
#define	OMAP_MMC_STAT_A_EMPTY		(1 << 11)
#define	OMAP_MMC_STAT_A_FULL		(1 << 10)
#define	OMAP_MMC_STAT_CMD_CRC		(1 <<  8)
#define	OMAP_MMC_STAT_CMD_TOUT		(1 <<  7)
#define	OMAP_MMC_STAT_DATA_CRC		(1 <<  6)
#define	OMAP_MMC_STAT_DATA_TOUT		(1 <<  5)
#define	OMAP_MMC_STAT_END_BUSY		(1 <<  4)
#define	OMAP_MMC_STAT_END_OF_DATA	(1 <<  3)
#define	OMAP_MMC_STAT_CARD_BUSY		(1 <<  2)
#define	OMAP_MMC_STAT_END_OF_CMD	(1 <<  0)

75 76 77 78 79 80 81
#define mmc_omap7xx()	(host->features & MMC_OMAP7XX)
#define mmc_omap15xx()	(host->features & MMC_OMAP15XX)
#define mmc_omap16xx()	(host->features & MMC_OMAP16XX)
#define MMC_OMAP1_MASK	(MMC_OMAP7XX | MMC_OMAP15XX | MMC_OMAP16XX)
#define mmc_omap1()	(host->features & MMC_OMAP1_MASK)
#define mmc_omap2()	(!mmc_omap1())

82 83 84
#define OMAP_MMC_REG(host, reg)		(OMAP_MMC_REG_##reg << (host)->reg_shift)
#define OMAP_MMC_READ(host, reg)	__raw_readw((host)->virt_base + OMAP_MMC_REG(host, reg))
#define OMAP_MMC_WRITE(host, reg, val)	__raw_writew((val), (host)->virt_base + OMAP_MMC_REG(host, reg))
85 86 87 88 89 90 91 92 93

/*
 * Command types
 */
#define OMAP_MMC_CMDTYPE_BC	0
#define OMAP_MMC_CMDTYPE_BCR	1
#define OMAP_MMC_CMDTYPE_AC	2
#define OMAP_MMC_CMDTYPE_ADTC	3

C
Carlos Aguiar 已提交
94 95 96 97
#define DRIVER_NAME "mmci-omap"

/* Specifies how often in millisecs to poll for card status changes
 * when the cover switch is open */
98
#define OMAP_MMC_COVER_POLL_DELAY	500
C
Carlos Aguiar 已提交
99

100 101 102 103 104 105 106
struct mmc_omap_host;

struct mmc_omap_slot {
	int			id;
	unsigned int		vdd;
	u16			saved_con;
	u16			bus_mode;
107
	u16			power_mode;
108 109
	unsigned int		fclk_freq;

110 111
	struct tasklet_struct	cover_tasklet;
	struct timer_list       cover_timer;
112 113
	unsigned		cover_open;

114 115 116 117 118 119
	struct mmc_request      *mrq;
	struct mmc_omap_host    *host;
	struct mmc_host		*mmc;
	struct omap_mmc_slot_data *pdata;
};

C
Carlos Aguiar 已提交
120 121 122 123 124 125 126 127 128 129
struct mmc_omap_host {
	int			initialized;
	struct mmc_request *	mrq;
	struct mmc_command *	cmd;
	struct mmc_data *	data;
	struct mmc_host *	mmc;
	struct device *		dev;
	unsigned char		id; /* 16xx chips have 2 MMC blocks */
	struct clk *		iclk;
	struct clk *		fclk;
R
Russell King 已提交
130 131 132 133
	struct dma_chan		*dma_rx;
	u32			dma_rx_burst;
	struct dma_chan		*dma_tx;
	u32			dma_tx_burst;
134 135
	void __iomem		*virt_base;
	unsigned int		phys_base;
C
Carlos Aguiar 已提交
136 137
	int			irq;
	unsigned char		bus_mode;
138
	unsigned int		reg_shift;
C
Carlos Aguiar 已提交
139

140 141 142
	struct work_struct	cmd_abort_work;
	unsigned		abort:1;
	struct timer_list	cmd_abort_timer;
J
Jarkko Lavinen 已提交
143

144 145 146 147 148
	struct work_struct      slot_release_work;
	struct mmc_omap_slot    *next_slot;
	struct work_struct      send_stop_work;
	struct mmc_data		*stop_data;

C
Carlos Aguiar 已提交
149 150 151 152 153 154
	unsigned int		sg_len;
	int			sg_idx;
	u16 *			buffer;
	u32			buffer_bytes_left;
	u32			total_bytes_left;

155
	unsigned		features;
C
Carlos Aguiar 已提交
156 157
	unsigned		brs_received:1, dma_done:1;
	unsigned		dma_in_use:1;
R
Russell King 已提交
158
	spinlock_t		dma_lock;
C
Carlos Aguiar 已提交
159

160 161 162 163 164 165
	struct mmc_omap_slot    *slots[OMAP_MMC_MAX_SLOTS];
	struct mmc_omap_slot    *current_slot;
	spinlock_t              slot_lock;
	wait_queue_head_t       slot_wq;
	int                     nr_slots;

J
Jarkko Lavinen 已提交
166 167 168
	struct timer_list       clk_timer;
	spinlock_t		clk_lock;     /* for changing enabled state */
	unsigned int            fclk_enabled:1;
169
	struct workqueue_struct *mmc_omap_wq;
J
Jarkko Lavinen 已提交
170

171
	struct omap_mmc_platform_data *pdata;
C
Carlos Aguiar 已提交
172 173
};

T
Tejun Heo 已提交
174

175
static void mmc_omap_fclk_offdelay(struct mmc_omap_slot *slot)
J
Jarkko Lavinen 已提交
176 177 178 179
{
	unsigned long tick_ns;

	if (slot != NULL && slot->host->fclk_enabled && slot->fclk_freq > 0) {
180
		tick_ns = DIV_ROUND_UP(NSEC_PER_SEC, slot->fclk_freq);
J
Jarkko Lavinen 已提交
181 182 183 184
		ndelay(8 * tick_ns);
	}
}

185
static void mmc_omap_fclk_enable(struct mmc_omap_host *host, unsigned int enable)
J
Jarkko Lavinen 已提交
186 187 188 189 190 191 192 193 194 195 196 197 198 199
{
	unsigned long flags;

	spin_lock_irqsave(&host->clk_lock, flags);
	if (host->fclk_enabled != enable) {
		host->fclk_enabled = enable;
		if (enable)
			clk_enable(host->fclk);
		else
			clk_disable(host->fclk);
	}
	spin_unlock_irqrestore(&host->clk_lock, flags);
}

200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
static void mmc_omap_select_slot(struct mmc_omap_slot *slot, int claimed)
{
	struct mmc_omap_host *host = slot->host;
	unsigned long flags;

	if (claimed)
		goto no_claim;
	spin_lock_irqsave(&host->slot_lock, flags);
	while (host->mmc != NULL) {
		spin_unlock_irqrestore(&host->slot_lock, flags);
		wait_event(host->slot_wq, host->mmc == NULL);
		spin_lock_irqsave(&host->slot_lock, flags);
	}
	host->mmc = slot->mmc;
	spin_unlock_irqrestore(&host->slot_lock, flags);
no_claim:
J
Jarkko Lavinen 已提交
216 217 218 219
	del_timer(&host->clk_timer);
	if (host->current_slot != slot || !claimed)
		mmc_omap_fclk_offdelay(host->current_slot);

220
	if (host->current_slot != slot) {
J
Jarkko Lavinen 已提交
221
		OMAP_MMC_WRITE(host, CON, slot->saved_con & 0xFC00);
222 223 224 225 226
		if (host->pdata->switch_slot != NULL)
			host->pdata->switch_slot(mmc_dev(slot->mmc), slot->id);
		host->current_slot = slot;
	}

J
Jarkko Lavinen 已提交
227 228 229 230 231 232 233
	if (claimed) {
		mmc_omap_fclk_enable(host, 1);

		/* Doing the dummy read here seems to work around some bug
		 * at least in OMAP24xx silicon where the command would not
		 * start after writing the CMD register. Sigh. */
		OMAP_MMC_READ(host, CON);
234

J
Jarkko Lavinen 已提交
235 236 237
		OMAP_MMC_WRITE(host, CON, slot->saved_con);
	} else
		mmc_omap_fclk_enable(host, 0);
238 239 240 241 242
}

static void mmc_omap_start_request(struct mmc_omap_host *host,
				   struct mmc_request *req);

243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
static void mmc_omap_slot_release_work(struct work_struct *work)
{
	struct mmc_omap_host *host = container_of(work, struct mmc_omap_host,
						  slot_release_work);
	struct mmc_omap_slot *next_slot = host->next_slot;
	struct mmc_request *rq;

	host->next_slot = NULL;
	mmc_omap_select_slot(next_slot, 1);

	rq = next_slot->mrq;
	next_slot->mrq = NULL;
	mmc_omap_start_request(host, rq);
}

J
Jarkko Lavinen 已提交
258
static void mmc_omap_release_slot(struct mmc_omap_slot *slot, int clk_enabled)
259 260 261 262 263 264
{
	struct mmc_omap_host *host = slot->host;
	unsigned long flags;
	int i;

	BUG_ON(slot == NULL || host->mmc == NULL);
J
Jarkko Lavinen 已提交
265 266 267 268 269 270 271 272 273

	if (clk_enabled)
		/* Keeps clock running for at least 8 cycles on valid freq */
		mod_timer(&host->clk_timer, jiffies  + HZ/10);
	else {
		del_timer(&host->clk_timer);
		mmc_omap_fclk_offdelay(slot);
		mmc_omap_fclk_enable(host, 0);
	}
274 275 276 277 278 279 280 281 282

	spin_lock_irqsave(&host->slot_lock, flags);
	/* Check for any pending requests */
	for (i = 0; i < host->nr_slots; i++) {
		struct mmc_omap_slot *new_slot;

		if (host->slots[i] == NULL || host->slots[i]->mrq == NULL)
			continue;

283
		BUG_ON(host->next_slot != NULL);
284 285 286 287
		new_slot = host->slots[i];
		/* The current slot should not have a request in queue */
		BUG_ON(new_slot == host->current_slot);

288
		host->next_slot = new_slot;
289 290
		host->mmc = new_slot->mmc;
		spin_unlock_irqrestore(&host->slot_lock, flags);
291
		queue_work(host->mmc_omap_wq, &host->slot_release_work);
292 293 294 295 296 297 298 299
		return;
	}

	host->mmc = NULL;
	wake_up(&host->slot_wq);
	spin_unlock_irqrestore(&host->slot_lock, flags);
}

300 301 302
static inline
int mmc_omap_cover_is_open(struct mmc_omap_slot *slot)
{
303 304 305 306
	if (slot->pdata->get_cover_state)
		return slot->pdata->get_cover_state(mmc_dev(slot->mmc),
						    slot->id);
	return 0;
307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
}

static ssize_t
mmc_omap_show_cover_switch(struct device *dev, struct device_attribute *attr,
			   char *buf)
{
	struct mmc_host *mmc = container_of(dev, struct mmc_host, class_dev);
	struct mmc_omap_slot *slot = mmc_priv(mmc);

	return sprintf(buf, "%s\n", mmc_omap_cover_is_open(slot) ? "open" :
		       "closed");
}

static DEVICE_ATTR(cover_switch, S_IRUGO, mmc_omap_show_cover_switch, NULL);

322 323 324 325 326 327 328 329 330 331 332 333
static ssize_t
mmc_omap_show_slot_name(struct device *dev, struct device_attribute *attr,
			char *buf)
{
	struct mmc_host *mmc = container_of(dev, struct mmc_host, class_dev);
	struct mmc_omap_slot *slot = mmc_priv(mmc);

	return sprintf(buf, "%s\n", slot->pdata->name);
}

static DEVICE_ATTR(slot_name, S_IRUGO, mmc_omap_show_slot_name, NULL);

C
Carlos Aguiar 已提交
334 335 336 337 338 339
static void
mmc_omap_start_command(struct mmc_omap_host *host, struct mmc_command *cmd)
{
	u32 cmdreg;
	u32 resptype;
	u32 cmdtype;
J
Jarkko Nikula 已提交
340
	u16 irq_mask;
C
Carlos Aguiar 已提交
341 342 343 344 345 346 347

	host->cmd = cmd;

	resptype = 0;
	cmdtype = 0;

	/* Our hardware needs to know exact type */
348 349 350 351 352
	switch (mmc_resp_type(cmd)) {
	case MMC_RSP_NONE:
		break;
	case MMC_RSP_R1:
	case MMC_RSP_R1B:
P
Philip Langdale 已提交
353
		/* resp 1, 1b, 6, 7 */
C
Carlos Aguiar 已提交
354 355
		resptype = 1;
		break;
356
	case MMC_RSP_R2:
C
Carlos Aguiar 已提交
357 358
		resptype = 2;
		break;
359
	case MMC_RSP_R3:
C
Carlos Aguiar 已提交
360 361 362
		resptype = 3;
		break;
	default:
363
		dev_err(mmc_dev(host->mmc), "Invalid response type: %04x\n", mmc_resp_type(cmd));
C
Carlos Aguiar 已提交
364 365 366 367 368 369 370 371 372 373 374 375 376 377 378
		break;
	}

	if (mmc_cmd_type(cmd) == MMC_CMD_ADTC) {
		cmdtype = OMAP_MMC_CMDTYPE_ADTC;
	} else if (mmc_cmd_type(cmd) == MMC_CMD_BC) {
		cmdtype = OMAP_MMC_CMDTYPE_BC;
	} else if (mmc_cmd_type(cmd) == MMC_CMD_BCR) {
		cmdtype = OMAP_MMC_CMDTYPE_BCR;
	} else {
		cmdtype = OMAP_MMC_CMDTYPE_AC;
	}

	cmdreg = cmd->opcode | (resptype << 8) | (cmdtype << 12);

379
	if (host->current_slot->bus_mode == MMC_BUSMODE_OPENDRAIN)
C
Carlos Aguiar 已提交
380 381 382 383 384 385 386 387
		cmdreg |= 1 << 6;

	if (cmd->flags & MMC_RSP_BUSY)
		cmdreg |= 1 << 11;

	if (host->data && !(host->data->flags & MMC_DATA_WRITE))
		cmdreg |= 1 << 15;

388
	mod_timer(&host->cmd_abort_timer, jiffies + HZ/2);
J
Jarkko Lavinen 已提交
389

390 391 392
	OMAP_MMC_WRITE(host, CTO, 200);
	OMAP_MMC_WRITE(host, ARGL, cmd->arg & 0xffff);
	OMAP_MMC_WRITE(host, ARGH, cmd->arg >> 16);
J
Jarkko Nikula 已提交
393 394 395 396 397 398 399 400
	irq_mask = OMAP_MMC_STAT_A_EMPTY    | OMAP_MMC_STAT_A_FULL    |
		   OMAP_MMC_STAT_CMD_CRC    | OMAP_MMC_STAT_CMD_TOUT  |
		   OMAP_MMC_STAT_DATA_CRC   | OMAP_MMC_STAT_DATA_TOUT |
		   OMAP_MMC_STAT_END_OF_CMD | OMAP_MMC_STAT_CARD_ERR  |
		   OMAP_MMC_STAT_END_OF_DATA;
	if (cmd->opcode == MMC_ERASE)
		irq_mask &= ~OMAP_MMC_STAT_DATA_TOUT;
	OMAP_MMC_WRITE(host, IE, irq_mask);
401
	OMAP_MMC_WRITE(host, CMD, cmdreg);
C
Carlos Aguiar 已提交
402 403
}

404 405 406 407 408
static void
mmc_omap_release_dma(struct mmc_omap_host *host, struct mmc_data *data,
		     int abort)
{
	enum dma_data_direction dma_data_dir;
R
Russell King 已提交
409 410
	struct device *dev = mmc_dev(host->mmc);
	struct dma_chan *c;
411

R
Russell King 已提交
412
	if (data->flags & MMC_DATA_WRITE) {
413
		dma_data_dir = DMA_TO_DEVICE;
R
Russell King 已提交
414 415
		c = host->dma_tx;
	} else {
416
		dma_data_dir = DMA_FROM_DEVICE;
R
Russell King 已提交
417 418 419 420 421 422 423 424 425 426 427
		c = host->dma_rx;
	}
	if (c) {
		if (data->error) {
			dmaengine_terminate_all(c);
			/* Claim nothing transferred on error... */
			data->bytes_xfered = 0;
		}
		dev = c->device->dev;
	}
	dma_unmap_sg(dev, data->sg, host->sg_len, dma_data_dir);
428 429
}

430 431 432 433 434 435 436 437
static void mmc_omap_send_stop_work(struct work_struct *work)
{
	struct mmc_omap_host *host = container_of(work, struct mmc_omap_host,
						  send_stop_work);
	struct mmc_omap_slot *slot = host->current_slot;
	struct mmc_data *data = host->stop_data;
	unsigned long tick_ns;

438
	tick_ns = DIV_ROUND_UP(NSEC_PER_SEC, slot->fclk_freq);
439 440 441 442 443
	ndelay(8*tick_ns);

	mmc_omap_start_command(host, data->stop);
}

C
Carlos Aguiar 已提交
444 445 446
static void
mmc_omap_xfer_done(struct mmc_omap_host *host, struct mmc_data *data)
{
447 448 449
	if (host->dma_in_use)
		mmc_omap_release_dma(host, data, data->error);

C
Carlos Aguiar 已提交
450 451 452 453 454 455 456 457 458
	host->data = NULL;
	host->sg_len = 0;

	/* NOTE:  MMC layer will sometimes poll-wait CMD13 next, issuing
	 * dozens of requests until the card finishes writing data.
	 * It'd be cheaper to just wait till an EOFB interrupt arrives...
	 */

	if (!data->stop) {
459 460
		struct mmc_host *mmc;

C
Carlos Aguiar 已提交
461
		host->mrq = NULL;
462
		mmc = host->mmc;
J
Jarkko Lavinen 已提交
463
		mmc_omap_release_slot(host->current_slot, 1);
464
		mmc_request_done(mmc, data->mrq);
C
Carlos Aguiar 已提交
465 466 467
		return;
	}

468
	host->stop_data = data;
469
	queue_work(host->mmc_omap_wq, &host->send_stop_work);
C
Carlos Aguiar 已提交
470 471
}

J
Jarkko Lavinen 已提交
472
static void
473
mmc_omap_send_abort(struct mmc_omap_host *host, int maxloops)
J
Jarkko Lavinen 已提交
474 475 476 477 478 479
{
	struct mmc_omap_slot *slot = host->current_slot;
	unsigned int restarts, passes, timeout;
	u16 stat = 0;

	/* Sending abort takes 80 clocks. Have some extra and round up */
480
	timeout = DIV_ROUND_UP(120 * USEC_PER_SEC, slot->fclk_freq);
J
Jarkko Lavinen 已提交
481
	restarts = 0;
482
	while (restarts < maxloops) {
J
Jarkko Lavinen 已提交
483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500
		OMAP_MMC_WRITE(host, STAT, 0xFFFF);
		OMAP_MMC_WRITE(host, CMD, (3 << 12) | (1 << 7));

		passes = 0;
		while (passes < timeout) {
			stat = OMAP_MMC_READ(host, STAT);
			if (stat & OMAP_MMC_STAT_END_OF_CMD)
				goto out;
			udelay(1);
			passes++;
		}

		restarts++;
	}
out:
	OMAP_MMC_WRITE(host, STAT, stat);
}

501 502 503 504 505 506 507 508 509
static void
mmc_omap_abort_xfer(struct mmc_omap_host *host, struct mmc_data *data)
{
	if (host->dma_in_use)
		mmc_omap_release_dma(host, data, 1);

	host->data = NULL;
	host->sg_len = 0;

510
	mmc_omap_send_abort(host, 10000);
511 512
}

C
Carlos Aguiar 已提交
513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555
static void
mmc_omap_end_of_data(struct mmc_omap_host *host, struct mmc_data *data)
{
	unsigned long flags;
	int done;

	if (!host->dma_in_use) {
		mmc_omap_xfer_done(host, data);
		return;
	}
	done = 0;
	spin_lock_irqsave(&host->dma_lock, flags);
	if (host->dma_done)
		done = 1;
	else
		host->brs_received = 1;
	spin_unlock_irqrestore(&host->dma_lock, flags);
	if (done)
		mmc_omap_xfer_done(host, data);
}

static void
mmc_omap_dma_done(struct mmc_omap_host *host, struct mmc_data *data)
{
	unsigned long flags;
	int done;

	done = 0;
	spin_lock_irqsave(&host->dma_lock, flags);
	if (host->brs_received)
		done = 1;
	else
		host->dma_done = 1;
	spin_unlock_irqrestore(&host->dma_lock, flags);
	if (done)
		mmc_omap_xfer_done(host, data);
}

static void
mmc_omap_cmd_done(struct mmc_omap_host *host, struct mmc_command *cmd)
{
	host->cmd = NULL;

556
	del_timer(&host->cmd_abort_timer);
J
Jarkko Lavinen 已提交
557

C
Carlos Aguiar 已提交
558 559 560 561
	if (cmd->flags & MMC_RSP_PRESENT) {
		if (cmd->flags & MMC_RSP_136) {
			/* response type 2 */
			cmd->resp[3] =
562 563
				OMAP_MMC_READ(host, RSP0) |
				(OMAP_MMC_READ(host, RSP1) << 16);
C
Carlos Aguiar 已提交
564
			cmd->resp[2] =
565 566
				OMAP_MMC_READ(host, RSP2) |
				(OMAP_MMC_READ(host, RSP3) << 16);
C
Carlos Aguiar 已提交
567
			cmd->resp[1] =
568 569
				OMAP_MMC_READ(host, RSP4) |
				(OMAP_MMC_READ(host, RSP5) << 16);
C
Carlos Aguiar 已提交
570
			cmd->resp[0] =
571 572
				OMAP_MMC_READ(host, RSP6) |
				(OMAP_MMC_READ(host, RSP7) << 16);
C
Carlos Aguiar 已提交
573 574 575
		} else {
			/* response types 1, 1b, 3, 4, 5, 6 */
			cmd->resp[0] =
576 577
				OMAP_MMC_READ(host, RSP6) |
				(OMAP_MMC_READ(host, RSP7) << 16);
C
Carlos Aguiar 已提交
578 579 580
		}
	}

P
Pierre Ossman 已提交
581
	if (host->data == NULL || cmd->error) {
582 583 584 585
		struct mmc_host *mmc;

		if (host->data != NULL)
			mmc_omap_abort_xfer(host, host->data);
C
Carlos Aguiar 已提交
586
		host->mrq = NULL;
587
		mmc = host->mmc;
J
Jarkko Lavinen 已提交
588
		mmc_omap_release_slot(host->current_slot, 1);
589
		mmc_request_done(mmc, cmd->mrq);
C
Carlos Aguiar 已提交
590 591 592
	}
}

J
Jarkko Lavinen 已提交
593 594 595 596 597 598 599
/*
 * Abort stuck command. Can occur when card is removed while it is being
 * read.
 */
static void mmc_omap_abort_command(struct work_struct *work)
{
	struct mmc_omap_host *host = container_of(work, struct mmc_omap_host,
600 601
						  cmd_abort_work);
	BUG_ON(!host->cmd);
J
Jarkko Lavinen 已提交
602 603 604 605

	dev_dbg(mmc_dev(host->mmc), "Aborting stuck command CMD%d\n",
		host->cmd->opcode);

606 607
	if (host->cmd->error == 0)
		host->cmd->error = -ETIMEDOUT;
J
Jarkko Lavinen 已提交
608

609 610 611 612 613 614 615 616 617 618
	if (host->data == NULL) {
		struct mmc_command *cmd;
		struct mmc_host    *mmc;

		cmd = host->cmd;
		host->cmd = NULL;
		mmc_omap_send_abort(host, 10000);

		host->mrq = NULL;
		mmc = host->mmc;
J
Jarkko Lavinen 已提交
619
		mmc_omap_release_slot(host->current_slot, 1);
620 621 622
		mmc_request_done(mmc, cmd->mrq);
	} else
		mmc_omap_cmd_done(host, host->cmd);
J
Jarkko Lavinen 已提交
623

624 625
	host->abort = 0;
	enable_irq(host->irq);
J
Jarkko Lavinen 已提交
626 627 628
}

static void
629
mmc_omap_cmd_timer(struct timer_list *t)
J
Jarkko Lavinen 已提交
630
{
631
	struct mmc_omap_host *host = from_timer(host, t, cmd_abort_timer);
632
	unsigned long flags;
J
Jarkko Lavinen 已提交
633

634 635 636 637 638
	spin_lock_irqsave(&host->slot_lock, flags);
	if (host->cmd != NULL && !host->abort) {
		OMAP_MMC_WRITE(host, IE, 0);
		disable_irq(host->irq);
		host->abort = 1;
639
		queue_work(host->mmc_omap_wq, &host->cmd_abort_work);
640 641
	}
	spin_unlock_irqrestore(&host->slot_lock, flags);
J
Jarkko Lavinen 已提交
642 643
}

C
Carlos Aguiar 已提交
644 645 646 647 648 649 650 651
/* PIO only */
static void
mmc_omap_sg_to_buf(struct mmc_omap_host *host)
{
	struct scatterlist *sg;

	sg = host->data->sg + host->sg_idx;
	host->buffer_bytes_left = sg->length;
J
Jens Axboe 已提交
652
	host->buffer = sg_virt(sg);
C
Carlos Aguiar 已提交
653 654 655 656
	if (host->buffer_bytes_left > host->total_bytes_left)
		host->buffer_bytes_left = host->total_bytes_left;
}

J
Jarkko Lavinen 已提交
657
static void
658
mmc_omap_clk_timer(struct timer_list *t)
J
Jarkko Lavinen 已提交
659
{
660
	struct mmc_omap_host *host = from_timer(host, t, clk_timer);
J
Jarkko Lavinen 已提交
661 662 663 664

	mmc_omap_fclk_enable(host, 0);
}

C
Carlos Aguiar 已提交
665 666 667 668
/* PIO only */
static void
mmc_omap_xfer_data(struct mmc_omap_host *host, int write)
{
P
Paul Walmsley 已提交
669
	int n, nwords;
C
Carlos Aguiar 已提交
670 671 672 673 674 675 676 677 678

	if (host->buffer_bytes_left == 0) {
		host->sg_idx++;
		BUG_ON(host->sg_idx == host->sg_len);
		mmc_omap_sg_to_buf(host);
	}
	n = 64;
	if (n > host->buffer_bytes_left)
		n = host->buffer_bytes_left;
P
Paul Walmsley 已提交
679

680 681
	/* Round up to handle odd number of bytes to transfer */
	nwords = DIV_ROUND_UP(n, 2);
P
Paul Walmsley 已提交
682

C
Carlos Aguiar 已提交
683 684 685 686 687
	host->buffer_bytes_left -= n;
	host->total_bytes_left -= n;
	host->data->bytes_xfered += n;

	if (write) {
P
Paul Walmsley 已提交
688 689
		__raw_writesw(host->virt_base + OMAP_MMC_REG(host, DATA),
			      host->buffer, nwords);
C
Carlos Aguiar 已提交
690
	} else {
P
Paul Walmsley 已提交
691 692
		__raw_readsw(host->virt_base + OMAP_MMC_REG(host, DATA),
			     host->buffer, nwords);
C
Carlos Aguiar 已提交
693
	}
P
Paul Walmsley 已提交
694 695

	host->buffer += nwords;
C
Carlos Aguiar 已提交
696 697
}

698 699
#ifdef CONFIG_MMC_DEBUG
static void mmc_omap_report_irq(struct mmc_omap_host *host, u16 status)
C
Carlos Aguiar 已提交
700 701 702 703 704
{
	static const char *mmc_omap_status_bits[] = {
		"EOC", "CD", "CB", "BRS", "EOFB", "DTO", "DCRC", "CTO",
		"CCRC", "CRW", "AF", "AE", "OCRB", "CIRQ", "CERR"
	};
705 706 707 708
	int i;
	char res[64], *buf = res;

	buf += sprintf(buf, "MMC IRQ 0x%x:", status);
C
Carlos Aguiar 已提交
709 710

	for (i = 0; i < ARRAY_SIZE(mmc_omap_status_bits); i++)
711 712 713 714 715 716 717
		if (status & (1 << i))
			buf += sprintf(buf, " %s", mmc_omap_status_bits[i]);
	dev_vdbg(mmc_dev(host->mmc), "%s\n", res);
}
#else
static void mmc_omap_report_irq(struct mmc_omap_host *host, u16 status)
{
C
Carlos Aguiar 已提交
718
}
719 720
#endif

C
Carlos Aguiar 已提交
721

722
static irqreturn_t mmc_omap_irq(int irq, void *dev_id)
C
Carlos Aguiar 已提交
723 724 725 726 727
{
	struct mmc_omap_host * host = (struct mmc_omap_host *)dev_id;
	u16 status;
	int end_command;
	int end_transfer;
728
	int transfer_error, cmd_error;
C
Carlos Aguiar 已提交
729 730

	if (host->cmd == NULL && host->data == NULL) {
731
		status = OMAP_MMC_READ(host, STAT);
732 733
		dev_info(mmc_dev(host->slots[0]->mmc),
			 "Spurious IRQ 0x%04x\n", status);
C
Carlos Aguiar 已提交
734
		if (status != 0) {
735 736
			OMAP_MMC_WRITE(host, STAT, status);
			OMAP_MMC_WRITE(host, IE, 0);
C
Carlos Aguiar 已提交
737 738 739 740 741 742 743
		}
		return IRQ_HANDLED;
	}

	end_command = 0;
	end_transfer = 0;
	transfer_error = 0;
744
	cmd_error = 0;
C
Carlos Aguiar 已提交
745

746
	while ((status = OMAP_MMC_READ(host, STAT)) != 0) {
747 748
		int cmd;

749
		OMAP_MMC_WRITE(host, STAT, status);
750 751 752 753
		if (host->cmd != NULL)
			cmd = host->cmd->opcode;
		else
			cmd = -1;
C
Carlos Aguiar 已提交
754
		dev_dbg(mmc_dev(host->mmc), "MMC IRQ %04x (CMD %d): ",
755
			status, cmd);
756 757
		mmc_omap_report_irq(host, status);

C
Carlos Aguiar 已提交
758 759 760 761 762 763 764 765
		if (host->total_bytes_left) {
			if ((status & OMAP_MMC_STAT_A_FULL) ||
			    (status & OMAP_MMC_STAT_END_OF_DATA))
				mmc_omap_xfer_data(host, 0);
			if (status & OMAP_MMC_STAT_A_EMPTY)
				mmc_omap_xfer_data(host, 1);
		}

766
		if (status & OMAP_MMC_STAT_END_OF_DATA)
C
Carlos Aguiar 已提交
767 768 769
			end_transfer = 1;

		if (status & OMAP_MMC_STAT_DATA_TOUT) {
770 771
			dev_dbg(mmc_dev(host->mmc), "data timeout (CMD%d)\n",
				cmd);
C
Carlos Aguiar 已提交
772
			if (host->data) {
P
Pierre Ossman 已提交
773
				host->data->error = -ETIMEDOUT;
C
Carlos Aguiar 已提交
774 775 776 777 778 779
				transfer_error = 1;
			}
		}

		if (status & OMAP_MMC_STAT_DATA_CRC) {
			if (host->data) {
P
Pierre Ossman 已提交
780
				host->data->error = -EILSEQ;
C
Carlos Aguiar 已提交
781 782 783 784 785 786 787 788 789 790 791 792
				dev_dbg(mmc_dev(host->mmc),
					 "data CRC error, bytes left %d\n",
					host->total_bytes_left);
				transfer_error = 1;
			} else {
				dev_dbg(mmc_dev(host->mmc), "data CRC error\n");
			}
		}

		if (status & OMAP_MMC_STAT_CMD_TOUT) {
			/* Timeouts are routine with some commands */
			if (host->cmd) {
793 794
				struct mmc_omap_slot *slot =
					host->current_slot;
795 796
				if (slot == NULL ||
				    !mmc_omap_cover_is_open(slot))
797
					dev_err(mmc_dev(host->mmc),
798 799
						"command timeout (CMD%d)\n",
						cmd);
P
Pierre Ossman 已提交
800
				host->cmd->error = -ETIMEDOUT;
C
Carlos Aguiar 已提交
801
				end_command = 1;
802
				cmd_error = 1;
C
Carlos Aguiar 已提交
803 804 805 806 807 808 809
			}
		}

		if (status & OMAP_MMC_STAT_CMD_CRC) {
			if (host->cmd) {
				dev_err(mmc_dev(host->mmc),
					"command CRC error (CMD%d, arg 0x%08x)\n",
810
					cmd, host->cmd->arg);
P
Pierre Ossman 已提交
811
				host->cmd->error = -EILSEQ;
C
Carlos Aguiar 已提交
812
				end_command = 1;
813
				cmd_error = 1;
C
Carlos Aguiar 已提交
814 815 816 817 818 819
			} else
				dev_err(mmc_dev(host->mmc),
					"command CRC error without cmd?\n");
		}

		if (status & OMAP_MMC_STAT_CARD_ERR) {
820 821
			dev_dbg(mmc_dev(host->mmc),
				"ignoring card status error (CMD%d)\n",
822
				cmd);
823
			end_command = 1;
C
Carlos Aguiar 已提交
824 825 826 827
		}

		/*
		 * NOTE: On 1610 the END_OF_CMD may come too early when
828
		 * starting a write
C
Carlos Aguiar 已提交
829 830 831 832 833 834 835
		 */
		if ((status & OMAP_MMC_STAT_END_OF_CMD) &&
		    (!(status & OMAP_MMC_STAT_A_EMPTY))) {
			end_command = 1;
		}
	}

836 837 838 839
	if (cmd_error && host->data) {
		del_timer(&host->cmd_abort_timer);
		host->abort = 1;
		OMAP_MMC_WRITE(host, IE, 0);
840
		disable_irq_nosync(host->irq);
841
		queue_work(host->mmc_omap_wq, &host->cmd_abort_work);
842 843 844
		return IRQ_HANDLED;
	}

845
	if (end_command && host->cmd)
C
Carlos Aguiar 已提交
846
		mmc_omap_cmd_done(host, host->cmd);
847 848 849 850 851
	if (host->data != NULL) {
		if (transfer_error)
			mmc_omap_xfer_done(host, host->data);
		else if (end_transfer)
			mmc_omap_end_of_data(host, host->data);
C
Carlos Aguiar 已提交
852 853 854 855 856
	}

	return IRQ_HANDLED;
}

857
void omap_mmc_notify_cover_event(struct device *dev, int num, int is_closed)
858
{
859
	int cover_open;
860
	struct mmc_omap_host *host = dev_get_drvdata(dev);
861
	struct mmc_omap_slot *slot = host->slots[num];
862

863
	BUG_ON(num >= host->nr_slots);
864 865

	/* Other subsystems can call in here before we're initialised. */
866
	if (host->nr_slots == 0 || !host->slots[num])
867 868
		return;

869 870 871 872 873 874 875
	cover_open = mmc_omap_cover_is_open(slot);
	if (cover_open != slot->cover_open) {
		slot->cover_open = cover_open;
		sysfs_notify(&slot->mmc->class_dev.kobj, NULL, "cover_switch");
	}

	tasklet_hi_schedule(&slot->cover_tasklet);
876 877
}

878
static void mmc_omap_cover_timer(struct timer_list *t)
879
{
880
	struct mmc_omap_slot *slot = from_timer(slot, t, cover_timer);
881
	tasklet_schedule(&slot->cover_tasklet);
882 883
}

884
static void mmc_omap_cover_handler(unsigned long param)
885
{
886 887
	struct mmc_omap_slot *slot = (struct mmc_omap_slot *)param;
	int cover_open = mmc_omap_cover_is_open(slot);
888

889 890 891 892 893 894 895 896
	mmc_detect_change(slot->mmc, 0);
	if (!cover_open)
		return;

	/*
	 * If no card is inserted, we postpone polling until
	 * the cover has been closed.
	 */
897
	if (slot->mmc->card == NULL)
898 899 900 901
		return;

	mod_timer(&slot->cover_timer,
		  jiffies + msecs_to_jiffies(OMAP_MMC_COVER_POLL_DELAY));
902 903
}

R
Russell King 已提交
904 905 906 907 908 909 910 911 912 913 914
static void mmc_omap_dma_callback(void *priv)
{
	struct mmc_omap_host *host = priv;
	struct mmc_data *data = host->data;

	/* If we got to the end of DMA, assume everything went well */
	data->bytes_xfered += data->blocks * data->blksz;

	mmc_omap_dma_done(host, data);
}

C
Carlos Aguiar 已提交
915 916 917 918
static inline void set_cmd_timeout(struct mmc_omap_host *host, struct mmc_request *req)
{
	u16 reg;

919
	reg = OMAP_MMC_READ(host, SDIO);
C
Carlos Aguiar 已提交
920
	reg &= ~(1 << 5);
921
	OMAP_MMC_WRITE(host, SDIO, reg);
C
Carlos Aguiar 已提交
922
	/* Set maximum timeout */
923
	OMAP_MMC_WRITE(host, CTO, 0xff);
C
Carlos Aguiar 已提交
924 925 926 927
}

static inline void set_data_timeout(struct mmc_omap_host *host, struct mmc_request *req)
{
928
	unsigned int timeout, cycle_ns;
C
Carlos Aguiar 已提交
929 930
	u16 reg;

931 932 933
	cycle_ns = 1000000000 / host->current_slot->fclk_freq;
	timeout = req->data->timeout_ns / cycle_ns;
	timeout += req->data->timeout_clks;
C
Carlos Aguiar 已提交
934 935

	/* Check if we need to use timeout multiplier register */
936
	reg = OMAP_MMC_READ(host, SDIO);
C
Carlos Aguiar 已提交
937 938 939 940 941
	if (timeout > 0xffff) {
		reg |= (1 << 5);
		timeout /= 1024;
	} else
		reg &= ~(1 << 5);
942 943
	OMAP_MMC_WRITE(host, SDIO, reg);
	OMAP_MMC_WRITE(host, DTO, timeout);
C
Carlos Aguiar 已提交
944 945 946 947 948 949
}

static void
mmc_omap_prepare_data(struct mmc_omap_host *host, struct mmc_request *req)
{
	struct mmc_data *data = req->data;
950
	int i, use_dma = 1, block_size;
951
	struct scatterlist *sg;
C
Carlos Aguiar 已提交
952 953 954 955
	unsigned sg_len;

	host->data = data;
	if (data == NULL) {
956 957 958
		OMAP_MMC_WRITE(host, BLEN, 0);
		OMAP_MMC_WRITE(host, NBLK, 0);
		OMAP_MMC_WRITE(host, BUF, 0);
C
Carlos Aguiar 已提交
959 960 961 962 963
		host->dma_in_use = 0;
		set_cmd_timeout(host, req);
		return;
	}

964
	block_size = data->blksz;
C
Carlos Aguiar 已提交
965

966 967
	OMAP_MMC_WRITE(host, NBLK, data->blocks - 1);
	OMAP_MMC_WRITE(host, BLEN, block_size - 1);
C
Carlos Aguiar 已提交
968 969 970 971 972 973 974 975
	set_data_timeout(host, req);

	/* cope with calling layer confusion; it issues "single
	 * block" writes using multi-block scatterlists.
	 */
	sg_len = (data->blocks == 1) ? 1 : data->sg_len;

	/* Only do DMA for entire blocks */
976 977
	for_each_sg(data->sg, sg, sg_len, i) {
		if ((sg->length % block_size) != 0) {
978 979
			use_dma = 0;
			break;
C
Carlos Aguiar 已提交
980 981 982 983
		}
	}

	host->sg_idx = 0;
R
Russell King 已提交
984 985 986 987 988 989 990 991 992 993 994 995 996
	if (use_dma) {
		enum dma_data_direction dma_data_dir;
		struct dma_async_tx_descriptor *tx;
		struct dma_chan *c;
		u32 burst, *bp;
		u16 buf;

		/*
		 * FIFO is 16x2 bytes on 15xx, and 32x2 bytes on 16xx
		 * and 24xx. Use 16 or 32 word frames when the
		 * blocksize is at least that large. Blocksize is
		 * usually 512 bytes; but not for some SD reads.
		 */
997
		burst = mmc_omap15xx() ? 32 : 64;
R
Russell King 已提交
998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
		if (burst > data->blksz)
			burst = data->blksz;

		burst >>= 1;

		if (data->flags & MMC_DATA_WRITE) {
			c = host->dma_tx;
			bp = &host->dma_tx_burst;
			buf = 0x0f80 | (burst - 1) << 0;
			dma_data_dir = DMA_TO_DEVICE;
		} else {
			c = host->dma_rx;
			bp = &host->dma_rx_burst;
			buf = 0x800f | (burst - 1) << 8;
			dma_data_dir = DMA_FROM_DEVICE;
		}

		if (!c)
			goto use_pio;

		/* Only reconfigure if we have a different burst size */
		if (*bp != burst) {
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029
			struct dma_slave_config cfg = {
				.src_addr = host->phys_base +
					    OMAP_MMC_REG(host, DATA),
				.dst_addr = host->phys_base +
					    OMAP_MMC_REG(host, DATA),
				.src_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES,
				.dst_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES,
				.src_maxburst = burst,
				.dst_maxburst = burst,
			};
R
Russell King 已提交
1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058

			if (dmaengine_slave_config(c, &cfg))
				goto use_pio;

			*bp = burst;
		}

		host->sg_len = dma_map_sg(c->device->dev, data->sg, sg_len,
					  dma_data_dir);
		if (host->sg_len == 0)
			goto use_pio;

		tx = dmaengine_prep_slave_sg(c, data->sg, host->sg_len,
			data->flags & MMC_DATA_WRITE ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM,
			DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
		if (!tx)
			goto use_pio;

		OMAP_MMC_WRITE(host, BUF, buf);

		tx->callback = mmc_omap_dma_callback;
		tx->callback_param = host;
		dmaengine_submit(tx);
		host->brs_received = 0;
		host->dma_done = 0;
		host->dma_in_use = 1;
		return;
	}
 use_pio:
C
Carlos Aguiar 已提交
1059 1060

	/* Revert to PIO? */
1061 1062 1063 1064 1065
	OMAP_MMC_WRITE(host, BUF, 0x1f1f);
	host->total_bytes_left = data->blocks * block_size;
	host->sg_len = sg_len;
	mmc_omap_sg_to_buf(host);
	host->dma_in_use = 0;
C
Carlos Aguiar 已提交
1066 1067
}

1068 1069
static void mmc_omap_start_request(struct mmc_omap_host *host,
				   struct mmc_request *req)
C
Carlos Aguiar 已提交
1070
{
1071
	BUG_ON(host->mrq != NULL);
C
Carlos Aguiar 已提交
1072 1073 1074 1075 1076 1077

	host->mrq = req;

	/* only touch fifo AFTER the controller readies it */
	mmc_omap_prepare_data(host, req);
	mmc_omap_start_command(host, req->cmd);
R
Russell King 已提交
1078 1079 1080 1081
	if (host->dma_in_use) {
		struct dma_chan *c = host->data->flags & MMC_DATA_WRITE ?
				host->dma_tx : host->dma_rx;

1082
		dma_async_issue_pending(c);
R
Russell King 已提交
1083
	}
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102
}

static void mmc_omap_request(struct mmc_host *mmc, struct mmc_request *req)
{
	struct mmc_omap_slot *slot = mmc_priv(mmc);
	struct mmc_omap_host *host = slot->host;
	unsigned long flags;

	spin_lock_irqsave(&host->slot_lock, flags);
	if (host->mmc != NULL) {
		BUG_ON(slot->mrq != NULL);
		slot->mrq = req;
		spin_unlock_irqrestore(&host->slot_lock, flags);
		return;
	} else
		host->mmc = mmc;
	spin_unlock_irqrestore(&host->slot_lock, flags);
	mmc_omap_select_slot(slot, 1);
	mmc_omap_start_request(host, req);
C
Carlos Aguiar 已提交
1103 1104
}

1105 1106
static void mmc_omap_set_power(struct mmc_omap_slot *slot, int power_on,
				int vdd)
C
Carlos Aguiar 已提交
1107
{
1108
	struct mmc_omap_host *host;
C
Carlos Aguiar 已提交
1109

1110 1111 1112 1113 1114
	host = slot->host;

	if (slot->pdata->set_power != NULL)
		slot->pdata->set_power(mmc_dev(slot->mmc), slot->id, power_on,
					vdd);
1115
	if (mmc_omap2()) {
1116 1117 1118 1119 1120 1121 1122 1123 1124
		u16 w;

		if (power_on) {
			w = OMAP_MMC_READ(host, CON);
			OMAP_MMC_WRITE(host, CON, w | (1 << 11));
		} else {
			w = OMAP_MMC_READ(host, CON);
			OMAP_MMC_WRITE(host, CON, w & ~(1 << 11));
		}
C
Carlos Aguiar 已提交
1125 1126 1127
	}
}

1128
static int mmc_omap_calc_divisor(struct mmc_host *mmc, struct mmc_ios *ios)
C
Carlos Aguiar 已提交
1129
{
1130 1131
	struct mmc_omap_slot *slot = mmc_priv(mmc);
	struct mmc_omap_host *host = slot->host;
1132
	int func_clk_rate = clk_get_rate(host->fclk);
C
Carlos Aguiar 已提交
1133 1134 1135
	int dsor;

	if (ios->clock == 0)
1136
		return 0;
C
Carlos Aguiar 已提交
1137

1138 1139 1140
	dsor = func_clk_rate / ios->clock;
	if (dsor < 1)
		dsor = 1;
C
Carlos Aguiar 已提交
1141

1142
	if (func_clk_rate / dsor > ios->clock)
C
Carlos Aguiar 已提交
1143 1144
		dsor++;

1145 1146 1147
	if (dsor > 250)
		dsor = 250;

1148 1149
	slot->fclk_freq = func_clk_rate / dsor;

1150 1151 1152 1153 1154 1155 1156 1157
	if (ios->bus_width == MMC_BUS_WIDTH_4)
		dsor |= 1 << 15;

	return dsor;
}

static void mmc_omap_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
{
1158 1159 1160
	struct mmc_omap_slot *slot = mmc_priv(mmc);
	struct mmc_omap_host *host = slot->host;
	int i, dsor;
1161
	int clk_enabled, init_stream;
1162 1163 1164

	mmc_omap_select_slot(slot, 0);

J
Jarkko Lavinen 已提交
1165 1166
	dsor = mmc_omap_calc_divisor(mmc, ios);

1167 1168
	if (ios->vdd != slot->vdd)
		slot->vdd = ios->vdd;
C
Carlos Aguiar 已提交
1169

J
Jarkko Lavinen 已提交
1170
	clk_enabled = 0;
1171
	init_stream = 0;
C
Carlos Aguiar 已提交
1172 1173
	switch (ios->power_mode) {
	case MMC_POWER_OFF:
1174
		mmc_omap_set_power(slot, 0, ios->vdd);
C
Carlos Aguiar 已提交
1175 1176
		break;
	case MMC_POWER_UP:
1177
		/* Cannot touch dsor yet, just power up MMC */
1178
		mmc_omap_set_power(slot, 1, ios->vdd);
1179
		slot->power_mode = ios->power_mode;
1180
		goto exit;
1181
	case MMC_POWER_ON:
J
Jarkko Lavinen 已提交
1182 1183
		mmc_omap_fclk_enable(host, 1);
		clk_enabled = 1;
1184
		dsor |= 1 << 11;
1185 1186
		if (slot->power_mode != MMC_POWER_ON)
			init_stream = 1;
C
Carlos Aguiar 已提交
1187 1188
		break;
	}
1189
	slot->power_mode = ios->power_mode;
C
Carlos Aguiar 已提交
1190

1191 1192 1193 1194 1195 1196
	if (slot->bus_mode != ios->bus_mode) {
		if (slot->pdata->set_bus_mode != NULL)
			slot->pdata->set_bus_mode(mmc_dev(mmc), slot->id,
						  ios->bus_mode);
		slot->bus_mode = ios->bus_mode;
	}
C
Carlos Aguiar 已提交
1197 1198 1199 1200 1201 1202

	/* On insanely high arm_per frequencies something sometimes
	 * goes somehow out of sync, and the POW bit is not being set,
	 * which results in the while loop below getting stuck.
	 * Writing to the CON register twice seems to do the trick. */
	for (i = 0; i < 2; i++)
1203
		OMAP_MMC_WRITE(host, CON, dsor);
1204
	slot->saved_con = dsor;
1205
	if (init_stream) {
1206 1207 1208
		/* worst case at 400kHz, 80 cycles makes 200 microsecs */
		int usecs = 250;

C
Carlos Aguiar 已提交
1209
		/* Send clock cycles, poll completion */
1210 1211
		OMAP_MMC_WRITE(host, IE, 0);
		OMAP_MMC_WRITE(host, STAT, 0xffff);
1212
		OMAP_MMC_WRITE(host, CMD, 1 << 7);
1213 1214 1215 1216
		while (usecs > 0 && (OMAP_MMC_READ(host, STAT) & 1) == 0) {
			udelay(1);
			usecs--;
		}
1217
		OMAP_MMC_WRITE(host, STAT, 1);
C
Carlos Aguiar 已提交
1218
	}
1219 1220

exit:
J
Jarkko Lavinen 已提交
1221
	mmc_omap_release_slot(slot, clk_enabled);
C
Carlos Aguiar 已提交
1222 1223
}

1224
static const struct mmc_host_ops mmc_omap_ops = {
C
Carlos Aguiar 已提交
1225 1226 1227 1228
	.request	= mmc_omap_request,
	.set_ios	= mmc_omap_set_ios,
};

B
Bill Pemberton 已提交
1229
static int mmc_omap_new_slot(struct mmc_omap_host *host, int id)
C
Carlos Aguiar 已提交
1230
{
1231
	struct mmc_omap_slot *slot = NULL;
C
Carlos Aguiar 已提交
1232
	struct mmc_host *mmc;
1233 1234 1235 1236 1237 1238 1239 1240 1241 1242
	int r;

	mmc = mmc_alloc_host(sizeof(struct mmc_omap_slot), host->dev);
	if (mmc == NULL)
		return -ENOMEM;

	slot = mmc_priv(mmc);
	slot->host = host;
	slot->mmc = mmc;
	slot->id = id;
1243
	slot->power_mode = MMC_POWER_UNDEFINED;
1244 1245 1246 1247
	slot->pdata = &host->pdata->slots[id];

	host->slots[id] = slot;

1248
	mmc->caps = 0;
1249
	if (host->pdata->slots[id].wires >= 4)
J
Jarkko Nikula 已提交
1250
		mmc->caps |= MMC_CAP_4_BIT_DATA | MMC_CAP_ERASE;
1251 1252 1253 1254

	mmc->ops = &mmc_omap_ops;
	mmc->f_min = 400000;

1255
	if (mmc_omap2())
1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266
		mmc->f_max = 48000000;
	else
		mmc->f_max = 24000000;
	if (host->pdata->max_freq)
		mmc->f_max = min(host->pdata->max_freq, mmc->f_max);
	mmc->ocr_avail = slot->pdata->ocr_mask;

	/* Use scatterlist DMA to reduce per-transfer costs.
	 * NOTE max_seg_size assumption that small blocks aren't
	 * normally used (except e.g. for reading SD registers).
	 */
1267
	mmc->max_segs = 32;
1268 1269 1270 1271 1272
	mmc->max_blk_size = 2048;	/* BLEN is 11 bits (+1) */
	mmc->max_blk_count = 2048;	/* NBLK is 11 bits (+1) */
	mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
	mmc->max_seg_size = mmc->max_req_size;

1273
	if (slot->pdata->get_cover_state != NULL) {
1274
		timer_setup(&slot->cover_timer, mmc_omap_cover_timer, 0);
1275 1276 1277 1278
		tasklet_init(&slot->cover_tasklet, mmc_omap_cover_handler,
			     (unsigned long)slot);
	}

1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289
	r = mmc_add_host(mmc);
	if (r < 0)
		goto err_remove_host;

	if (slot->pdata->name != NULL) {
		r = device_create_file(&mmc->class_dev,
					&dev_attr_slot_name);
		if (r < 0)
			goto err_remove_host;
	}

1290 1291 1292 1293 1294
	if (slot->pdata->get_cover_state != NULL) {
		r = device_create_file(&mmc->class_dev,
					&dev_attr_cover_switch);
		if (r < 0)
			goto err_remove_slot_name;
1295
		tasklet_schedule(&slot->cover_tasklet);
1296 1297
	}

1298 1299
	return 0;

1300 1301 1302
err_remove_slot_name:
	if (slot->pdata->name != NULL)
		device_remove_file(&mmc->class_dev, &dev_attr_slot_name);
1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314
err_remove_host:
	mmc_remove_host(mmc);
	mmc_free_host(mmc);
	return r;
}

static void mmc_omap_remove_slot(struct mmc_omap_slot *slot)
{
	struct mmc_host *mmc = slot->mmc;

	if (slot->pdata->name != NULL)
		device_remove_file(&mmc->class_dev, &dev_attr_slot_name);
1315 1316 1317
	if (slot->pdata->get_cover_state != NULL)
		device_remove_file(&mmc->class_dev, &dev_attr_cover_switch);

1318 1319
	tasklet_kill(&slot->cover_tasklet);
	del_timer_sync(&slot->cover_timer);
1320
	flush_workqueue(slot->host->mmc_omap_wq);
1321 1322 1323 1324 1325

	mmc_remove_host(mmc);
	mmc_free_host(mmc);
}

B
Bill Pemberton 已提交
1326
static int mmc_omap_probe(struct platform_device *pdev)
1327 1328
{
	struct omap_mmc_platform_data *pdata = pdev->dev.platform_data;
C
Carlos Aguiar 已提交
1329
	struct mmc_omap_host *host = NULL;
1330
	struct resource *res;
1331
	int i, ret = 0;
1332
	int irq;
1333

1334
	if (pdata == NULL) {
1335 1336 1337
		dev_err(&pdev->dev, "platform data missing\n");
		return -ENXIO;
	}
1338 1339
	if (pdata->nr_slots == 0) {
		dev_err(&pdev->dev, "no slots\n");
1340
		return -EPROBE_DEFER;
1341
	}
1342

1343 1344 1345 1346 1347
	host = devm_kzalloc(&pdev->dev, sizeof(struct mmc_omap_host),
			    GFP_KERNEL);
	if (host == NULL)
		return -ENOMEM;

1348
	irq = platform_get_irq(pdev, 0);
1349
	if (irq < 0)
1350
		return -ENXIO;
C
Carlos Aguiar 已提交
1351

1352 1353 1354 1355
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	host->virt_base = devm_ioremap_resource(&pdev->dev, res);
	if (IS_ERR(host->virt_base))
		return PTR_ERR(host->virt_base);
C
Carlos Aguiar 已提交
1356

1357 1358 1359
	INIT_WORK(&host->slot_release_work, mmc_omap_slot_release_work);
	INIT_WORK(&host->send_stop_work, mmc_omap_send_stop_work);

1360
	INIT_WORK(&host->cmd_abort_work, mmc_omap_abort_command);
1361
	timer_setup(&host->cmd_abort_timer, mmc_omap_cmd_timer, 0);
J
Jarkko Lavinen 已提交
1362

J
Jarkko Lavinen 已提交
1363
	spin_lock_init(&host->clk_lock);
1364
	timer_setup(&host->clk_timer, mmc_omap_clk_timer, 0);
J
Jarkko Lavinen 已提交
1365

C
Carlos Aguiar 已提交
1366
	spin_lock_init(&host->dma_lock);
1367 1368 1369 1370
	spin_lock_init(&host->slot_lock);
	init_waitqueue_head(&host->slot_wq);

	host->pdata = pdata;
1371
	host->features = host->pdata->slots[0].features;
1372 1373 1374
	host->dev = &pdev->dev;
	platform_set_drvdata(pdev, host);

C
Carlos Aguiar 已提交
1375
	host->id = pdev->id;
1376
	host->irq = irq;
1377
	host->phys_base = res->start;
1378
	host->iclk = clk_get(&pdev->dev, "ick");
1379 1380
	if (IS_ERR(host->iclk))
		return PTR_ERR(host->iclk);
1381
	clk_enable(host->iclk);
C
Carlos Aguiar 已提交
1382

1383
	host->fclk = clk_get(&pdev->dev, "fck");
C
Carlos Aguiar 已提交
1384 1385
	if (IS_ERR(host->fclk)) {
		ret = PTR_ERR(host->fclk);
1386
		goto err_free_iclk;
C
Carlos Aguiar 已提交
1387 1388
	}

R
Russell King 已提交
1389 1390 1391
	host->dma_tx_burst = -1;
	host->dma_rx_burst = -1;

1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416
	host->dma_tx = dma_request_chan(&pdev->dev, "tx");
	if (IS_ERR(host->dma_tx)) {
		ret = PTR_ERR(host->dma_tx);
		if (ret == -EPROBE_DEFER) {
			clk_put(host->fclk);
			goto err_free_iclk;
		}

		host->dma_tx = NULL;
		dev_warn(host->dev, "TX DMA channel request failed\n");
	}

	host->dma_rx = dma_request_chan(&pdev->dev, "rx");
	if (IS_ERR(host->dma_rx)) {
		ret = PTR_ERR(host->dma_rx);
		if (ret == -EPROBE_DEFER) {
			if (host->dma_tx)
				dma_release_channel(host->dma_tx);
			clk_put(host->fclk);
			goto err_free_iclk;
		}

		host->dma_rx = NULL;
		dev_warn(host->dev, "RX DMA channel request failed\n");
	}
R
Russell King 已提交
1417

1418 1419
	ret = request_irq(host->irq, mmc_omap_irq, 0, DRIVER_NAME, host);
	if (ret)
R
Russell King 已提交
1420
		goto err_free_dma;
1421

1422 1423 1424 1425 1426
	if (pdata->init != NULL) {
		ret = pdata->init(&pdev->dev);
		if (ret < 0)
			goto err_free_irq;
	}
C
Carlos Aguiar 已提交
1427

1428
	host->nr_slots = pdata->nr_slots;
1429
	host->reg_shift = (mmc_omap7xx() ? 1 : 2);
1430 1431

	host->mmc_omap_wq = alloc_workqueue("mmc_omap", 0, 0);
J
Julia Lawall 已提交
1432 1433
	if (!host->mmc_omap_wq) {
		ret = -ENOMEM;
1434
		goto err_plat_cleanup;
J
Julia Lawall 已提交
1435
	}
1436

1437 1438 1439 1440 1441
	for (i = 0; i < pdata->nr_slots; i++) {
		ret = mmc_omap_new_slot(host, i);
		if (ret < 0) {
			while (--i >= 0)
				mmc_omap_remove_slot(host->slots[i]);
C
Carlos Aguiar 已提交
1442

1443
			goto err_destroy_wq;
C
Carlos Aguiar 已提交
1444 1445 1446 1447 1448
		}
	}

	return 0;

1449 1450
err_destroy_wq:
	destroy_workqueue(host->mmc_omap_wq);
1451 1452 1453 1454 1455
err_plat_cleanup:
	if (pdata->cleanup)
		pdata->cleanup(&pdev->dev);
err_free_irq:
	free_irq(host->irq, host);
R
Russell King 已提交
1456 1457 1458 1459 1460
err_free_dma:
	if (host->dma_tx)
		dma_release_channel(host->dma_tx);
	if (host->dma_rx)
		dma_release_channel(host->dma_rx);
1461 1462
	clk_put(host->fclk);
err_free_iclk:
1463 1464
	clk_disable(host->iclk);
	clk_put(host->iclk);
C
Carlos Aguiar 已提交
1465 1466 1467
	return ret;
}

B
Bill Pemberton 已提交
1468
static int mmc_omap_remove(struct platform_device *pdev)
C
Carlos Aguiar 已提交
1469 1470
{
	struct mmc_omap_host *host = platform_get_drvdata(pdev);
1471
	int i;
C
Carlos Aguiar 已提交
1472

1473 1474
	BUG_ON(host == NULL);

1475 1476 1477 1478 1479
	for (i = 0; i < host->nr_slots; i++)
		mmc_omap_remove_slot(host->slots[i]);

	if (host->pdata->cleanup)
		host->pdata->cleanup(&pdev->dev);
1480

1481
	mmc_omap_fclk_enable(host, 0);
L
Ladislav Michl 已提交
1482
	free_irq(host->irq, host);
1483 1484 1485
	clk_put(host->fclk);
	clk_disable(host->iclk);
	clk_put(host->iclk);
C
Carlos Aguiar 已提交
1486

R
Russell King 已提交
1487 1488 1489 1490 1491
	if (host->dma_tx)
		dma_release_channel(host->dma_tx);
	if (host->dma_rx)
		dma_release_channel(host->dma_rx);

1492
	destroy_workqueue(host->mmc_omap_wq);
1493

C
Carlos Aguiar 已提交
1494 1495 1496
	return 0;
}

1497 1498 1499 1500 1501
#if IS_BUILTIN(CONFIG_OF)
static const struct of_device_id mmc_omap_match[] = {
	{ .compatible = "ti,omap2420-mmc", },
	{ },
};
1502
MODULE_DEVICE_TABLE(of, mmc_omap_match);
1503 1504
#endif

C
Carlos Aguiar 已提交
1505
static struct platform_driver mmc_omap_driver = {
1506
	.probe		= mmc_omap_probe,
B
Bill Pemberton 已提交
1507
	.remove		= mmc_omap_remove,
C
Carlos Aguiar 已提交
1508 1509
	.driver		= {
		.name	= DRIVER_NAME,
1510
		.of_match_table = of_match_ptr(mmc_omap_match),
C
Carlos Aguiar 已提交
1511 1512 1513
	},
};

1514
module_platform_driver(mmc_omap_driver);
C
Carlos Aguiar 已提交
1515 1516
MODULE_DESCRIPTION("OMAP Multimedia Card driver");
MODULE_LICENSE("GPL");
1517
MODULE_ALIAS("platform:" DRIVER_NAME);
A
Al Viro 已提交
1518
MODULE_AUTHOR("Juha Yrjölä");