1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56#include <linux/module.h>
57#include <linux/moduleparam.h>
58#include <linux/init.h>
59#include <linux/ioport.h>
60#include <linux/platform_device.h>
61#include <linux/interrupt.h>
62#include <linux/blkdev.h>
63#include <linux/delay.h>
64#include <linux/err.h>
65#include <linux/dma-mapping.h>
66#include <linux/clk.h>
67#include <linux/atmel_pdc.h>
68#include <linux/gfp.h>
69#include <linux/highmem.h>
70
71#include <linux/mmc/host.h>
72#include <linux/mmc/sdio.h>
73
74#include <asm/io.h>
75#include <asm/irq.h>
76#include <asm/gpio.h>
77
78#include <mach/board.h>
79#include <mach/cpu.h>
80
81#include "at91_mci.h"
82
83#define DRIVER_NAME "at91_mci"
84
85static inline int at91mci_is_mci1rev2xx(void)
86{
87 return ( cpu_is_at91sam9260()
88 || cpu_is_at91sam9263()
89 || cpu_is_at91cap9()
90 || cpu_is_at91sam9rl()
91 || cpu_is_at91sam9g10()
92 || cpu_is_at91sam9g20()
93 );
94}
95
96#define FL_SENT_COMMAND (1 << 0)
97#define FL_SENT_STOP (1 << 1)
98
99#define AT91_MCI_ERRORS (AT91_MCI_RINDE | AT91_MCI_RDIRE | AT91_MCI_RCRCE \
100 | AT91_MCI_RENDE | AT91_MCI_RTOE | AT91_MCI_DCRCE \
101 | AT91_MCI_DTOE | AT91_MCI_OVRE | AT91_MCI_UNRE)
102
103#define at91_mci_read(host, reg) __raw_readl((host)->baseaddr + (reg))
104#define at91_mci_write(host, reg, val) __raw_writel((val), (host)->baseaddr + (reg))
105
106#define MCI_BLKSIZE 512
107#define MCI_MAXBLKSIZE 4095
108#define MCI_BLKATONCE 256
109#define MCI_BUFSIZE (MCI_BLKSIZE * MCI_BLKATONCE)
110
111
112
113
114struct at91mci_host
115{
116 struct mmc_host *mmc;
117 struct mmc_command *cmd;
118 struct mmc_request *request;
119
120 void __iomem *baseaddr;
121 int irq;
122
123 struct at91_mmc_data *board;
124 int present;
125
126 struct clk *mci_clk;
127
128
129
130
131
132 unsigned int flags;
133
134 u32 bus_mode;
135
136
137 unsigned int* buffer;
138 dma_addr_t physical_address;
139 unsigned int total_length;
140
141
142 int in_use_index;
143
144
145 int transfer_index;
146
147
148 struct timer_list timer;
149};
150
151
152
153
154static void at91_reset_host(struct at91mci_host *host)
155{
156 unsigned long flags;
157 u32 mr;
158 u32 sdcr;
159 u32 dtor;
160 u32 imr;
161
162 local_irq_save(flags);
163 imr = at91_mci_read(host, AT91_MCI_IMR);
164
165 at91_mci_write(host, AT91_MCI_IDR, 0xffffffff);
166
167
168 mr = at91_mci_read(host, AT91_MCI_MR) & 0x7fff;
169 sdcr = at91_mci_read(host, AT91_MCI_SDCR);
170 dtor = at91_mci_read(host, AT91_MCI_DTOR);
171
172
173 at91_mci_write(host, AT91_MCI_CR, AT91_MCI_MCIDIS | AT91_MCI_SWRST);
174
175
176 at91_mci_write(host, AT91_MCI_CR, AT91_MCI_MCIEN);
177 at91_mci_write(host, AT91_MCI_MR, mr);
178 at91_mci_write(host, AT91_MCI_SDCR, sdcr);
179 at91_mci_write(host, AT91_MCI_DTOR, dtor);
180 at91_mci_write(host, AT91_MCI_IER, imr);
181
182
183 at91_mci_read(host, AT91_MCI_SR);
184
185 local_irq_restore(flags);
186}
187
188static void at91_timeout_timer(unsigned long data)
189{
190 struct at91mci_host *host;
191
192 host = (struct at91mci_host *)data;
193
194 if (host->request) {
195 dev_err(host->mmc->parent, "Timeout waiting end of packet\n");
196
197 if (host->cmd && host->cmd->data) {
198 host->cmd->data->error = -ETIMEDOUT;
199 } else {
200 if (host->cmd)
201 host->cmd->error = -ETIMEDOUT;
202 else
203 host->request->cmd->error = -ETIMEDOUT;
204 }
205
206 at91_reset_host(host);
207 mmc_request_done(host->mmc, host->request);
208 }
209}
210
211
212
213
214static inline void at91_mci_sg_to_dma(struct at91mci_host *host, struct mmc_data *data)
215{
216 unsigned int len, i, size;
217 unsigned *dmabuf = host->buffer;
218
219 size = data->blksz * data->blocks;
220 len = data->sg_len;
221
222
223 if (at91mci_is_mci1rev2xx())
224 if (host->total_length == 12)
225 memset(dmabuf, 0, 12);
226
227
228
229
230
231
232 for (i = 0; i < len; i++) {
233 struct scatterlist *sg;
234 int amount;
235 unsigned int *sgbuffer;
236
237 sg = &data->sg[i];
238
239 sgbuffer = kmap_atomic(sg_page(sg)) + sg->offset;
240 amount = min(size, sg->length);
241 size -= amount;
242
243 if (cpu_is_at91rm9200()) {
244 int index;
245
246 for (index = 0; index < (amount / 4); index++)
247 *dmabuf++ = swab32(sgbuffer[index]);
248 } else {
249 char *tmpv = (char *)dmabuf;
250 memcpy(tmpv, sgbuffer, amount);
251 tmpv += amount;
252 dmabuf = (unsigned *)tmpv;
253 }
254
255 kunmap_atomic(sgbuffer);
256
257 if (size == 0)
258 break;
259 }
260
261
262
263
264
265 BUG_ON(size != 0);
266}
267
268
269
270
271static void at91_mci_post_dma_read(struct at91mci_host *host)
272{
273 struct mmc_command *cmd;
274 struct mmc_data *data;
275 unsigned int len, i, size;
276 unsigned *dmabuf = host->buffer;
277
278 pr_debug("post dma read\n");
279
280 cmd = host->cmd;
281 if (!cmd) {
282 pr_debug("no command\n");
283 return;
284 }
285
286 data = cmd->data;
287 if (!data) {
288 pr_debug("no data\n");
289 return;
290 }
291
292 size = data->blksz * data->blocks;
293 len = data->sg_len;
294
295 at91_mci_write(host, AT91_MCI_IDR, AT91_MCI_ENDRX);
296 at91_mci_write(host, AT91_MCI_IER, AT91_MCI_RXBUFF);
297
298 for (i = 0; i < len; i++) {
299 struct scatterlist *sg;
300 int amount;
301 unsigned int *sgbuffer;
302
303 sg = &data->sg[i];
304
305 sgbuffer = kmap_atomic(sg_page(sg)) + sg->offset;
306 amount = min(size, sg->length);
307 size -= amount;
308
309 if (cpu_is_at91rm9200()) {
310 int index;
311 for (index = 0; index < (amount / 4); index++)
312 sgbuffer[index] = swab32(*dmabuf++);
313 } else {
314 char *tmpv = (char *)dmabuf;
315 memcpy(sgbuffer, tmpv, amount);
316 tmpv += amount;
317 dmabuf = (unsigned *)tmpv;
318 }
319
320 flush_kernel_dcache_page(sg_page(sg));
321 kunmap_atomic(sgbuffer);
322 data->bytes_xfered += amount;
323 if (size == 0)
324 break;
325 }
326
327 pr_debug("post dma read done\n");
328}
329
330
331
332
333static void at91_mci_handle_transmitted(struct at91mci_host *host)
334{
335 struct mmc_command *cmd;
336 struct mmc_data *data;
337
338 pr_debug("Handling the transmit\n");
339
340
341 at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_RXTDIS | ATMEL_PDC_TXTDIS);
342
343
344 at91_mci_write(host, AT91_MCI_IDR, AT91_MCI_TXBUFE);
345
346 cmd = host->cmd;
347 if (!cmd) return;
348
349 data = cmd->data;
350 if (!data) return;
351
352 if (cmd->data->blocks > 1) {
353 pr_debug("multiple write : wait for BLKE...\n");
354 at91_mci_write(host, AT91_MCI_IER, AT91_MCI_BLKE);
355 } else
356 at91_mci_write(host, AT91_MCI_IER, AT91_MCI_NOTBUSY);
357}
358
359
360
361
362static void at91_mci_update_bytes_xfered(struct at91mci_host *host)
363{
364 struct mmc_data *data;
365
366
367
368 if (host->request->cmd && host->request->cmd->error != 0)
369 return;
370
371 if (host->request->data) {
372 data = host->request->data;
373 if (data->flags & MMC_DATA_WRITE) {
374
375 pr_debug("-> bytes_xfered %d, total_length = %d\n",
376 data->bytes_xfered, host->total_length);
377 data->bytes_xfered = data->blksz * data->blocks;
378 }
379 }
380}
381
382
383
384static int at91_mci_handle_cmdrdy(struct at91mci_host *host)
385{
386 if (!host->cmd)
387 return 1;
388 else if (!host->cmd->data) {
389 if (host->flags & FL_SENT_STOP) {
390
391 at91_mci_write(host, AT91_MCI_IER, AT91_MCI_NOTBUSY);
392 } else return 1;
393 } else if (host->cmd->data->flags & MMC_DATA_WRITE) {
394
395 at91_mci_write(host, AT91_MCI_IER, AT91_MCI_TXBUFE | AT91_MCI_BLKE);
396 at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_TXTEN);
397 }
398
399
400 return 0;
401}
402
403
404
405
406
407static void at91_mci_enable(struct at91mci_host *host)
408{
409 unsigned int mr;
410
411 at91_mci_write(host, AT91_MCI_CR, AT91_MCI_MCIEN);
412 at91_mci_write(host, AT91_MCI_IDR, 0xffffffff);
413 at91_mci_write(host, AT91_MCI_DTOR, AT91_MCI_DTOMUL_1M | AT91_MCI_DTOCYC);
414 mr = AT91_MCI_PDCMODE | 0x34a;
415
416 if (at91mci_is_mci1rev2xx())
417 mr |= AT91_MCI_RDPROOF | AT91_MCI_WRPROOF;
418
419 at91_mci_write(host, AT91_MCI_MR, mr);
420
421
422 at91_mci_write(host, AT91_MCI_SDCR, host->board->slot_b);
423}
424
425
426
427
428static void at91_mci_disable(struct at91mci_host *host)
429{
430 at91_mci_write(host, AT91_MCI_CR, AT91_MCI_MCIDIS | AT91_MCI_SWRST);
431}
432
433
434
435
436static void at91_mci_send_command(struct at91mci_host *host, struct mmc_command *cmd)
437{
438 unsigned int cmdr, mr;
439 unsigned int block_length;
440 struct mmc_data *data = cmd->data;
441
442 unsigned int blocks;
443 unsigned int ier = 0;
444
445 host->cmd = cmd;
446
447
448 if ((at91_mci_read(host, AT91_MCI_SR) & AT91_MCI_RTOE) && (cmd->opcode == 1)) {
449 pr_debug("Clearing timeout\n");
450 at91_mci_write(host, AT91_MCI_ARGR, 0);
451 at91_mci_write(host, AT91_MCI_CMDR, AT91_MCI_OPDCMD);
452 while (!(at91_mci_read(host, AT91_MCI_SR) & AT91_MCI_CMDRDY)) {
453
454 pr_debug("Clearing: SR = %08X\n", at91_mci_read(host, AT91_MCI_SR));
455 }
456 }
457
458 cmdr = cmd->opcode;
459
460 if (mmc_resp_type(cmd) == MMC_RSP_NONE)
461 cmdr |= AT91_MCI_RSPTYP_NONE;
462 else {
463
464 cmdr |= AT91_MCI_MAXLAT;
465
466 if (mmc_resp_type(cmd) == MMC_RSP_R2)
467 cmdr |= AT91_MCI_RSPTYP_136;
468 else
469 cmdr |= AT91_MCI_RSPTYP_48;
470 }
471
472 if (data) {
473
474 if (cpu_is_at91rm9200() || cpu_is_at91sam9261()) {
475 if (data->blksz & 0x3) {
476 pr_debug("Unsupported block size\n");
477 cmd->error = -EINVAL;
478 mmc_request_done(host->mmc, host->request);
479 return;
480 }
481 if (data->flags & MMC_DATA_STREAM) {
482 pr_debug("Stream commands not supported\n");
483 cmd->error = -EINVAL;
484 mmc_request_done(host->mmc, host->request);
485 return;
486 }
487 }
488
489 block_length = data->blksz;
490 blocks = data->blocks;
491
492
493 if (data->flags & MMC_DATA_READ)
494 cmdr |= (AT91_MCI_TRDIR | AT91_MCI_TRCMD_START);
495 else if (data->flags & MMC_DATA_WRITE)
496 cmdr |= AT91_MCI_TRCMD_START;
497
498 if (cmd->opcode == SD_IO_RW_EXTENDED) {
499 cmdr |= AT91_MCI_TRTYP_SDIO_BLOCK;
500 } else {
501 if (data->flags & MMC_DATA_STREAM)
502 cmdr |= AT91_MCI_TRTYP_STREAM;
503 if (data->blocks > 1)
504 cmdr |= AT91_MCI_TRTYP_MULTIPLE;
505 }
506 }
507 else {
508 block_length = 0;
509 blocks = 0;
510 }
511
512 if (host->flags & FL_SENT_STOP)
513 cmdr |= AT91_MCI_TRCMD_STOP;
514
515 if (host->bus_mode == MMC_BUSMODE_OPENDRAIN)
516 cmdr |= AT91_MCI_OPDCMD;
517
518
519
520
521 pr_debug("Sending command %d as %08X, arg = %08X, blocks = %d, length = %d (MR = %08X)\n",
522 cmd->opcode, cmdr, cmd->arg, blocks, block_length, at91_mci_read(host, AT91_MCI_MR));
523
524 if (!data) {
525 at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_TXTDIS | ATMEL_PDC_RXTDIS);
526 at91_mci_write(host, ATMEL_PDC_RPR, 0);
527 at91_mci_write(host, ATMEL_PDC_RCR, 0);
528 at91_mci_write(host, ATMEL_PDC_RNPR, 0);
529 at91_mci_write(host, ATMEL_PDC_RNCR, 0);
530 at91_mci_write(host, ATMEL_PDC_TPR, 0);
531 at91_mci_write(host, ATMEL_PDC_TCR, 0);
532 at91_mci_write(host, ATMEL_PDC_TNPR, 0);
533 at91_mci_write(host, ATMEL_PDC_TNCR, 0);
534 ier = AT91_MCI_CMDRDY;
535 } else {
536
537 mr = at91_mci_read(host, AT91_MCI_MR) & 0x5fff;
538 mr |= (data->blksz & 0x3) ? AT91_MCI_PDCFBYTE : 0;
539 mr |= (block_length << 16);
540 mr |= AT91_MCI_PDCMODE;
541 at91_mci_write(host, AT91_MCI_MR, mr);
542
543 if (!(cpu_is_at91rm9200() || cpu_is_at91sam9261()))
544 at91_mci_write(host, AT91_MCI_BLKR,
545 AT91_MCI_BLKR_BCNT(blocks) |
546 AT91_MCI_BLKR_BLKLEN(block_length));
547
548
549
550
551 at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_RXTDIS | ATMEL_PDC_TXTDIS);
552
553 if (cmdr & AT91_MCI_TRCMD_START) {
554 data->bytes_xfered = 0;
555 host->transfer_index = 0;
556 host->in_use_index = 0;
557 if (cmdr & AT91_MCI_TRDIR) {
558
559
560
561 host->total_length = 0;
562
563 at91_mci_write(host, ATMEL_PDC_RPR, host->physical_address);
564 at91_mci_write(host, ATMEL_PDC_RCR, (data->blksz & 0x3) ?
565 (blocks * block_length) : (blocks * block_length) / 4);
566 at91_mci_write(host, ATMEL_PDC_RNPR, 0);
567 at91_mci_write(host, ATMEL_PDC_RNCR, 0);
568
569 ier = AT91_MCI_ENDRX ;
570 }
571 else {
572
573
574
575 host->total_length = block_length * blocks;
576
577
578
579
580 if (at91mci_is_mci1rev2xx())
581 if (host->total_length < 12)
582 host->total_length = 12;
583
584 at91_mci_sg_to_dma(host, data);
585
586 pr_debug("Transmitting %d bytes\n", host->total_length);
587
588 at91_mci_write(host, ATMEL_PDC_TPR, host->physical_address);
589 at91_mci_write(host, ATMEL_PDC_TCR, (data->blksz & 0x3) ?
590 host->total_length : host->total_length / 4);
591
592 ier = AT91_MCI_CMDRDY;
593 }
594 }
595 }
596
597
598
599
600
601
602 at91_mci_write(host, AT91_MCI_ARGR, cmd->arg);
603 at91_mci_write(host, AT91_MCI_CMDR, cmdr);
604
605 if (cmdr & AT91_MCI_TRCMD_START) {
606 if (cmdr & AT91_MCI_TRDIR)
607 at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_RXTEN);
608 }
609
610
611 at91_mci_write(host, AT91_MCI_IER, AT91_MCI_ERRORS | ier);
612}
613
614
615
616
617static void at91_mci_process_next(struct at91mci_host *host)
618{
619 if (!(host->flags & FL_SENT_COMMAND)) {
620 host->flags |= FL_SENT_COMMAND;
621 at91_mci_send_command(host, host->request->cmd);
622 }
623 else if ((!(host->flags & FL_SENT_STOP)) && host->request->stop) {
624 host->flags |= FL_SENT_STOP;
625 at91_mci_send_command(host, host->request->stop);
626 } else {
627 del_timer(&host->timer);
628
629
630
631 if (cpu_is_at91rm9200())
632 at91_reset_host(host);
633 mmc_request_done(host->mmc, host->request);
634 }
635}
636
637
638
639
640static void at91_mci_completed_command(struct at91mci_host *host, unsigned int status)
641{
642 struct mmc_command *cmd = host->cmd;
643 struct mmc_data *data = cmd->data;
644
645 at91_mci_write(host, AT91_MCI_IDR, 0xffffffff & ~(AT91_MCI_SDIOIRQA | AT91_MCI_SDIOIRQB));
646
647 cmd->resp[0] = at91_mci_read(host, AT91_MCI_RSPR(0));
648 cmd->resp[1] = at91_mci_read(host, AT91_MCI_RSPR(1));
649 cmd->resp[2] = at91_mci_read(host, AT91_MCI_RSPR(2));
650 cmd->resp[3] = at91_mci_read(host, AT91_MCI_RSPR(3));
651
652 pr_debug("Status = %08X/%08x [%08X %08X %08X %08X]\n",
653 status, at91_mci_read(host, AT91_MCI_SR),
654 cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]);
655
656 if (status & AT91_MCI_ERRORS) {
657 if ((status & AT91_MCI_RCRCE) && !(mmc_resp_type(cmd) & MMC_RSP_CRC)) {
658 cmd->error = 0;
659 }
660 else {
661 if (status & (AT91_MCI_DTOE | AT91_MCI_DCRCE)) {
662 if (data) {
663 if (status & AT91_MCI_DTOE)
664 data->error = -ETIMEDOUT;
665 else if (status & AT91_MCI_DCRCE)
666 data->error = -EILSEQ;
667 }
668 } else {
669 if (status & AT91_MCI_RTOE)
670 cmd->error = -ETIMEDOUT;
671 else if (status & AT91_MCI_RCRCE)
672 cmd->error = -EILSEQ;
673 else
674 cmd->error = -EIO;
675 }
676
677 pr_debug("Error detected and set to %d/%d (cmd = %d, retries = %d)\n",
678 cmd->error, data ? data->error : 0,
679 cmd->opcode, cmd->retries);
680 }
681 }
682 else
683 cmd->error = 0;
684
685 at91_mci_process_next(host);
686}
687
688
689
690
691static void at91_mci_request(struct mmc_host *mmc, struct mmc_request *mrq)
692{
693 struct at91mci_host *host = mmc_priv(mmc);
694 host->request = mrq;
695 host->flags = 0;
696
697
698 mod_timer(&host->timer, jiffies + msecs_to_jiffies(2000));
699
700 at91_mci_process_next(host);
701}
702
703
704
705
706static void at91_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
707{
708 int clkdiv;
709 struct at91mci_host *host = mmc_priv(mmc);
710 unsigned long at91_master_clock = clk_get_rate(host->mci_clk);
711
712 host->bus_mode = ios->bus_mode;
713
714 if (ios->clock == 0) {
715
716 at91_mci_write(host, AT91_MCI_CR, AT91_MCI_MCIDIS);
717 clkdiv = 0;
718 }
719 else {
720
721 at91_mci_write(host, AT91_MCI_CR, AT91_MCI_MCIEN);
722
723 if ((at91_master_clock % (ios->clock * 2)) == 0)
724 clkdiv = ((at91_master_clock / ios->clock) / 2) - 1;
725 else
726 clkdiv = (at91_master_clock / ios->clock) / 2;
727
728 pr_debug("clkdiv = %d. mcck = %ld\n", clkdiv,
729 at91_master_clock / (2 * (clkdiv + 1)));
730 }
731 if (ios->bus_width == MMC_BUS_WIDTH_4 && host->board->wire4) {
732 pr_debug("MMC: Setting controller bus width to 4\n");
733 at91_mci_write(host, AT91_MCI_SDCR, at91_mci_read(host, AT91_MCI_SDCR) | AT91_MCI_SDCBUS);
734 }
735 else {
736 pr_debug("MMC: Setting controller bus width to 1\n");
737 at91_mci_write(host, AT91_MCI_SDCR, at91_mci_read(host, AT91_MCI_SDCR) & ~AT91_MCI_SDCBUS);
738 }
739
740
741 at91_mci_write(host, AT91_MCI_MR, (at91_mci_read(host, AT91_MCI_MR) & ~AT91_MCI_CLKDIV) | clkdiv);
742
743
744 if (gpio_is_valid(host->board->vcc_pin)) {
745 switch (ios->power_mode) {
746 case MMC_POWER_OFF:
747 gpio_set_value(host->board->vcc_pin, 0);
748 break;
749 case MMC_POWER_UP:
750 gpio_set_value(host->board->vcc_pin, 1);
751 break;
752 case MMC_POWER_ON:
753 break;
754 default:
755 WARN_ON(1);
756 }
757 }
758}
759
760
761
762
763static irqreturn_t at91_mci_irq(int irq, void *devid)
764{
765 struct at91mci_host *host = devid;
766 int completed = 0;
767 unsigned int int_status, int_mask;
768
769 int_status = at91_mci_read(host, AT91_MCI_SR);
770 int_mask = at91_mci_read(host, AT91_MCI_IMR);
771
772 pr_debug("MCI irq: status = %08X, %08X, %08X\n", int_status, int_mask,
773 int_status & int_mask);
774
775 int_status = int_status & int_mask;
776
777 if (int_status & AT91_MCI_ERRORS) {
778 completed = 1;
779
780 if (int_status & AT91_MCI_UNRE)
781 pr_debug("MMC: Underrun error\n");
782 if (int_status & AT91_MCI_OVRE)
783 pr_debug("MMC: Overrun error\n");
784 if (int_status & AT91_MCI_DTOE)
785 pr_debug("MMC: Data timeout\n");
786 if (int_status & AT91_MCI_DCRCE)
787 pr_debug("MMC: CRC error in data\n");
788 if (int_status & AT91_MCI_RTOE)
789 pr_debug("MMC: Response timeout\n");
790 if (int_status & AT91_MCI_RENDE)
791 pr_debug("MMC: Response end bit error\n");
792 if (int_status & AT91_MCI_RCRCE)
793 pr_debug("MMC: Response CRC error\n");
794 if (int_status & AT91_MCI_RDIRE)
795 pr_debug("MMC: Response direction error\n");
796 if (int_status & AT91_MCI_RINDE)
797 pr_debug("MMC: Response index error\n");
798 } else {
799
800
801 if (int_status & AT91_MCI_TXBUFE) {
802 pr_debug("TX buffer empty\n");
803 at91_mci_handle_transmitted(host);
804 }
805
806 if (int_status & AT91_MCI_ENDRX) {
807 pr_debug("ENDRX\n");
808 at91_mci_post_dma_read(host);
809 }
810
811 if (int_status & AT91_MCI_RXBUFF) {
812 pr_debug("RX buffer full\n");
813 at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_RXTDIS | ATMEL_PDC_TXTDIS);
814 at91_mci_write(host, AT91_MCI_IDR, AT91_MCI_RXBUFF | AT91_MCI_ENDRX);
815 completed = 1;
816 }
817
818 if (int_status & AT91_MCI_ENDTX)
819 pr_debug("Transmit has ended\n");
820
821 if (int_status & AT91_MCI_NOTBUSY) {
822 pr_debug("Card is ready\n");
823 at91_mci_update_bytes_xfered(host);
824 completed = 1;
825 }
826
827 if (int_status & AT91_MCI_DTIP)
828 pr_debug("Data transfer in progress\n");
829
830 if (int_status & AT91_MCI_BLKE) {
831 pr_debug("Block transfer has ended\n");
832 if (host->request->data && host->request->data->blocks > 1) {
833
834
835 completed = 1;
836 } else {
837 at91_mci_write(host, AT91_MCI_IER, AT91_MCI_NOTBUSY);
838 }
839 }
840
841 if (int_status & AT91_MCI_SDIOIRQA)
842 mmc_signal_sdio_irq(host->mmc);
843
844 if (int_status & AT91_MCI_SDIOIRQB)
845 mmc_signal_sdio_irq(host->mmc);
846
847 if (int_status & AT91_MCI_TXRDY)
848 pr_debug("Ready to transmit\n");
849
850 if (int_status & AT91_MCI_RXRDY)
851 pr_debug("Ready to receive\n");
852
853 if (int_status & AT91_MCI_CMDRDY) {
854 pr_debug("Command ready\n");
855 completed = at91_mci_handle_cmdrdy(host);
856 }
857 }
858
859 if (completed) {
860 pr_debug("Completed command\n");
861 at91_mci_write(host, AT91_MCI_IDR, 0xffffffff & ~(AT91_MCI_SDIOIRQA | AT91_MCI_SDIOIRQB));
862 at91_mci_completed_command(host, int_status);
863 } else
864 at91_mci_write(host, AT91_MCI_IDR, int_status & ~(AT91_MCI_SDIOIRQA | AT91_MCI_SDIOIRQB));
865
866 return IRQ_HANDLED;
867}
868
869static irqreturn_t at91_mmc_det_irq(int irq, void *_host)
870{
871 struct at91mci_host *host = _host;
872 int present;
873
874
875
876 present = !gpio_get_value(host->board->det_pin);
877
878
879
880
881
882 if (present != host->present) {
883 host->present = present;
884 pr_debug("%s: card %s\n", mmc_hostname(host->mmc),
885 present ? "insert" : "remove");
886 if (!present) {
887 pr_debug("****** Resetting SD-card bus width ******\n");
888 at91_mci_write(host, AT91_MCI_SDCR, at91_mci_read(host, AT91_MCI_SDCR) & ~AT91_MCI_SDCBUS);
889 }
890
891 mmc_detect_change(host->mmc, msecs_to_jiffies(500));
892 }
893 return IRQ_HANDLED;
894}
895
896static int at91_mci_get_ro(struct mmc_host *mmc)
897{
898 struct at91mci_host *host = mmc_priv(mmc);
899
900 if (gpio_is_valid(host->board->wp_pin))
901 return !!gpio_get_value(host->board->wp_pin);
902
903
904
905
906 return -ENOSYS;
907}
908
909static void at91_mci_enable_sdio_irq(struct mmc_host *mmc, int enable)
910{
911 struct at91mci_host *host = mmc_priv(mmc);
912
913 pr_debug("%s: sdio_irq %c : %s\n", mmc_hostname(host->mmc),
914 host->board->slot_b ? 'B':'A', enable ? "enable" : "disable");
915 at91_mci_write(host, enable ? AT91_MCI_IER : AT91_MCI_IDR,
916 host->board->slot_b ? AT91_MCI_SDIOIRQB : AT91_MCI_SDIOIRQA);
917
918}
919
920static const struct mmc_host_ops at91_mci_ops = {
921 .request = at91_mci_request,
922 .set_ios = at91_mci_set_ios,
923 .get_ro = at91_mci_get_ro,
924 .enable_sdio_irq = at91_mci_enable_sdio_irq,
925};
926
927
928
929
930static int __init at91_mci_probe(struct platform_device *pdev)
931{
932 struct mmc_host *mmc;
933 struct at91mci_host *host;
934 struct resource *res;
935 int ret;
936
937 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
938 if (!res)
939 return -ENXIO;
940
941 if (!request_mem_region(res->start, resource_size(res), DRIVER_NAME))
942 return -EBUSY;
943
944 mmc = mmc_alloc_host(sizeof(struct at91mci_host), &pdev->dev);
945 if (!mmc) {
946 ret = -ENOMEM;
947 dev_dbg(&pdev->dev, "couldn't allocate mmc host\n");
948 goto fail6;
949 }
950
951 mmc->ops = &at91_mci_ops;
952 mmc->f_min = 375000;
953 mmc->f_max = 25000000;
954 mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
955 mmc->caps = 0;
956
957 mmc->max_blk_size = MCI_MAXBLKSIZE;
958 mmc->max_blk_count = MCI_BLKATONCE;
959 mmc->max_req_size = MCI_BUFSIZE;
960 mmc->max_segs = MCI_BLKATONCE;
961 mmc->max_seg_size = MCI_BUFSIZE;
962
963 host = mmc_priv(mmc);
964 host->mmc = mmc;
965 host->bus_mode = 0;
966 host->board = pdev->dev.platform_data;
967 if (host->board->wire4) {
968 if (at91mci_is_mci1rev2xx())
969 mmc->caps |= MMC_CAP_4_BIT_DATA;
970 else
971 dev_warn(&pdev->dev, "4 wire bus mode not supported"
972 " - using 1 wire\n");
973 }
974
975 host->buffer = dma_alloc_coherent(&pdev->dev, MCI_BUFSIZE,
976 &host->physical_address, GFP_KERNEL);
977 if (!host->buffer) {
978 ret = -ENOMEM;
979 dev_err(&pdev->dev, "Can't allocate transmit buffer\n");
980 goto fail5;
981 }
982
983
984 if (at91mci_is_mci1rev2xx()) {
985
986 if (host->board->wire4 || !host->board->slot_b)
987 mmc->caps |= MMC_CAP_SDIO_IRQ;
988 }
989
990
991
992
993
994 if (gpio_is_valid(host->board->det_pin)) {
995 ret = gpio_request(host->board->det_pin, "mmc_detect");
996 if (ret < 0) {
997 dev_dbg(&pdev->dev, "couldn't claim card detect pin\n");
998 goto fail4b;
999 }
1000 }
1001 if (gpio_is_valid(host->board->wp_pin)) {
1002 ret = gpio_request(host->board->wp_pin, "mmc_wp");
1003 if (ret < 0) {
1004 dev_dbg(&pdev->dev, "couldn't claim wp sense pin\n");
1005 goto fail4;
1006 }
1007 }
1008 if (gpio_is_valid(host->board->vcc_pin)) {
1009 ret = gpio_request(host->board->vcc_pin, "mmc_vcc");
1010 if (ret < 0) {
1011 dev_dbg(&pdev->dev, "couldn't claim vcc switch pin\n");
1012 goto fail3;
1013 }
1014 }
1015
1016
1017
1018
1019 host->mci_clk = clk_get(&pdev->dev, "mci_clk");
1020 if (IS_ERR(host->mci_clk)) {
1021 ret = -ENODEV;
1022 dev_dbg(&pdev->dev, "no mci_clk?\n");
1023 goto fail2;
1024 }
1025
1026
1027
1028
1029 host->baseaddr = ioremap(res->start, resource_size(res));
1030 if (!host->baseaddr) {
1031 ret = -ENOMEM;
1032 goto fail1;
1033 }
1034
1035
1036
1037
1038 clk_enable(host->mci_clk);
1039 at91_mci_disable(host);
1040 at91_mci_enable(host);
1041
1042
1043
1044
1045 host->irq = platform_get_irq(pdev, 0);
1046 ret = request_irq(host->irq, at91_mci_irq, IRQF_SHARED,
1047 mmc_hostname(mmc), host);
1048 if (ret) {
1049 dev_dbg(&pdev->dev, "request MCI interrupt failed\n");
1050 goto fail0;
1051 }
1052
1053 setup_timer(&host->timer, at91_timeout_timer, (unsigned long)host);
1054
1055 platform_set_drvdata(pdev, mmc);
1056
1057
1058
1059
1060 if (gpio_is_valid(host->board->det_pin)) {
1061 host->present = !gpio_get_value(host->board->det_pin);
1062 }
1063 else
1064 host->present = -1;
1065
1066 mmc_add_host(mmc);
1067
1068
1069
1070
1071 if (gpio_is_valid(host->board->det_pin)) {
1072 ret = request_irq(gpio_to_irq(host->board->det_pin),
1073 at91_mmc_det_irq, 0, mmc_hostname(mmc), host);
1074 if (ret)
1075 dev_warn(&pdev->dev, "request MMC detect irq failed\n");
1076 else
1077 device_init_wakeup(&pdev->dev, 1);
1078 }
1079
1080 pr_debug("Added MCI driver\n");
1081
1082 return 0;
1083
1084fail0:
1085 clk_disable(host->mci_clk);
1086 iounmap(host->baseaddr);
1087fail1:
1088 clk_put(host->mci_clk);
1089fail2:
1090 if (gpio_is_valid(host->board->vcc_pin))
1091 gpio_free(host->board->vcc_pin);
1092fail3:
1093 if (gpio_is_valid(host->board->wp_pin))
1094 gpio_free(host->board->wp_pin);
1095fail4:
1096 if (gpio_is_valid(host->board->det_pin))
1097 gpio_free(host->board->det_pin);
1098fail4b:
1099 if (host->buffer)
1100 dma_free_coherent(&pdev->dev, MCI_BUFSIZE,
1101 host->buffer, host->physical_address);
1102fail5:
1103 mmc_free_host(mmc);
1104fail6:
1105 release_mem_region(res->start, resource_size(res));
1106 dev_err(&pdev->dev, "probe failed, err %d\n", ret);
1107 return ret;
1108}
1109
1110
1111
1112
1113static int __exit at91_mci_remove(struct platform_device *pdev)
1114{
1115 struct mmc_host *mmc = platform_get_drvdata(pdev);
1116 struct at91mci_host *host;
1117 struct resource *res;
1118
1119 if (!mmc)
1120 return -1;
1121
1122 host = mmc_priv(mmc);
1123
1124 if (host->buffer)
1125 dma_free_coherent(&pdev->dev, MCI_BUFSIZE,
1126 host->buffer, host->physical_address);
1127
1128 if (gpio_is_valid(host->board->det_pin)) {
1129 if (device_can_wakeup(&pdev->dev))
1130 free_irq(gpio_to_irq(host->board->det_pin), host);
1131 device_init_wakeup(&pdev->dev, 0);
1132 gpio_free(host->board->det_pin);
1133 }
1134
1135 at91_mci_disable(host);
1136 del_timer_sync(&host->timer);
1137 mmc_remove_host(mmc);
1138 free_irq(host->irq, host);
1139
1140 clk_disable(host->mci_clk);
1141 clk_put(host->mci_clk);
1142
1143 if (gpio_is_valid(host->board->vcc_pin))
1144 gpio_free(host->board->vcc_pin);
1145 if (gpio_is_valid(host->board->wp_pin))
1146 gpio_free(host->board->wp_pin);
1147
1148 iounmap(host->baseaddr);
1149 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1150 release_mem_region(res->start, resource_size(res));
1151
1152 mmc_free_host(mmc);
1153 platform_set_drvdata(pdev, NULL);
1154 pr_debug("MCI Removed\n");
1155
1156 return 0;
1157}
1158
1159#ifdef CONFIG_PM
1160static int at91_mci_suspend(struct platform_device *pdev, pm_message_t state)
1161{
1162 struct mmc_host *mmc = platform_get_drvdata(pdev);
1163 struct at91mci_host *host = mmc_priv(mmc);
1164 int ret = 0;
1165
1166 if (gpio_is_valid(host->board->det_pin) && device_may_wakeup(&pdev->dev))
1167 enable_irq_wake(host->board->det_pin);
1168
1169 if (mmc)
1170 ret = mmc_suspend_host(mmc);
1171
1172 return ret;
1173}
1174
1175static int at91_mci_resume(struct platform_device *pdev)
1176{
1177 struct mmc_host *mmc = platform_get_drvdata(pdev);
1178 struct at91mci_host *host = mmc_priv(mmc);
1179 int ret = 0;
1180
1181 if (gpio_is_valid(host->board->det_pin) && device_may_wakeup(&pdev->dev))
1182 disable_irq_wake(host->board->det_pin);
1183
1184 if (mmc)
1185 ret = mmc_resume_host(mmc);
1186
1187 return ret;
1188}
1189#else
1190#define at91_mci_suspend NULL
1191#define at91_mci_resume NULL
1192#endif
1193
1194static struct platform_driver at91_mci_driver = {
1195 .remove = __exit_p(at91_mci_remove),
1196 .suspend = at91_mci_suspend,
1197 .resume = at91_mci_resume,
1198 .driver = {
1199 .name = DRIVER_NAME,
1200 .owner = THIS_MODULE,
1201 },
1202};
1203
1204static int __init at91_mci_init(void)
1205{
1206 return platform_driver_probe(&at91_mci_driver, at91_mci_probe);
1207}
1208
1209static void __exit at91_mci_exit(void)
1210{
1211 platform_driver_unregister(&at91_mci_driver);
1212}
1213
1214module_init(at91_mci_init);
1215module_exit(at91_mci_exit);
1216
1217MODULE_DESCRIPTION("AT91 Multimedia Card Interface driver");
1218MODULE_AUTHOR("Nick Randell");
1219MODULE_LICENSE("GPL");
1220MODULE_ALIAS("platform:at91_mci");
1221