aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/sdhci
diff options
context:
space:
mode:
authorLuiz Otavio O Souza <loos@FreeBSD.org>2017-05-04 18:56:11 +0000
committerLuiz Otavio O Souza <loos@FreeBSD.org>2017-05-04 18:56:11 +0000
commitcd39450155199da7940bb58e629f660c7bf76ed4 (patch)
tree75f7a1cdd076ec7c213d0411d51563f6f98e37c3 /sys/dev/sdhci
parent6da3b2f7f0a9c2436837bf85b461c229b42b12da (diff)
Notes
Diffstat (limited to 'sys/dev/sdhci')
-rw-r--r--sys/dev/sdhci/sdhci_fdt.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/sys/dev/sdhci/sdhci_fdt.c b/sys/dev/sdhci/sdhci_fdt.c
index 2e1b30e4b3773..c5c300a2774d6 100644
--- a/sys/dev/sdhci/sdhci_fdt.c
+++ b/sys/dev/sdhci/sdhci_fdt.c
@@ -70,6 +70,9 @@ struct sdhci_fdt_softc {
int num_slots; /* Number of slots on this controller*/
struct sdhci_slot slots[MAX_SLOTS];
struct resource *mem_res[MAX_SLOTS]; /* Memory resource */
+
+ bool wp_inverted; /* WP pin is inverted */
+ bool no_18v; /* No 1.8V support */
};
static uint8_t
@@ -110,8 +113,13 @@ static uint32_t
sdhci_fdt_read_4(device_t dev, struct sdhci_slot *slot, bus_size_t off)
{
struct sdhci_fdt_softc *sc = device_get_softc(dev);
+ uint32_t val32;
+
+ val32 = bus_read_4(sc->mem_res[slot->num], off);
+ if (off == SDHCI_CAPABILITIES && sc->no_18v)
+ val32 &= ~SDHCI_CAN_VDD_180;
- return (bus_read_4(sc->mem_res[slot->num], off));
+ return (val32);
}
static void
@@ -152,6 +160,14 @@ sdhci_fdt_intr(void *arg)
}
static int
+sdhci_fdt_get_ro(device_t bus, device_t dev)
+{
+ struct sdhci_fdt_softc *sc = device_get_softc(bus);
+
+ return (sdhci_generic_get_ro(bus, dev) ^ sc->wp_inverted);
+}
+
+static int
sdhci_fdt_probe(device_t dev)
{
struct sdhci_fdt_softc *sc = device_get_softc(dev);
@@ -182,6 +198,10 @@ sdhci_fdt_probe(device_t dev)
sc->num_slots = cid;
if ((OF_getencprop(node, "max-frequency", &cid, sizeof(cid))) > 0)
sc->max_clk = cid;
+ if (OF_hasprop(node, "no-1-8-v"))
+ sc->no_18v = true;
+ if (OF_hasprop(node, "wp-inverted"))
+ sc->wp_inverted = true;
return (0);
}
@@ -279,7 +299,7 @@ static device_method_t sdhci_fdt_methods[] = {
/* mmcbr_if */
DEVMETHOD(mmcbr_update_ios, sdhci_generic_update_ios),
DEVMETHOD(mmcbr_request, sdhci_generic_request),
- DEVMETHOD(mmcbr_get_ro, sdhci_generic_get_ro),
+ DEVMETHOD(mmcbr_get_ro, sdhci_fdt_get_ro),
DEVMETHOD(mmcbr_acquire_host, sdhci_generic_acquire_host),
DEVMETHOD(mmcbr_release_host, sdhci_generic_release_host),