Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0aa67700 authored by Philip Rakity's avatar Philip Rakity Committed by Chris Ball
Browse files

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: default avatarPhilip Rakity <prakity@marvell.com>
Reviewed-by: default avatarAaron Lu <aaron_lu@amd.com>
Signed-off-by: default avatarChris Ball <cjb@laptop.org>
parent bad37e1a
Loading
Loading
Loading
Loading
+12 −11
Original line number Diff line number Diff line
@@ -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)
{
	int current_limit = 0;
	int current_limit = SD_SET_CURRENT_NO_CHANGE;
	int err;

	/*
	 * Current limit switch is only defined for SDR50, SDR104, and DDR50
	 * bus speed modes. For other bus speed modes, we set the default
	 * current limit of 200mA.
	 * bus speed modes. For other bus speed modes, we do not change the
	 * current limit.
	 */
	if ((card->sd_bus_speed == UHS_SDR50_BUS_SPEED) ||
	    (card->sd_bus_speed == UHS_SDR104_BUS_SPEED) ||
@@ -595,9 +595,9 @@ static int sd_set_current_limit(struct mmc_card *card, u8 *status)
			if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_200)
				current_limit = SD_SET_CURRENT_LIMIT_200;
		}
	} else
		current_limit = SD_SET_CURRENT_LIMIT_200;
	}

	if (current_limit != SD_SET_CURRENT_NO_CHANGE) {
		err = mmc_sd_switch(card, 1, 3, current_limit, status);
		if (err)
			return err;
@@ -606,6 +606,7 @@ static int sd_set_current_limit(struct mmc_card *card, u8 *status)
			pr_warning("%s: Problem setting current limit!\n",
				mmc_hostname(card->host));

	}
	return 0;
}

+1 −1
Original line number Diff line number Diff line
@@ -2914,7 +2914,7 @@ int sdhci_add_host(struct sdhci_host *host)
			mmc->caps |= MMC_CAP_MAX_CURRENT_600;
		else if (max_current_180 >= 400)
			mmc->caps |= MMC_CAP_MAX_CURRENT_400;
		else
		else if (max_current_180 >= 200)
			mmc->caps |= MMC_CAP_MAX_CURRENT_200;
	}

+1 −0
Original line number Diff line number Diff line
@@ -149,6 +149,7 @@ struct sd_switch_caps {
#define SD_SET_CURRENT_LIMIT_400	1
#define SD_SET_CURRENT_LIMIT_600	2
#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_400	(1 << SD_SET_CURRENT_LIMIT_400)