diff options
-rw-r--r-- | drivers/mmc/core/sd.c | 23 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci.c | 2 | ||||
-rw-r--r-- | include/linux/mmc/card.h | 1 |
3 files changed, 14 insertions, 12 deletions
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index b2b43f624b9e..b0b9e372f5da 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c | |||
@@ -553,13 +553,13 @@ static int sd_set_bus_speed_mode(struct mmc_card *card, u8 *status) | |||
553 | 553 | ||
554 | static int sd_set_current_limit(struct mmc_card *card, u8 *status) | 554 | static int sd_set_current_limit(struct mmc_card *card, u8 *status) |
555 | { | 555 | { |
556 | int current_limit = 0; | 556 | int current_limit = SD_SET_CURRENT_NO_CHANGE; |
557 | int err; | 557 | int err; |
558 | 558 | ||
559 | /* | 559 | /* |
560 | * Current limit switch is only defined for SDR50, SDR104, and DDR50 | 560 | * Current limit switch is only defined for SDR50, SDR104, and DDR50 |
561 | * bus speed modes. For other bus speed modes, we set the default | 561 | * bus speed modes. For other bus speed modes, we do not change the |
562 | * current limit of 200mA. | 562 | * current limit. |
563 | */ | 563 | */ |
564 | if ((card->sd_bus_speed == UHS_SDR50_BUS_SPEED) || | 564 | if ((card->sd_bus_speed == UHS_SDR50_BUS_SPEED) || |
565 | (card->sd_bus_speed == UHS_SDR104_BUS_SPEED) || | 565 | (card->sd_bus_speed == UHS_SDR104_BUS_SPEED) || |
@@ -595,17 +595,18 @@ static int sd_set_current_limit(struct mmc_card *card, u8 *status) | |||
595 | if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_200) | 595 | if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_200) |
596 | current_limit = SD_SET_CURRENT_LIMIT_200; | 596 | current_limit = SD_SET_CURRENT_LIMIT_200; |
597 | } | 597 | } |
598 | } else | 598 | } |
599 | current_limit = SD_SET_CURRENT_LIMIT_200; | ||
600 | 599 | ||
601 | err = mmc_sd_switch(card, 1, 3, current_limit, status); | 600 | if (current_limit != SD_SET_CURRENT_NO_CHANGE) { |
602 | if (err) | 601 | err = mmc_sd_switch(card, 1, 3, current_limit, status); |
603 | return err; | 602 | if (err) |
603 | return err; | ||
604 | 604 | ||
605 | if (((status[15] >> 4) & 0x0F) != current_limit) | 605 | if (((status[15] >> 4) & 0x0F) != current_limit) |
606 | pr_warning("%s: Problem setting current limit!\n", | 606 | pr_warning("%s: Problem setting current limit!\n", |
607 | mmc_hostname(card->host)); | 607 | mmc_hostname(card->host)); |
608 | 608 | ||
609 | } | ||
609 | return 0; | 610 | return 0; |
610 | } | 611 | } |
611 | 612 | ||
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index a0853d03b330..8f61f8d6e0ca 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c | |||
@@ -2914,7 +2914,7 @@ int sdhci_add_host(struct sdhci_host *host) | |||
2914 | mmc->caps |= MMC_CAP_MAX_CURRENT_600; | 2914 | mmc->caps |= MMC_CAP_MAX_CURRENT_600; |
2915 | else if (max_current_180 >= 400) | 2915 | else if (max_current_180 >= 400) |
2916 | mmc->caps |= MMC_CAP_MAX_CURRENT_400; | 2916 | mmc->caps |= MMC_CAP_MAX_CURRENT_400; |
2917 | else | 2917 | else if (max_current_180 >= 200) |
2918 | mmc->caps |= MMC_CAP_MAX_CURRENT_200; | 2918 | mmc->caps |= MMC_CAP_MAX_CURRENT_200; |
2919 | } | 2919 | } |
2920 | 2920 | ||
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index d76513b5b263..111aca5e97f3 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
@@ -149,6 +149,7 @@ struct sd_switch_caps { | |||
149 | #define SD_SET_CURRENT_LIMIT_400 1 | 149 | #define SD_SET_CURRENT_LIMIT_400 1 |
150 | #define SD_SET_CURRENT_LIMIT_600 2 | 150 | #define SD_SET_CURRENT_LIMIT_600 2 |
151 | #define SD_SET_CURRENT_LIMIT_800 3 | 151 | #define SD_SET_CURRENT_LIMIT_800 3 |
152 | #define SD_SET_CURRENT_NO_CHANGE (-1) | ||
152 | 153 | ||
153 | #define SD_MAX_CURRENT_200 (1 << SD_SET_CURRENT_LIMIT_200) | 154 | #define SD_MAX_CURRENT_200 (1 << SD_SET_CURRENT_LIMIT_200) |
154 | #define SD_MAX_CURRENT_400 (1 << SD_SET_CURRENT_LIMIT_400) | 155 | #define SD_MAX_CURRENT_400 (1 << SD_SET_CURRENT_LIMIT_400) |