diff options
author | Philip Rakity <prakity@marvell.com> | 2012-05-27 21:36:33 -0400 |
---|---|---|
committer | Chris Ball <cjb@laptop.org> | 2012-07-21 00:02:23 -0400 |
commit | 0aa6770000bafa65c17cf44b6619d328d4fc79b3 (patch) | |
tree | 58ac3bff5d06e706ad38f9ccc8acb39b02301938 /drivers/mmc | |
parent | bad37e1ac6b1a73ed30702b24a45c27c4f53aada (diff) |
mmc: sdhci: only set 200mA support for 1.8v if 200mA is available
max_current_caps can return 0 if not available from the sd controller.
If no regulator is present or the regulator specifies a current
less then 200ma, we no longer still set the 200mA caps bit anyway.
Signed-off-by: Philip Rakity <prakity@marvell.com>
Reviewed-by: Aaron Lu <aaron_lu@amd.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
Diffstat (limited to 'drivers/mmc')
-rw-r--r-- | drivers/mmc/core/sd.c | 23 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci.c | 2 |
2 files changed, 13 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 | ||