sdhci.c 34.4 KB
Newer Older
1
/*
P
Pierre Ossman 已提交
2
 *  linux/drivers/mmc/host/sdhci.c - Secure Digital Host Controller Interface driver
3
 *
4
 *  Copyright (C) 2005-2008 Pierre Ossman, All Rights Reserved.
5 6
 *
 * This program is free software; you can redistribute it and/or modify
7 8 9
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at
 * your option) any later version.
10 11 12 13
 *
 * Thanks to the following companies for their support:
 *
 *     - JMicron (hardware and technical support)
14 15 16 17
 */

#include <linux/delay.h>
#include <linux/highmem.h>
18
#include <linux/io.h>
19
#include <linux/dma-mapping.h>
20
#include <linux/scatterlist.h>
21

22 23
#include <linux/leds.h>

24 25 26 27 28 29 30
#include <linux/mmc/host.h>

#include "sdhci.h"

#define DRIVER_NAME "sdhci"

#define DBG(f, x...) \
31
	pr_debug(DRIVER_NAME " [%s()]: " f, __func__,## x)
32

33
static unsigned int debug_quirks = 0;
34

35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
static void sdhci_prepare_data(struct sdhci_host *, struct mmc_data *);
static void sdhci_finish_data(struct sdhci_host *);

static void sdhci_send_command(struct sdhci_host *, struct mmc_command *);
static void sdhci_finish_command(struct sdhci_host *);

static void sdhci_dumpregs(struct sdhci_host *host)
{
	printk(KERN_DEBUG DRIVER_NAME ": ============== REGISTER DUMP ==============\n");

	printk(KERN_DEBUG DRIVER_NAME ": Sys addr: 0x%08x | Version:  0x%08x\n",
		readl(host->ioaddr + SDHCI_DMA_ADDRESS),
		readw(host->ioaddr + SDHCI_HOST_VERSION));
	printk(KERN_DEBUG DRIVER_NAME ": Blk size: 0x%08x | Blk cnt:  0x%08x\n",
		readw(host->ioaddr + SDHCI_BLOCK_SIZE),
		readw(host->ioaddr + SDHCI_BLOCK_COUNT));
	printk(KERN_DEBUG DRIVER_NAME ": Argument: 0x%08x | Trn mode: 0x%08x\n",
		readl(host->ioaddr + SDHCI_ARGUMENT),
		readw(host->ioaddr + SDHCI_TRANSFER_MODE));
	printk(KERN_DEBUG DRIVER_NAME ": Present:  0x%08x | Host ctl: 0x%08x\n",
		readl(host->ioaddr + SDHCI_PRESENT_STATE),
		readb(host->ioaddr + SDHCI_HOST_CONTROL));
	printk(KERN_DEBUG DRIVER_NAME ": Power:    0x%08x | Blk gap:  0x%08x\n",
		readb(host->ioaddr + SDHCI_POWER_CONTROL),
		readb(host->ioaddr + SDHCI_BLOCK_GAP_CONTROL));
	printk(KERN_DEBUG DRIVER_NAME ": Wake-up:  0x%08x | Clock:    0x%08x\n",
N
Nicolas Pitre 已提交
61
		readb(host->ioaddr + SDHCI_WAKE_UP_CONTROL),
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
		readw(host->ioaddr + SDHCI_CLOCK_CONTROL));
	printk(KERN_DEBUG DRIVER_NAME ": Timeout:  0x%08x | Int stat: 0x%08x\n",
		readb(host->ioaddr + SDHCI_TIMEOUT_CONTROL),
		readl(host->ioaddr + SDHCI_INT_STATUS));
	printk(KERN_DEBUG DRIVER_NAME ": Int enab: 0x%08x | Sig enab: 0x%08x\n",
		readl(host->ioaddr + SDHCI_INT_ENABLE),
		readl(host->ioaddr + SDHCI_SIGNAL_ENABLE));
	printk(KERN_DEBUG DRIVER_NAME ": AC12 err: 0x%08x | Slot int: 0x%08x\n",
		readw(host->ioaddr + SDHCI_ACMD12_ERR),
		readw(host->ioaddr + SDHCI_SLOT_INT_STATUS));
	printk(KERN_DEBUG DRIVER_NAME ": Caps:     0x%08x | Max curr: 0x%08x\n",
		readl(host->ioaddr + SDHCI_CAPABILITIES),
		readl(host->ioaddr + SDHCI_MAX_CURRENT));

	printk(KERN_DEBUG DRIVER_NAME ": ===========================================\n");
}

/*****************************************************************************\
 *                                                                           *
 * Low level functions                                                       *
 *                                                                           *
\*****************************************************************************/

static void sdhci_reset(struct sdhci_host *host, u8 mask)
{
87 88
	unsigned long timeout;

89
	if (host->quirks & SDHCI_QUIRK_NO_CARD_NO_RESET) {
90 91 92 93 94
		if (!(readl(host->ioaddr + SDHCI_PRESENT_STATE) &
			SDHCI_CARD_PRESENT))
			return;
	}

95 96
	writeb(mask, host->ioaddr + SDHCI_SOFTWARE_RESET);

97
	if (mask & SDHCI_RESET_ALL)
98 99
		host->clock = 0;

100 101 102 103 104 105
	/* Wait max 100 ms */
	timeout = 100;

	/* hw clears the bit when it's done */
	while (readb(host->ioaddr + SDHCI_SOFTWARE_RESET) & mask) {
		if (timeout == 0) {
P
Pierre Ossman 已提交
106
			printk(KERN_ERR "%s: Reset 0x%x never completed.\n",
107 108 109 110 111 112
				mmc_hostname(host->mmc), (int)mask);
			sdhci_dumpregs(host);
			return;
		}
		timeout--;
		mdelay(1);
113 114 115 116 117 118 119 120 121
	}
}

static void sdhci_init(struct sdhci_host *host)
{
	u32 intmask;

	sdhci_reset(host, SDHCI_RESET_ALL);

122 123 124 125
	intmask = SDHCI_INT_BUS_POWER | SDHCI_INT_DATA_END_BIT |
		SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_TIMEOUT | SDHCI_INT_INDEX |
		SDHCI_INT_END_BIT | SDHCI_INT_CRC | SDHCI_INT_TIMEOUT |
		SDHCI_INT_CARD_REMOVE | SDHCI_INT_CARD_INSERT |
P
Pierre Ossman 已提交
126
		SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL |
127
		SDHCI_INT_DMA_END | SDHCI_INT_DATA_END | SDHCI_INT_RESPONSE;
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150

	writel(intmask, host->ioaddr + SDHCI_INT_ENABLE);
	writel(intmask, host->ioaddr + SDHCI_SIGNAL_ENABLE);
}

static void sdhci_activate_led(struct sdhci_host *host)
{
	u8 ctrl;

	ctrl = readb(host->ioaddr + SDHCI_HOST_CONTROL);
	ctrl |= SDHCI_CTRL_LED;
	writeb(ctrl, host->ioaddr + SDHCI_HOST_CONTROL);
}

static void sdhci_deactivate_led(struct sdhci_host *host)
{
	u8 ctrl;

	ctrl = readb(host->ioaddr + SDHCI_HOST_CONTROL);
	ctrl &= ~SDHCI_CTRL_LED;
	writeb(ctrl, host->ioaddr + SDHCI_HOST_CONTROL);
}

151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
#ifdef CONFIG_LEDS_CLASS
static void sdhci_led_control(struct led_classdev *led,
	enum led_brightness brightness)
{
	struct sdhci_host *host = container_of(led, struct sdhci_host, led);
	unsigned long flags;

	spin_lock_irqsave(&host->lock, flags);

	if (brightness == LED_OFF)
		sdhci_deactivate_led(host);
	else
		sdhci_activate_led(host);

	spin_unlock_irqrestore(&host->lock, flags);
}
#endif

169 170 171 172 173 174
/*****************************************************************************\
 *                                                                           *
 * Core functions                                                            *
 *                                                                           *
\*****************************************************************************/

175
static inline char* sdhci_sg_to_buffer(struct sdhci_host* host)
176
{
J
Jens Axboe 已提交
177
	return sg_virt(host->cur_sg);
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
}

static inline int sdhci_next_sg(struct sdhci_host* host)
{
	/*
	 * Skip to next SG entry.
	 */
	host->cur_sg++;
	host->num_sg--;

	/*
	 * Any entries left?
	 */
	if (host->num_sg > 0) {
		host->offset = 0;
		host->remain = host->cur_sg->length;
	}

	return host->num_sg;
}

P
Pierre Ossman 已提交
199
static void sdhci_read_block_pio(struct sdhci_host *host)
200
{
P
Pierre Ossman 已提交
201 202
	int blksize, chunk_remain;
	u32 data;
203
	char *buffer;
P
Pierre Ossman 已提交
204
	int size;
205

P
Pierre Ossman 已提交
206
	DBG("PIO reading\n");
207

P
Pierre Ossman 已提交
208 209 210
	blksize = host->data->blksz;
	chunk_remain = 0;
	data = 0;
211

212
	buffer = sdhci_sg_to_buffer(host) + host->offset;
213

P
Pierre Ossman 已提交
214 215 216 217 218
	while (blksize) {
		if (chunk_remain == 0) {
			data = readl(host->ioaddr + SDHCI_BUFFER);
			chunk_remain = min(blksize, 4);
		}
219

220
		size = min(host->remain, chunk_remain);
221

P
Pierre Ossman 已提交
222 223 224 225
		chunk_remain -= size;
		blksize -= size;
		host->offset += size;
		host->remain -= size;
226

P
Pierre Ossman 已提交
227 228 229 230 231 232
		while (size) {
			*buffer = data & 0xFF;
			buffer++;
			data >>= 8;
			size--;
		}
233

P
Pierre Ossman 已提交
234 235 236 237 238
		if (host->remain == 0) {
			if (sdhci_next_sg(host) == 0) {
				BUG_ON(blksize != 0);
				return;
			}
239
			buffer = sdhci_sg_to_buffer(host);
240
		}
P
Pierre Ossman 已提交
241 242
	}
}
243

P
Pierre Ossman 已提交
244 245 246 247 248 249
static void sdhci_write_block_pio(struct sdhci_host *host)
{
	int blksize, chunk_remain;
	u32 data;
	char *buffer;
	int bytes, size;
250

P
Pierre Ossman 已提交
251 252 253 254 255
	DBG("PIO writing\n");

	blksize = host->data->blksz;
	chunk_remain = 4;
	data = 0;
256

P
Pierre Ossman 已提交
257
	bytes = 0;
258
	buffer = sdhci_sg_to_buffer(host) + host->offset;
259

P
Pierre Ossman 已提交
260
	while (blksize) {
261
		size = min(host->remain, chunk_remain);
P
Pierre Ossman 已提交
262 263 264

		chunk_remain -= size;
		blksize -= size;
265 266
		host->offset += size;
		host->remain -= size;
267

P
Pierre Ossman 已提交
268 269 270 271 272 273 274 275 276 277 278
		while (size) {
			data >>= 8;
			data |= (u32)*buffer << 24;
			buffer++;
			size--;
		}

		if (chunk_remain == 0) {
			writel(data, host->ioaddr + SDHCI_BUFFER);
			chunk_remain = min(blksize, 4);
		}
279 280 281

		if (host->remain == 0) {
			if (sdhci_next_sg(host) == 0) {
P
Pierre Ossman 已提交
282
				BUG_ON(blksize != 0);
283 284
				return;
			}
285
			buffer = sdhci_sg_to_buffer(host);
286 287
		}
	}
P
Pierre Ossman 已提交
288 289 290 291 292 293 294 295
}

static void sdhci_transfer_pio(struct sdhci_host *host)
{
	u32 mask;

	BUG_ON(!host->data);

296
	if (host->num_sg == 0)
P
Pierre Ossman 已提交
297 298 299 300 301 302 303 304 305 306 307 308
		return;

	if (host->data->flags & MMC_DATA_READ)
		mask = SDHCI_DATA_AVAILABLE;
	else
		mask = SDHCI_SPACE_AVAILABLE;

	while (readl(host->ioaddr + SDHCI_PRESENT_STATE) & mask) {
		if (host->data->flags & MMC_DATA_READ)
			sdhci_read_block_pio(host);
		else
			sdhci_write_block_pio(host);
309

310
		if (host->num_sg == 0)
P
Pierre Ossman 已提交
311 312
			break;
	}
313

P
Pierre Ossman 已提交
314
	DBG("PIO transfer complete.\n");
315 316
}

317
static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_data *data)
318
{
319 320
	u8 count;
	unsigned target_timeout, current_timeout;
321

322 323 324 325 326 327 328 329
	/*
	 * If the host controller provides us with an incorrect timeout
	 * value, just skip the check and use 0xE.  The hardware may take
	 * longer to time out, but that's much better than having a too-short
	 * timeout value.
	 */
	if ((host->quirks & SDHCI_QUIRK_BROKEN_TIMEOUT_VAL))
		return 0xE;
330

331 332 333
	/* timeout in us */
	target_timeout = data->timeout_ns / 1000 +
		data->timeout_clks / host->clock;
334

335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359
	/*
	 * Figure out needed cycles.
	 * We do this in steps in order to fit inside a 32 bit int.
	 * The first step is the minimum timeout, which will have a
	 * minimum resolution of 6 bits:
	 * (1) 2^13*1000 > 2^22,
	 * (2) host->timeout_clk < 2^16
	 *     =>
	 *     (1) / (2) > 2^6
	 */
	count = 0;
	current_timeout = (1 << 13) * 1000 / host->timeout_clk;
	while (current_timeout < target_timeout) {
		count++;
		current_timeout <<= 1;
		if (count >= 0xF)
			break;
	}

	if (count >= 0xF) {
		printk(KERN_WARNING "%s: Too large timeout requested!\n",
			mmc_hostname(host->mmc));
		count = 0xE;
	}

360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380
	return count;
}

static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)
{
	u8 count;

	WARN_ON(host->data);

	if (data == NULL)
		return;

	/* Sanity checks */
	BUG_ON(data->blksz * data->blocks > 524288);
	BUG_ON(data->blksz > host->mmc->max_blk_size);
	BUG_ON(data->blocks > 65535);

	host->data = data;
	host->data_early = 0;

	count = sdhci_calc_timeout(host, data);
381
	writeb(count, host->ioaddr + SDHCI_TIMEOUT_CONTROL);
382

383 384 385 386
	if (host->flags & SDHCI_USE_DMA)
		host->flags |= SDHCI_REQ_USE_DMA;

	if (unlikely((host->flags & SDHCI_REQ_USE_DMA) &&
387
		(host->quirks & SDHCI_QUIRK_32BIT_DMA_SIZE) &&
388 389 390 391 392 393 394 395 396 397 398
		((data->blksz * data->blocks) & 0x3))) {
		DBG("Reverting to PIO because of transfer size (%d)\n",
			data->blksz * data->blocks);
		host->flags &= ~SDHCI_REQ_USE_DMA;
	}

	/*
	 * The assumption here being that alignment is the same after
	 * translation to device address space.
	 */
	if (unlikely((host->flags & SDHCI_REQ_USE_DMA) &&
399
		(host->quirks & SDHCI_QUIRK_32BIT_DMA_ADDR) &&
400 401 402 403 404 405
		(data->sg->offset & 0x3))) {
		DBG("Reverting to PIO because of bad alignment\n");
		host->flags &= ~SDHCI_REQ_USE_DMA;
	}

	if (host->flags & SDHCI_REQ_USE_DMA) {
406 407
		int count;

408 409 410 411
		count = dma_map_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
				(data->flags & MMC_DATA_READ) ?
					DMA_FROM_DEVICE : DMA_TO_DEVICE);
		WARN_ON(count != 1);
412

413 414
		writel(sg_dma_address(data->sg),
			host->ioaddr + SDHCI_DMA_ADDRESS);
415 416 417 418 419 420 421
	} else {
		host->cur_sg = data->sg;
		host->num_sg = data->sg_len;

		host->offset = 0;
		host->remain = host->cur_sg->length;
	}
422

423 424 425
	/* We do not handle DMA boundaries, so set it to max (512 KiB) */
	writew(SDHCI_MAKE_BLKSZ(7, data->blksz),
		host->ioaddr + SDHCI_BLOCK_SIZE);
426 427 428 429 430 431 432 433 434 435 436
	writew(data->blocks, host->ioaddr + SDHCI_BLOCK_COUNT);
}

static void sdhci_set_transfer_mode(struct sdhci_host *host,
	struct mmc_data *data)
{
	u16 mode;

	if (data == NULL)
		return;

437 438
	WARN_ON(!host->data);

439 440 441 442 443
	mode = SDHCI_TRNS_BLK_CNT_EN;
	if (data->blocks > 1)
		mode |= SDHCI_TRNS_MULTI;
	if (data->flags & MMC_DATA_READ)
		mode |= SDHCI_TRNS_READ;
444
	if (host->flags & SDHCI_REQ_USE_DMA)
445 446 447
		mode |= SDHCI_TRNS_DMA;

	writew(mode, host->ioaddr + SDHCI_TRANSFER_MODE);
448 449 450 451 452 453 454 455 456 457 458
}

static void sdhci_finish_data(struct sdhci_host *host)
{
	struct mmc_data *data;

	BUG_ON(!host->data);

	data = host->data;
	host->data = NULL;

459
	if (host->flags & SDHCI_REQ_USE_DMA) {
460 461 462
		dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
			(data->flags & MMC_DATA_READ) ?
				DMA_FROM_DEVICE : DMA_TO_DEVICE);
463 464 465
	}

	/*
466 467 468 469 470
	 * The specification states that the block count register must
	 * be updated, but it does not specify at what point in the
	 * data flow. That makes the register entirely useless to read
	 * back so we have to assume that nothing made it to the card
	 * in the event of an error.
471
	 */
472 473
	if (data->error)
		data->bytes_xfered = 0;
474
	else
475
		data->bytes_xfered = data->blksz * data->blocks;
476 477 478 479 480 481

	if (data->stop) {
		/*
		 * The controller needs a reset of internal state machines
		 * upon error conditions.
		 */
P
Pierre Ossman 已提交
482
		if (data->error) {
483 484 485 486 487 488 489 490 491 492 493 494
			sdhci_reset(host, SDHCI_RESET_CMD);
			sdhci_reset(host, SDHCI_RESET_DATA);
		}

		sdhci_send_command(host, data->stop);
	} else
		tasklet_schedule(&host->finish_tasklet);
}

static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)
{
	int flags;
495
	u32 mask;
496
	unsigned long timeout;
497 498 499 500

	WARN_ON(host->cmd);

	/* Wait max 10 ms */
501
	timeout = 10;
502 503 504 505 506 507 508 509 510 511 512

	mask = SDHCI_CMD_INHIBIT;
	if ((cmd->data != NULL) || (cmd->flags & MMC_RSP_BUSY))
		mask |= SDHCI_DATA_INHIBIT;

	/* We shouldn't wait for data inihibit for stop commands, even
	   though they might use busy signaling */
	if (host->mrq->data && (cmd == host->mrq->data->stop))
		mask &= ~SDHCI_DATA_INHIBIT;

	while (readl(host->ioaddr + SDHCI_PRESENT_STATE) & mask) {
513
		if (timeout == 0) {
514
			printk(KERN_ERR "%s: Controller never released "
P
Pierre Ossman 已提交
515
				"inhibit bit(s).\n", mmc_hostname(host->mmc));
516
			sdhci_dumpregs(host);
P
Pierre Ossman 已提交
517
			cmd->error = -EIO;
518 519 520
			tasklet_schedule(&host->finish_tasklet);
			return;
		}
521 522 523
		timeout--;
		mdelay(1);
	}
524 525 526 527 528 529 530 531 532

	mod_timer(&host->timer, jiffies + 10 * HZ);

	host->cmd = cmd;

	sdhci_prepare_data(host, cmd->data);

	writel(cmd->arg, host->ioaddr + SDHCI_ARGUMENT);

533 534
	sdhci_set_transfer_mode(host, cmd->data);

535
	if ((cmd->flags & MMC_RSP_136) && (cmd->flags & MMC_RSP_BUSY)) {
P
Pierre Ossman 已提交
536
		printk(KERN_ERR "%s: Unsupported response type!\n",
537
			mmc_hostname(host->mmc));
P
Pierre Ossman 已提交
538
		cmd->error = -EINVAL;
539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558
		tasklet_schedule(&host->finish_tasklet);
		return;
	}

	if (!(cmd->flags & MMC_RSP_PRESENT))
		flags = SDHCI_CMD_RESP_NONE;
	else if (cmd->flags & MMC_RSP_136)
		flags = SDHCI_CMD_RESP_LONG;
	else if (cmd->flags & MMC_RSP_BUSY)
		flags = SDHCI_CMD_RESP_SHORT_BUSY;
	else
		flags = SDHCI_CMD_RESP_SHORT;

	if (cmd->flags & MMC_RSP_CRC)
		flags |= SDHCI_CMD_CRC;
	if (cmd->flags & MMC_RSP_OPCODE)
		flags |= SDHCI_CMD_INDEX;
	if (cmd->data)
		flags |= SDHCI_CMD_DATA;

559
	writew(SDHCI_MAKE_CMD(cmd->opcode, flags),
560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584
		host->ioaddr + SDHCI_COMMAND);
}

static void sdhci_finish_command(struct sdhci_host *host)
{
	int i;

	BUG_ON(host->cmd == NULL);

	if (host->cmd->flags & MMC_RSP_PRESENT) {
		if (host->cmd->flags & MMC_RSP_136) {
			/* CRC is stripped so we need to do some shifting. */
			for (i = 0;i < 4;i++) {
				host->cmd->resp[i] = readl(host->ioaddr +
					SDHCI_RESPONSE + (3-i)*4) << 8;
				if (i != 3)
					host->cmd->resp[i] |=
						readb(host->ioaddr +
						SDHCI_RESPONSE + (3-i)*4-1);
			}
		} else {
			host->cmd->resp[0] = readl(host->ioaddr + SDHCI_RESPONSE);
		}
	}

P
Pierre Ossman 已提交
585
	host->cmd->error = 0;
586

587 588 589 590
	if (host->data && host->data_early)
		sdhci_finish_data(host);

	if (!host->cmd->data)
591 592 593 594 595 596 597 598 599
		tasklet_schedule(&host->finish_tasklet);

	host->cmd = NULL;
}

static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
{
	int div;
	u16 clk;
600
	unsigned long timeout;
601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620

	if (clock == host->clock)
		return;

	writew(0, host->ioaddr + SDHCI_CLOCK_CONTROL);

	if (clock == 0)
		goto out;

	for (div = 1;div < 256;div *= 2) {
		if ((host->max_clk / div) <= clock)
			break;
	}
	div >>= 1;

	clk = div << SDHCI_DIVIDER_SHIFT;
	clk |= SDHCI_CLOCK_INT_EN;
	writew(clk, host->ioaddr + SDHCI_CLOCK_CONTROL);

	/* Wait max 10 ms */
621 622 623 624
	timeout = 10;
	while (!((clk = readw(host->ioaddr + SDHCI_CLOCK_CONTROL))
		& SDHCI_CLOCK_INT_STABLE)) {
		if (timeout == 0) {
P
Pierre Ossman 已提交
625 626
			printk(KERN_ERR "%s: Internal clock never "
				"stabilised.\n", mmc_hostname(host->mmc));
627 628 629
			sdhci_dumpregs(host);
			return;
		}
630 631 632
		timeout--;
		mdelay(1);
	}
633 634 635 636 637 638 639 640

	clk |= SDHCI_CLOCK_CARD_EN;
	writew(clk, host->ioaddr + SDHCI_CLOCK_CONTROL);

out:
	host->clock = clock;
}

641 642 643 644 645 646 647
static void sdhci_set_power(struct sdhci_host *host, unsigned short power)
{
	u8 pwr;

	if (host->power == power)
		return;

648 649
	if (power == (unsigned short)-1) {
		writeb(0, host->ioaddr + SDHCI_POWER_CONTROL);
650
		goto out;
651 652 653 654 655 656
	}

	/*
	 * Spec says that we should clear the power reg before setting
	 * a new value. Some controllers don't seem to like this though.
	 */
657
	if (!(host->quirks & SDHCI_QUIRK_SINGLE_POWER_WRITE))
658
		writeb(0, host->ioaddr + SDHCI_POWER_CONTROL);
659 660 661

	pwr = SDHCI_POWER_ON;

662
	switch (1 << power) {
663
	case MMC_VDD_165_195:
664 665
		pwr |= SDHCI_POWER_180;
		break;
666 667
	case MMC_VDD_29_30:
	case MMC_VDD_30_31:
668 669
		pwr |= SDHCI_POWER_300;
		break;
670 671
	case MMC_VDD_32_33:
	case MMC_VDD_33_34:
672 673 674 675 676 677
		pwr |= SDHCI_POWER_330;
		break;
	default:
		BUG();
	}

678 679 680 681
	/*
	 * At least the CaFe chip gets confused if we set the voltage
	 * and set turn on power at the same time, so set the voltage first.
	 */
682
	if ((host->quirks & SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER))
683 684 685
		writeb(pwr & ~SDHCI_POWER_ON,
				host->ioaddr + SDHCI_POWER_CONTROL);

686 687 688 689 690 691
	writeb(pwr, host->ioaddr + SDHCI_POWER_CONTROL);

out:
	host->power = power;
}

692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708
/*****************************************************************************\
 *                                                                           *
 * MMC callbacks                                                             *
 *                                                                           *
\*****************************************************************************/

static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
{
	struct sdhci_host *host;
	unsigned long flags;

	host = mmc_priv(mmc);

	spin_lock_irqsave(&host->lock, flags);

	WARN_ON(host->mrq != NULL);

709
#ifndef CONFIG_LEDS_CLASS
710
	sdhci_activate_led(host);
711
#endif
712 713 714 715

	host->mrq = mrq;

	if (!(readl(host->ioaddr + SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT)) {
P
Pierre Ossman 已提交
716
		host->mrq->cmd->error = -ENOMEDIUM;
717 718 719 720
		tasklet_schedule(&host->finish_tasklet);
	} else
		sdhci_send_command(host, mrq->cmd);

721
	mmiowb();
722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746
	spin_unlock_irqrestore(&host->lock, flags);
}

static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
{
	struct sdhci_host *host;
	unsigned long flags;
	u8 ctrl;

	host = mmc_priv(mmc);

	spin_lock_irqsave(&host->lock, flags);

	/*
	 * Reset the chip on each power off.
	 * Should clear out any weird states.
	 */
	if (ios->power_mode == MMC_POWER_OFF) {
		writel(0, host->ioaddr + SDHCI_SIGNAL_ENABLE);
		sdhci_init(host);
	}

	sdhci_set_clock(host, ios->clock);

	if (ios->power_mode == MMC_POWER_OFF)
747
		sdhci_set_power(host, -1);
748
	else
749
		sdhci_set_power(host, ios->vdd);
750 751

	ctrl = readb(host->ioaddr + SDHCI_HOST_CONTROL);
752

753 754 755 756
	if (ios->bus_width == MMC_BUS_WIDTH_4)
		ctrl |= SDHCI_CTRL_4BITBUS;
	else
		ctrl &= ~SDHCI_CTRL_4BITBUS;
757 758 759 760 761 762

	if (ios->timing == MMC_TIMING_SD_HS)
		ctrl |= SDHCI_CTRL_HISPD;
	else
		ctrl &= ~SDHCI_CTRL_HISPD;

763 764
	writeb(ctrl, host->ioaddr + SDHCI_HOST_CONTROL);

765 766 767 768 769
	/*
	 * Some (ENE) controllers go apeshit on some ios operation,
	 * signalling timeout and CRC errors even on CMD0. Resetting
	 * it on each ios seems to solve the problem.
	 */
770
	if(host->quirks & SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS)
771 772
		sdhci_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA);

773
	mmiowb();
774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793
	spin_unlock_irqrestore(&host->lock, flags);
}

static int sdhci_get_ro(struct mmc_host *mmc)
{
	struct sdhci_host *host;
	unsigned long flags;
	int present;

	host = mmc_priv(mmc);

	spin_lock_irqsave(&host->lock, flags);

	present = readl(host->ioaddr + SDHCI_PRESENT_STATE);

	spin_unlock_irqrestore(&host->lock, flags);

	return !(present & SDHCI_WRITE_PROTECT);
}

P
Pierre Ossman 已提交
794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817
static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
{
	struct sdhci_host *host;
	unsigned long flags;
	u32 ier;

	host = mmc_priv(mmc);

	spin_lock_irqsave(&host->lock, flags);

	ier = readl(host->ioaddr + SDHCI_INT_ENABLE);

	ier &= ~SDHCI_INT_CARD_INT;
	if (enable)
		ier |= SDHCI_INT_CARD_INT;

	writel(ier, host->ioaddr + SDHCI_INT_ENABLE);
	writel(ier, host->ioaddr + SDHCI_SIGNAL_ENABLE);

	mmiowb();

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

818
static const struct mmc_host_ops sdhci_ops = {
819 820 821
	.request	= sdhci_request,
	.set_ios	= sdhci_set_ios,
	.get_ro		= sdhci_get_ro,
P
Pierre Ossman 已提交
822
	.enable_sdio_irq = sdhci_enable_sdio_irq,
823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849
};

/*****************************************************************************\
 *                                                                           *
 * Tasklets                                                                  *
 *                                                                           *
\*****************************************************************************/

static void sdhci_tasklet_card(unsigned long param)
{
	struct sdhci_host *host;
	unsigned long flags;

	host = (struct sdhci_host*)param;

	spin_lock_irqsave(&host->lock, flags);

	if (!(readl(host->ioaddr + SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT)) {
		if (host->mrq) {
			printk(KERN_ERR "%s: Card removed during transfer!\n",
				mmc_hostname(host->mmc));
			printk(KERN_ERR "%s: Resetting controller.\n",
				mmc_hostname(host->mmc));

			sdhci_reset(host, SDHCI_RESET_CMD);
			sdhci_reset(host, SDHCI_RESET_DATA);

P
Pierre Ossman 已提交
850
			host->mrq->cmd->error = -ENOMEDIUM;
851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877
			tasklet_schedule(&host->finish_tasklet);
		}
	}

	spin_unlock_irqrestore(&host->lock, flags);

	mmc_detect_change(host->mmc, msecs_to_jiffies(500));
}

static void sdhci_tasklet_finish(unsigned long param)
{
	struct sdhci_host *host;
	unsigned long flags;
	struct mmc_request *mrq;

	host = (struct sdhci_host*)param;

	spin_lock_irqsave(&host->lock, flags);

	del_timer(&host->timer);

	mrq = host->mrq;

	/*
	 * The controller needs a reset of internal state machines
	 * upon error conditions.
	 */
P
Pierre Ossman 已提交
878 879
	if (mrq->cmd->error ||
		(mrq->data && (mrq->data->error ||
880
		(mrq->data->stop && mrq->data->stop->error))) ||
881
		(host->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST)) {
882 883

		/* Some controllers need this kick or reset won't work here */
884
		if (host->quirks & SDHCI_QUIRK_CLOCK_BEFORE_RESET) {
885 886 887 888 889 890 891 892 893 894
			unsigned int clock;

			/* This is to force an update */
			clock = host->clock;
			host->clock = 0;
			sdhci_set_clock(host, clock);
		}

		/* Spec says we should do both at the same time, but Ricoh
		   controllers do not like that. */
895 896 897 898 899 900 901 902
		sdhci_reset(host, SDHCI_RESET_CMD);
		sdhci_reset(host, SDHCI_RESET_DATA);
	}

	host->mrq = NULL;
	host->cmd = NULL;
	host->data = NULL;

903
#ifndef CONFIG_LEDS_CLASS
904
	sdhci_deactivate_led(host);
905
#endif
906

907
	mmiowb();
908 909 910 911 912 913 914 915 916 917 918 919 920 921 922
	spin_unlock_irqrestore(&host->lock, flags);

	mmc_request_done(host->mmc, mrq);
}

static void sdhci_timeout_timer(unsigned long data)
{
	struct sdhci_host *host;
	unsigned long flags;

	host = (struct sdhci_host*)data;

	spin_lock_irqsave(&host->lock, flags);

	if (host->mrq) {
P
Pierre Ossman 已提交
923 924
		printk(KERN_ERR "%s: Timeout waiting for hardware "
			"interrupt.\n", mmc_hostname(host->mmc));
925 926 927
		sdhci_dumpregs(host);

		if (host->data) {
P
Pierre Ossman 已提交
928
			host->data->error = -ETIMEDOUT;
929 930 931
			sdhci_finish_data(host);
		} else {
			if (host->cmd)
P
Pierre Ossman 已提交
932
				host->cmd->error = -ETIMEDOUT;
933
			else
P
Pierre Ossman 已提交
934
				host->mrq->cmd->error = -ETIMEDOUT;
935 936 937 938 939

			tasklet_schedule(&host->finish_tasklet);
		}
	}

940
	mmiowb();
941 942 943 944 945 946 947 948 949 950 951 952 953 954
	spin_unlock_irqrestore(&host->lock, flags);
}

/*****************************************************************************\
 *                                                                           *
 * Interrupt handling                                                        *
 *                                                                           *
\*****************************************************************************/

static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask)
{
	BUG_ON(intmask == 0);

	if (!host->cmd) {
955 956 957
		printk(KERN_ERR "%s: Got command interrupt 0x%08x even "
			"though no command operation was in progress.\n",
			mmc_hostname(host->mmc), (unsigned)intmask);
958 959 960 961
		sdhci_dumpregs(host);
		return;
	}

962
	if (intmask & SDHCI_INT_TIMEOUT)
P
Pierre Ossman 已提交
963 964 965 966
		host->cmd->error = -ETIMEDOUT;
	else if (intmask & (SDHCI_INT_CRC | SDHCI_INT_END_BIT |
			SDHCI_INT_INDEX))
		host->cmd->error = -EILSEQ;
967

P
Pierre Ossman 已提交
968
	if (host->cmd->error)
969
		tasklet_schedule(&host->finish_tasklet);
970 971
	else if (intmask & SDHCI_INT_RESPONSE)
		sdhci_finish_command(host);
972 973 974 975 976 977 978 979 980 981 982 983 984 985
}

static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
{
	BUG_ON(intmask == 0);

	if (!host->data) {
		/*
		 * A data end interrupt is sent together with the response
		 * for the stop command.
		 */
		if (intmask & SDHCI_INT_DATA_END)
			return;

986 987 988
		printk(KERN_ERR "%s: Got data interrupt 0x%08x even "
			"though no data operation was in progress.\n",
			mmc_hostname(host->mmc), (unsigned)intmask);
989 990 991 992 993 994
		sdhci_dumpregs(host);

		return;
	}

	if (intmask & SDHCI_INT_DATA_TIMEOUT)
P
Pierre Ossman 已提交
995 996 997
		host->data->error = -ETIMEDOUT;
	else if (intmask & (SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_END_BIT))
		host->data->error = -EILSEQ;
998

P
Pierre Ossman 已提交
999
	if (host->data->error)
1000 1001
		sdhci_finish_data(host);
	else {
P
Pierre Ossman 已提交
1002
		if (intmask & (SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL))
1003 1004
			sdhci_transfer_pio(host);

1005 1006 1007 1008 1009 1010 1011 1012 1013
		/*
		 * We currently don't do anything fancy with DMA
		 * boundaries, but as we can't disable the feature
		 * we need to at least restart the transfer.
		 */
		if (intmask & SDHCI_INT_DMA_END)
			writel(readl(host->ioaddr + SDHCI_DMA_ADDRESS),
				host->ioaddr + SDHCI_DMA_ADDRESS);

1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025
		if (intmask & SDHCI_INT_DATA_END) {
			if (host->cmd) {
				/*
				 * Data managed to finish before the
				 * command completed. Make sure we do
				 * things in the proper order.
				 */
				host->data_early = 1;
			} else {
				sdhci_finish_data(host);
			}
		}
1026 1027 1028
	}
}

1029
static irqreturn_t sdhci_irq(int irq, void *dev_id)
1030 1031 1032 1033
{
	irqreturn_t result;
	struct sdhci_host* host = dev_id;
	u32 intmask;
P
Pierre Ossman 已提交
1034
	int cardint = 0;
1035 1036 1037 1038 1039

	spin_lock(&host->lock);

	intmask = readl(host->ioaddr + SDHCI_INT_STATUS);

1040
	if (!intmask || intmask == 0xffffffff) {
1041 1042 1043 1044
		result = IRQ_NONE;
		goto out;
	}

1045 1046
	DBG("*** %s got interrupt: 0x%08x\n",
		mmc_hostname(host->mmc), intmask);
1047

1048 1049 1050
	if (intmask & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE)) {
		writel(intmask & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE),
			host->ioaddr + SDHCI_INT_STATUS);
1051
		tasklet_schedule(&host->card_tasklet);
1052
	}
1053

1054
	intmask &= ~(SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE);
1055

1056
	if (intmask & SDHCI_INT_CMD_MASK) {
1057 1058
		writel(intmask & SDHCI_INT_CMD_MASK,
			host->ioaddr + SDHCI_INT_STATUS);
1059
		sdhci_cmd_irq(host, intmask & SDHCI_INT_CMD_MASK);
1060 1061 1062 1063 1064
	}

	if (intmask & SDHCI_INT_DATA_MASK) {
		writel(intmask & SDHCI_INT_DATA_MASK,
			host->ioaddr + SDHCI_INT_STATUS);
1065
		sdhci_data_irq(host, intmask & SDHCI_INT_DATA_MASK);
1066 1067 1068 1069
	}

	intmask &= ~(SDHCI_INT_CMD_MASK | SDHCI_INT_DATA_MASK);

1070 1071
	intmask &= ~SDHCI_INT_ERROR;

1072
	if (intmask & SDHCI_INT_BUS_POWER) {
1073
		printk(KERN_ERR "%s: Card is consuming too much power!\n",
1074
			mmc_hostname(host->mmc));
1075
		writel(SDHCI_INT_BUS_POWER, host->ioaddr + SDHCI_INT_STATUS);
1076 1077
	}

1078
	intmask &= ~SDHCI_INT_BUS_POWER;
1079

P
Pierre Ossman 已提交
1080 1081 1082 1083 1084
	if (intmask & SDHCI_INT_CARD_INT)
		cardint = 1;

	intmask &= ~SDHCI_INT_CARD_INT;

1085
	if (intmask) {
P
Pierre Ossman 已提交
1086
		printk(KERN_ERR "%s: Unexpected interrupt 0x%08x.\n",
1087
			mmc_hostname(host->mmc), intmask);
1088 1089 1090
		sdhci_dumpregs(host);

		writel(intmask, host->ioaddr + SDHCI_INT_STATUS);
1091
	}
1092 1093 1094

	result = IRQ_HANDLED;

1095
	mmiowb();
1096 1097 1098
out:
	spin_unlock(&host->lock);

P
Pierre Ossman 已提交
1099 1100 1101 1102 1103 1104
	/*
	 * We have to delay this as it calls back into the driver.
	 */
	if (cardint)
		mmc_signal_sdio_irq(host->mmc);

1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115
	return result;
}

/*****************************************************************************\
 *                                                                           *
 * Suspend/resume                                                            *
 *                                                                           *
\*****************************************************************************/

#ifdef CONFIG_PM

1116
int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state)
1117
{
1118
	int ret;
1119

1120 1121 1122
	ret = mmc_suspend_host(host->mmc, state);
	if (ret)
		return ret;
1123

1124
	free_irq(host->irq, host);
1125 1126 1127 1128

	return 0;
}

1129
EXPORT_SYMBOL_GPL(sdhci_suspend_host);
1130

1131 1132 1133
int sdhci_resume_host(struct sdhci_host *host)
{
	int ret;
1134

1135 1136 1137 1138
	if (host->flags & SDHCI_USE_DMA) {
		if (host->ops->enable_dma)
			host->ops->enable_dma(host);
	}
1139

1140 1141
	ret = request_irq(host->irq, sdhci_irq, IRQF_SHARED,
			  mmc_hostname(host->mmc), host);
1142 1143
	if (ret)
		return ret;
1144

1145 1146 1147 1148 1149 1150
	sdhci_init(host);
	mmiowb();

	ret = mmc_resume_host(host->mmc);
	if (ret)
		return ret;
1151 1152 1153 1154

	return 0;
}

1155
EXPORT_SYMBOL_GPL(sdhci_resume_host);
1156 1157 1158 1159 1160

#endif /* CONFIG_PM */

/*****************************************************************************\
 *                                                                           *
1161
 * Device allocation/registration                                            *
1162 1163 1164
 *                                                                           *
\*****************************************************************************/

1165 1166
struct sdhci_host *sdhci_alloc_host(struct device *dev,
	size_t priv_size)
1167 1168 1169 1170
{
	struct mmc_host *mmc;
	struct sdhci_host *host;

1171
	WARN_ON(dev == NULL);
1172

1173
	mmc = mmc_alloc_host(sizeof(struct sdhci_host) + priv_size, dev);
1174
	if (!mmc)
1175
		return ERR_PTR(-ENOMEM);
1176 1177 1178 1179

	host = mmc_priv(mmc);
	host->mmc = mmc;

1180 1181
	return host;
}
1182

1183
EXPORT_SYMBOL_GPL(sdhci_alloc_host);
1184

1185 1186 1187 1188 1189 1190
int sdhci_add_host(struct sdhci_host *host)
{
	struct mmc_host *mmc;
	unsigned int caps;
	unsigned int version;
	int ret;
1191

1192 1193 1194
	WARN_ON(host == NULL);
	if (host == NULL)
		return -EINVAL;
1195

1196
	mmc = host->mmc;
1197

1198 1199
	if (debug_quirks)
		host->quirks = debug_quirks;
1200

1201 1202
	sdhci_reset(host, SDHCI_RESET_ALL);

1203 1204
	version = readw(host->ioaddr + SDHCI_HOST_VERSION);
	version = (version & SDHCI_SPEC_VER_MASK) >> SDHCI_SPEC_VER_SHIFT;
1205
	if (version > 1) {
1206
		printk(KERN_ERR "%s: Unknown controller version (%d). "
1207
			"You may experience problems.\n", mmc_hostname(mmc),
1208 1209 1210
			version);
	}

1211 1212
	caps = readl(host->ioaddr + SDHCI_CAPABILITIES);

1213
	if (host->quirks & SDHCI_QUIRK_FORCE_DMA)
1214
		host->flags |= SDHCI_USE_DMA;
1215 1216 1217
	else if (!(caps & SDHCI_CAN_DO_DMA))
		DBG("Controller doesn't have DMA capability\n");
	else
1218 1219
		host->flags |= SDHCI_USE_DMA;

1220
	if ((host->quirks & SDHCI_QUIRK_BROKEN_DMA) &&
1221
		(host->flags & SDHCI_USE_DMA)) {
R
Rolf Eike Beer 已提交
1222
		DBG("Disabling DMA as it is marked broken\n");
1223 1224 1225
		host->flags &= ~SDHCI_USE_DMA;
	}

1226
	if (host->flags & SDHCI_USE_DMA) {
1227 1228 1229 1230 1231 1232 1233
		if (host->ops->enable_dma) {
			if (host->ops->enable_dma(host)) {
				printk(KERN_WARNING "%s: No suitable DMA "
					"available. Falling back to PIO.\n",
					mmc_hostname(mmc));
				host->flags &= ~SDHCI_USE_DMA;
			}
1234 1235 1236
		}
	}

1237 1238 1239
	/* XXX: Hack to get MMC layer to avoid highmem */
	if (!(host->flags & SDHCI_USE_DMA))
		mmc_dev(host->mmc)->dma_mask = 0;
1240

1241 1242 1243 1244
	host->max_clk =
		(caps & SDHCI_CLOCK_BASE_MASK) >> SDHCI_CLOCK_BASE_SHIFT;
	if (host->max_clk == 0) {
		printk(KERN_ERR "%s: Hardware doesn't specify base clock "
1245
			"frequency.\n", mmc_hostname(mmc));
1246
		return -ENODEV;
1247
	}
1248 1249
	host->max_clk *= 1000000;

1250 1251 1252 1253
	host->timeout_clk =
		(caps & SDHCI_TIMEOUT_CLK_MASK) >> SDHCI_TIMEOUT_CLK_SHIFT;
	if (host->timeout_clk == 0) {
		printk(KERN_ERR "%s: Hardware doesn't specify timeout clock "
1254
			"frequency.\n", mmc_hostname(mmc));
1255
		return -ENODEV;
1256 1257 1258
	}
	if (caps & SDHCI_TIMEOUT_CLK_UNIT)
		host->timeout_clk *= 1000;
1259 1260 1261 1262 1263 1264 1265

	/*
	 * Set host parameters.
	 */
	mmc->ops = &sdhci_ops;
	mmc->f_min = host->max_clk / 256;
	mmc->f_max = host->max_clk;
1266
	mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ;
1267

1268 1269 1270
	if (caps & SDHCI_CAN_DO_HISPD)
		mmc->caps |= MMC_CAP_SD_HIGHSPEED;

1271 1272 1273
	mmc->ocr_avail = 0;
	if (caps & SDHCI_CAN_VDD_330)
		mmc->ocr_avail |= MMC_VDD_32_33|MMC_VDD_33_34;
P
Pierre Ossman 已提交
1274
	if (caps & SDHCI_CAN_VDD_300)
1275
		mmc->ocr_avail |= MMC_VDD_29_30|MMC_VDD_30_31;
P
Pierre Ossman 已提交
1276
	if (caps & SDHCI_CAN_VDD_180)
1277
		mmc->ocr_avail |= MMC_VDD_165_195;
1278 1279 1280

	if (mmc->ocr_avail == 0) {
		printk(KERN_ERR "%s: Hardware doesn't report any "
1281
			"support voltages.\n", mmc_hostname(mmc));
1282
		return -ENODEV;
1283 1284
	}

1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296
	spin_lock_init(&host->lock);

	/*
	 * Maximum number of segments. Hardware cannot do scatter lists.
	 */
	if (host->flags & SDHCI_USE_DMA)
		mmc->max_hw_segs = 1;
	else
		mmc->max_hw_segs = 16;
	mmc->max_phys_segs = 16;

	/*
1297
	 * Maximum number of sectors in one transfer. Limited by DMA boundary
1298
	 * size (512KiB).
1299
	 */
1300
	mmc->max_req_size = 524288;
1301 1302 1303

	/*
	 * Maximum segment size. Could be one segment with the maximum number
1304
	 * of bytes.
1305
	 */
1306
	mmc->max_seg_size = mmc->max_req_size;
1307

1308 1309 1310 1311 1312 1313
	/*
	 * Maximum block size. This varies from controller to controller and
	 * is specified in the capabilities register.
	 */
	mmc->max_blk_size = (caps & SDHCI_MAX_BLOCK_MASK) >> SDHCI_MAX_BLOCK_SHIFT;
	if (mmc->max_blk_size >= 3) {
1314 1315
		printk(KERN_WARNING "%s: Invalid maximum block size, "
			"assuming 512 bytes\n", mmc_hostname(mmc));
1316 1317 1318
		mmc->max_blk_size = 512;
	} else
		mmc->max_blk_size = 512 << mmc->max_blk_size;
1319

1320 1321 1322 1323 1324
	/*
	 * Maximum block count.
	 */
	mmc->max_blk_count = 65535;

1325 1326 1327 1328 1329 1330 1331 1332
	/*
	 * Init tasklets.
	 */
	tasklet_init(&host->card_tasklet,
		sdhci_tasklet_card, (unsigned long)host);
	tasklet_init(&host->finish_tasklet,
		sdhci_tasklet_finish, (unsigned long)host);

1333
	setup_timer(&host->timer, sdhci_timeout_timer, (unsigned long)host);
1334

1335
	ret = request_irq(host->irq, sdhci_irq, IRQF_SHARED,
1336
		mmc_hostname(mmc), host);
1337
	if (ret)
1338
		goto untasklet;
1339 1340 1341 1342 1343 1344 1345

	sdhci_init(host);

#ifdef CONFIG_MMC_DEBUG
	sdhci_dumpregs(host);
#endif

1346 1347 1348 1349 1350 1351
#ifdef CONFIG_LEDS_CLASS
	host->led.name = mmc_hostname(mmc);
	host->led.brightness = LED_OFF;
	host->led.default_trigger = mmc_hostname(mmc);
	host->led.brightness_set = sdhci_led_control;

1352
	ret = led_classdev_register(mmc_dev(mmc), &host->led);
1353 1354 1355 1356
	if (ret)
		goto reset;
#endif

1357 1358
	mmiowb();

1359 1360
	mmc_add_host(mmc);

1361 1362
	printk(KERN_INFO "%s: SDHCI controller on %s [%s] using %s\n",
		mmc_hostname(mmc), host->hw_name, mmc_dev(mmc)->bus_id,
1363 1364 1365 1366
		(host->flags & SDHCI_USE_DMA)?"DMA":"PIO");

	return 0;

1367 1368 1369 1370 1371
#ifdef CONFIG_LEDS_CLASS
reset:
	sdhci_reset(host, SDHCI_RESET_ALL);
	free_irq(host->irq, host);
#endif
1372
untasklet:
1373 1374 1375 1376 1377 1378
	tasklet_kill(&host->card_tasklet);
	tasklet_kill(&host->finish_tasklet);

	return ret;
}

1379
EXPORT_SYMBOL_GPL(sdhci_add_host);
1380

1381 1382 1383
void sdhci_remove_host(struct sdhci_host *host)
{
	mmc_remove_host(host->mmc);
1384

1385 1386 1387 1388
#ifdef CONFIG_LEDS_CLASS
	led_classdev_unregister(&host->led);
#endif

1389 1390 1391 1392 1393 1394 1395 1396 1397 1398
	sdhci_reset(host, SDHCI_RESET_ALL);

	free_irq(host->irq, host);

	del_timer_sync(&host->timer);

	tasklet_kill(&host->card_tasklet);
	tasklet_kill(&host->finish_tasklet);
}

1399
EXPORT_SYMBOL_GPL(sdhci_remove_host);
1400

1401
void sdhci_free_host(struct sdhci_host *host)
1402
{
1403
	mmc_free_host(host->mmc);
1404 1405
}

1406
EXPORT_SYMBOL_GPL(sdhci_free_host);
1407 1408 1409 1410 1411 1412 1413 1414 1415 1416

/*****************************************************************************\
 *                                                                           *
 * Driver init/exit                                                          *
 *                                                                           *
\*****************************************************************************/

static int __init sdhci_drv_init(void)
{
	printk(KERN_INFO DRIVER_NAME
1417
		": Secure Digital Host Controller Interface driver\n");
1418 1419
	printk(KERN_INFO DRIVER_NAME ": Copyright(c) Pierre Ossman\n");

1420
	return 0;
1421 1422 1423 1424 1425 1426 1427 1428 1429
}

static void __exit sdhci_drv_exit(void)
{
}

module_init(sdhci_drv_init);
module_exit(sdhci_drv_exit);

1430
module_param(debug_quirks, uint, 0444);
1431

1432
MODULE_AUTHOR("Pierre Ossman <drzeus@drzeus.cx>");
1433
MODULE_DESCRIPTION("Secure Digital Host Controller Interface core driver");
1434
MODULE_LICENSE("GPL");
1435

1436
MODULE_PARM_DESC(debug_quirks, "Force certain quirks.");