mmc: core: add helpers mmc_regulator_enable/disable_vqmmc
[ Upstream commit 8d91f3f8ae57e6292142ca89f322e90fa0d6ac02 ] 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: Heiner Kallweit <hkallweit1@gmail.com> Acked-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Link: https://lore.kernel.org/r/71586432-360f-9b92-17f6-b05a8a971bc2@gmail.com Signed-off-by: Ulf 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: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
376fabe367
commit
b532bc9b73
@@ -271,3 +271,44 @@ int mmc_regulator_get_supply(struct mmc_host *mmc)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mmc_regulator_get_supply);
|
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);
|
||||||
|
@@ -405,6 +405,7 @@ struct mmc_host {
|
|||||||
unsigned int use_blk_mq:1; /* use blk-mq */
|
unsigned int use_blk_mq:1; /* use blk-mq */
|
||||||
unsigned int retune_crc_disable:1; /* don't trigger retune upon crc */
|
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 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_disable; /* disable card detection */
|
||||||
int rescan_entered; /* used with nonremovable devices */
|
int rescan_entered; /* used with nonremovable devices */
|
||||||
@@ -546,6 +547,8 @@ static inline int mmc_regulator_set_vqmmc(struct mmc_host *mmc,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
int mmc_regulator_get_supply(struct mmc_host *mmc);
|
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)
|
static inline int mmc_card_is_removable(struct mmc_host *host)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user