diff options
Diffstat (limited to 'drivers/mmc/core/sdio.c')
-rw-r--r-- | drivers/mmc/core/sdio.c | 54 |
1 files changed, 38 insertions, 16 deletions
diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 2273ce6b6c1a..aa0719a4dfd1 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c | |||
@@ -157,10 +157,7 @@ static int sdio_read_cccr(struct mmc_card *card, u32 ocr) | |||
157 | if (ret) | 157 | if (ret) |
158 | goto out; | 158 | goto out; |
159 | 159 | ||
160 | if (card->host->caps & | 160 | if (mmc_host_uhs(card->host)) { |
161 | (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | | ||
162 | MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 | | ||
163 | MMC_CAP_UHS_DDR50)) { | ||
164 | if (data & SDIO_UHS_DDR50) | 161 | if (data & SDIO_UHS_DDR50) |
165 | card->sw_caps.sd3_bus_mode | 162 | card->sw_caps.sd3_bus_mode |
166 | |= SD_MODE_UHS_DDR50; | 163 | |= SD_MODE_UHS_DDR50; |
@@ -478,8 +475,7 @@ static int sdio_set_bus_speed_mode(struct mmc_card *card) | |||
478 | * If the host doesn't support any of the UHS-I modes, fallback on | 475 | * If the host doesn't support any of the UHS-I modes, fallback on |
479 | * default speed. | 476 | * default speed. |
480 | */ | 477 | */ |
481 | if (!(card->host->caps & (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | | 478 | if (!mmc_host_uhs(card->host)) |
482 | MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 | MMC_CAP_UHS_DDR50))) | ||
483 | return 0; | 479 | return 0; |
484 | 480 | ||
485 | bus_speed = SDIO_SPEED_SDR12; | 481 | bus_speed = SDIO_SPEED_SDR12; |
@@ -489,23 +485,27 @@ static int sdio_set_bus_speed_mode(struct mmc_card *card) | |||
489 | bus_speed = SDIO_SPEED_SDR104; | 485 | bus_speed = SDIO_SPEED_SDR104; |
490 | timing = MMC_TIMING_UHS_SDR104; | 486 | timing = MMC_TIMING_UHS_SDR104; |
491 | card->sw_caps.uhs_max_dtr = UHS_SDR104_MAX_DTR; | 487 | card->sw_caps.uhs_max_dtr = UHS_SDR104_MAX_DTR; |
488 | card->sd_bus_speed = UHS_SDR104_BUS_SPEED; | ||
492 | } else if ((card->host->caps & MMC_CAP_UHS_DDR50) && | 489 | } else if ((card->host->caps & MMC_CAP_UHS_DDR50) && |
493 | (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_DDR50)) { | 490 | (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_DDR50)) { |
494 | bus_speed = SDIO_SPEED_DDR50; | 491 | bus_speed = SDIO_SPEED_DDR50; |
495 | timing = MMC_TIMING_UHS_DDR50; | 492 | timing = MMC_TIMING_UHS_DDR50; |
496 | card->sw_caps.uhs_max_dtr = UHS_DDR50_MAX_DTR; | 493 | card->sw_caps.uhs_max_dtr = UHS_DDR50_MAX_DTR; |
494 | card->sd_bus_speed = UHS_DDR50_BUS_SPEED; | ||
497 | } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | | 495 | } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | |
498 | MMC_CAP_UHS_SDR50)) && (card->sw_caps.sd3_bus_mode & | 496 | MMC_CAP_UHS_SDR50)) && (card->sw_caps.sd3_bus_mode & |
499 | SD_MODE_UHS_SDR50)) { | 497 | SD_MODE_UHS_SDR50)) { |
500 | bus_speed = SDIO_SPEED_SDR50; | 498 | bus_speed = SDIO_SPEED_SDR50; |
501 | timing = MMC_TIMING_UHS_SDR50; | 499 | timing = MMC_TIMING_UHS_SDR50; |
502 | card->sw_caps.uhs_max_dtr = UHS_SDR50_MAX_DTR; | 500 | card->sw_caps.uhs_max_dtr = UHS_SDR50_MAX_DTR; |
501 | card->sd_bus_speed = UHS_SDR50_BUS_SPEED; | ||
503 | } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | | 502 | } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | |
504 | MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR25)) && | 503 | MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR25)) && |
505 | (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR25)) { | 504 | (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR25)) { |
506 | bus_speed = SDIO_SPEED_SDR25; | 505 | bus_speed = SDIO_SPEED_SDR25; |
507 | timing = MMC_TIMING_UHS_SDR25; | 506 | timing = MMC_TIMING_UHS_SDR25; |
508 | card->sw_caps.uhs_max_dtr = UHS_SDR25_MAX_DTR; | 507 | card->sw_caps.uhs_max_dtr = UHS_SDR25_MAX_DTR; |
508 | card->sd_bus_speed = UHS_SDR25_BUS_SPEED; | ||
509 | } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | | 509 | } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | |
510 | MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR25 | | 510 | MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR25 | |
511 | MMC_CAP_UHS_SDR12)) && (card->sw_caps.sd3_bus_mode & | 511 | MMC_CAP_UHS_SDR12)) && (card->sw_caps.sd3_bus_mode & |
@@ -513,6 +513,7 @@ static int sdio_set_bus_speed_mode(struct mmc_card *card) | |||
513 | bus_speed = SDIO_SPEED_SDR12; | 513 | bus_speed = SDIO_SPEED_SDR12; |
514 | timing = MMC_TIMING_UHS_SDR12; | 514 | timing = MMC_TIMING_UHS_SDR12; |
515 | card->sw_caps.uhs_max_dtr = UHS_SDR12_MAX_DTR; | 515 | card->sw_caps.uhs_max_dtr = UHS_SDR12_MAX_DTR; |
516 | card->sd_bus_speed = UHS_SDR12_BUS_SPEED; | ||
516 | } | 517 | } |
517 | 518 | ||
518 | err = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_SPEED, 0, &speed); | 519 | err = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_SPEED, 0, &speed); |
@@ -583,10 +584,19 @@ static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr, | |||
583 | { | 584 | { |
584 | struct mmc_card *card; | 585 | struct mmc_card *card; |
585 | int err; | 586 | int err; |
587 | int retries = 10; | ||
586 | 588 | ||
587 | BUG_ON(!host); | 589 | BUG_ON(!host); |
588 | WARN_ON(!host->claimed); | 590 | WARN_ON(!host->claimed); |
589 | 591 | ||
592 | try_again: | ||
593 | if (!retries) { | ||
594 | pr_warning("%s: Skipping voltage switch\n", | ||
595 | mmc_hostname(host)); | ||
596 | ocr &= ~R4_18V_PRESENT; | ||
597 | host->ocr &= ~R4_18V_PRESENT; | ||
598 | } | ||
599 | |||
590 | /* | 600 | /* |
591 | * Inform the card of the voltage | 601 | * Inform the card of the voltage |
592 | */ | 602 | */ |
@@ -645,14 +655,16 @@ static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr, | |||
645 | * systems that claim 1.8v signalling in fact do not support | 655 | * systems that claim 1.8v signalling in fact do not support |
646 | * it. | 656 | * it. |
647 | */ | 657 | */ |
648 | if ((ocr & R4_18V_PRESENT) && | 658 | if (!powered_resume && (ocr & R4_18V_PRESENT) && mmc_host_uhs(host)) { |
649 | (host->caps & | 659 | err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180); |
650 | (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | | 660 | if (err == -EAGAIN) { |
651 | MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 | | 661 | sdio_reset(host); |
652 | MMC_CAP_UHS_DDR50))) { | 662 | mmc_go_idle(host); |
653 | err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180, | 663 | mmc_send_if_cond(host, host->ocr_avail); |
654 | true); | 664 | mmc_remove_card(card); |
655 | if (err) { | 665 | retries--; |
666 | goto try_again; | ||
667 | } else if (err) { | ||
656 | ocr &= ~R4_18V_PRESENT; | 668 | ocr &= ~R4_18V_PRESENT; |
657 | host->ocr &= ~R4_18V_PRESENT; | 669 | host->ocr &= ~R4_18V_PRESENT; |
658 | } | 670 | } |
@@ -937,10 +949,12 @@ static int mmc_sdio_resume(struct mmc_host *host) | |||
937 | mmc_claim_host(host); | 949 | mmc_claim_host(host); |
938 | 950 | ||
939 | /* No need to reinitialize powered-resumed nonremovable cards */ | 951 | /* No need to reinitialize powered-resumed nonremovable cards */ |
940 | if (mmc_card_is_removable(host) || !mmc_card_keep_power(host)) | 952 | if (mmc_card_is_removable(host) || !mmc_card_keep_power(host)) { |
953 | sdio_reset(host); | ||
954 | mmc_go_idle(host); | ||
941 | err = mmc_sdio_init_card(host, host->ocr, host->card, | 955 | err = mmc_sdio_init_card(host, host->ocr, host->card, |
942 | mmc_card_keep_power(host)); | 956 | mmc_card_keep_power(host)); |
943 | else if (mmc_card_keep_power(host) && mmc_card_wake_sdio_irq(host)) { | 957 | } else if (mmc_card_keep_power(host) && mmc_card_wake_sdio_irq(host)) { |
944 | /* We may have switched to 1-bit mode during suspend */ | 958 | /* We may have switched to 1-bit mode during suspend */ |
945 | err = sdio_enable_4bit_bus(host->card); | 959 | err = sdio_enable_4bit_bus(host->card); |
946 | if (err > 0) { | 960 | if (err > 0) { |
@@ -1020,6 +1034,10 @@ static int mmc_sdio_power_restore(struct mmc_host *host) | |||
1020 | goto out; | 1034 | goto out; |
1021 | } | 1035 | } |
1022 | 1036 | ||
1037 | if (mmc_host_uhs(host)) | ||
1038 | /* to query card if 1.8V signalling is supported */ | ||
1039 | host->ocr |= R4_18V_PRESENT; | ||
1040 | |||
1023 | ret = mmc_sdio_init_card(host, host->ocr, host->card, | 1041 | ret = mmc_sdio_init_card(host, host->ocr, host->card, |
1024 | mmc_card_keep_power(host)); | 1042 | mmc_card_keep_power(host)); |
1025 | if (!ret && host->sdio_irqs) | 1043 | if (!ret && host->sdio_irqs) |
@@ -1085,6 +1103,10 @@ int mmc_attach_sdio(struct mmc_host *host) | |||
1085 | /* | 1103 | /* |
1086 | * Detect and init the card. | 1104 | * Detect and init the card. |
1087 | */ | 1105 | */ |
1106 | if (mmc_host_uhs(host)) | ||
1107 | /* to query card if 1.8V signalling is supported */ | ||
1108 | host->ocr |= R4_18V_PRESENT; | ||
1109 | |||
1088 | err = mmc_sdio_init_card(host, host->ocr, NULL, 0); | 1110 | err = mmc_sdio_init_card(host, host->ocr, NULL, 0); |
1089 | if (err) { | 1111 | if (err) { |
1090 | if (err == -EAGAIN) { | 1112 | if (err == -EAGAIN) { |