Author: ian
Date: Fri Feb 27 15:47:30 2015
New Revision: 279360
URL: https://svnweb.freebsd.org/changeset/base/279360

Log:
  Detect, report and use 8-bit bus if is available.
  
  Differential Revision:        https://reviews.freebsd.org/D1921
  Submitted by: Michal Meloun

Modified:
  head/sys/dev/sdhci/sdhci.c

Modified: head/sys/dev/sdhci/sdhci.c
==============================================================================
--- head/sys/dev/sdhci/sdhci.c  Fri Feb 27 15:14:25 2015        (r279359)
+++ head/sys/dev/sdhci/sdhci.c  Fri Feb 27 15:47:30 2015        (r279360)
@@ -583,6 +583,8 @@ sdhci_init_slot(device_t dev, struct sdh
                    "support voltages.\n");
        }
        slot->host.caps = MMC_CAP_4_BIT_DATA;
+       if (caps & SDHCI_CAN_DO_8BITBUS)
+               slot->host.caps |= MMC_CAP_8_BIT_DATA;
        if (caps & SDHCI_CAN_DO_HISPD)
                slot->host.caps |= MMC_CAP_HSPEED;
        /* Decide if we have usable DMA. */
@@ -602,9 +604,11 @@ sdhci_init_slot(device_t dev, struct sdh
                slot->opt &= ~SDHCI_HAVE_DMA;
 
        if (bootverbose || sdhci_debug) {
-               slot_printf(slot, "%uMHz%s 4bits%s%s%s %s\n",
+               slot_printf(slot, "%uMHz%s %s%s%s%s %s\n",
                    slot->max_clk / 1000000,
                    (caps & SDHCI_CAN_DO_HISPD) ? " HS" : "",
+                   (caps & MMC_CAP_8_BIT_DATA) ? "8bits" :
+                       ((caps & MMC_CAP_4_BIT_DATA) ? "4bits" : "1bit"),
                    (caps & SDHCI_CAN_VDD_330) ? " 3.3V" : "",
                    (caps & SDHCI_CAN_VDD_300) ? " 3.0V" : "",
                    (caps & SDHCI_CAN_VDD_180) ? " 1.8V" : "",
@@ -691,11 +695,19 @@ sdhci_generic_update_ios(device_t brdev,
        }
        /* Configure the bus. */
        sdhci_set_clock(slot, ios->clock);
-       sdhci_set_power(slot, (ios->power_mode == power_off)?0:ios->vdd);
-       if (ios->bus_width == bus_width_4)
+       sdhci_set_power(slot, (ios->power_mode == power_off) ? 0 : ios->vdd);
+       if (ios->bus_width == bus_width_8) {
+               slot->hostctrl |= SDHCI_CTRL_8BITBUS;
+               slot->hostctrl &= ~SDHCI_CTRL_4BITBUS;
+       } else if (ios->bus_width == bus_width_4) {
+               slot->hostctrl &= ~SDHCI_CTRL_8BITBUS;
                slot->hostctrl |= SDHCI_CTRL_4BITBUS;
-       else
+       } else if (ios->bus_width == bus_width_1) {
+               slot->hostctrl &= ~SDHCI_CTRL_8BITBUS;
                slot->hostctrl &= ~SDHCI_CTRL_4BITBUS;
+       } else {
+               panic("Invalid bus width: %d", ios->bus_width);
+       }
        if (ios->timing == bus_timing_hs && 
            !(slot->quirks & SDHCI_QUIRK_DONT_SET_HISPD_BIT))
                slot->hostctrl |= SDHCI_CTRL_HISPD;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to