aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mmc/core/sd.c23
-rw-r--r--drivers/mmc/host/sdhci.c2
-rw-r--r--include/linux/mmc/card.h1
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
554static int sd_set_current_limit(struct mmc_card *card, u8 *status) 554static 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)