summaryrefslogtreecommitdiffstats
path: root/drivers/mci
diff options
context:
space:
mode:
authorTrent Piepho <tpiepho@kymetacorp.com>2015-11-18 21:06:46 +0000
committerSascha Hauer <s.hauer@pengutronix.de>2015-11-19 08:52:10 +0100
commite11f5908d73540005e1aca804c167dbbeb61a6a8 (patch)
tree4440cb7084226a3e317b597a2458ab3b9ae0420c /drivers/mci
parentedc1bfa1fe475031a9b652e0500393cad7f15eae (diff)
downloadbarebox-e11f5908d73540005e1aca804c167dbbeb61a6a8.tar.gz
barebox-e11f5908d73540005e1aca804c167dbbeb61a6a8.tar.xz
mci: core: bus-width property should override driver default
The OF code for parsing bus-width would only add the specified width to those the driver might have already set capability flags for. Because of this, if the driver had set 8 or 4 bit width, it wasn't possible for the DT to specify that fewer pins were used on the board and a smaller width was necessary. Change this so the width in the DT overrides whatever widths the driver says it supports. There is no reason to have an incorrect device tree and it makes far more sense for the DT to override the driver default than for the driver default to override the DT. The widths the driver puts in host_caps before calling mci_of_parse() are considered the default if the DT doesn't specify bus-width. This should cause the least amount of change to existing boards, as despite a comment that no bus-width meant to use 1 bit, using the driver default is what was really happening. Unfortunately, half of existing drivers default to the largest width they support while the other half default to the smallest. Boards should just stick the width in the device tree. Signed-off-by: Trent Piepho <tpiepho@kymetacorp.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/mci')
-rw-r--r--drivers/mci/mci-core.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c
index 29c0d5474e..4e6b83be5f 100644
--- a/drivers/mci/mci-core.c
+++ b/drivers/mci/mci-core.c
@@ -1819,23 +1819,29 @@ void mci_of_parse(struct mci_host *host)
/* "bus-width" is translated to MMC_CAP_*_BIT_DATA flags */
if (of_property_read_u32(np, "bus-width", &bus_width) < 0) {
+ /* If bus-width is missing we get the driver's default, which
+ * is, unfortunately, not consistent from driver to driver.
+ * Better to specify it in the device tree. */
dev_dbg(host->hw_dev,
- "\"bus-width\" property is missing, assuming 1 bit.\n");
- bus_width = 1;
- }
-
- switch (bus_width) {
- case 8:
- host->host_caps |= MMC_CAP_8_BIT_DATA;
- /* Hosts capable of 8-bit transfers can also do 4 bits */
- case 4:
- host->host_caps |= MMC_CAP_4_BIT_DATA;
- break;
- case 1:
- break;
- default:
- dev_err(host->hw_dev,
- "Invalid \"bus-width\" value %u!\n", bus_width);
+ "\"bus-width\" property missing, default is %d\n",
+ (host->host_caps & MMC_CAP_8_BIT_DATA) ? 8 :
+ (host->host_caps & MMC_CAP_4_BIT_DATA) ? 4 : 1);
+ } else {
+ /* Set data width caps to exactly those specified in the DT.
+ * bus-width isn't a list, so widths smaller than the specified
+ * value are implictly supported as well. */
+ host->host_caps &= ~MMC_CAP_BIT_DATA_MASK;
+ switch (bus_width) {
+ case 8:
+ host->host_caps |= MMC_CAP_8_BIT_DATA;
+ case 4: /* note fall through from above */
+ host->host_caps |= MMC_CAP_4_BIT_DATA;
+ case 1:
+ break;
+ default:
+ dev_err(host->hw_dev,
+ "Invalid \"bus-width\" value %u!\n", bus_width);
+ }
}
/* f_max is obtained from the optional "max-frequency" property */