at91_mci.c 25.6 KB
Newer Older
1
/*
P
Pierre Ossman 已提交
2
 *  linux/drivers/mmc/host/at91_mci.c - ATMEL AT91 MCI Driver
3 4 5 6 7 8 9 10 11 12 13
 *
 *  Copyright (C) 2005 Cougar Creek Computing Devices Ltd, All Rights Reserved
 *
 *  Copyright (C) 2006 Malcolm Noyes
 *
 * 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.
 */

/*
A
Andrew Victor 已提交
14
   This is the AT91 MCI driver that has been tested with both MMC cards
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
   and SD-cards.  Boards that support write protect are now supported.
   The CCAT91SBC001 board does not support SD cards.

   The three entry points are at91_mci_request, at91_mci_set_ios
   and at91_mci_get_ro.

   SET IOS
     This configures the device to put it into the correct mode and clock speed
     required.

   MCI REQUEST
     MCI request processes the commands sent in the mmc_request structure. This
     can consist of a processing command and a stop command in the case of
     multiple block transfers.

     There are three main types of request, commands, reads and writes.

     Commands are straight forward. The command is submitted to the controller and
     the request function returns. When the controller generates an interrupt to indicate
     the command is finished, the response to the command are read and the mmc_request_done
     function called to end the request.

     Reads and writes work in a similar manner to normal commands but involve the PDC (DMA)
     controller to manage the transfers.

     A read is done from the controller directly to the scatterlist passed in from the request.
A
Andrew Victor 已提交
41 42
     Due to a bug in the AT91RM9200 controller, when a read is completed, all the words are byte
     swapped in the scatterlist buffers.  AT91SAM926x are not affected by this bug.
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

     The sequence of read interrupts is: ENDRX, RXBUFF, CMDRDY

     A write is slightly different in that the bytes to write are read from the scatterlist
     into a dma memory buffer (this is in case the source buffer should be read only). The
     entire write buffer is then done from this single dma memory buffer.

     The sequence of write interrupts is: ENDTX, TXBUFE, NOTBUSY, CMDRDY

   GET RO
     Gets the status of the write protect pin, if available.
*/

#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>
#include <linux/blkdev.h>
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/dma-mapping.h>
#include <linux/clk.h>
67
#include <linux/atmel_pdc.h>
68 69 70 71 72 73 74

#include <linux/mmc/host.h>

#include <asm/io.h>
#include <asm/irq.h>
#include <asm/mach/mmc.h>
#include <asm/arch/board.h>
A
Andrew Victor 已提交
75
#include <asm/arch/cpu.h>
76
#include <asm/arch/gpio.h>
77
#include <asm/arch/at91_mci.h>
78 79 80

#define DRIVER_NAME "at91_mci"

81 82
#define FL_SENT_COMMAND	(1 << 0)
#define FL_SENT_STOP	(1 << 1)
83

84 85
#define AT91_MCI_ERRORS	(AT91_MCI_RINDE | AT91_MCI_RDIRE | AT91_MCI_RCRCE	\
		| AT91_MCI_RENDE | AT91_MCI_RTOE | AT91_MCI_DCRCE		\
86
		| AT91_MCI_DTOE | AT91_MCI_OVRE | AT91_MCI_UNRE)
87

A
Andrew Victor 已提交
88 89
#define at91_mci_read(host, reg)	__raw_readl((host)->baseaddr + (reg))
#define at91_mci_write(host, reg, val)	__raw_writel((val), (host)->baseaddr + (reg))
90 91 92 93 94 95 96 97 98 99 100


/*
 * Low level type for this driver
 */
struct at91mci_host
{
	struct mmc_host *mmc;
	struct mmc_command *cmd;
	struct mmc_request *request;

A
Andrew Victor 已提交
101
	void __iomem *baseaddr;
102
	int irq;
A
Andrew Victor 已提交
103

104 105 106
	struct at91_mmc_data *board;
	int present;

107 108
	struct clk *mci_clk;

109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
	/*
	 * Flag indicating when the command has been sent. This is used to
	 * work out whether or not to send the stop
	 */
	unsigned int flags;
	/* flag for current bus settings */
	u32 bus_mode;

	/* DMA buffer used for transmitting */
	unsigned int* buffer;
	dma_addr_t physical_address;
	unsigned int total_length;

	/* Latest in the scatterlist that has been enabled for transfer, but not freed */
	int in_use_index;

	/* Latest in the scatterlist that has been enabled for transfer */
	int transfer_index;
};

/*
 * Copy from sg to a dma block - used for transfers
 */
N
Nicolas Ferre 已提交
132
static inline void at91_mci_sg_to_dma(struct at91mci_host *host, struct mmc_data *data)
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
{
	unsigned int len, i, size;
	unsigned *dmabuf = host->buffer;

	size = host->total_length;
	len = data->sg_len;

	/*
	 * Just loop through all entries. Size might not
	 * be the entire list though so make sure that
	 * we do not transfer too much.
	 */
	for (i = 0; i < len; i++) {
		struct scatterlist *sg;
		int amount;
		unsigned int *sgbuffer;

		sg = &data->sg[i];

J
Jens Axboe 已提交
152
		sgbuffer = kmap_atomic(sg_page(sg), KM_BIO_SRC_IRQ) + sg->offset;
153 154 155
		amount = min(size, sg->length);
		size -= amount;

A
Andrew Victor 已提交
156 157 158 159 160 161 162 163
		if (cpu_is_at91rm9200()) {	/* AT91RM9200 errata */
			int index;

			for (index = 0; index < (amount / 4); index++)
				*dmabuf++ = swab32(sgbuffer[index]);
		}
		else
			memcpy(dmabuf, sgbuffer, amount);
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180

		kunmap_atomic(sgbuffer, KM_BIO_SRC_IRQ);

		if (size == 0)
			break;
	}

	/*
	 * Check that we didn't get a request to transfer
	 * more data than can fit into the SG list.
	 */
	BUG_ON(size != 0);
}

/*
 * Prepare a dma read
 */
N
Nicolas Ferre 已提交
181
static void at91_mci_pre_dma_read(struct at91mci_host *host)
182 183 184 185 186 187
{
	int i;
	struct scatterlist *sg;
	struct mmc_command *cmd;
	struct mmc_data *data;

188
	pr_debug("pre dma read\n");
189 190 191

	cmd = host->cmd;
	if (!cmd) {
192
		pr_debug("no command\n");
193 194 195 196 197
		return;
	}

	data = cmd->data;
	if (!data) {
198
		pr_debug("no data\n");
199 200 201 202 203 204
		return;
	}

	for (i = 0; i < 2; i++) {
		/* nothing left to transfer */
		if (host->transfer_index >= data->sg_len) {
205
			pr_debug("Nothing left to transfer (index = %d)\n", host->transfer_index);
206 207 208 209 210
			break;
		}

		/* Check to see if this needs filling */
		if (i == 0) {
211
			if (at91_mci_read(host, ATMEL_PDC_RCR) != 0) {
212
				pr_debug("Transfer active in current\n");
213 214 215 216
				continue;
			}
		}
		else {
217
			if (at91_mci_read(host, ATMEL_PDC_RNCR) != 0) {
218
				pr_debug("Transfer active in next\n");
219 220 221 222 223
				continue;
			}
		}

		/* Setup the next transfer */
224
		pr_debug("Using transfer index %d\n", host->transfer_index);
225 226

		sg = &data->sg[host->transfer_index++];
227
		pr_debug("sg = %p\n", sg);
228

J
Jens Axboe 已提交
229
		sg->dma_address = dma_map_page(NULL, sg_page(sg), sg->offset, sg->length, DMA_FROM_DEVICE);
230

231
		pr_debug("dma address = %08X, length = %d\n", sg->dma_address, sg->length);
232 233

		if (i == 0) {
234 235
			at91_mci_write(host, ATMEL_PDC_RPR, sg->dma_address);
			at91_mci_write(host, ATMEL_PDC_RCR, sg->length / 4);
236 237
		}
		else {
238 239
			at91_mci_write(host, ATMEL_PDC_RNPR, sg->dma_address);
			at91_mci_write(host, ATMEL_PDC_RNCR, sg->length / 4);
240 241 242
		}
	}

243
	pr_debug("pre dma read done\n");
244 245 246 247 248
}

/*
 * Handle after a dma read
 */
N
Nicolas Ferre 已提交
249
static void at91_mci_post_dma_read(struct at91mci_host *host)
250 251 252 253
{
	struct mmc_command *cmd;
	struct mmc_data *data;

254
	pr_debug("post dma read\n");
255 256 257

	cmd = host->cmd;
	if (!cmd) {
258
		pr_debug("no command\n");
259 260 261 262 263
		return;
	}

	data = cmd->data;
	if (!data) {
264
		pr_debug("no data\n");
265 266 267 268 269 270
		return;
	}

	while (host->in_use_index < host->transfer_index) {
		struct scatterlist *sg;

271
		pr_debug("finishing index %d\n", host->in_use_index);
272 273 274

		sg = &data->sg[host->in_use_index++];

275
		pr_debug("Unmapping page %08X\n", sg->dma_address);
276 277 278 279 280

		dma_unmap_page(NULL, sg->dma_address, sg->length, DMA_FROM_DEVICE);

		data->bytes_xfered += sg->length;

A
Andrew Victor 已提交
281
		if (cpu_is_at91rm9200()) {	/* AT91RM9200 errata */
282
			unsigned int *buffer;
A
Andrew Victor 已提交
283
			int index;
284

285
			/* Swap the contents of the buffer */
J
Jens Axboe 已提交
286
			buffer = kmap_atomic(sg_page(sg), KM_BIO_SRC_IRQ) + sg->offset;
287 288
			pr_debug("buffer = %p, length = %d\n", buffer, sg->length);

A
Andrew Victor 已提交
289 290
			for (index = 0; index < (sg->length / 4); index++)
				buffer[index] = swab32(buffer[index]);
291 292

			kunmap_atomic(buffer, KM_BIO_SRC_IRQ);
293
		}
A
Andrew Victor 已提交
294

J
Jens Axboe 已提交
295
		flush_dcache_page(sg_page(sg));
296 297 298 299
	}

	/* Is there another transfer to trigger? */
	if (host->transfer_index < data->sg_len)
N
Nicolas Ferre 已提交
300
		at91_mci_pre_dma_read(host);
301
	else {
302
		at91_mci_write(host, AT91_MCI_IDR, AT91_MCI_ENDRX);
A
Andrew Victor 已提交
303
		at91_mci_write(host, AT91_MCI_IER, AT91_MCI_RXBUFF);
304 305
	}

306
	pr_debug("post dma read done\n");
307 308 309 310 311 312 313 314 315 316
}

/*
 * Handle transmitted data
 */
static void at91_mci_handle_transmitted(struct at91mci_host *host)
{
	struct mmc_command *cmd;
	struct mmc_data *data;

317
	pr_debug("Handling the transmit\n");
318 319

	/* Disable the transfer */
320
	at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_RXTDIS | ATMEL_PDC_TXTDIS);
321 322

	/* Now wait for cmd ready */
A
Andrew Victor 已提交
323
	at91_mci_write(host, AT91_MCI_IDR, AT91_MCI_TXBUFE);
324 325 326 327 328 329 330

	cmd = host->cmd;
	if (!cmd) return;

	data = cmd->data;
	if (!data) return;

P
Pierre Ossman 已提交
331
	if (cmd->data->blocks > 1) {
332 333 334 335 336
		pr_debug("multiple write : wait for BLKE...\n");
		at91_mci_write(host, AT91_MCI_IER, AT91_MCI_BLKE);
	} else
		at91_mci_write(host, AT91_MCI_IER, AT91_MCI_NOTBUSY);

337 338 339
	data->bytes_xfered = host->total_length;
}

340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361
/*Handle after command sent ready*/
static int at91_mci_handle_cmdrdy(struct at91mci_host *host)
{
	if (!host->cmd)
		return 1;
	else if (!host->cmd->data) {
		if (host->flags & FL_SENT_STOP) {
			/*After multi block write, we must wait for NOTBUSY*/
			at91_mci_write(host, AT91_MCI_IER, AT91_MCI_NOTBUSY);
		} else return 1;
	} else if (host->cmd->data->flags & MMC_DATA_WRITE) {
		/*After sendding multi-block-write command, start DMA transfer*/
		at91_mci_write(host, AT91_MCI_IER, AT91_MCI_TXBUFE);
		at91_mci_write(host, AT91_MCI_IER, AT91_MCI_BLKE);
		at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_TXTEN);
	}

	/* command not completed, have to wait */
	return 0;
}


362 363 364
/*
 * Enable the controller
 */
A
Andrew Victor 已提交
365
static void at91_mci_enable(struct at91mci_host *host)
366
{
367 368
	unsigned int mr;

A
Andrew Victor 已提交
369
	at91_mci_write(host, AT91_MCI_CR, AT91_MCI_MCIEN);
A
Andrew Victor 已提交
370
	at91_mci_write(host, AT91_MCI_IDR, 0xffffffff);
A
Andrew Victor 已提交
371
	at91_mci_write(host, AT91_MCI_DTOR, AT91_MCI_DTOMUL_1M | AT91_MCI_DTOCYC);
372 373 374 375 376 377
	mr = AT91_MCI_PDCMODE | 0x34a;

	if (cpu_is_at91sam9260() || cpu_is_at91sam9263())
		mr |= AT91_MCI_RDPROOF | AT91_MCI_WRPROOF;

	at91_mci_write(host, AT91_MCI_MR, mr);
A
Andrew Victor 已提交
378 379 380

	/* use Slot A or B (only one at same time) */
	at91_mci_write(host, AT91_MCI_SDCR, host->board->slot_b);
381 382 383 384 385
}

/*
 * Disable the controller
 */
A
Andrew Victor 已提交
386
static void at91_mci_disable(struct at91mci_host *host)
387
{
A
Andrew Victor 已提交
388
	at91_mci_write(host, AT91_MCI_CR, AT91_MCI_MCIDIS | AT91_MCI_SWRST);
389 390 391 392 393
}

/*
 * Send a command
 */
394
static void at91_mci_send_command(struct at91mci_host *host, struct mmc_command *cmd)
395 396 397 398 399 400 401 402 403 404
{
	unsigned int cmdr, mr;
	unsigned int block_length;
	struct mmc_data *data = cmd->data;

	unsigned int blocks;
	unsigned int ier = 0;

	host->cmd = cmd;

405
	/* Needed for leaving busy state before CMD1 */
A
Andrew Victor 已提交
406
	if ((at91_mci_read(host, AT91_MCI_SR) & AT91_MCI_RTOE) && (cmd->opcode == 1)) {
407
		pr_debug("Clearing timeout\n");
A
Andrew Victor 已提交
408 409 410
		at91_mci_write(host, AT91_MCI_ARGR, 0);
		at91_mci_write(host, AT91_MCI_CMDR, AT91_MCI_OPDCMD);
		while (!(at91_mci_read(host, AT91_MCI_SR) & AT91_MCI_CMDRDY)) {
411
			/* spin */
A
Andrew Victor 已提交
412
			pr_debug("Clearing: SR = %08X\n", at91_mci_read(host, AT91_MCI_SR));
413 414
		}
	}
415

416 417 418 419 420 421 422 423 424 425 426 427 428 429 430
	cmdr = cmd->opcode;

	if (mmc_resp_type(cmd) == MMC_RSP_NONE)
		cmdr |= AT91_MCI_RSPTYP_NONE;
	else {
		/* if a response is expected then allow maximum response latancy */
		cmdr |= AT91_MCI_MAXLAT;
		/* set 136 bit response for R2, 48 bit response otherwise */
		if (mmc_resp_type(cmd) == MMC_RSP_R2)
			cmdr |= AT91_MCI_RSPTYP_136;
		else
			cmdr |= AT91_MCI_RSPTYP_48;
	}

	if (data) {
431 432 433 434 435 436 437 438

		if ( data->blksz & 0x3 ) {
			pr_debug("Unsupported block size\n");
			cmd->error = -EINVAL;
			mmc_request_done(host->mmc, host->request);
			return;
		}

439
		block_length = data->blksz;
440 441 442 443 444 445 446 447 448 449
		blocks = data->blocks;

		/* always set data start - also set direction flag for read */
		if (data->flags & MMC_DATA_READ)
			cmdr |= (AT91_MCI_TRDIR | AT91_MCI_TRCMD_START);
		else if (data->flags & MMC_DATA_WRITE)
			cmdr |= AT91_MCI_TRCMD_START;

		if (data->flags & MMC_DATA_STREAM)
			cmdr |= AT91_MCI_TRTYP_STREAM;
P
Pierre Ossman 已提交
450
		if (data->blocks > 1)
451 452 453 454 455 456 457
			cmdr |= AT91_MCI_TRTYP_MULTIPLE;
	}
	else {
		block_length = 0;
		blocks = 0;
	}

458
	if (host->flags & FL_SENT_STOP)
459 460 461 462 463 464 465 466
		cmdr |= AT91_MCI_TRCMD_STOP;

	if (host->bus_mode == MMC_BUSMODE_OPENDRAIN)
		cmdr |= AT91_MCI_OPDCMD;

	/*
	 * Set the arguments and send the command
	 */
A
Andrew Victor 已提交
467
	pr_debug("Sending command %d as %08X, arg = %08X, blocks = %d, length = %d (MR = %08X)\n",
A
Andrew Victor 已提交
468
		cmd->opcode, cmdr, cmd->arg, blocks, block_length, at91_mci_read(host, AT91_MCI_MR));
469 470

	if (!data) {
471 472 473 474 475 476 477 478 479
		at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_TXTDIS | ATMEL_PDC_RXTDIS);
		at91_mci_write(host, ATMEL_PDC_RPR, 0);
		at91_mci_write(host, ATMEL_PDC_RCR, 0);
		at91_mci_write(host, ATMEL_PDC_RNPR, 0);
		at91_mci_write(host, ATMEL_PDC_RNCR, 0);
		at91_mci_write(host, ATMEL_PDC_TPR, 0);
		at91_mci_write(host, ATMEL_PDC_TCR, 0);
		at91_mci_write(host, ATMEL_PDC_TNPR, 0);
		at91_mci_write(host, ATMEL_PDC_TNCR, 0);
480 481 482 483 484
		ier = AT91_MCI_CMDRDY;
	} else {
		/* zero block length and PDC mode */
		mr = at91_mci_read(host, AT91_MCI_MR) & 0x7fff;
		at91_mci_write(host, AT91_MCI_MR, mr | (block_length << 16) | AT91_MCI_PDCMODE);
A
Andrew Victor 已提交
485

486 487 488 489
		/*
		 * Disable the PDC controller
		 */
		at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_RXTDIS | ATMEL_PDC_TXTDIS);
490

491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521
		if (cmdr & AT91_MCI_TRCMD_START) {
			data->bytes_xfered = 0;
			host->transfer_index = 0;
			host->in_use_index = 0;
			if (cmdr & AT91_MCI_TRDIR) {
				/*
				 * Handle a read
				 */
				host->buffer = NULL;
				host->total_length = 0;

				at91_mci_pre_dma_read(host);
				ier = AT91_MCI_ENDRX /* | AT91_MCI_RXBUFF */;
			}
			else {
				/*
				 * Handle a write
				 */
				host->total_length = block_length * blocks;
				host->buffer = dma_alloc_coherent(NULL,
						host->total_length,
						&host->physical_address, GFP_KERNEL);

				at91_mci_sg_to_dma(host, data);

				pr_debug("Transmitting %d bytes\n", host->total_length);

				at91_mci_write(host, ATMEL_PDC_TPR, host->physical_address);
				at91_mci_write(host, ATMEL_PDC_TCR, host->total_length / 4);
				ier = AT91_MCI_CMDRDY;
			}
522 523 524 525 526 527 528 529
		}
	}

	/*
	 * Send the command and then enable the PDC - not the other way round as
	 * the data sheet says
	 */

A
Andrew Victor 已提交
530 531
	at91_mci_write(host, AT91_MCI_ARGR, cmd->arg);
	at91_mci_write(host, AT91_MCI_CMDR, cmdr);
532 533 534

	if (cmdr & AT91_MCI_TRCMD_START) {
		if (cmdr & AT91_MCI_TRDIR)
535
			at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_RXTEN);
536 537
	}

538
	/* Enable selected interrupts */
539
	at91_mci_write(host, AT91_MCI_IER, AT91_MCI_ERRORS | ier);
540 541 542 543 544
}

/*
 * Process the next step in the request
 */
N
Nicolas Ferre 已提交
545
static void at91_mci_process_next(struct at91mci_host *host)
546 547 548
{
	if (!(host->flags & FL_SENT_COMMAND)) {
		host->flags |= FL_SENT_COMMAND;
549
		at91_mci_send_command(host, host->request->cmd);
550 551 552
	}
	else if ((!(host->flags & FL_SENT_STOP)) && host->request->stop) {
		host->flags |= FL_SENT_STOP;
553
		at91_mci_send_command(host, host->request->stop);
554 555 556 557 558 559 560 561
	}
	else
		mmc_request_done(host->mmc, host->request);
}

/*
 * Handle a command that has been completed
 */
N
Nicolas Ferre 已提交
562
static void at91_mci_completed_command(struct at91mci_host *host)
563 564 565 566
{
	struct mmc_command *cmd = host->cmd;
	unsigned int status;

A
Andrew Victor 已提交
567
	at91_mci_write(host, AT91_MCI_IDR, 0xffffffff);
568

A
Andrew Victor 已提交
569 570 571 572
	cmd->resp[0] = at91_mci_read(host, AT91_MCI_RSPR(0));
	cmd->resp[1] = at91_mci_read(host, AT91_MCI_RSPR(1));
	cmd->resp[2] = at91_mci_read(host, AT91_MCI_RSPR(2));
	cmd->resp[3] = at91_mci_read(host, AT91_MCI_RSPR(3));
573 574 575 576 577 578

	if (host->buffer) {
		dma_free_coherent(NULL, host->total_length, host->buffer, host->physical_address);
		host->buffer = NULL;
	}

A
Andrew Victor 已提交
579
	status = at91_mci_read(host, AT91_MCI_SR);
580

581
	pr_debug("Status = %08X [%08X %08X %08X %08X]\n",
582 583
		 status, cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]);

584
	if (status & AT91_MCI_ERRORS) {
585
		if ((status & AT91_MCI_RCRCE) && !(mmc_resp_type(cmd) & MMC_RSP_CRC)) {
P
Pierre Ossman 已提交
586
			cmd->error = 0;
587 588 589
		}
		else {
			if (status & (AT91_MCI_RTOE | AT91_MCI_DTOE))
P
Pierre Ossman 已提交
590
				cmd->error = -ETIMEDOUT;
591
			else if (status & (AT91_MCI_RCRCE | AT91_MCI_DCRCE))
P
Pierre Ossman 已提交
592
				cmd->error = -EILSEQ;
593
			else
P
Pierre Ossman 已提交
594
				cmd->error = -EIO;
595

596
			pr_debug("Error detected and set to %d (cmd = %d, retries = %d)\n",
597 598 599 600
				 cmd->error, cmd->opcode, cmd->retries);
		}
	}
	else
P
Pierre Ossman 已提交
601
		cmd->error = 0;
602

N
Nicolas Ferre 已提交
603
	at91_mci_process_next(host);
604 605 606 607 608 609 610 611 612 613 614
}

/*
 * Handle an MMC request
 */
static void at91_mci_request(struct mmc_host *mmc, struct mmc_request *mrq)
{
	struct at91mci_host *host = mmc_priv(mmc);
	host->request = mrq;
	host->flags = 0;

N
Nicolas Ferre 已提交
615
	at91_mci_process_next(host);
616 617 618 619 620 621 622 623 624
}

/*
 * Set the IOS
 */
static void at91_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
{
	int clkdiv;
	struct at91mci_host *host = mmc_priv(mmc);
625
	unsigned long at91_master_clock = clk_get_rate(host->mci_clk);
626

627
	host->bus_mode = ios->bus_mode;
628 629 630

	if (ios->clock == 0) {
		/* Disable the MCI controller */
A
Andrew Victor 已提交
631
		at91_mci_write(host, AT91_MCI_CR, AT91_MCI_MCIDIS);
632 633 634 635
		clkdiv = 0;
	}
	else {
		/* Enable the MCI controller */
A
Andrew Victor 已提交
636
		at91_mci_write(host, AT91_MCI_CR, AT91_MCI_MCIEN);
637 638 639 640 641 642

		if ((at91_master_clock % (ios->clock * 2)) == 0)
			clkdiv = ((at91_master_clock / ios->clock) / 2) - 1;
		else
			clkdiv = (at91_master_clock / ios->clock) / 2;

643
		pr_debug("clkdiv = %d. mcck = %ld\n", clkdiv,
644 645 646
			at91_master_clock / (2 * (clkdiv + 1)));
	}
	if (ios->bus_width == MMC_BUS_WIDTH_4 && host->board->wire4) {
647
		pr_debug("MMC: Setting controller bus width to 4\n");
A
Andrew Victor 已提交
648
		at91_mci_write(host, AT91_MCI_SDCR, at91_mci_read(host, AT91_MCI_SDCR) | AT91_MCI_SDCBUS);
649 650
	}
	else {
651
		pr_debug("MMC: Setting controller bus width to 1\n");
A
Andrew Victor 已提交
652
		at91_mci_write(host, AT91_MCI_SDCR, at91_mci_read(host, AT91_MCI_SDCR) & ~AT91_MCI_SDCBUS);
653 654 655
	}

	/* Set the clock divider */
A
Andrew Victor 已提交
656
	at91_mci_write(host, AT91_MCI_MR, (at91_mci_read(host, AT91_MCI_MR) & ~AT91_MCI_CLKDIV) | clkdiv);
657 658

	/* maybe switch power to the card */
659
	if (host->board->vcc_pin) {
660 661
		switch (ios->power_mode) {
			case MMC_POWER_OFF:
A
Andrew Victor 已提交
662
				at91_set_gpio_value(host->board->vcc_pin, 0);
663 664 665
				break;
			case MMC_POWER_UP:
			case MMC_POWER_ON:
A
Andrew Victor 已提交
666
				at91_set_gpio_value(host->board->vcc_pin, 1);
667 668 669 670 671 672 673 674
				break;
		}
	}
}

/*
 * Handle an interrupt
 */
675
static irqreturn_t at91_mci_irq(int irq, void *devid)
676 677 678
{
	struct at91mci_host *host = devid;
	int completed = 0;
679
	unsigned int int_status, int_mask;
680

A
Andrew Victor 已提交
681
	int_status = at91_mci_read(host, AT91_MCI_SR);
682
	int_mask = at91_mci_read(host, AT91_MCI_IMR);
683

A
Andrew Victor 已提交
684
	pr_debug("MCI irq: status = %08X, %08X, %08X\n", int_status, int_mask,
685
		int_status & int_mask);
686

687 688 689
	int_status = int_status & int_mask;

	if (int_status & AT91_MCI_ERRORS) {
690
		completed = 1;
691

692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711
		if (int_status & AT91_MCI_UNRE)
			pr_debug("MMC: Underrun error\n");
		if (int_status & AT91_MCI_OVRE)
			pr_debug("MMC: Overrun error\n");
		if (int_status & AT91_MCI_DTOE)
			pr_debug("MMC: Data timeout\n");
		if (int_status & AT91_MCI_DCRCE)
			pr_debug("MMC: CRC error in data\n");
		if (int_status & AT91_MCI_RTOE)
			pr_debug("MMC: Response timeout\n");
		if (int_status & AT91_MCI_RENDE)
			pr_debug("MMC: Response end bit error\n");
		if (int_status & AT91_MCI_RCRCE)
			pr_debug("MMC: Response CRC error\n");
		if (int_status & AT91_MCI_RDIRE)
			pr_debug("MMC: Response direction error\n");
		if (int_status & AT91_MCI_RINDE)
			pr_debug("MMC: Response index error\n");
	} else {
		/* Only continue processing if no errors */
712 713

		if (int_status & AT91_MCI_TXBUFE) {
714
			pr_debug("TX buffer empty\n");
715 716 717
			at91_mci_handle_transmitted(host);
		}

718 719 720 721 722
		if (int_status & AT91_MCI_ENDRX) {
			pr_debug("ENDRX\n");
			at91_mci_post_dma_read(host);
		}

723
		if (int_status & AT91_MCI_RXBUFF) {
724
			pr_debug("RX buffer full\n");
725 726 727
			at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_RXTDIS | ATMEL_PDC_TXTDIS);
			at91_mci_write(host, AT91_MCI_IDR, AT91_MCI_RXBUFF | AT91_MCI_ENDRX);
			completed = 1;
728 729
		}

730
		if (int_status & AT91_MCI_ENDTX)
731
			pr_debug("Transmit has ended\n");
732 733

		if (int_status & AT91_MCI_NOTBUSY) {
734
			pr_debug("Card is ready\n");
735
			completed = 1;
736 737
		}

738
		if (int_status & AT91_MCI_DTIP)
739
			pr_debug("Data transfer in progress\n");
740

741
		if (int_status & AT91_MCI_BLKE) {
742
			pr_debug("Block transfer has ended\n");
743 744
			completed = 1;
		}
745

746
		if (int_status & AT91_MCI_TXRDY)
747
			pr_debug("Ready to transmit\n");
748

749
		if (int_status & AT91_MCI_RXRDY)
750
			pr_debug("Ready to receive\n");
751 752

		if (int_status & AT91_MCI_CMDRDY) {
753
			pr_debug("Command ready\n");
754
			completed = at91_mci_handle_cmdrdy(host);
755 756 757 758
		}
	}

	if (completed) {
759
		pr_debug("Completed command\n");
A
Andrew Victor 已提交
760
		at91_mci_write(host, AT91_MCI_IDR, 0xffffffff);
N
Nicolas Ferre 已提交
761
		at91_mci_completed_command(host);
762 763
	} else
		at91_mci_write(host, AT91_MCI_IDR, int_status);
764 765 766 767

	return IRQ_HANDLED;
}

768
static irqreturn_t at91_mmc_det_irq(int irq, void *_host)
769 770 771 772 773 774 775 776 777 778
{
	struct at91mci_host *host = _host;
	int present = !at91_get_gpio_value(irq);

	/*
	 * we expect this irq on both insert and remove,
	 * and use a short delay to debounce.
	 */
	if (present != host->present) {
		host->present = present;
779
		pr_debug("%s: card %s\n", mmc_hostname(host->mmc),
780 781
			present ? "insert" : "remove");
		if (!present) {
782
			pr_debug("****** Resetting SD-card bus width ******\n");
A
Andrew Victor 已提交
783
			at91_mci_write(host, AT91_MCI_SDCR, at91_mci_read(host, AT91_MCI_SDCR) & ~AT91_MCI_SDCBUS);
784 785 786 787 788 789
		}
		mmc_detect_change(host->mmc, msecs_to_jiffies(100));
	}
	return IRQ_HANDLED;
}

D
David Brownell 已提交
790
static int at91_mci_get_ro(struct mmc_host *mmc)
791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806
{
	int read_only = 0;
	struct at91mci_host *host = mmc_priv(mmc);

	if (host->board->wp_pin) {
		read_only = at91_get_gpio_value(host->board->wp_pin);
		printk(KERN_WARNING "%s: card is %s\n", mmc_hostname(mmc),
				(read_only ? "read-only" : "read-write") );
	}
	else {
		printk(KERN_WARNING "%s: host does not support reading read-only "
				"switch.  Assuming write-enable.\n", mmc_hostname(mmc));
	}
	return read_only;
}

807
static const struct mmc_host_ops at91_mci_ops = {
808 809 810 811 812 813 814 815
	.request	= at91_mci_request,
	.set_ios	= at91_mci_set_ios,
	.get_ro		= at91_mci_get_ro,
};

/*
 * Probe for the device
 */
D
David Brownell 已提交
816
static int __init at91_mci_probe(struct platform_device *pdev)
817 818 819
{
	struct mmc_host *mmc;
	struct at91mci_host *host;
820
	struct resource *res;
821 822
	int ret;

823
	pr_debug("Probe MCI devices\n");
824

825 826 827 828 829 830 831
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res)
		return -ENXIO;

	if (!request_mem_region(res->start, res->end - res->start + 1, DRIVER_NAME))
		return -EBUSY;

832 833
	mmc = mmc_alloc_host(sizeof(struct at91mci_host), &pdev->dev);
	if (!mmc) {
834
		pr_debug("Failed to allocate mmc host\n");
835
		release_mem_region(res->start, res->end - res->start + 1);
836 837 838 839 840 841 842 843
		return -ENOMEM;
	}

	mmc->ops = &at91_mci_ops;
	mmc->f_min = 375000;
	mmc->f_max = 25000000;
	mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;

844
	mmc->max_blk_size = 4095;
845
	mmc->max_blk_count = mmc->max_req_size;
846

847 848 849 850 851 852
	host = mmc_priv(mmc);
	host->mmc = mmc;
	host->buffer = NULL;
	host->bus_mode = 0;
	host->board = pdev->dev.platform_data;
	if (host->board->wire4) {
853 854 855 856 857
		if (cpu_is_at91sam9260() || cpu_is_at91sam9263())
			mmc->caps |= MMC_CAP_4_BIT_DATA;
		else
			printk("AT91 MMC: 4 wire bus mode not supported"
				" - using 1 wire\n");
858 859 860 861 862
	}

	/*
	 * Get Clock
	 */
863 864
	host->mci_clk = clk_get(&pdev->dev, "mci_clk");
	if (IS_ERR(host->mci_clk)) {
865
		printk(KERN_ERR "AT91 MMC: no clock defined.\n");
866
		mmc_free_host(mmc);
867
		release_mem_region(res->start, res->end - res->start + 1);
868 869 870
		return -ENODEV;
	}

871 872 873 874 875
	/*
	 * Map I/O region
	 */
	host->baseaddr = ioremap(res->start, res->end - res->start + 1);
	if (!host->baseaddr) {
876
		clk_put(host->mci_clk);
877 878 879 880
		mmc_free_host(mmc);
		release_mem_region(res->start, res->end - res->start + 1);
		return -ENOMEM;
	}
A
Andrew Victor 已提交
881 882 883 884

	/*
	 * Reset hardware
	 */
885
	clk_enable(host->mci_clk);		/* Enable the peripheral clock */
A
Andrew Victor 已提交
886 887 888
	at91_mci_disable(host);
	at91_mci_enable(host);

889 890 891
	/*
	 * Allocate the MCI interrupt
	 */
892 893
	host->irq = platform_get_irq(pdev, 0);
	ret = request_irq(host->irq, at91_mci_irq, IRQF_SHARED, DRIVER_NAME, host);
894
	if (ret) {
A
Andrew Victor 已提交
895
		printk(KERN_ERR "AT91 MMC: Failed to request MCI interrupt\n");
896 897
		clk_disable(host->mci_clk);
		clk_put(host->mci_clk);
898
		mmc_free_host(mmc);
899 900
		iounmap(host->baseaddr);
		release_mem_region(res->start, res->end - res->start + 1);
901 902 903 904 905 906 907 908
		return ret;
	}

	platform_set_drvdata(pdev, mmc);

	/*
	 * Add host to MMC layer
	 */
909
	if (host->board->det_pin) {
910
		host->present = !at91_get_gpio_value(host->board->det_pin);
911 912
		device_init_wakeup(&pdev->dev, 1);
	}
913 914 915 916 917 918 919 920 921 922
	else
		host->present = -1;

	mmc_add_host(mmc);

	/*
	 * monitor card insertion/removal if we can
	 */
	if (host->board->det_pin) {
		ret = request_irq(host->board->det_pin, at91_mmc_det_irq,
923
				0, DRIVER_NAME, host);
924
		if (ret)
A
Andrew Victor 已提交
925
			printk(KERN_ERR "AT91 MMC: Couldn't allocate MMC detect irq\n");
926 927
	}

A
Andrew Victor 已提交
928
	pr_debug("Added MCI driver\n");
929 930 931 932 933 934 935

	return 0;
}

/*
 * Remove a device
 */
D
David Brownell 已提交
936
static int __exit at91_mci_remove(struct platform_device *pdev)
937 938 939
{
	struct mmc_host *mmc = platform_get_drvdata(pdev);
	struct at91mci_host *host;
940
	struct resource *res;
941 942 943 944 945 946

	if (!mmc)
		return -1;

	host = mmc_priv(mmc);

A
Anti Sullin 已提交
947
	if (host->board->det_pin) {
948
		device_init_wakeup(&pdev->dev, 0);
949 950 951 952
		free_irq(host->board->det_pin, host);
		cancel_delayed_work(&host->mmc->detect);
	}

A
Andrew Victor 已提交
953
	at91_mci_disable(host);
954 955
	mmc_remove_host(mmc);
	free_irq(host->irq, host);
956

957 958
	clk_disable(host->mci_clk);			/* Disable the peripheral clock */
	clk_put(host->mci_clk);
959

960 961 962
	iounmap(host->baseaddr);
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	release_mem_region(res->start, res->end - res->start + 1);
963

964 965
	mmc_free_host(mmc);
	platform_set_drvdata(pdev, NULL);
966
	pr_debug("MCI Removed\n");
967 968 969 970 971 972 973 974

	return 0;
}

#ifdef CONFIG_PM
static int at91_mci_suspend(struct platform_device *pdev, pm_message_t state)
{
	struct mmc_host *mmc = platform_get_drvdata(pdev);
975
	struct at91mci_host *host = mmc_priv(mmc);
976 977
	int ret = 0;

A
Anti Sullin 已提交
978
	if (host->board->det_pin && device_may_wakeup(&pdev->dev))
979 980
		enable_irq_wake(host->board->det_pin);

981 982 983 984 985 986 987 988 989
	if (mmc)
		ret = mmc_suspend_host(mmc, state);

	return ret;
}

static int at91_mci_resume(struct platform_device *pdev)
{
	struct mmc_host *mmc = platform_get_drvdata(pdev);
990
	struct at91mci_host *host = mmc_priv(mmc);
991 992
	int ret = 0;

A
Anti Sullin 已提交
993
	if (host->board->det_pin && device_may_wakeup(&pdev->dev))
994 995
		disable_irq_wake(host->board->det_pin);

996 997 998 999 1000 1001 1002 1003 1004 1005 1006
	if (mmc)
		ret = mmc_resume_host(mmc);

	return ret;
}
#else
#define at91_mci_suspend	NULL
#define at91_mci_resume		NULL
#endif

static struct platform_driver at91_mci_driver = {
D
David Brownell 已提交
1007
	.remove		= __exit_p(at91_mci_remove),
1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
	.suspend	= at91_mci_suspend,
	.resume		= at91_mci_resume,
	.driver		= {
		.name	= DRIVER_NAME,
		.owner	= THIS_MODULE,
	},
};

static int __init at91_mci_init(void)
{
D
David Brownell 已提交
1018
	return platform_driver_probe(&at91_mci_driver, at91_mci_probe);
1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031
}

static void __exit at91_mci_exit(void)
{
	platform_driver_unregister(&at91_mci_driver);
}

module_init(at91_mci_init);
module_exit(at91_mci_exit);

MODULE_DESCRIPTION("AT91 Multimedia Card Interface driver");
MODULE_AUTHOR("Nick Randell");
MODULE_LICENSE("GPL");