blob: eb7bfb39e925f45807e8d54eec9933c4f18f665a [file] [log] [blame]
Andy Fleming272cc702008-10-30 16:41:01 -05001/*
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>
Rabin Vincent9b1f9422009-04-05 13:30:54 +053034#include <div64.h>
Andy Fleming272cc702008-10-30 16:41:01 -050035
36static struct list_head mmc_devices;
37static int cur_dev_num = -1;
38
Stefano Babic11fdade2010-02-05 15:04:43 +010039int __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
Andy Fleming272cc702008-10-30 16:41:01 -050046int 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
Lei Wen01581262010-10-14 13:38:11 +080081mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
Andy Fleming272cc702008-10-30 16:41:01 -050082{
83 struct mmc_cmd cmd;
84 struct mmc_data data;
Lei Wen01581262010-10-14 13:38:11 +080085 int blklen, err;
Andy Fleming272cc702008-10-30 16:41:01 -050086
87 blklen = mmc->write_bl_len;
88
Lei Wend2bf29e2010-09-13 22:07:27 +080089 if ((start + blkcnt) > mmc->block_dev.lba) {
Wolfgang Denkfe64fd42010-09-19 01:03:20 +020090 printf("MMC: block number 0x%lx exceeds max(0x%lx)",
Lei Wend2bf29e2010-09-13 22:07:27 +080091 start + blkcnt, mmc->block_dev.lba);
92 return 0;
93 }
Andy Fleming272cc702008-10-30 16:41:01 -050094
95 if (blkcnt > 1)
96 cmd.cmdidx = MMC_CMD_WRITE_MULTIPLE_BLOCK;
97 else
98 cmd.cmdidx = MMC_CMD_WRITE_SINGLE_BLOCK;
99
100 if (mmc->high_capacity)
101 cmd.cmdarg = start;
102 else
103 cmd.cmdarg = start * blklen;
104
105 cmd.resp_type = MMC_RSP_R1;
106 cmd.flags = 0;
107
108 data.src = src;
109 data.blocks = blkcnt;
110 data.blocksize = blklen;
111 data.flags = MMC_DATA_WRITE;
112
113 err = mmc_send_cmd(mmc, &cmd, &data);
114
115 if (err) {
116 printf("mmc write failed\n\r");
117 return err;
118 }
119
120 if (blkcnt > 1) {
121 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
122 cmd.cmdarg = 0;
123 cmd.resp_type = MMC_RSP_R1b;
124 cmd.flags = 0;
Lei Wen01581262010-10-14 13:38:11 +0800125 err = mmc_send_cmd(mmc, &cmd, NULL);
126 if (err) {
127 printf("mmc fail to send stop cmd\n\r");
128 return err;
129 }
Andy Fleming272cc702008-10-30 16:41:01 -0500130 }
131
132 return blkcnt;
133}
134
Lei Wen01581262010-10-14 13:38:11 +0800135static ulong
136mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
137{
138 int err;
139 struct mmc *mmc = find_mmc_device(dev_num);
140 lbaint_t cur, blocks_todo = blkcnt;
141
142 if (!mmc)
143 return -1;
144
145 err = mmc_set_blocklen(mmc, mmc->write_bl_len);
146 if (err) {
147 printf("set write bl len failed\n\r");
148 return err;
149 }
150
151 do {
152 /*
153 * The 65535 constraint comes from some hardware has
154 * only 16 bit width block number counter
155 */
156 cur = (blocks_todo > 65535) ? 65535 : blocks_todo;
157 if(mmc_write_blocks(mmc, start, cur, src) != cur)
158 return -1;
159 blocks_todo -= cur;
160 start += cur;
161 src += cur * mmc->write_bl_len;
162 } while (blocks_todo > 0);
163
164 return blkcnt;
165}
166
Andy Fleming272cc702008-10-30 16:41:01 -0500167int mmc_read_block(struct mmc *mmc, void *dst, uint blocknum)
168{
169 struct mmc_cmd cmd;
170 struct mmc_data data;
171
172 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
173
174 if (mmc->high_capacity)
175 cmd.cmdarg = blocknum;
176 else
177 cmd.cmdarg = blocknum * mmc->read_bl_len;
178
179 cmd.resp_type = MMC_RSP_R1;
180 cmd.flags = 0;
181
182 data.dest = dst;
183 data.blocks = 1;
184 data.blocksize = mmc->read_bl_len;
185 data.flags = MMC_DATA_READ;
186
187 return mmc_send_cmd(mmc, &cmd, &data);
188}
189
190int mmc_read(struct mmc *mmc, u64 src, uchar *dst, int size)
191{
192 char *buffer;
193 int i;
194 int blklen = mmc->read_bl_len;
Rabin Vincent9b1f9422009-04-05 13:30:54 +0530195 int startblock = lldiv(src, mmc->read_bl_len);
196 int endblock = lldiv(src + size - 1, mmc->read_bl_len);
Andy Fleming272cc702008-10-30 16:41:01 -0500197 int err = 0;
198
199 /* Make a buffer big enough to hold all the blocks we might read */
200 buffer = malloc(blklen);
201
202 if (!buffer) {
203 printf("Could not allocate buffer for MMC read!\n");
204 return -1;
205 }
206
207 /* We always do full block reads from the card */
208 err = mmc_set_blocklen(mmc, mmc->read_bl_len);
209
210 if (err)
Wolfgang Denk8c4444f2010-03-11 23:35:43 +0100211 goto free_buffer;
Andy Fleming272cc702008-10-30 16:41:01 -0500212
213 for (i = startblock; i <= endblock; i++) {
214 int segment_size;
215 int offset;
216
217 err = mmc_read_block(mmc, buffer, i);
218
219 if (err)
220 goto free_buffer;
221
222 /*
223 * The first block may not be aligned, so we
224 * copy from the desired point in the block
225 */
226 offset = (src & (blklen - 1));
227 segment_size = MIN(blklen - offset, size);
228
229 memcpy(dst, buffer + offset, segment_size);
230
231 dst += segment_size;
232 src += segment_size;
233 size -= segment_size;
234 }
235
236free_buffer:
237 free(buffer);
238
239 return err;
240}
241
242static ulong mmc_bread(int dev_num, ulong start, lbaint_t blkcnt, void *dst)
243{
244 int err;
245 int i;
246 struct mmc *mmc = find_mmc_device(dev_num);
247
248 if (!mmc)
249 return 0;
250
Lei Wend2bf29e2010-09-13 22:07:27 +0800251 if ((start + blkcnt) > mmc->block_dev.lba) {
Wolfgang Denkfe64fd42010-09-19 01:03:20 +0200252 printf("MMC: block number 0x%lx exceeds max(0x%lx)",
Lei Wend2bf29e2010-09-13 22:07:27 +0800253 start + blkcnt, mmc->block_dev.lba);
254 return 0;
255 }
Andy Fleming272cc702008-10-30 16:41:01 -0500256 /* We always do full block reads from the card */
257 err = mmc_set_blocklen(mmc, mmc->read_bl_len);
258
259 if (err) {
260 return 0;
261 }
262
263 for (i = start; i < start + blkcnt; i++, dst += mmc->read_bl_len) {
264 err = mmc_read_block(mmc, dst, i);
265
266 if (err) {
267 printf("block read failed: %d\n", err);
268 return i - start;
269 }
270 }
271
272 return blkcnt;
273}
274
275int mmc_go_idle(struct mmc* mmc)
276{
277 struct mmc_cmd cmd;
278 int err;
279
280 udelay(1000);
281
282 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
283 cmd.cmdarg = 0;
284 cmd.resp_type = MMC_RSP_NONE;
285 cmd.flags = 0;
286
287 err = mmc_send_cmd(mmc, &cmd, NULL);
288
289 if (err)
290 return err;
291
292 udelay(2000);
293
294 return 0;
295}
296
297int
298sd_send_op_cond(struct mmc *mmc)
299{
300 int timeout = 1000;
301 int err;
302 struct mmc_cmd cmd;
303
304 do {
305 cmd.cmdidx = MMC_CMD_APP_CMD;
306 cmd.resp_type = MMC_RSP_R1;
307 cmd.cmdarg = 0;
308 cmd.flags = 0;
309
310 err = mmc_send_cmd(mmc, &cmd, NULL);
311
312 if (err)
313 return err;
314
315 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
316 cmd.resp_type = MMC_RSP_R3;
Stefano Babic250de122010-01-20 18:20:39 +0100317
318 /*
319 * Most cards do not answer if some reserved bits
320 * in the ocr are set. However, Some controller
321 * can set bit 7 (reserved for low voltages), but
322 * how to manage low voltages SD card is not yet
323 * specified.
324 */
325 cmd.cmdarg = mmc->voltages & 0xff8000;
Andy Fleming272cc702008-10-30 16:41:01 -0500326
327 if (mmc->version == SD_VERSION_2)
328 cmd.cmdarg |= OCR_HCS;
329
330 err = mmc_send_cmd(mmc, &cmd, NULL);
331
332 if (err)
333 return err;
334
335 udelay(1000);
336 } while ((!(cmd.response[0] & OCR_BUSY)) && timeout--);
337
338 if (timeout <= 0)
339 return UNUSABLE_ERR;
340
341 if (mmc->version != SD_VERSION_2)
342 mmc->version = SD_VERSION_1_0;
343
Rabin Vincent998be3d2009-04-05 13:30:56 +0530344 mmc->ocr = cmd.response[0];
Andy Fleming272cc702008-10-30 16:41:01 -0500345
346 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
347 mmc->rca = 0;
348
349 return 0;
350}
351
352int mmc_send_op_cond(struct mmc *mmc)
353{
354 int timeout = 1000;
355 struct mmc_cmd cmd;
356 int err;
357
358 /* Some cards seem to need this */
359 mmc_go_idle(mmc);
360
361 do {
362 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
363 cmd.resp_type = MMC_RSP_R3;
364 cmd.cmdarg = OCR_HCS | mmc->voltages;
365 cmd.flags = 0;
366
367 err = mmc_send_cmd(mmc, &cmd, NULL);
368
369 if (err)
370 return err;
371
372 udelay(1000);
373 } while (!(cmd.response[0] & OCR_BUSY) && timeout--);
374
375 if (timeout <= 0)
376 return UNUSABLE_ERR;
377
378 mmc->version = MMC_VERSION_UNKNOWN;
Rabin Vincent998be3d2009-04-05 13:30:56 +0530379 mmc->ocr = cmd.response[0];
Andy Fleming272cc702008-10-30 16:41:01 -0500380
381 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
382 mmc->rca = 0;
383
384 return 0;
385}
386
387
388int mmc_send_ext_csd(struct mmc *mmc, char *ext_csd)
389{
390 struct mmc_cmd cmd;
391 struct mmc_data data;
392 int err;
393
394 /* Get the Card Status Register */
395 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
396 cmd.resp_type = MMC_RSP_R1;
397 cmd.cmdarg = 0;
398 cmd.flags = 0;
399
400 data.dest = ext_csd;
401 data.blocks = 1;
402 data.blocksize = 512;
403 data.flags = MMC_DATA_READ;
404
405 err = mmc_send_cmd(mmc, &cmd, &data);
406
407 return err;
408}
409
410
411int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
412{
413 struct mmc_cmd cmd;
414
415 cmd.cmdidx = MMC_CMD_SWITCH;
416 cmd.resp_type = MMC_RSP_R1b;
417 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
418 (index << 16) |
419 (value << 8);
420 cmd.flags = 0;
421
422 return mmc_send_cmd(mmc, &cmd, NULL);
423}
424
425int mmc_change_freq(struct mmc *mmc)
426{
427 char ext_csd[512];
428 char cardtype;
429 int err;
430
431 mmc->card_caps = 0;
432
433 /* Only version 4 supports high-speed */
434 if (mmc->version < MMC_VERSION_4)
435 return 0;
436
437 mmc->card_caps |= MMC_MODE_4BIT;
438
439 err = mmc_send_ext_csd(mmc, ext_csd);
440
441 if (err)
442 return err;
443
444 if (ext_csd[212] || ext_csd[213] || ext_csd[214] || ext_csd[215])
445 mmc->high_capacity = 1;
446
447 cardtype = ext_csd[196] & 0xf;
448
449 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
450
451 if (err)
452 return err;
453
454 /* Now check to see that it worked */
455 err = mmc_send_ext_csd(mmc, ext_csd);
456
457 if (err)
458 return err;
459
460 /* No high-speed support */
461 if (!ext_csd[185])
462 return 0;
463
464 /* High Speed is set, there are two types: 52MHz and 26MHz */
465 if (cardtype & MMC_HS_52MHZ)
466 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
467 else
468 mmc->card_caps |= MMC_MODE_HS;
469
470 return 0;
471}
472
473int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
474{
475 struct mmc_cmd cmd;
476 struct mmc_data data;
477
478 /* Switch the frequency */
479 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
480 cmd.resp_type = MMC_RSP_R1;
481 cmd.cmdarg = (mode << 31) | 0xffffff;
482 cmd.cmdarg &= ~(0xf << (group * 4));
483 cmd.cmdarg |= value << (group * 4);
484 cmd.flags = 0;
485
486 data.dest = (char *)resp;
487 data.blocksize = 64;
488 data.blocks = 1;
489 data.flags = MMC_DATA_READ;
490
491 return mmc_send_cmd(mmc, &cmd, &data);
492}
493
494
495int sd_change_freq(struct mmc *mmc)
496{
497 int err;
498 struct mmc_cmd cmd;
499 uint scr[2];
500 uint switch_status[16];
501 struct mmc_data data;
502 int timeout;
503
504 mmc->card_caps = 0;
505
506 /* Read the SCR to find out if this card supports higher speeds */
507 cmd.cmdidx = MMC_CMD_APP_CMD;
508 cmd.resp_type = MMC_RSP_R1;
509 cmd.cmdarg = mmc->rca << 16;
510 cmd.flags = 0;
511
512 err = mmc_send_cmd(mmc, &cmd, NULL);
513
514 if (err)
515 return err;
516
517 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
518 cmd.resp_type = MMC_RSP_R1;
519 cmd.cmdarg = 0;
520 cmd.flags = 0;
521
522 timeout = 3;
523
524retry_scr:
525 data.dest = (char *)&scr;
526 data.blocksize = 8;
527 data.blocks = 1;
528 data.flags = MMC_DATA_READ;
529
530 err = mmc_send_cmd(mmc, &cmd, &data);
531
532 if (err) {
533 if (timeout--)
534 goto retry_scr;
535
536 return err;
537 }
538
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300539 mmc->scr[0] = __be32_to_cpu(scr[0]);
540 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Fleming272cc702008-10-30 16:41:01 -0500541
542 switch ((mmc->scr[0] >> 24) & 0xf) {
543 case 0:
544 mmc->version = SD_VERSION_1_0;
545 break;
546 case 1:
547 mmc->version = SD_VERSION_1_10;
548 break;
549 case 2:
550 mmc->version = SD_VERSION_2;
551 break;
552 default:
553 mmc->version = SD_VERSION_1_0;
554 break;
555 }
556
557 /* Version 1.0 doesn't support switching */
558 if (mmc->version == SD_VERSION_1_0)
559 return 0;
560
561 timeout = 4;
562 while (timeout--) {
563 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
564 (u8 *)&switch_status);
565
566 if (err)
567 return err;
568
569 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300570 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Fleming272cc702008-10-30 16:41:01 -0500571 break;
572 }
573
574 if (mmc->scr[0] & SD_DATA_4BIT)
575 mmc->card_caps |= MMC_MODE_4BIT;
576
577 /* If high-speed isn't supported, we return */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300578 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
Andy Fleming272cc702008-10-30 16:41:01 -0500579 return 0;
580
581 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)&switch_status);
582
583 if (err)
584 return err;
585
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300586 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
Andy Fleming272cc702008-10-30 16:41:01 -0500587 mmc->card_caps |= MMC_MODE_HS;
588
589 return 0;
590}
591
592/* frequency bases */
593/* divided by 10 to be nice to platforms without floating point */
594int fbase[] = {
595 10000,
596 100000,
597 1000000,
598 10000000,
599};
600
601/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
602 * to platforms without floating point.
603 */
604int multipliers[] = {
605 0, /* reserved */
606 10,
607 12,
608 13,
609 15,
610 20,
611 25,
612 30,
613 35,
614 40,
615 45,
616 50,
617 55,
618 60,
619 70,
620 80,
621};
622
623void mmc_set_ios(struct mmc *mmc)
624{
625 mmc->set_ios(mmc);
626}
627
628void mmc_set_clock(struct mmc *mmc, uint clock)
629{
630 if (clock > mmc->f_max)
631 clock = mmc->f_max;
632
633 if (clock < mmc->f_min)
634 clock = mmc->f_min;
635
636 mmc->clock = clock;
637
638 mmc_set_ios(mmc);
639}
640
641void mmc_set_bus_width(struct mmc *mmc, uint width)
642{
643 mmc->bus_width = width;
644
645 mmc_set_ios(mmc);
646}
647
648int mmc_startup(struct mmc *mmc)
649{
650 int err;
651 uint mult, freq;
652 u64 cmult, csize;
653 struct mmc_cmd cmd;
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +0530654 char ext_csd[512];
Andy Fleming272cc702008-10-30 16:41:01 -0500655
656 /* Put the Card in Identify Mode */
657 cmd.cmdidx = MMC_CMD_ALL_SEND_CID;
658 cmd.resp_type = MMC_RSP_R2;
659 cmd.cmdarg = 0;
660 cmd.flags = 0;
661
662 err = mmc_send_cmd(mmc, &cmd, NULL);
663
664 if (err)
665 return err;
666
667 memcpy(mmc->cid, cmd.response, 16);
668
669 /*
670 * For MMC cards, set the Relative Address.
671 * For SD cards, get the Relatvie Address.
672 * This also puts the cards into Standby State
673 */
674 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
675 cmd.cmdarg = mmc->rca << 16;
676 cmd.resp_type = MMC_RSP_R6;
677 cmd.flags = 0;
678
679 err = mmc_send_cmd(mmc, &cmd, NULL);
680
681 if (err)
682 return err;
683
684 if (IS_SD(mmc))
Rabin Vincent998be3d2009-04-05 13:30:56 +0530685 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
Andy Fleming272cc702008-10-30 16:41:01 -0500686
687 /* Get the Card-Specific Data */
688 cmd.cmdidx = MMC_CMD_SEND_CSD;
689 cmd.resp_type = MMC_RSP_R2;
690 cmd.cmdarg = mmc->rca << 16;
691 cmd.flags = 0;
692
693 err = mmc_send_cmd(mmc, &cmd, NULL);
694
695 if (err)
696 return err;
697
Rabin Vincent998be3d2009-04-05 13:30:56 +0530698 mmc->csd[0] = cmd.response[0];
699 mmc->csd[1] = cmd.response[1];
700 mmc->csd[2] = cmd.response[2];
701 mmc->csd[3] = cmd.response[3];
Andy Fleming272cc702008-10-30 16:41:01 -0500702
703 if (mmc->version == MMC_VERSION_UNKNOWN) {
Rabin Vincent0b453ff2009-04-05 13:30:55 +0530704 int version = (cmd.response[0] >> 26) & 0xf;
Andy Fleming272cc702008-10-30 16:41:01 -0500705
706 switch (version) {
707 case 0:
708 mmc->version = MMC_VERSION_1_2;
709 break;
710 case 1:
711 mmc->version = MMC_VERSION_1_4;
712 break;
713 case 2:
714 mmc->version = MMC_VERSION_2_2;
715 break;
716 case 3:
717 mmc->version = MMC_VERSION_3;
718 break;
719 case 4:
720 mmc->version = MMC_VERSION_4;
721 break;
722 default:
723 mmc->version = MMC_VERSION_1_2;
724 break;
725 }
726 }
727
728 /* divide frequency by 10, since the mults are 10x bigger */
Rabin Vincent0b453ff2009-04-05 13:30:55 +0530729 freq = fbase[(cmd.response[0] & 0x7)];
730 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
Andy Fleming272cc702008-10-30 16:41:01 -0500731
732 mmc->tran_speed = freq * mult;
733
Rabin Vincent998be3d2009-04-05 13:30:56 +0530734 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -0500735
736 if (IS_SD(mmc))
737 mmc->write_bl_len = mmc->read_bl_len;
738 else
Rabin Vincent998be3d2009-04-05 13:30:56 +0530739 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -0500740
741 if (mmc->high_capacity) {
742 csize = (mmc->csd[1] & 0x3f) << 16
743 | (mmc->csd[2] & 0xffff0000) >> 16;
744 cmult = 8;
745 } else {
746 csize = (mmc->csd[1] & 0x3ff) << 2
747 | (mmc->csd[2] & 0xc0000000) >> 30;
748 cmult = (mmc->csd[2] & 0x00038000) >> 15;
749 }
750
751 mmc->capacity = (csize + 1) << (cmult + 2);
752 mmc->capacity *= mmc->read_bl_len;
753
754 if (mmc->read_bl_len > 512)
755 mmc->read_bl_len = 512;
756
757 if (mmc->write_bl_len > 512)
758 mmc->write_bl_len = 512;
759
760 /* Select the card, and put it into Transfer Mode */
761 cmd.cmdidx = MMC_CMD_SELECT_CARD;
762 cmd.resp_type = MMC_RSP_R1b;
763 cmd.cmdarg = mmc->rca << 16;
764 cmd.flags = 0;
765 err = mmc_send_cmd(mmc, &cmd, NULL);
766
767 if (err)
768 return err;
769
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +0530770 if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
771 /* check ext_csd version and capacity */
772 err = mmc_send_ext_csd(mmc, ext_csd);
773 if (!err & (ext_csd[192] >= 2)) {
774 mmc->capacity = ext_csd[212] << 0 | ext_csd[213] << 8 |
775 ext_csd[214] << 16 | ext_csd[215] << 24;
776 mmc->capacity *= 512;
777 }
778 }
779
Andy Fleming272cc702008-10-30 16:41:01 -0500780 if (IS_SD(mmc))
781 err = sd_change_freq(mmc);
782 else
783 err = mmc_change_freq(mmc);
784
785 if (err)
786 return err;
787
788 /* Restrict card's capabilities by what the host can do */
789 mmc->card_caps &= mmc->host_caps;
790
791 if (IS_SD(mmc)) {
792 if (mmc->card_caps & MMC_MODE_4BIT) {
793 cmd.cmdidx = MMC_CMD_APP_CMD;
794 cmd.resp_type = MMC_RSP_R1;
795 cmd.cmdarg = mmc->rca << 16;
796 cmd.flags = 0;
797
798 err = mmc_send_cmd(mmc, &cmd, NULL);
799 if (err)
800 return err;
801
802 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
803 cmd.resp_type = MMC_RSP_R1;
804 cmd.cmdarg = 2;
805 cmd.flags = 0;
806 err = mmc_send_cmd(mmc, &cmd, NULL);
807 if (err)
808 return err;
809
810 mmc_set_bus_width(mmc, 4);
811 }
812
813 if (mmc->card_caps & MMC_MODE_HS)
814 mmc_set_clock(mmc, 50000000);
815 else
816 mmc_set_clock(mmc, 25000000);
817 } else {
818 if (mmc->card_caps & MMC_MODE_4BIT) {
819 /* Set the card to use 4 bit*/
820 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
821 EXT_CSD_BUS_WIDTH,
822 EXT_CSD_BUS_WIDTH_4);
823
824 if (err)
825 return err;
826
827 mmc_set_bus_width(mmc, 4);
828 } else if (mmc->card_caps & MMC_MODE_8BIT) {
829 /* Set the card to use 8 bit*/
830 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
831 EXT_CSD_BUS_WIDTH,
832 EXT_CSD_BUS_WIDTH_8);
833
834 if (err)
835 return err;
836
837 mmc_set_bus_width(mmc, 8);
838 }
839
840 if (mmc->card_caps & MMC_MODE_HS) {
841 if (mmc->card_caps & MMC_MODE_HS_52MHz)
842 mmc_set_clock(mmc, 52000000);
843 else
844 mmc_set_clock(mmc, 26000000);
845 } else
846 mmc_set_clock(mmc, 20000000);
847 }
848
849 /* fill in device description */
850 mmc->block_dev.lun = 0;
851 mmc->block_dev.type = 0;
852 mmc->block_dev.blksz = mmc->read_bl_len;
Rabin Vincent9b1f9422009-04-05 13:30:54 +0530853 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
Rabin Vincent0b453ff2009-04-05 13:30:55 +0530854 sprintf(mmc->block_dev.vendor, "Man %06x Snr %08x", mmc->cid[0] >> 8,
855 (mmc->cid[2] << 8) | (mmc->cid[3] >> 24));
856 sprintf(mmc->block_dev.product, "%c%c%c%c%c", mmc->cid[0] & 0xff,
857 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
858 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff);
859 sprintf(mmc->block_dev.revision, "%d.%d", mmc->cid[2] >> 28,
860 (mmc->cid[2] >> 24) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -0500861 init_part(&mmc->block_dev);
862
863 return 0;
864}
865
866int mmc_send_if_cond(struct mmc *mmc)
867{
868 struct mmc_cmd cmd;
869 int err;
870
871 cmd.cmdidx = SD_CMD_SEND_IF_COND;
872 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
873 cmd.cmdarg = ((mmc->voltages & 0xff8000) != 0) << 8 | 0xaa;
874 cmd.resp_type = MMC_RSP_R7;
875 cmd.flags = 0;
876
877 err = mmc_send_cmd(mmc, &cmd, NULL);
878
879 if (err)
880 return err;
881
Rabin Vincent998be3d2009-04-05 13:30:56 +0530882 if ((cmd.response[0] & 0xff) != 0xaa)
Andy Fleming272cc702008-10-30 16:41:01 -0500883 return UNUSABLE_ERR;
884 else
885 mmc->version = SD_VERSION_2;
886
887 return 0;
888}
889
890int mmc_register(struct mmc *mmc)
891{
892 /* Setup the universal parts of the block interface just once */
893 mmc->block_dev.if_type = IF_TYPE_MMC;
894 mmc->block_dev.dev = cur_dev_num++;
895 mmc->block_dev.removable = 1;
896 mmc->block_dev.block_read = mmc_bread;
897 mmc->block_dev.block_write = mmc_bwrite;
898
899 INIT_LIST_HEAD (&mmc->link);
900
901 list_add_tail (&mmc->link, &mmc_devices);
902
903 return 0;
904}
905
906block_dev_desc_t *mmc_get_dev(int dev)
907{
908 struct mmc *mmc = find_mmc_device(dev);
909
Rabin Vincente85649c2009-04-05 13:30:53 +0530910 return mmc ? &mmc->block_dev : NULL;
Andy Fleming272cc702008-10-30 16:41:01 -0500911}
912
913int mmc_init(struct mmc *mmc)
914{
915 int err;
916
917 err = mmc->init(mmc);
918
919 if (err)
920 return err;
921
Ilya Yanokb86b85e2009-06-29 17:53:16 +0400922 mmc_set_bus_width(mmc, 1);
923 mmc_set_clock(mmc, 1);
924
Andy Fleming272cc702008-10-30 16:41:01 -0500925 /* Reset the Card */
926 err = mmc_go_idle(mmc);
927
928 if (err)
929 return err;
930
931 /* Test for SD version 2 */
932 err = mmc_send_if_cond(mmc);
933
Andy Fleming272cc702008-10-30 16:41:01 -0500934 /* Now try to get the SD card's operating condition */
935 err = sd_send_op_cond(mmc);
936
937 /* If the command timed out, we check for an MMC card */
938 if (err == TIMEOUT) {
939 err = mmc_send_op_cond(mmc);
940
941 if (err) {
942 printf("Card did not respond to voltage select!\n");
943 return UNUSABLE_ERR;
944 }
945 }
946
947 return mmc_startup(mmc);
948}
949
950/*
951 * CPU and board-specific MMC initializations. Aliased function
952 * signals caller to move on
953 */
954static int __def_mmc_init(bd_t *bis)
955{
956 return -1;
957}
958
Peter Tyserf9a109b2009-04-20 11:08:46 -0500959int cpu_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
960int board_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
Andy Fleming272cc702008-10-30 16:41:01 -0500961
962void print_mmc_devices(char separator)
963{
964 struct mmc *m;
965 struct list_head *entry;
966
967 list_for_each(entry, &mmc_devices) {
968 m = list_entry(entry, struct mmc, link);
969
970 printf("%s: %d", m->name, m->block_dev.dev);
971
972 if (entry->next != &mmc_devices)
973 printf("%c ", separator);
974 }
975
976 printf("\n");
977}
978
979int mmc_initialize(bd_t *bis)
980{
981 INIT_LIST_HEAD (&mmc_devices);
982 cur_dev_num = 0;
983
984 if (board_mmc_init(bis) < 0)
985 cpu_mmc_init(bis);
986
987 print_mmc_devices(',');
988
989 return 0;
990}