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>
This commit is contained in:
parent
bad37e1ac6
commit
0aa6770000
3 changed files with 14 additions and 12 deletions
|
@ -553,13 +553,13 @@ static int sd_set_bus_speed_mode(struct mmc_card *card, u8 *status)
|
||||||
|
|
||||||
static int sd_set_current_limit(struct mmc_card *card, u8 *status)
|
static int sd_set_current_limit(struct mmc_card *card, u8 *status)
|
||||||
{
|
{
|
||||||
int current_limit = 0;
|
int current_limit = SD_SET_CURRENT_NO_CHANGE;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Current limit switch is only defined for SDR50, SDR104, and DDR50
|
* Current limit switch is only defined for SDR50, SDR104, and DDR50
|
||||||
* bus speed modes. For other bus speed modes, we set the default
|
* bus speed modes. For other bus speed modes, we do not change the
|
||||||
* current limit of 200mA.
|
* current limit.
|
||||||
*/
|
*/
|
||||||
if ((card->sd_bus_speed == UHS_SDR50_BUS_SPEED) ||
|
if ((card->sd_bus_speed == UHS_SDR50_BUS_SPEED) ||
|
||||||
(card->sd_bus_speed == UHS_SDR104_BUS_SPEED) ||
|
(card->sd_bus_speed == UHS_SDR104_BUS_SPEED) ||
|
||||||
|
@ -595,17 +595,18 @@ static int sd_set_current_limit(struct mmc_card *card, u8 *status)
|
||||||
if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_200)
|
if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_200)
|
||||||
current_limit = SD_SET_CURRENT_LIMIT_200;
|
current_limit = SD_SET_CURRENT_LIMIT_200;
|
||||||
}
|
}
|
||||||
} else
|
}
|
||||||
current_limit = SD_SET_CURRENT_LIMIT_200;
|
|
||||||
|
|
||||||
err = mmc_sd_switch(card, 1, 3, current_limit, status);
|
if (current_limit != SD_SET_CURRENT_NO_CHANGE) {
|
||||||
if (err)
|
err = mmc_sd_switch(card, 1, 3, current_limit, status);
|
||||||
return err;
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
if (((status[15] >> 4) & 0x0F) != current_limit)
|
if (((status[15] >> 4) & 0x0F) != current_limit)
|
||||||
pr_warning("%s: Problem setting current limit!\n",
|
pr_warning("%s: Problem setting current limit!\n",
|
||||||
mmc_hostname(card->host));
|
mmc_hostname(card->host));
|
||||||
|
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2914,7 +2914,7 @@ int sdhci_add_host(struct sdhci_host *host)
|
||||||
mmc->caps |= MMC_CAP_MAX_CURRENT_600;
|
mmc->caps |= MMC_CAP_MAX_CURRENT_600;
|
||||||
else if (max_current_180 >= 400)
|
else if (max_current_180 >= 400)
|
||||||
mmc->caps |= MMC_CAP_MAX_CURRENT_400;
|
mmc->caps |= MMC_CAP_MAX_CURRENT_400;
|
||||||
else
|
else if (max_current_180 >= 200)
|
||||||
mmc->caps |= MMC_CAP_MAX_CURRENT_200;
|
mmc->caps |= MMC_CAP_MAX_CURRENT_200;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -149,6 +149,7 @@ struct sd_switch_caps {
|
||||||
#define SD_SET_CURRENT_LIMIT_400 1
|
#define SD_SET_CURRENT_LIMIT_400 1
|
||||||
#define SD_SET_CURRENT_LIMIT_600 2
|
#define SD_SET_CURRENT_LIMIT_600 2
|
||||||
#define SD_SET_CURRENT_LIMIT_800 3
|
#define SD_SET_CURRENT_LIMIT_800 3
|
||||||
|
#define SD_SET_CURRENT_NO_CHANGE (-1)
|
||||||
|
|
||||||
#define SD_MAX_CURRENT_200 (1 << SD_SET_CURRENT_LIMIT_200)
|
#define SD_MAX_CURRENT_200 (1 << SD_SET_CURRENT_LIMIT_200)
|
||||||
#define SD_MAX_CURRENT_400 (1 << SD_SET_CURRENT_LIMIT_400)
|
#define SD_MAX_CURRENT_400 (1 << SD_SET_CURRENT_LIMIT_400)
|
||||||
|
|
Loading…
Reference in a new issue