summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorian <ian@FreeBSD.org>2014-12-19 23:13:46 +0000
committerian <ian@FreeBSD.org>2014-12-19 23:13:46 +0000
commite666523a3eaae71c4107bd3d592655b46181158b (patch)
treecc435cb7ae2f401da7920b4fae467a4108469141
parentdf0aca7fc164e69294a3e69664f32fabb984906a (diff)
downloadFreeBSD-src-e666523a3eaae71c4107bd3d592655b46181158b.zip
FreeBSD-src-e666523a3eaae71c4107bd3d592655b46181158b.tar.gz
Add code to set and reset open-drain mode on the bus when requested.
Submitted by: Michal Meloun <meloun@miracle.cz>
-rw-r--r--sys/arm/ti/ti_sdhci.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/sys/arm/ti/ti_sdhci.c b/sys/arm/ti/ti_sdhci.c
index 024c830..a56f384 100644
--- a/sys/arm/ti/ti_sdhci.c
+++ b/sys/arm/ti/ti_sdhci.c
@@ -112,6 +112,7 @@ static struct ofw_compat_data compat_data[] = {
#define MMCHS_CON 0x02C
#define MMCHS_CON_DW8 (1 << 5)
#define MMCHS_CON_DVAL_8_4MS (3 << 9)
+#define MMCHS_CON_OD (1 << 0)
#define MMCHS_SYSCTL 0x12C
#define MMCHS_SYSCTL_CLKD_MASK 0x3FF
#define MMCHS_SYSCTL_CLKD_SHIFT 6
@@ -327,7 +328,7 @@ ti_sdhci_update_ios(device_t brdev, device_t reqdev)
struct ti_sdhci_softc *sc = device_get_softc(brdev);
struct sdhci_slot *slot;
struct mmc_ios *ios;
- uint32_t val32;
+ uint32_t val32, newval32;
slot = device_get_ivars(reqdev);
ios = &slot->host.ios;
@@ -339,10 +340,20 @@ ti_sdhci_update_ios(device_t brdev, device_t reqdev)
* requested, then let the standard driver handle everything else.
*/
val32 = ti_mmchs_read_4(sc, MMCHS_CON);
+ newval32 = val32;
+
if (ios->bus_width == bus_width_8)
- ti_mmchs_write_4(sc, MMCHS_CON, val32 | MMCHS_CON_DW8);
+ newval32 |= MMCHS_CON_DW8;
else
- ti_mmchs_write_4(sc, MMCHS_CON, val32 & ~MMCHS_CON_DW8);
+ newval32 &= ~MMCHS_CON_DW8;
+
+ if (ios->bus_mode == opendrain)
+ newval32 |= MMCHS_CON_OD;
+ else /* if (ios->bus_mode == pushpull) */
+ newval32 &= ~MMCHS_CON_OD;
+
+ if (newval32 != val32)
+ ti_mmchs_write_4(sc, MMCHS_CON, newval32);
return (sdhci_generic_update_ios(brdev, reqdev));
}
OpenPOWER on IntegriCloud