Commit 4d2b1b67 authored by Heiner Kallweit's avatar Heiner Kallweit Committed by sanglipeng
Browse files

mmc: core: add helpers mmc_regulator_enable/disable_vqmmc

stable inclusion
from stable-v5.10.203
commit b532bc9b73e603452edfb39bbc50b7d9cbbd939e
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I9GXII

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=b532bc9b73e603452edfb39bbc50b7d9cbbd939e



--------------------------------

[ Upstream commit 8d91f3f8 ]

There's a number of drivers (e.g. dw_mmc, meson-gx, mmci, sunxi) using
the same mechanism and a private flag vqmmc_enabled to deal with
enabling/disabling the vqmmc regulator.

Move this to the core and create new helpers mmc_regulator_enable_vqmmc
and mmc_regulator_disable_vqmmc.

Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Acked-by: default avatarMartin Blumenstingl <martin.blumenstingl@googlemail.com>
Link: https://lore.kernel.org/r/71586432-360f-9b92-17f6-b05a8a971bc2@gmail.com


Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Stable-dep-of: 477865af60b2 ("mmc: sdhci-sprd: Fix vqmmc not shutting down after the card was pulled")
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarsanglipeng <sanglipeng1@jd.com>
parent 734f2ecf
Loading
Loading
Loading
Loading
+41 −0
Original line number Diff line number Diff line
@@ -271,3 +271,44 @@ int mmc_regulator_get_supply(struct mmc_host *mmc)
	return 0;
}
EXPORT_SYMBOL_GPL(mmc_regulator_get_supply);

/**
 * mmc_regulator_enable_vqmmc - enable VQMMC regulator for a host
 * @mmc: the host to regulate
 *
 * Returns 0 or errno. Enables the regulator for vqmmc.
 * Keeps track of the enable status for ensuring that calls to
 * regulator_enable/disable are balanced.
 */
int mmc_regulator_enable_vqmmc(struct mmc_host *mmc)
{
	int ret = 0;

	if (!IS_ERR(mmc->supply.vqmmc) && !mmc->vqmmc_enabled) {
		ret = regulator_enable(mmc->supply.vqmmc);
		if (ret < 0)
			dev_err(mmc_dev(mmc), "enabling vqmmc regulator failed\n");
		else
			mmc->vqmmc_enabled = true;
	}

	return ret;
}
EXPORT_SYMBOL_GPL(mmc_regulator_enable_vqmmc);

/**
 * mmc_regulator_disable_vqmmc - disable VQMMC regulator for a host
 * @mmc: the host to regulate
 *
 * Returns 0 or errno. Disables the regulator for vqmmc.
 * Keeps track of the enable status for ensuring that calls to
 * regulator_enable/disable are balanced.
 */
void mmc_regulator_disable_vqmmc(struct mmc_host *mmc)
{
	if (!IS_ERR(mmc->supply.vqmmc) && mmc->vqmmc_enabled) {
		regulator_disable(mmc->supply.vqmmc);
		mmc->vqmmc_enabled = false;
	}
}
EXPORT_SYMBOL_GPL(mmc_regulator_disable_vqmmc);
+3 −0
Original line number Diff line number Diff line
@@ -405,6 +405,7 @@ struct mmc_host {
	unsigned int		use_blk_mq:1;	/* use blk-mq */
	unsigned int		retune_crc_disable:1; /* don't trigger retune upon crc */
	unsigned int		can_dma_map_merge:1; /* merging can be used */
	unsigned int		vqmmc_enabled:1; /* vqmmc regulator is enabled */

	int			rescan_disable;	/* disable card detection */
	int			rescan_entered;	/* used with nonremovable devices */
@@ -546,6 +547,8 @@ static inline int mmc_regulator_set_vqmmc(struct mmc_host *mmc,
#endif

int mmc_regulator_get_supply(struct mmc_host *mmc);
int mmc_regulator_enable_vqmmc(struct mmc_host *mmc);
void mmc_regulator_disable_vqmmc(struct mmc_host *mmc);

static inline int mmc_card_is_removable(struct mmc_host *host)
{