]> git.ipfire.org Git - people/ms/u-boot.git/blame - drivers/mmc/mmc.c
disk/part.c: fix potential stack overflow bug
[people/ms/u-boot.git] / drivers / mmc / mmc.c
CommitLineData
272cc70b
AF
1/*
2 * Copyright 2008, Freescale Semiconductor, Inc
3 * Andy Fleming
4 *
5 * Based vaguely on the Linux code
6 *
7 * See file CREDITS for list of people who contributed to this
8 * project.
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License as
12 * published by the Free Software Foundation; either version 2 of
13 * the License, or (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
23 * MA 02111-1307 USA
24 */
25
26#include <config.h>
27#include <common.h>
28#include <command.h>
29#include <mmc.h>
30#include <part.h>
31#include <malloc.h>
32#include <linux/list.h>
33#include <mmc.h>
9b1f942c 34#include <div64.h>
272cc70b
AF
35
36static struct list_head mmc_devices;
37static int cur_dev_num = -1;
38
11fdade2
SB
39int __board_mmc_getcd(u8 *cd, struct mmc *mmc) {
40 return -1;
41}
42
43int board_mmc_getcd(u8 *cd, struct mmc *mmc)__attribute__((weak,
44 alias("__board_mmc_getcd")));
45
272cc70b
AF
46int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
47{
48 return mmc->send_cmd(mmc, cmd, data);
49}
50
51int mmc_set_blocklen(struct mmc *mmc, int len)
52{
53 struct mmc_cmd cmd;
54
55 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
56 cmd.resp_type = MMC_RSP_R1;
57 cmd.cmdarg = len;
58 cmd.flags = 0;
59
60 return mmc_send_cmd(mmc, &cmd, NULL);
61}
62
63struct mmc *find_mmc_device(int dev_num)
64{
65 struct mmc *m;
66 struct list_head *entry;
67
68 list_for_each(entry, &mmc_devices) {
69 m = list_entry(entry, struct mmc, link);
70
71 if (m->block_dev.dev == dev_num)
72 return m;
73 }
74
75 printf("MMC Device %d not found\n", dev_num);
76
77 return NULL;
78}
79
80static ulong
0158126e 81mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
272cc70b
AF
82{
83 struct mmc_cmd cmd;
84 struct mmc_data data;
272cc70b 85
d2bf29e3 86 if ((start + blkcnt) > mmc->block_dev.lba) {
def412b6 87 printf("MMC: block number 0x%lx exceeds max(0x%lx)\n",
d2bf29e3
LW
88 start + blkcnt, mmc->block_dev.lba);
89 return 0;
90 }
272cc70b
AF
91
92 if (blkcnt > 1)
93 cmd.cmdidx = MMC_CMD_WRITE_MULTIPLE_BLOCK;
94 else
95 cmd.cmdidx = MMC_CMD_WRITE_SINGLE_BLOCK;
96
97 if (mmc->high_capacity)
98 cmd.cmdarg = start;
99 else
def412b6 100 cmd.cmdarg = start * mmc->write_bl_len;
272cc70b
AF
101
102 cmd.resp_type = MMC_RSP_R1;
103 cmd.flags = 0;
104
105 data.src = src;
106 data.blocks = blkcnt;
def412b6 107 data.blocksize = mmc->write_bl_len;
272cc70b
AF
108 data.flags = MMC_DATA_WRITE;
109
def412b6
SS
110 if (mmc_send_cmd(mmc, &cmd, &data)) {
111 printf("mmc write failed\n");
112 return 0;
272cc70b
AF
113 }
114
115 if (blkcnt > 1) {
116 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
117 cmd.cmdarg = 0;
118 cmd.resp_type = MMC_RSP_R1b;
119 cmd.flags = 0;
def412b6
SS
120 if (mmc_send_cmd(mmc, &cmd, NULL)) {
121 printf("mmc fail to send stop cmd\n");
122 return 0;
0158126e 123 }
272cc70b
AF
124 }
125
126 return blkcnt;
127}
128
0158126e
LW
129static ulong
130mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
131{
0158126e
LW
132 lbaint_t cur, blocks_todo = blkcnt;
133
def412b6 134 struct mmc *mmc = find_mmc_device(dev_num);
0158126e 135 if (!mmc)
def412b6 136 return 0;
0158126e 137
def412b6
SS
138 if (mmc_set_blocklen(mmc, mmc->write_bl_len))
139 return 0;
0158126e
LW
140
141 do {
142 /*
143 * The 65535 constraint comes from some hardware has
144 * only 16 bit width block number counter
145 */
146 cur = (blocks_todo > 65535) ? 65535 : blocks_todo;
147 if(mmc_write_blocks(mmc, start, cur, src) != cur)
def412b6 148 return 0;
0158126e
LW
149 blocks_todo -= cur;
150 start += cur;
151 src += cur * mmc->write_bl_len;
152 } while (blocks_todo > 0);
153
154 return blkcnt;
155}
156
4a1a06bc 157int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, lbaint_t blkcnt)
272cc70b
AF
158{
159 struct mmc_cmd cmd;
160 struct mmc_data data;
161
4a1a06bc
AS
162 if (blkcnt > 1)
163 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
164 else
165 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
272cc70b
AF
166
167 if (mmc->high_capacity)
4a1a06bc 168 cmd.cmdarg = start;
272cc70b 169 else
4a1a06bc 170 cmd.cmdarg = start * mmc->read_bl_len;
272cc70b
AF
171
172 cmd.resp_type = MMC_RSP_R1;
173 cmd.flags = 0;
174
175 data.dest = dst;
4a1a06bc 176 data.blocks = blkcnt;
272cc70b
AF
177 data.blocksize = mmc->read_bl_len;
178 data.flags = MMC_DATA_READ;
179
4a1a06bc
AS
180 if (mmc_send_cmd(mmc, &cmd, &data))
181 return 0;
272cc70b 182
4a1a06bc
AS
183 if (blkcnt > 1) {
184 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
185 cmd.cmdarg = 0;
186 cmd.resp_type = MMC_RSP_R1b;
187 cmd.flags = 0;
188 if (mmc_send_cmd(mmc, &cmd, NULL)) {
189 printf("mmc fail to send stop cmd\n");
190 return 0;
191 }
272cc70b
AF
192 }
193
4a1a06bc 194 return blkcnt;
272cc70b
AF
195}
196
197static ulong mmc_bread(int dev_num, ulong start, lbaint_t blkcnt, void *dst)
198{
4a1a06bc
AS
199 lbaint_t cur, blocks_todo = blkcnt;
200
201 if (blkcnt == 0)
202 return 0;
272cc70b 203
4a1a06bc 204 struct mmc *mmc = find_mmc_device(dev_num);
272cc70b
AF
205 if (!mmc)
206 return 0;
207
d2bf29e3 208 if ((start + blkcnt) > mmc->block_dev.lba) {
4a1a06bc 209 printf("MMC: block number 0x%lx exceeds max(0x%lx)\n",
d2bf29e3
LW
210 start + blkcnt, mmc->block_dev.lba);
211 return 0;
212 }
272cc70b 213
4a1a06bc 214 if (mmc_set_blocklen(mmc, mmc->read_bl_len))
272cc70b 215 return 0;
272cc70b 216
4a1a06bc
AS
217 do {
218 /*
219 * The 65535 constraint comes from some hardware has
220 * only 16 bit width block number counter
221 */
222 cur = (blocks_todo > 65535) ? 65535 : blocks_todo;
223 if(mmc_read_blocks(mmc, dst, start, cur) != cur)
224 return 0;
225 blocks_todo -= cur;
226 start += cur;
227 dst += cur * mmc->read_bl_len;
228 } while (blocks_todo > 0);
272cc70b
AF
229
230 return blkcnt;
231}
232
233int mmc_go_idle(struct mmc* mmc)
234{
235 struct mmc_cmd cmd;
236 int err;
237
238 udelay(1000);
239
240 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
241 cmd.cmdarg = 0;
242 cmd.resp_type = MMC_RSP_NONE;
243 cmd.flags = 0;
244
245 err = mmc_send_cmd(mmc, &cmd, NULL);
246
247 if (err)
248 return err;
249
250 udelay(2000);
251
252 return 0;
253}
254
255int
256sd_send_op_cond(struct mmc *mmc)
257{
258 int timeout = 1000;
259 int err;
260 struct mmc_cmd cmd;
261
262 do {
263 cmd.cmdidx = MMC_CMD_APP_CMD;
264 cmd.resp_type = MMC_RSP_R1;
265 cmd.cmdarg = 0;
266 cmd.flags = 0;
267
268 err = mmc_send_cmd(mmc, &cmd, NULL);
269
270 if (err)
271 return err;
272
273 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
274 cmd.resp_type = MMC_RSP_R3;
250de12b
SB
275
276 /*
277 * Most cards do not answer if some reserved bits
278 * in the ocr are set. However, Some controller
279 * can set bit 7 (reserved for low voltages), but
280 * how to manage low voltages SD card is not yet
281 * specified.
282 */
283 cmd.cmdarg = mmc->voltages & 0xff8000;
272cc70b
AF
284
285 if (mmc->version == SD_VERSION_2)
286 cmd.cmdarg |= OCR_HCS;
287
288 err = mmc_send_cmd(mmc, &cmd, NULL);
289
290 if (err)
291 return err;
292
293 udelay(1000);
294 } while ((!(cmd.response[0] & OCR_BUSY)) && timeout--);
295
296 if (timeout <= 0)
297 return UNUSABLE_ERR;
298
299 if (mmc->version != SD_VERSION_2)
300 mmc->version = SD_VERSION_1_0;
301
998be3dd 302 mmc->ocr = cmd.response[0];
272cc70b
AF
303
304 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
305 mmc->rca = 0;
306
307 return 0;
308}
309
310int mmc_send_op_cond(struct mmc *mmc)
311{
312 int timeout = 1000;
313 struct mmc_cmd cmd;
314 int err;
315
316 /* Some cards seem to need this */
317 mmc_go_idle(mmc);
318
319 do {
320 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
321 cmd.resp_type = MMC_RSP_R3;
322 cmd.cmdarg = OCR_HCS | mmc->voltages;
323 cmd.flags = 0;
324
325 err = mmc_send_cmd(mmc, &cmd, NULL);
326
327 if (err)
328 return err;
329
330 udelay(1000);
331 } while (!(cmd.response[0] & OCR_BUSY) && timeout--);
332
333 if (timeout <= 0)
334 return UNUSABLE_ERR;
335
336 mmc->version = MMC_VERSION_UNKNOWN;
998be3dd 337 mmc->ocr = cmd.response[0];
272cc70b
AF
338
339 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
340 mmc->rca = 0;
341
342 return 0;
343}
344
345
346int mmc_send_ext_csd(struct mmc *mmc, char *ext_csd)
347{
348 struct mmc_cmd cmd;
349 struct mmc_data data;
350 int err;
351
352 /* Get the Card Status Register */
353 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
354 cmd.resp_type = MMC_RSP_R1;
355 cmd.cmdarg = 0;
356 cmd.flags = 0;
357
358 data.dest = ext_csd;
359 data.blocks = 1;
360 data.blocksize = 512;
361 data.flags = MMC_DATA_READ;
362
363 err = mmc_send_cmd(mmc, &cmd, &data);
364
365 return err;
366}
367
368
369int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
370{
371 struct mmc_cmd cmd;
372
373 cmd.cmdidx = MMC_CMD_SWITCH;
374 cmd.resp_type = MMC_RSP_R1b;
375 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
376 (index << 16) |
377 (value << 8);
378 cmd.flags = 0;
379
380 return mmc_send_cmd(mmc, &cmd, NULL);
381}
382
383int mmc_change_freq(struct mmc *mmc)
384{
385 char ext_csd[512];
386 char cardtype;
387 int err;
388
389 mmc->card_caps = 0;
390
391 /* Only version 4 supports high-speed */
392 if (mmc->version < MMC_VERSION_4)
393 return 0;
394
395 mmc->card_caps |= MMC_MODE_4BIT;
396
397 err = mmc_send_ext_csd(mmc, ext_csd);
398
399 if (err)
400 return err;
401
402 if (ext_csd[212] || ext_csd[213] || ext_csd[214] || ext_csd[215])
403 mmc->high_capacity = 1;
404
405 cardtype = ext_csd[196] & 0xf;
406
407 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
408
409 if (err)
410 return err;
411
412 /* Now check to see that it worked */
413 err = mmc_send_ext_csd(mmc, ext_csd);
414
415 if (err)
416 return err;
417
418 /* No high-speed support */
419 if (!ext_csd[185])
420 return 0;
421
422 /* High Speed is set, there are two types: 52MHz and 26MHz */
423 if (cardtype & MMC_HS_52MHZ)
424 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
425 else
426 mmc->card_caps |= MMC_MODE_HS;
427
428 return 0;
429}
430
431int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
432{
433 struct mmc_cmd cmd;
434 struct mmc_data data;
435
436 /* Switch the frequency */
437 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
438 cmd.resp_type = MMC_RSP_R1;
439 cmd.cmdarg = (mode << 31) | 0xffffff;
440 cmd.cmdarg &= ~(0xf << (group * 4));
441 cmd.cmdarg |= value << (group * 4);
442 cmd.flags = 0;
443
444 data.dest = (char *)resp;
445 data.blocksize = 64;
446 data.blocks = 1;
447 data.flags = MMC_DATA_READ;
448
449 return mmc_send_cmd(mmc, &cmd, &data);
450}
451
452
453int sd_change_freq(struct mmc *mmc)
454{
455 int err;
456 struct mmc_cmd cmd;
457 uint scr[2];
458 uint switch_status[16];
459 struct mmc_data data;
460 int timeout;
461
462 mmc->card_caps = 0;
463
464 /* Read the SCR to find out if this card supports higher speeds */
465 cmd.cmdidx = MMC_CMD_APP_CMD;
466 cmd.resp_type = MMC_RSP_R1;
467 cmd.cmdarg = mmc->rca << 16;
468 cmd.flags = 0;
469
470 err = mmc_send_cmd(mmc, &cmd, NULL);
471
472 if (err)
473 return err;
474
475 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
476 cmd.resp_type = MMC_RSP_R1;
477 cmd.cmdarg = 0;
478 cmd.flags = 0;
479
480 timeout = 3;
481
482retry_scr:
483 data.dest = (char *)&scr;
484 data.blocksize = 8;
485 data.blocks = 1;
486 data.flags = MMC_DATA_READ;
487
488 err = mmc_send_cmd(mmc, &cmd, &data);
489
490 if (err) {
491 if (timeout--)
492 goto retry_scr;
493
494 return err;
495 }
496
4e3d89ba
YK
497 mmc->scr[0] = __be32_to_cpu(scr[0]);
498 mmc->scr[1] = __be32_to_cpu(scr[1]);
272cc70b
AF
499
500 switch ((mmc->scr[0] >> 24) & 0xf) {
501 case 0:
502 mmc->version = SD_VERSION_1_0;
503 break;
504 case 1:
505 mmc->version = SD_VERSION_1_10;
506 break;
507 case 2:
508 mmc->version = SD_VERSION_2;
509 break;
510 default:
511 mmc->version = SD_VERSION_1_0;
512 break;
513 }
514
515 /* Version 1.0 doesn't support switching */
516 if (mmc->version == SD_VERSION_1_0)
517 return 0;
518
519 timeout = 4;
520 while (timeout--) {
521 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
522 (u8 *)&switch_status);
523
524 if (err)
525 return err;
526
527 /* The high-speed function is busy. Try again */
4e3d89ba 528 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
272cc70b
AF
529 break;
530 }
531
532 if (mmc->scr[0] & SD_DATA_4BIT)
533 mmc->card_caps |= MMC_MODE_4BIT;
534
535 /* If high-speed isn't supported, we return */
4e3d89ba 536 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
272cc70b
AF
537 return 0;
538
539 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)&switch_status);
540
541 if (err)
542 return err;
543
4e3d89ba 544 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
272cc70b
AF
545 mmc->card_caps |= MMC_MODE_HS;
546
547 return 0;
548}
549
550/* frequency bases */
551/* divided by 10 to be nice to platforms without floating point */
552int fbase[] = {
553 10000,
554 100000,
555 1000000,
556 10000000,
557};
558
559/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
560 * to platforms without floating point.
561 */
562int multipliers[] = {
563 0, /* reserved */
564 10,
565 12,
566 13,
567 15,
568 20,
569 25,
570 30,
571 35,
572 40,
573 45,
574 50,
575 55,
576 60,
577 70,
578 80,
579};
580
581void mmc_set_ios(struct mmc *mmc)
582{
583 mmc->set_ios(mmc);
584}
585
586void mmc_set_clock(struct mmc *mmc, uint clock)
587{
588 if (clock > mmc->f_max)
589 clock = mmc->f_max;
590
591 if (clock < mmc->f_min)
592 clock = mmc->f_min;
593
594 mmc->clock = clock;
595
596 mmc_set_ios(mmc);
597}
598
599void mmc_set_bus_width(struct mmc *mmc, uint width)
600{
601 mmc->bus_width = width;
602
603 mmc_set_ios(mmc);
604}
605
606int mmc_startup(struct mmc *mmc)
607{
608 int err;
609 uint mult, freq;
610 u64 cmult, csize;
611 struct mmc_cmd cmd;
d23e2c09 612 char ext_csd[512];
272cc70b
AF
613
614 /* Put the Card in Identify Mode */
615 cmd.cmdidx = MMC_CMD_ALL_SEND_CID;
616 cmd.resp_type = MMC_RSP_R2;
617 cmd.cmdarg = 0;
618 cmd.flags = 0;
619
620 err = mmc_send_cmd(mmc, &cmd, NULL);
621
622 if (err)
623 return err;
624
625 memcpy(mmc->cid, cmd.response, 16);
626
627 /*
628 * For MMC cards, set the Relative Address.
629 * For SD cards, get the Relatvie Address.
630 * This also puts the cards into Standby State
631 */
632 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
633 cmd.cmdarg = mmc->rca << 16;
634 cmd.resp_type = MMC_RSP_R6;
635 cmd.flags = 0;
636
637 err = mmc_send_cmd(mmc, &cmd, NULL);
638
639 if (err)
640 return err;
641
642 if (IS_SD(mmc))
998be3dd 643 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
272cc70b
AF
644
645 /* Get the Card-Specific Data */
646 cmd.cmdidx = MMC_CMD_SEND_CSD;
647 cmd.resp_type = MMC_RSP_R2;
648 cmd.cmdarg = mmc->rca << 16;
649 cmd.flags = 0;
650
651 err = mmc_send_cmd(mmc, &cmd, NULL);
652
653 if (err)
654 return err;
655
998be3dd
RV
656 mmc->csd[0] = cmd.response[0];
657 mmc->csd[1] = cmd.response[1];
658 mmc->csd[2] = cmd.response[2];
659 mmc->csd[3] = cmd.response[3];
272cc70b
AF
660
661 if (mmc->version == MMC_VERSION_UNKNOWN) {
0b453ffe 662 int version = (cmd.response[0] >> 26) & 0xf;
272cc70b
AF
663
664 switch (version) {
665 case 0:
666 mmc->version = MMC_VERSION_1_2;
667 break;
668 case 1:
669 mmc->version = MMC_VERSION_1_4;
670 break;
671 case 2:
672 mmc->version = MMC_VERSION_2_2;
673 break;
674 case 3:
675 mmc->version = MMC_VERSION_3;
676 break;
677 case 4:
678 mmc->version = MMC_VERSION_4;
679 break;
680 default:
681 mmc->version = MMC_VERSION_1_2;
682 break;
683 }
684 }
685
686 /* divide frequency by 10, since the mults are 10x bigger */
0b453ffe
RV
687 freq = fbase[(cmd.response[0] & 0x7)];
688 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
272cc70b
AF
689
690 mmc->tran_speed = freq * mult;
691
998be3dd 692 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
272cc70b
AF
693
694 if (IS_SD(mmc))
695 mmc->write_bl_len = mmc->read_bl_len;
696 else
998be3dd 697 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
272cc70b
AF
698
699 if (mmc->high_capacity) {
700 csize = (mmc->csd[1] & 0x3f) << 16
701 | (mmc->csd[2] & 0xffff0000) >> 16;
702 cmult = 8;
703 } else {
704 csize = (mmc->csd[1] & 0x3ff) << 2
705 | (mmc->csd[2] & 0xc0000000) >> 30;
706 cmult = (mmc->csd[2] & 0x00038000) >> 15;
707 }
708
709 mmc->capacity = (csize + 1) << (cmult + 2);
710 mmc->capacity *= mmc->read_bl_len;
711
712 if (mmc->read_bl_len > 512)
713 mmc->read_bl_len = 512;
714
715 if (mmc->write_bl_len > 512)
716 mmc->write_bl_len = 512;
717
718 /* Select the card, and put it into Transfer Mode */
719 cmd.cmdidx = MMC_CMD_SELECT_CARD;
720 cmd.resp_type = MMC_RSP_R1b;
721 cmd.cmdarg = mmc->rca << 16;
722 cmd.flags = 0;
723 err = mmc_send_cmd(mmc, &cmd, NULL);
724
725 if (err)
726 return err;
727
d23e2c09
SG
728 if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
729 /* check ext_csd version and capacity */
730 err = mmc_send_ext_csd(mmc, ext_csd);
731 if (!err & (ext_csd[192] >= 2)) {
732 mmc->capacity = ext_csd[212] << 0 | ext_csd[213] << 8 |
733 ext_csd[214] << 16 | ext_csd[215] << 24;
734 mmc->capacity *= 512;
735 }
736 }
737
272cc70b
AF
738 if (IS_SD(mmc))
739 err = sd_change_freq(mmc);
740 else
741 err = mmc_change_freq(mmc);
742
743 if (err)
744 return err;
745
746 /* Restrict card's capabilities by what the host can do */
747 mmc->card_caps &= mmc->host_caps;
748
749 if (IS_SD(mmc)) {
750 if (mmc->card_caps & MMC_MODE_4BIT) {
751 cmd.cmdidx = MMC_CMD_APP_CMD;
752 cmd.resp_type = MMC_RSP_R1;
753 cmd.cmdarg = mmc->rca << 16;
754 cmd.flags = 0;
755
756 err = mmc_send_cmd(mmc, &cmd, NULL);
757 if (err)
758 return err;
759
760 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
761 cmd.resp_type = MMC_RSP_R1;
762 cmd.cmdarg = 2;
763 cmd.flags = 0;
764 err = mmc_send_cmd(mmc, &cmd, NULL);
765 if (err)
766 return err;
767
768 mmc_set_bus_width(mmc, 4);
769 }
770
771 if (mmc->card_caps & MMC_MODE_HS)
772 mmc_set_clock(mmc, 50000000);
773 else
774 mmc_set_clock(mmc, 25000000);
775 } else {
776 if (mmc->card_caps & MMC_MODE_4BIT) {
777 /* Set the card to use 4 bit*/
778 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
779 EXT_CSD_BUS_WIDTH,
780 EXT_CSD_BUS_WIDTH_4);
781
782 if (err)
783 return err;
784
785 mmc_set_bus_width(mmc, 4);
786 } else if (mmc->card_caps & MMC_MODE_8BIT) {
787 /* Set the card to use 8 bit*/
788 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
789 EXT_CSD_BUS_WIDTH,
790 EXT_CSD_BUS_WIDTH_8);
791
792 if (err)
793 return err;
794
795 mmc_set_bus_width(mmc, 8);
796 }
797
798 if (mmc->card_caps & MMC_MODE_HS) {
799 if (mmc->card_caps & MMC_MODE_HS_52MHz)
800 mmc_set_clock(mmc, 52000000);
801 else
802 mmc_set_clock(mmc, 26000000);
803 } else
804 mmc_set_clock(mmc, 20000000);
805 }
806
807 /* fill in device description */
808 mmc->block_dev.lun = 0;
809 mmc->block_dev.type = 0;
810 mmc->block_dev.blksz = mmc->read_bl_len;
9b1f942c 811 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
0b453ffe
RV
812 sprintf(mmc->block_dev.vendor, "Man %06x Snr %08x", mmc->cid[0] >> 8,
813 (mmc->cid[2] << 8) | (mmc->cid[3] >> 24));
814 sprintf(mmc->block_dev.product, "%c%c%c%c%c", mmc->cid[0] & 0xff,
815 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
816 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff);
817 sprintf(mmc->block_dev.revision, "%d.%d", mmc->cid[2] >> 28,
818 (mmc->cid[2] >> 24) & 0xf);
272cc70b
AF
819 init_part(&mmc->block_dev);
820
821 return 0;
822}
823
824int mmc_send_if_cond(struct mmc *mmc)
825{
826 struct mmc_cmd cmd;
827 int err;
828
829 cmd.cmdidx = SD_CMD_SEND_IF_COND;
830 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
831 cmd.cmdarg = ((mmc->voltages & 0xff8000) != 0) << 8 | 0xaa;
832 cmd.resp_type = MMC_RSP_R7;
833 cmd.flags = 0;
834
835 err = mmc_send_cmd(mmc, &cmd, NULL);
836
837 if (err)
838 return err;
839
998be3dd 840 if ((cmd.response[0] & 0xff) != 0xaa)
272cc70b
AF
841 return UNUSABLE_ERR;
842 else
843 mmc->version = SD_VERSION_2;
844
845 return 0;
846}
847
848int mmc_register(struct mmc *mmc)
849{
850 /* Setup the universal parts of the block interface just once */
851 mmc->block_dev.if_type = IF_TYPE_MMC;
852 mmc->block_dev.dev = cur_dev_num++;
853 mmc->block_dev.removable = 1;
854 mmc->block_dev.block_read = mmc_bread;
855 mmc->block_dev.block_write = mmc_bwrite;
856
857 INIT_LIST_HEAD (&mmc->link);
858
859 list_add_tail (&mmc->link, &mmc_devices);
860
861 return 0;
862}
863
864block_dev_desc_t *mmc_get_dev(int dev)
865{
866 struct mmc *mmc = find_mmc_device(dev);
867
e85649c7 868 return mmc ? &mmc->block_dev : NULL;
272cc70b
AF
869}
870
871int mmc_init(struct mmc *mmc)
872{
873 int err;
874
875 err = mmc->init(mmc);
876
877 if (err)
878 return err;
879
b86b85e2
IY
880 mmc_set_bus_width(mmc, 1);
881 mmc_set_clock(mmc, 1);
882
272cc70b
AF
883 /* Reset the Card */
884 err = mmc_go_idle(mmc);
885
886 if (err)
887 return err;
888
889 /* Test for SD version 2 */
890 err = mmc_send_if_cond(mmc);
891
272cc70b
AF
892 /* Now try to get the SD card's operating condition */
893 err = sd_send_op_cond(mmc);
894
895 /* If the command timed out, we check for an MMC card */
896 if (err == TIMEOUT) {
897 err = mmc_send_op_cond(mmc);
898
899 if (err) {
900 printf("Card did not respond to voltage select!\n");
901 return UNUSABLE_ERR;
902 }
903 }
904
905 return mmc_startup(mmc);
906}
907
908/*
909 * CPU and board-specific MMC initializations. Aliased function
910 * signals caller to move on
911 */
912static int __def_mmc_init(bd_t *bis)
913{
914 return -1;
915}
916
f9a109b3
PT
917int cpu_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
918int board_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
272cc70b
AF
919
920void print_mmc_devices(char separator)
921{
922 struct mmc *m;
923 struct list_head *entry;
924
925 list_for_each(entry, &mmc_devices) {
926 m = list_entry(entry, struct mmc, link);
927
928 printf("%s: %d", m->name, m->block_dev.dev);
929
930 if (entry->next != &mmc_devices)
931 printf("%c ", separator);
932 }
933
934 printf("\n");
935}
936
937int mmc_initialize(bd_t *bis)
938{
939 INIT_LIST_HEAD (&mmc_devices);
940 cur_dev_num = 0;
941
942 if (board_mmc_init(bis) < 0)
943 cpu_mmc_init(bis);
944
945 print_mmc_devices(',');
946
947 return 0;
948}