aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/mmc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mmc/mmc.c')
-rw-r--r--drivers/mmc/mmc.c140
1 files changed, 112 insertions, 28 deletions
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 105f419d08cb..b48c277312de 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -289,7 +289,10 @@ void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card,
289 else 289 else
290 limit_us = 100000; 290 limit_us = 100000;
291 291
292 if (timeout_us > limit_us) { 292 /*
293 * SDHC cards always use these fixed values.
294 */
295 if (timeout_us > limit_us || mmc_card_blockaddr(card)) {
293 data->timeout_ns = limit_us * 1000; 296 data->timeout_ns = limit_us * 1000;
294 data->timeout_clks = 0; 297 data->timeout_clks = 0;
295 } 298 }
@@ -372,7 +375,7 @@ static inline void mmc_set_ios(struct mmc_host *host)
372 mmc_hostname(host), ios->clock, ios->bus_mode, 375 mmc_hostname(host), ios->clock, ios->bus_mode,
373 ios->power_mode, ios->chip_select, ios->vdd, 376 ios->power_mode, ios->chip_select, ios->vdd,
374 ios->bus_width); 377 ios->bus_width);
375 378
376 host->ops->set_ios(host, ios); 379 host->ops->set_ios(host, ios);
377} 380}
378 381
@@ -588,34 +591,65 @@ static void mmc_decode_csd(struct mmc_card *card)
588 591
589 if (mmc_card_sd(card)) { 592 if (mmc_card_sd(card)) {
590 csd_struct = UNSTUFF_BITS(resp, 126, 2); 593 csd_struct = UNSTUFF_BITS(resp, 126, 2);
591 if (csd_struct != 0) { 594
595 switch (csd_struct) {
596 case 0:
597 m = UNSTUFF_BITS(resp, 115, 4);
598 e = UNSTUFF_BITS(resp, 112, 3);
599 csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
600 csd->tacc_clks = UNSTUFF_BITS(resp, 104, 8) * 100;
601
602 m = UNSTUFF_BITS(resp, 99, 4);
603 e = UNSTUFF_BITS(resp, 96, 3);
604 csd->max_dtr = tran_exp[e] * tran_mant[m];
605 csd->cmdclass = UNSTUFF_BITS(resp, 84, 12);
606
607 e = UNSTUFF_BITS(resp, 47, 3);
608 m = UNSTUFF_BITS(resp, 62, 12);
609 csd->capacity = (1 + m) << (e + 2);
610
611 csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
612 csd->read_partial = UNSTUFF_BITS(resp, 79, 1);
613 csd->write_misalign = UNSTUFF_BITS(resp, 78, 1);
614 csd->read_misalign = UNSTUFF_BITS(resp, 77, 1);
615 csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3);
616 csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4);
617 csd->write_partial = UNSTUFF_BITS(resp, 21, 1);
618 break;
619 case 1:
620 /*
621 * This is a block-addressed SDHC card. Most
622 * interesting fields are unused and have fixed
623 * values. To avoid getting tripped by buggy cards,
624 * we assume those fixed values ourselves.
625 */
626 mmc_card_set_blockaddr(card);
627
628 csd->tacc_ns = 0; /* Unused */
629 csd->tacc_clks = 0; /* Unused */
630
631 m = UNSTUFF_BITS(resp, 99, 4);
632 e = UNSTUFF_BITS(resp, 96, 3);
633 csd->max_dtr = tran_exp[e] * tran_mant[m];
634 csd->cmdclass = UNSTUFF_BITS(resp, 84, 12);
635
636 m = UNSTUFF_BITS(resp, 48, 22);
637 csd->capacity = (1 + m) << 10;
638
639 csd->read_blkbits = 9;
640 csd->read_partial = 0;
641 csd->write_misalign = 0;
642 csd->read_misalign = 0;
643 csd->r2w_factor = 4; /* Unused */
644 csd->write_blkbits = 9;
645 csd->write_partial = 0;
646 break;
647 default:
592 printk("%s: unrecognised CSD structure version %d\n", 648 printk("%s: unrecognised CSD structure version %d\n",
593 mmc_hostname(card->host), csd_struct); 649 mmc_hostname(card->host), csd_struct);
594 mmc_card_set_bad(card); 650 mmc_card_set_bad(card);
595 return; 651 return;
596 } 652 }
597
598 m = UNSTUFF_BITS(resp, 115, 4);
599 e = UNSTUFF_BITS(resp, 112, 3);
600 csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
601 csd->tacc_clks = UNSTUFF_BITS(resp, 104, 8) * 100;
602
603 m = UNSTUFF_BITS(resp, 99, 4);
604 e = UNSTUFF_BITS(resp, 96, 3);
605 csd->max_dtr = tran_exp[e] * tran_mant[m];
606 csd->cmdclass = UNSTUFF_BITS(resp, 84, 12);
607
608 e = UNSTUFF_BITS(resp, 47, 3);
609 m = UNSTUFF_BITS(resp, 62, 12);
610 csd->capacity = (1 + m) << (e + 2);
611
612 csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
613 csd->read_partial = UNSTUFF_BITS(resp, 79, 1);
614 csd->write_misalign = UNSTUFF_BITS(resp, 78, 1);
615 csd->read_misalign = UNSTUFF_BITS(resp, 77, 1);
616 csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3);
617 csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4);
618 csd->write_partial = UNSTUFF_BITS(resp, 21, 1);
619 } else { 653 } else {
620 /* 654 /*
621 * We only understand CSD structure v1.1 and v1.2. 655 * We only understand CSD structure v1.1 and v1.2.
@@ -848,6 +882,41 @@ static int mmc_send_app_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
848 return err; 882 return err;
849} 883}
850 884
885static int mmc_send_if_cond(struct mmc_host *host, u32 ocr, int *rsd2)
886{
887 struct mmc_command cmd;
888 int err, sd2;
889 static const u8 test_pattern = 0xAA;
890
891 /*
892 * To support SD 2.0 cards, we must always invoke SD_SEND_IF_COND
893 * before SD_APP_OP_COND. This command will harmlessly fail for
894 * SD 1.0 cards.
895 */
896 cmd.opcode = SD_SEND_IF_COND;
897 cmd.arg = ((ocr & 0xFF8000) != 0) << 8 | test_pattern;
898 cmd.flags = MMC_RSP_R7 | MMC_CMD_BCR;
899
900 err = mmc_wait_for_cmd(host, &cmd, 0);
901 if (err == MMC_ERR_NONE) {
902 if ((cmd.resp[0] & 0xFF) == test_pattern) {
903 sd2 = 1;
904 } else {
905 sd2 = 0;
906 err = MMC_ERR_FAILED;
907 }
908 } else {
909 /*
910 * Treat errors as SD 1.0 card.
911 */
912 sd2 = 0;
913 err = MMC_ERR_NONE;
914 }
915 if (rsd2)
916 *rsd2 = sd2;
917 return err;
918}
919
851/* 920/*
852 * Discover cards by requesting their CID. If this command 921 * Discover cards by requesting their CID. If this command
853 * times out, it is not an error; there are no further cards 922 * times out, it is not an error; there are no further cards
@@ -1334,6 +1403,10 @@ static void mmc_setup(struct mmc_host *host)
1334 mmc_power_up(host); 1403 mmc_power_up(host);
1335 mmc_idle_cards(host); 1404 mmc_idle_cards(host);
1336 1405
1406 err = mmc_send_if_cond(host, host->ocr_avail, NULL);
1407 if (err != MMC_ERR_NONE) {
1408 return;
1409 }
1337 err = mmc_send_app_op_cond(host, 0, &ocr); 1410 err = mmc_send_app_op_cond(host, 0, &ocr);
1338 1411
1339 /* 1412 /*
@@ -1386,10 +1459,21 @@ static void mmc_setup(struct mmc_host *host)
1386 * all get the idea that they should be ready for CMD2. 1459 * all get the idea that they should be ready for CMD2.
1387 * (My SanDisk card seems to need this.) 1460 * (My SanDisk card seems to need this.)
1388 */ 1461 */
1389 if (host->mode == MMC_MODE_SD) 1462 if (host->mode == MMC_MODE_SD) {
1390 mmc_send_app_op_cond(host, host->ocr, NULL); 1463 int err, sd2;
1391 else 1464 err = mmc_send_if_cond(host, host->ocr, &sd2);
1465 if (err == MMC_ERR_NONE) {
1466 /*
1467 * If SD_SEND_IF_COND indicates an SD 2.0
1468 * compliant card and we should set bit 30
1469 * of the ocr to indicate that we can handle
1470 * block-addressed SDHC cards.
1471 */
1472 mmc_send_app_op_cond(host, host->ocr | (sd2 << 30), NULL);
1473 }
1474 } else {
1392 mmc_send_op_cond(host, host->ocr, NULL); 1475 mmc_send_op_cond(host, host->ocr, NULL);
1476 }
1393 1477
1394 mmc_discover_cards(host); 1478 mmc_discover_cards(host);
1395 1479