svn commit: r333556 - head/sys/arm/allwinner
Emmanuel Vadot
manu at FreeBSD.org
Sat May 12 13:14:02 UTC 2018
Author: manu
Date: Sat May 12 13:14:01 2018
New Revision: 333556
URL: https://svnweb.freebsd.org/changeset/base/333556
Log:
aw_mmc: Rework regulator handling
Don't enable regulator on attach but dealt with them on power_up/power_off
Only set the voltage for the signaling regulator since I don't have boards
that can change the supply voltage.
Enable 1.8v signaling voltage.
Modified:
head/sys/arm/allwinner/aw_mmc.c
Modified: head/sys/arm/allwinner/aw_mmc.c
==============================================================================
--- head/sys/arm/allwinner/aw_mmc.c Sat May 12 13:13:34 2018 (r333555)
+++ head/sys/arm/allwinner/aw_mmc.c Sat May 12 13:14:01 2018 (r333556)
@@ -115,6 +115,7 @@ struct aw_mmc_softc {
uint32_t aw_intr_wait;
void * aw_intrhand;
int32_t aw_vdd;
+ int32_t aw_vccq;
regulator_t aw_reg_vmmc;
regulator_t aw_reg_vqmmc;
unsigned int aw_clock;
@@ -265,13 +266,11 @@ aw_mmc_attach(device_t dev)
&sc->aw_reg_vmmc) == 0) {
if (bootverbose)
device_printf(dev, "vmmc-supply regulator found\n");
- regulator_enable(sc->aw_reg_vmmc);
}
if (regulator_get_by_ofw_property(dev, 0, "vqmmc-supply",
&sc->aw_reg_vqmmc) == 0 && bootverbose) {
if (bootverbose)
device_printf(dev, "vqmmc-supply regulator found\n");
- regulator_enable(sc->aw_reg_vqmmc);
}
sc->aw_host.f_min = 400000;
@@ -281,7 +280,7 @@ aw_mmc_attach(device_t dev)
MMC_CAP_UHS_SDR25 | MMC_CAP_UHS_SDR50 |
MMC_CAP_UHS_DDR50 | MMC_CAP_MMC_DDR52;
- sc->aw_host.caps |= MMC_CAP_SIGNALING_330 /* | MMC_CAP_SIGNALING_180 */;
+ sc->aw_host.caps |= MMC_CAP_SIGNALING_330 | MMC_CAP_SIGNALING_180;
if (bus_width >= 4)
sc->aw_host.caps |= MMC_CAP_4_BIT_DATA;
@@ -800,6 +799,9 @@ aw_mmc_read_ivar(device_t bus, device_t child, int whi
case MMCBR_IVAR_VDD:
*(int *)result = sc->aw_host.ios.vdd;
break;
+ case MMCBR_IVAR_VCCQ:
+ *(int *)result = sc->aw_host.ios.vccq;
+ break;
case MMCBR_IVAR_CAPS:
*(int *)result = sc->aw_host.caps;
break;
@@ -848,6 +850,9 @@ aw_mmc_write_ivar(device_t bus, device_t child, int wh
case MMCBR_IVAR_VDD:
sc->aw_host.ios.vdd = value;
break;
+ case MMCBR_IVAR_VCCQ:
+ sc->aw_host.ios.vccq = value;
+ break;
case MMCBR_IVAR_TIMING:
sc->aw_host.ios.timing = value;
break;
@@ -906,36 +911,30 @@ aw_mmc_update_clock(struct aw_mmc_softc *sc, uint32_t
}
static void
-aw_mmc_set_power(struct aw_mmc_softc *sc, int32_t vdd)
+aw_mmc_set_vccq(struct aw_mmc_softc *sc, int32_t vccq)
{
- int min_uvolt, max_uvolt;
+ int uvolt;
- sc->aw_vdd = vdd;
-
if (sc->aw_reg_vqmmc == NULL)
return;
- switch (1 << vdd) {
- case MMC_OCR_LOW_VOLTAGE:
- min_uvolt = max_uvolt = 1800000;
+ switch (vccq) {
+ case vccq_180:
+ uvolt = 1800000;
break;
- case MMC_OCR_320_330:
- min_uvolt = 3200000;
- max_uvolt = 3300000;
+ case vccq_330:
+ uvolt = 3300000;
break;
- case MMC_OCR_330_340:
- min_uvolt = 3300000;
- max_uvolt = 3400000;
- break;
+ default:
+ return;
}
- if (sc->aw_reg_vqmmc)
- if (regulator_set_voltage(sc->aw_reg_vqmmc,
- min_uvolt, max_uvolt) != 0)
- device_printf(sc->aw_dev,
- "Cannot set vqmmc to %d<->%d\n",
- min_uvolt,
- max_uvolt);
+ if (regulator_set_voltage(sc->aw_reg_vqmmc,
+ uvolt, uvolt) != 0)
+ device_printf(sc->aw_dev,
+ "Cannot set vqmmc to %d<->%d\n",
+ uvolt,
+ uvolt);
}
static int
@@ -970,14 +969,30 @@ aw_mmc_update_ios(device_t bus, device_t child)
case power_off:
if (bootverbose)
device_printf(sc->aw_dev, "Powering down sd/mmc\n");
+
+ if (sc->aw_reg_vmmc)
+ regulator_disable(sc->aw_reg_vmmc);
+ if (sc->aw_reg_vqmmc)
+ regulator_disable(sc->aw_reg_vqmmc);
+
aw_mmc_reset(sc);
break;
case power_up:
if (bootverbose)
device_printf(sc->aw_dev, "Powering up sd/mmc\n");
+
+ if (sc->aw_reg_vmmc)
+ regulator_enable(sc->aw_reg_vmmc);
+ if (sc->aw_reg_vqmmc)
+ regulator_enable(sc->aw_reg_vqmmc);
aw_mmc_init(sc);
break;
};
+
+ if (ios->vccq != sc->aw_vccq) {
+ aw_mmc_set_vccq(sc, ios->vccq);
+ sc->aw_vccq = ios->vccq;
+ }
/* Enable ddr mode if needed */
reg = AW_MMC_READ_4(sc, AW_MMC_GCTL);
More information about the svn-src-all
mailing list