sdhci.c 34.2 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 318
}

static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)
{
319 320
	u8 count;
	unsigned target_timeout, current_timeout;
321 322 323

	WARN_ON(host->data);

324
	if (data == NULL)
325 326
		return;

327 328
	/* Sanity checks */
	BUG_ON(data->blksz * data->blocks > 524288);
329
	BUG_ON(data->blksz > host->mmc->max_blk_size);
330
	BUG_ON(data->blocks > 65535);
331

332 333 334
	host->data = data;
	host->data_early = 0;

335 336 337
	/* timeout in us */
	target_timeout = data->timeout_ns / 1000 +
		data->timeout_clks / host->clock;
338

339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
	/*
	 * 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;
	}

358 359 360 361
	/*
	 * Compensate for an off-by-one error in the CaFe hardware; otherwise,
	 * a too-small count gives us interrupt timeouts.
	 */
362
	if ((host->quirks & SDHCI_QUIRK_INCR_TIMEOUT_CONTROL))
363 364
		count++;

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

	writeb(count, host->ioaddr + SDHCI_TIMEOUT_CONTROL);
372

373 374 375 376
	if (host->flags & SDHCI_USE_DMA)
		host->flags |= SDHCI_REQ_USE_DMA;

	if (unlikely((host->flags & SDHCI_REQ_USE_DMA) &&
377
		(host->quirks & SDHCI_QUIRK_32BIT_DMA_SIZE) &&
378 379 380 381 382 383 384 385 386 387 388
		((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) &&
389
		(host->quirks & SDHCI_QUIRK_32BIT_DMA_ADDR) &&
390 391 392 393 394 395
		(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) {
396 397
		int count;

398 399 400 401
		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);
402

403 404
		writel(sg_dma_address(data->sg),
			host->ioaddr + SDHCI_DMA_ADDRESS);
405 406 407 408 409 410 411
	} else {
		host->cur_sg = data->sg;
		host->num_sg = data->sg_len;

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

413 414 415
	/* 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);
416 417 418 419 420 421 422 423 424 425 426
	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;

427 428
	WARN_ON(!host->data);

429 430 431 432 433
	mode = SDHCI_TRNS_BLK_CNT_EN;
	if (data->blocks > 1)
		mode |= SDHCI_TRNS_MULTI;
	if (data->flags & MMC_DATA_READ)
		mode |= SDHCI_TRNS_READ;
434
	if (host->flags & SDHCI_REQ_USE_DMA)
435 436 437
		mode |= SDHCI_TRNS_DMA;

	writew(mode, host->ioaddr + SDHCI_TRANSFER_MODE);
438 439 440 441 442 443 444 445 446 447 448
}

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

	BUG_ON(!host->data);

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

449
	if (host->flags & SDHCI_REQ_USE_DMA) {
450 451 452
		dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
			(data->flags & MMC_DATA_READ) ?
				DMA_FROM_DEVICE : DMA_TO_DEVICE);
453 454 455
	}

	/*
456 457 458 459 460
	 * 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.
461
	 */
462 463
	if (data->error)
		data->bytes_xfered = 0;
464
	else
465
		data->bytes_xfered = data->blksz * data->blocks;
466 467 468 469 470 471

	if (data->stop) {
		/*
		 * The controller needs a reset of internal state machines
		 * upon error conditions.
		 */
P
Pierre Ossman 已提交
472
		if (data->error) {
473 474 475 476 477 478 479 480 481 482 483 484
			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;
485
	u32 mask;
486
	unsigned long timeout;
487 488 489 490

	WARN_ON(host->cmd);

	/* Wait max 10 ms */
491
	timeout = 10;
492 493 494 495 496 497 498 499 500 501 502

	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) {
503
		if (timeout == 0) {
504
			printk(KERN_ERR "%s: Controller never released "
P
Pierre Ossman 已提交
505
				"inhibit bit(s).\n", mmc_hostname(host->mmc));
506
			sdhci_dumpregs(host);
P
Pierre Ossman 已提交
507
			cmd->error = -EIO;
508 509 510
			tasklet_schedule(&host->finish_tasklet);
			return;
		}
511 512 513
		timeout--;
		mdelay(1);
	}
514 515 516 517 518 519 520 521 522

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

	host->cmd = cmd;

	sdhci_prepare_data(host, cmd->data);

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

523 524
	sdhci_set_transfer_mode(host, cmd->data);

525
	if ((cmd->flags & MMC_RSP_136) && (cmd->flags & MMC_RSP_BUSY)) {
P
Pierre Ossman 已提交
526
		printk(KERN_ERR "%s: Unsupported response type!\n",
527
			mmc_hostname(host->mmc));
P
Pierre Ossman 已提交
528
		cmd->error = -EINVAL;
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548
		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;

549
	writew(SDHCI_MAKE_CMD(cmd->opcode, flags),
550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574
		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 已提交
575
	host->cmd->error = 0;
576

577 578 579 580
	if (host->data && host->data_early)
		sdhci_finish_data(host);

	if (!host->cmd->data)
581 582 583 584 585 586 587 588 589
		tasklet_schedule(&host->finish_tasklet);

	host->cmd = NULL;
}

static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
{
	int div;
	u16 clk;
590
	unsigned long timeout;
591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610

	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 */
611 612 613 614
	timeout = 10;
	while (!((clk = readw(host->ioaddr + SDHCI_CLOCK_CONTROL))
		& SDHCI_CLOCK_INT_STABLE)) {
		if (timeout == 0) {
P
Pierre Ossman 已提交
615 616
			printk(KERN_ERR "%s: Internal clock never "
				"stabilised.\n", mmc_hostname(host->mmc));
617 618 619
			sdhci_dumpregs(host);
			return;
		}
620 621 622
		timeout--;
		mdelay(1);
	}
623 624 625 626 627 628 629 630

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

out:
	host->clock = clock;
}

631 632 633 634 635 636 637
static void sdhci_set_power(struct sdhci_host *host, unsigned short power)
{
	u8 pwr;

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

638 639
	if (power == (unsigned short)-1) {
		writeb(0, host->ioaddr + SDHCI_POWER_CONTROL);
640
		goto out;
641 642 643 644 645 646
	}

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

	pwr = SDHCI_POWER_ON;

652
	switch (1 << power) {
653
	case MMC_VDD_165_195:
654 655
		pwr |= SDHCI_POWER_180;
		break;
656 657
	case MMC_VDD_29_30:
	case MMC_VDD_30_31:
658 659
		pwr |= SDHCI_POWER_300;
		break;
660 661
	case MMC_VDD_32_33:
	case MMC_VDD_33_34:
662 663 664 665 666 667
		pwr |= SDHCI_POWER_330;
		break;
	default:
		BUG();
	}

668 669 670 671
	/*
	 * 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.
	 */
672
	if ((host->quirks & SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER))
673 674 675
		writeb(pwr & ~SDHCI_POWER_ON,
				host->ioaddr + SDHCI_POWER_CONTROL);

676 677 678 679 680 681
	writeb(pwr, host->ioaddr + SDHCI_POWER_CONTROL);

out:
	host->power = power;
}

682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698
/*****************************************************************************\
 *                                                                           *
 * 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);

699
#ifndef CONFIG_LEDS_CLASS
700
	sdhci_activate_led(host);
701
#endif
702 703 704 705

	host->mrq = mrq;

	if (!(readl(host->ioaddr + SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT)) {
P
Pierre Ossman 已提交
706
		host->mrq->cmd->error = -ENOMEDIUM;
707 708 709 710
		tasklet_schedule(&host->finish_tasklet);
	} else
		sdhci_send_command(host, mrq->cmd);

711
	mmiowb();
712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736
	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)
737
		sdhci_set_power(host, -1);
738
	else
739
		sdhci_set_power(host, ios->vdd);
740 741

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

743 744 745 746
	if (ios->bus_width == MMC_BUS_WIDTH_4)
		ctrl |= SDHCI_CTRL_4BITBUS;
	else
		ctrl &= ~SDHCI_CTRL_4BITBUS;
747 748 749 750 751 752

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

753 754
	writeb(ctrl, host->ioaddr + SDHCI_HOST_CONTROL);

755 756 757 758 759
	/*
	 * 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.
	 */
760
	if(host->quirks & SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS)
761 762
		sdhci_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA);

763
	mmiowb();
764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783
	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 已提交
784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807
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);
}

808
static const struct mmc_host_ops sdhci_ops = {
809 810 811
	.request	= sdhci_request,
	.set_ios	= sdhci_set_ios,
	.get_ro		= sdhci_get_ro,
P
Pierre Ossman 已提交
812
	.enable_sdio_irq = sdhci_enable_sdio_irq,
813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839
};

/*****************************************************************************\
 *                                                                           *
 * 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 已提交
840
			host->mrq->cmd->error = -ENOMEDIUM;
841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867
			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 已提交
868 869
	if (mrq->cmd->error ||
		(mrq->data && (mrq->data->error ||
870
		(mrq->data->stop && mrq->data->stop->error))) ||
871
		(host->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST)) {
872 873

		/* Some controllers need this kick or reset won't work here */
874
		if (host->quirks & SDHCI_QUIRK_CLOCK_BEFORE_RESET) {
875 876 877 878 879 880 881 882 883 884
			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. */
885 886 887 888 889 890 891 892
		sdhci_reset(host, SDHCI_RESET_CMD);
		sdhci_reset(host, SDHCI_RESET_DATA);
	}

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

893
#ifndef CONFIG_LEDS_CLASS
894
	sdhci_deactivate_led(host);
895
#endif
896

897
	mmiowb();
898 899 900 901 902 903 904 905 906 907 908 909 910 911 912
	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 已提交
913 914
		printk(KERN_ERR "%s: Timeout waiting for hardware "
			"interrupt.\n", mmc_hostname(host->mmc));
915 916 917
		sdhci_dumpregs(host);

		if (host->data) {
P
Pierre Ossman 已提交
918
			host->data->error = -ETIMEDOUT;
919 920 921
			sdhci_finish_data(host);
		} else {
			if (host->cmd)
P
Pierre Ossman 已提交
922
				host->cmd->error = -ETIMEDOUT;
923
			else
P
Pierre Ossman 已提交
924
				host->mrq->cmd->error = -ETIMEDOUT;
925 926 927 928 929

			tasklet_schedule(&host->finish_tasklet);
		}
	}

930
	mmiowb();
931 932 933 934 935 936 937 938 939 940 941 942 943 944
	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) {
945 946 947
		printk(KERN_ERR "%s: Got command interrupt 0x%08x even "
			"though no command operation was in progress.\n",
			mmc_hostname(host->mmc), (unsigned)intmask);
948 949 950 951
		sdhci_dumpregs(host);
		return;
	}

952
	if (intmask & SDHCI_INT_TIMEOUT)
P
Pierre Ossman 已提交
953 954 955 956
		host->cmd->error = -ETIMEDOUT;
	else if (intmask & (SDHCI_INT_CRC | SDHCI_INT_END_BIT |
			SDHCI_INT_INDEX))
		host->cmd->error = -EILSEQ;
957

P
Pierre Ossman 已提交
958
	if (host->cmd->error)
959
		tasklet_schedule(&host->finish_tasklet);
960 961
	else if (intmask & SDHCI_INT_RESPONSE)
		sdhci_finish_command(host);
962 963 964 965 966 967 968 969 970 971 972 973 974 975
}

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;

976 977 978
		printk(KERN_ERR "%s: Got data interrupt 0x%08x even "
			"though no data operation was in progress.\n",
			mmc_hostname(host->mmc), (unsigned)intmask);
979 980 981 982 983 984
		sdhci_dumpregs(host);

		return;
	}

	if (intmask & SDHCI_INT_DATA_TIMEOUT)
P
Pierre Ossman 已提交
985 986 987
		host->data->error = -ETIMEDOUT;
	else if (intmask & (SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_END_BIT))
		host->data->error = -EILSEQ;
988

P
Pierre Ossman 已提交
989
	if (host->data->error)
990 991
		sdhci_finish_data(host);
	else {
P
Pierre Ossman 已提交
992
		if (intmask & (SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL))
993 994
			sdhci_transfer_pio(host);

995 996 997 998 999 1000 1001 1002 1003
		/*
		 * 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);

1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015
		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);
			}
		}
1016 1017 1018
	}
}

1019
static irqreturn_t sdhci_irq(int irq, void *dev_id)
1020 1021 1022 1023
{
	irqreturn_t result;
	struct sdhci_host* host = dev_id;
	u32 intmask;
P
Pierre Ossman 已提交
1024
	int cardint = 0;
1025 1026 1027 1028 1029

	spin_lock(&host->lock);

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

1030
	if (!intmask || intmask == 0xffffffff) {
1031 1032 1033 1034
		result = IRQ_NONE;
		goto out;
	}

1035 1036
	DBG("*** %s got interrupt: 0x%08x\n",
		mmc_hostname(host->mmc), intmask);
1037

1038 1039 1040
	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);
1041
		tasklet_schedule(&host->card_tasklet);
1042
	}
1043

1044
	intmask &= ~(SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE);
1045

1046
	if (intmask & SDHCI_INT_CMD_MASK) {
1047 1048
		writel(intmask & SDHCI_INT_CMD_MASK,
			host->ioaddr + SDHCI_INT_STATUS);
1049
		sdhci_cmd_irq(host, intmask & SDHCI_INT_CMD_MASK);
1050 1051 1052 1053 1054
	}

	if (intmask & SDHCI_INT_DATA_MASK) {
		writel(intmask & SDHCI_INT_DATA_MASK,
			host->ioaddr + SDHCI_INT_STATUS);
1055
		sdhci_data_irq(host, intmask & SDHCI_INT_DATA_MASK);
1056 1057 1058 1059
	}

	intmask &= ~(SDHCI_INT_CMD_MASK | SDHCI_INT_DATA_MASK);

1060 1061
	intmask &= ~SDHCI_INT_ERROR;

1062
	if (intmask & SDHCI_INT_BUS_POWER) {
1063
		printk(KERN_ERR "%s: Card is consuming too much power!\n",
1064
			mmc_hostname(host->mmc));
1065
		writel(SDHCI_INT_BUS_POWER, host->ioaddr + SDHCI_INT_STATUS);
1066 1067
	}

1068
	intmask &= ~SDHCI_INT_BUS_POWER;
1069

P
Pierre Ossman 已提交
1070 1071 1072 1073 1074
	if (intmask & SDHCI_INT_CARD_INT)
		cardint = 1;

	intmask &= ~SDHCI_INT_CARD_INT;

1075
	if (intmask) {
P
Pierre Ossman 已提交
1076
		printk(KERN_ERR "%s: Unexpected interrupt 0x%08x.\n",
1077
			mmc_hostname(host->mmc), intmask);
1078 1079 1080
		sdhci_dumpregs(host);

		writel(intmask, host->ioaddr + SDHCI_INT_STATUS);
1081
	}
1082 1083 1084

	result = IRQ_HANDLED;

1085
	mmiowb();
1086 1087 1088
out:
	spin_unlock(&host->lock);

P
Pierre Ossman 已提交
1089 1090 1091 1092 1093 1094
	/*
	 * We have to delay this as it calls back into the driver.
	 */
	if (cardint)
		mmc_signal_sdio_irq(host->mmc);

1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105
	return result;
}

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

#ifdef CONFIG_PM

1106
int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state)
1107
{
1108
	int ret;
1109

1110 1111 1112
	ret = mmc_suspend_host(host->mmc, state);
	if (ret)
		return ret;
1113

1114
	free_irq(host->irq, host);
1115 1116 1117 1118

	return 0;
}

1119
EXPORT_SYMBOL_GPL(sdhci_suspend_host);
1120

1121 1122 1123
int sdhci_resume_host(struct sdhci_host *host)
{
	int ret;
1124

1125 1126 1127 1128
	if (host->flags & SDHCI_USE_DMA) {
		if (host->ops->enable_dma)
			host->ops->enable_dma(host);
	}
1129

1130 1131
	ret = request_irq(host->irq, sdhci_irq, IRQF_SHARED,
			  mmc_hostname(host->mmc), host);
1132 1133
	if (ret)
		return ret;
1134

1135 1136 1137 1138 1139 1140
	sdhci_init(host);
	mmiowb();

	ret = mmc_resume_host(host->mmc);
	if (ret)
		return ret;
1141 1142 1143 1144

	return 0;
}

1145
EXPORT_SYMBOL_GPL(sdhci_resume_host);
1146 1147 1148 1149 1150

#endif /* CONFIG_PM */

/*****************************************************************************\
 *                                                                           *
1151
 * Device allocation/registration                                            *
1152 1153 1154
 *                                                                           *
\*****************************************************************************/

1155 1156
struct sdhci_host *sdhci_alloc_host(struct device *dev,
	size_t priv_size)
1157 1158 1159 1160
{
	struct mmc_host *mmc;
	struct sdhci_host *host;

1161
	WARN_ON(dev == NULL);
1162

1163
	mmc = mmc_alloc_host(sizeof(struct sdhci_host) + priv_size, dev);
1164
	if (!mmc)
1165
		return ERR_PTR(-ENOMEM);
1166 1167 1168 1169

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

1170 1171
	return host;
}
1172

1173
EXPORT_SYMBOL_GPL(sdhci_alloc_host);
1174

1175 1176 1177 1178 1179 1180
int sdhci_add_host(struct sdhci_host *host)
{
	struct mmc_host *mmc;
	unsigned int caps;
	unsigned int version;
	int ret;
1181

1182 1183 1184
	WARN_ON(host == NULL);
	if (host == NULL)
		return -EINVAL;
1185

1186
	mmc = host->mmc;
1187

1188 1189
	if (debug_quirks)
		host->quirks = debug_quirks;
1190

1191 1192
	sdhci_reset(host, SDHCI_RESET_ALL);

1193 1194
	version = readw(host->ioaddr + SDHCI_HOST_VERSION);
	version = (version & SDHCI_SPEC_VER_MASK) >> SDHCI_SPEC_VER_SHIFT;
1195
	if (version > 1) {
1196
		printk(KERN_ERR "%s: Unknown controller version (%d). "
1197
			"You may experience problems.\n", mmc_hostname(mmc),
1198 1199 1200
			version);
	}

1201 1202
	caps = readl(host->ioaddr + SDHCI_CAPABILITIES);

1203
	if (host->quirks & SDHCI_QUIRK_FORCE_DMA)
1204
		host->flags |= SDHCI_USE_DMA;
1205 1206 1207
	else if (!(caps & SDHCI_CAN_DO_DMA))
		DBG("Controller doesn't have DMA capability\n");
	else
1208 1209
		host->flags |= SDHCI_USE_DMA;

1210
	if ((host->quirks & SDHCI_QUIRK_BROKEN_DMA) &&
1211
		(host->flags & SDHCI_USE_DMA)) {
R
Rolf Eike Beer 已提交
1212
		DBG("Disabling DMA as it is marked broken\n");
1213 1214 1215
		host->flags &= ~SDHCI_USE_DMA;
	}

1216
	if (host->flags & SDHCI_USE_DMA) {
1217 1218 1219 1220 1221 1222 1223
		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;
			}
1224 1225 1226
		}
	}

1227 1228 1229
	/* XXX: Hack to get MMC layer to avoid highmem */
	if (!(host->flags & SDHCI_USE_DMA))
		mmc_dev(host->mmc)->dma_mask = 0;
1230

1231 1232 1233 1234
	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 "
1235
			"frequency.\n", mmc_hostname(mmc));
1236
		return -ENODEV;
1237
	}
1238 1239
	host->max_clk *= 1000000;

1240 1241 1242 1243
	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 "
1244
			"frequency.\n", mmc_hostname(mmc));
1245
		return -ENODEV;
1246 1247 1248
	}
	if (caps & SDHCI_TIMEOUT_CLK_UNIT)
		host->timeout_clk *= 1000;
1249 1250 1251 1252 1253 1254 1255

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

1258 1259 1260
	if (caps & SDHCI_CAN_DO_HISPD)
		mmc->caps |= MMC_CAP_SD_HIGHSPEED;

1261 1262 1263
	mmc->ocr_avail = 0;
	if (caps & SDHCI_CAN_VDD_330)
		mmc->ocr_avail |= MMC_VDD_32_33|MMC_VDD_33_34;
P
Pierre Ossman 已提交
1264
	if (caps & SDHCI_CAN_VDD_300)
1265
		mmc->ocr_avail |= MMC_VDD_29_30|MMC_VDD_30_31;
P
Pierre Ossman 已提交
1266
	if (caps & SDHCI_CAN_VDD_180)
1267
		mmc->ocr_avail |= MMC_VDD_165_195;
1268 1269 1270

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

1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286
	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;

	/*
1287
	 * Maximum number of sectors in one transfer. Limited by DMA boundary
1288
	 * size (512KiB).
1289
	 */
1290
	mmc->max_req_size = 524288;
1291 1292 1293

	/*
	 * Maximum segment size. Could be one segment with the maximum number
1294
	 * of bytes.
1295
	 */
1296
	mmc->max_seg_size = mmc->max_req_size;
1297

1298 1299 1300 1301 1302 1303
	/*
	 * 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) {
1304 1305
		printk(KERN_WARNING "%s: Invalid maximum block size, "
			"assuming 512 bytes\n", mmc_hostname(mmc));
1306 1307 1308
		mmc->max_blk_size = 512;
	} else
		mmc->max_blk_size = 512 << mmc->max_blk_size;
1309

1310 1311 1312 1313 1314
	/*
	 * Maximum block count.
	 */
	mmc->max_blk_count = 65535;

1315 1316 1317 1318 1319 1320 1321 1322
	/*
	 * Init tasklets.
	 */
	tasklet_init(&host->card_tasklet,
		sdhci_tasklet_card, (unsigned long)host);
	tasklet_init(&host->finish_tasklet,
		sdhci_tasklet_finish, (unsigned long)host);

1323
	setup_timer(&host->timer, sdhci_timeout_timer, (unsigned long)host);
1324

1325
	ret = request_irq(host->irq, sdhci_irq, IRQF_SHARED,
1326
		mmc_hostname(mmc), host);
1327
	if (ret)
1328
		goto untasklet;
1329 1330 1331 1332 1333 1334 1335

	sdhci_init(host);

#ifdef CONFIG_MMC_DEBUG
	sdhci_dumpregs(host);
#endif

1336 1337 1338 1339 1340 1341
#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;

1342
	ret = led_classdev_register(mmc_dev(mmc), &host->led);
1343 1344 1345 1346
	if (ret)
		goto reset;
#endif

1347 1348
	mmiowb();

1349 1350
	mmc_add_host(mmc);

1351 1352
	printk(KERN_INFO "%s: SDHCI controller on %s [%s] using %s\n",
		mmc_hostname(mmc), host->hw_name, mmc_dev(mmc)->bus_id,
1353 1354 1355 1356
		(host->flags & SDHCI_USE_DMA)?"DMA":"PIO");

	return 0;

1357 1358 1359 1360 1361
#ifdef CONFIG_LEDS_CLASS
reset:
	sdhci_reset(host, SDHCI_RESET_ALL);
	free_irq(host->irq, host);
#endif
1362
untasklet:
1363 1364 1365 1366 1367 1368
	tasklet_kill(&host->card_tasklet);
	tasklet_kill(&host->finish_tasklet);

	return ret;
}

1369
EXPORT_SYMBOL_GPL(sdhci_add_host);
1370

1371 1372 1373
void sdhci_remove_host(struct sdhci_host *host)
{
	mmc_remove_host(host->mmc);
1374

1375 1376 1377 1378
#ifdef CONFIG_LEDS_CLASS
	led_classdev_unregister(&host->led);
#endif

1379 1380 1381 1382 1383 1384 1385 1386 1387 1388
	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);
}

1389
EXPORT_SYMBOL_GPL(sdhci_remove_host);
1390

1391
void sdhci_free_host(struct sdhci_host *host)
1392
{
1393
	mmc_free_host(host->mmc);
1394 1395
}

1396
EXPORT_SYMBOL_GPL(sdhci_free_host);
1397 1398 1399 1400 1401 1402 1403 1404 1405 1406

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

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

1410
	return 0;
1411 1412 1413 1414 1415 1416 1417 1418 1419
}

static void __exit sdhci_drv_exit(void)
{
}

module_init(sdhci_drv_init);
module_exit(sdhci_drv_exit);

1420
module_param(debug_quirks, uint, 0444);
1421

1422
MODULE_AUTHOR("Pierre Ossman <drzeus@drzeus.cx>");
1423
MODULE_DESCRIPTION("Secure Digital Host Controller Interface core driver");
1424
MODULE_LICENSE("GPL");
1425

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