aboutsummaryrefslogtreecommitdiff
path: root/sys/arm
diff options
context:
space:
mode:
authorEmmanuel Vadot <manu@FreeBSD.org>2021-05-16 14:24:31 +0000
committerEmmanuel Vadot <manu@FreeBSD.org>2021-05-21 15:39:47 +0000
commit115e71a4571459e69001b5017ec19532e9d60e1b (patch)
treef7caf1087e2a491a9565257a0e6ce8974ec62ed6 /sys/arm
parentf52072b06da761c05dcb636dd1a02dea7214174a (diff)
downloadsrc-115e71a4571459e69001b5017ec19532e9d60e1b.tar.gz
src-115e71a4571459e69001b5017ec19532e9d60e1b.zip
arm: allwinner: aw_mmc: Check regulators status before enabling/disabling them
Sponsored by: Diablotin Systems Differential Revision: https://reviews.freebsd.org/D30294
Diffstat (limited to 'sys/arm')
-rw-r--r--sys/arm/allwinner/aw_mmc.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/sys/arm/allwinner/aw_mmc.c b/sys/arm/allwinner/aw_mmc.c
index f63b41f9b73c..0b3f19aea55f 100644
--- a/sys/arm/allwinner/aw_mmc.c
+++ b/sys/arm/allwinner/aw_mmc.c
@@ -1285,6 +1285,8 @@ aw_mmc_update_ios(device_t bus, device_t child)
struct mmc_ios *ios;
unsigned int clock;
uint32_t reg, div = 1;
+ int reg_status;
+ int rv;
sc = device_get_softc(bus);
@@ -1310,10 +1312,16 @@ aw_mmc_update_ios(device_t bus, device_t child)
if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_CARD))
device_printf(sc->aw_dev, "Powering down sd/mmc\n");
- if (sc->mmc_helper.vmmc_supply)
- regulator_disable(sc->mmc_helper.vmmc_supply);
- if (sc->mmc_helper.vqmmc_supply)
- regulator_disable(sc->mmc_helper.vqmmc_supply);
+ if (sc->mmc_helper.vmmc_supply) {
+ rv = regulator_status(sc->mmc_helper.vmmc_supply, &reg_status);
+ if (rv == 0 && reg_status == REGULATOR_STATUS_ENABLED)
+ regulator_disable(sc->mmc_helper.vmmc_supply);
+ }
+ if (sc->mmc_helper.vqmmc_supply) {
+ rv = regulator_status(sc->mmc_helper.vqmmc_supply, &reg_status);
+ if (rv == 0 && reg_status == REGULATOR_STATUS_ENABLED)
+ regulator_disable(sc->mmc_helper.vqmmc_supply);
+ }
aw_mmc_reset(sc);
break;
@@ -1321,10 +1329,16 @@ aw_mmc_update_ios(device_t bus, device_t child)
if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_CARD))
device_printf(sc->aw_dev, "Powering up sd/mmc\n");
- if (sc->mmc_helper.vmmc_supply)
- regulator_enable(sc->mmc_helper.vmmc_supply);
- if (sc->mmc_helper.vqmmc_supply)
- regulator_enable(sc->mmc_helper.vqmmc_supply);
+ if (sc->mmc_helper.vmmc_supply) {
+ rv = regulator_status(sc->mmc_helper.vmmc_supply, &reg_status);
+ if (rv == 0 && reg_status != REGULATOR_STATUS_ENABLED)
+ regulator_enable(sc->mmc_helper.vmmc_supply);
+ }
+ if (sc->mmc_helper.vqmmc_supply) {
+ rv = regulator_status(sc->mmc_helper.vqmmc_supply, &reg_status);
+ if (rv == 0 && reg_status != REGULATOR_STATUS_ENABLED)
+ regulator_enable(sc->mmc_helper.vqmmc_supply);
+ }
aw_mmc_init(sc);
break;
};