* [RFC v3 0/2] mmc: sdhci: Ignore capability register when it comes to speeds and use DT binding instead when sdhci-cap-speed-modes-broken is set.
@ 2016-10-24 19:04 Zach Brown
2016-10-24 19:04 ` [RFC v3 1/2] mmc: sdhci: Add device tree property sdhci-cap-speed-modes-broken Zach Brown
2016-10-24 19:04 ` [RFC v3 2/2] mmc: sdhci: Ignore capability register when it comes to speeds and use DT binding instead when sdhci-cap-speed-modes-broken is set Zach Brown
0 siblings, 2 replies; 3+ messages in thread
From: Zach Brown @ 2016-10-24 19:04 UTC (permalink / raw)
To: ulf.hansson
Cc: adrian.hunter, robh+dt, mark.rutland, linux-mmc, devicetree,
linux-kernel, zach.brown
The first patch add documentation about a new devicetree property
sdhci-cap-speed-modes-broken.
The second patch makes the sdhci use the DT binding instead of the caps
register for determining which speed modes are supported by the controller.
This RFC is an alternative to another patch[1] set I sent up.
[1]
https://www.mail-archive.com/linux-kernel@vger.kernel.org/msg1251944.html
v2:
* Removed separate OF parsing function, relying on mmc_of_parse to be called
before read_caps
* Moved check of sdhci-cap-speed-modes-broken into sdhci_read_caps.
* Added SDHCI_SUPPORT_HS400 to list of bits to clear in sdhci cap1, not
sure that's all of the them now, but I think so.
v3:
* Read "sdhci-cap-speed-modes-broken" only once.
* If caps are provided to sdhci_read_caps the speed bits are not overwritten.
Zach Brown (2):
mmc: sdhci: Add device tree property sdhci-cap-speed-modes-broken
mmc: sdhci: Ignore capability register when it comes to speeds and use
DT binding instead when sdhci-cap-speed-modes-broken is set.
Documentation/devicetree/bindings/mmc/mmc.txt | 3 +++
drivers/mmc/host/sdhci.c | 25 +++++++++++++++++++++++--
2 files changed, 26 insertions(+), 2 deletions(-)
--
2.7.4
^ permalink raw reply [flat|nested] 3+ messages in thread
* [RFC v3 1/2] mmc: sdhci: Add device tree property sdhci-cap-speed-modes-broken
2016-10-24 19:04 [RFC v3 0/2] mmc: sdhci: Ignore capability register when it comes to speeds and use DT binding instead when sdhci-cap-speed-modes-broken is set Zach Brown
@ 2016-10-24 19:04 ` Zach Brown
2016-10-24 19:04 ` [RFC v3 2/2] mmc: sdhci: Ignore capability register when it comes to speeds and use DT binding instead when sdhci-cap-speed-modes-broken is set Zach Brown
1 sibling, 0 replies; 3+ messages in thread
From: Zach Brown @ 2016-10-24 19:04 UTC (permalink / raw)
To: ulf.hansson
Cc: adrian.hunter, robh+dt, mark.rutland, linux-mmc, devicetree,
linux-kernel, zach.brown
On some systems the sdhci capabilty registers are incorrect for one
reason or another.
The sdhci-cap-speed-modes-broken property will let the driver know that
the sdhci capability registers should not be relied on for speed modes.
Instead the driver should check the mmc generic DT bindings.
Signed-off-by: Zach Brown <zach.brown@ni.com>
---
Documentation/devicetree/bindings/mmc/mmc.txt | 3 +++
1 file changed, 3 insertions(+)
diff --git a/Documentation/devicetree/bindings/mmc/mmc.txt b/Documentation/devicetree/bindings/mmc/mmc.txt
index 8a37782..671d6c0 100644
--- a/Documentation/devicetree/bindings/mmc/mmc.txt
+++ b/Documentation/devicetree/bindings/mmc/mmc.txt
@@ -52,6 +52,9 @@ Optional properties:
- no-sdio: controller is limited to send sdio cmd during initialization
- no-sd: controller is limited to send sd cmd during initialization
- no-mmc: controller is limited to send mmc cmd during initialization
+- sdhci-cap-speed-modes-broken: One or more of the bits in the sdhci
+ capabilities registers representing speed modes are incorrect. All the bits
+ representing speed modes should be ignored.
*NOTE* on CD and WP polarity. To use common for all SD/MMC host controllers line
polarity properties, we have to fix the meaning of the "normal" and "inverted"
--
2.7.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [RFC v3 2/2] mmc: sdhci: Ignore capability register when it comes to speeds and use DT binding instead when sdhci-cap-speed-modes-broken is set.
2016-10-24 19:04 [RFC v3 0/2] mmc: sdhci: Ignore capability register when it comes to speeds and use DT binding instead when sdhci-cap-speed-modes-broken is set Zach Brown
2016-10-24 19:04 ` [RFC v3 1/2] mmc: sdhci: Add device tree property sdhci-cap-speed-modes-broken Zach Brown
@ 2016-10-24 19:04 ` Zach Brown
1 sibling, 0 replies; 3+ messages in thread
From: Zach Brown @ 2016-10-24 19:04 UTC (permalink / raw)
To: ulf.hansson
Cc: adrian.hunter, robh+dt, mark.rutland, linux-mmc, devicetree,
linux-kernel, zach.brown
When the sdhci-cap-speed-modes-broken DT property is set, the driver
will ignore the bits of the capability registers that correspond to
speed modes.
Signed-off-by: Zach Brown <zach.brown@ni.com>
---
drivers/mmc/host/sdhci.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 1e25b01..a17c47e 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -22,6 +22,7 @@
#include <linux/scatterlist.h>
#include <linux/regulator/consumer.h>
#include <linux/pm_runtime.h>
+#include <linux/of.h>
#include <linux/leds.h>
@@ -2991,6 +2992,7 @@ static int sdhci_set_dma_mask(struct sdhci_host *host)
void __sdhci_read_caps(struct sdhci_host *host, u16 *ver, u32 *caps, u32 *caps1)
{
u16 v;
+ unsigned int speed_cap_broken = false;
if (host->read_caps)
return;
@@ -3005,18 +3007,37 @@ void __sdhci_read_caps(struct sdhci_host *host, u16 *ver, u32 *caps, u32 *caps1)
sdhci_do_reset(host, SDHCI_RESET_ALL);
+ if (of_property_read_bool(mmc_dev(host->mmc)->of_node,
+ "sdhci-cap-speed-modes-broken"))
+ speed_cap_broken = true;
+
v = ver ? *ver : sdhci_readw(host, SDHCI_HOST_VERSION);
host->version = (v & SDHCI_SPEC_VER_MASK) >> SDHCI_SPEC_VER_SHIFT;
if (host->quirks & SDHCI_QUIRK_MISSING_CAPS)
return;
- host->caps = caps ? *caps : sdhci_readl(host, SDHCI_CAPABILITIES);
+ if (caps)
+ host->caps = *caps;
+ else {
+ host->caps = sdhci_readl(host, SDHCI_CAPABILITIES);
+ if (speed_cap_broken)
+ host->caps &= ~SDHCI_CAN_DO_HISPD;
+ }
if (host->version < SDHCI_SPEC_300)
return;
- host->caps1 = caps1 ? *caps1 : sdhci_readl(host, SDHCI_CAPABILITIES_1);
+ if (caps1)
+ host->caps1 = *caps1;
+ else {
+ host->caps1 = sdhci_readl(host, SDHCI_CAPABILITIES_1);
+ if (speed_cap_broken)
+ host->caps1 &= ~(SDHCI_SUPPORT_SDR50 |
+ SDHCI_SUPPORT_SDR104 |
+ SDHCI_SUPPORT_DDR50 |
+ SDHCI_SUPPORT_HS400);
+ }
}
EXPORT_SYMBOL_GPL(__sdhci_read_caps);
--
2.7.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2016-10-24 19:04 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-10-24 19:04 [RFC v3 0/2] mmc: sdhci: Ignore capability register when it comes to speeds and use DT binding instead when sdhci-cap-speed-modes-broken is set Zach Brown
2016-10-24 19:04 ` [RFC v3 1/2] mmc: sdhci: Add device tree property sdhci-cap-speed-modes-broken Zach Brown
2016-10-24 19:04 ` [RFC v3 2/2] mmc: sdhci: Ignore capability register when it comes to speeds and use DT binding instead when sdhci-cap-speed-modes-broken is set Zach Brown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).