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

Commit 7c0136ef authored by Ulf Hansson's avatar Ulf Hansson Committed by Russell King
Browse files

ARM: 7721/1: mmc: mmci: Fixup regulator handling for vqmmc



We can not rely on regulator_is_enabled to decide whether to
enable|disable the regulator. It would mean that the reference
counter for it is not balanced properly.

Instead keep track of our internal state by using a new flag in
the host struct, so we can take correct decisions.

Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 1fd83f0e
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -1156,9 +1156,10 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
		if (!IS_ERR(mmc->supply.vmmc))
			mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0);

		if (!IS_ERR(mmc->supply.vqmmc) &&
		    regulator_is_enabled(mmc->supply.vqmmc))
		if (!IS_ERR(mmc->supply.vqmmc) && host->vqmmc_enabled) {
			regulator_disable(mmc->supply.vqmmc);
			host->vqmmc_enabled = false;
		}

		break;
	case MMC_POWER_UP:
@@ -1174,12 +1175,13 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)

		break;
	case MMC_POWER_ON:
		if (!IS_ERR(mmc->supply.vqmmc) &&
		    !regulator_is_enabled(mmc->supply.vqmmc)) {
		if (!IS_ERR(mmc->supply.vqmmc) && !host->vqmmc_enabled) {
			ret = regulator_enable(mmc->supply.vqmmc);
			if (ret < 0)
				dev_err(mmc_dev(mmc),
					"failed to enable vqmmc regulator\n");
			else
				host->vqmmc_enabled = true;
		}

		pwr |= MCI_PWR_ON;
+1 −0
Original line number Diff line number Diff line
@@ -183,6 +183,7 @@ struct mmci_host {
	unsigned int		cclk;
	u32			pwr_reg;
	u32			clk_reg;
	bool			vqmmc_enabled;
	struct mmci_platform_data *plat;
	struct variant_data	*variant;