aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGregory CLEMENT <gregory.clement@free-electrons.com>2015-01-29 06:36:24 -0500
committerUlf Hansson <ulf.hansson@linaro.org>2015-01-29 07:07:41 -0500
commitd4b803c559843e3774736e5108cf6331cf75f64c (patch)
tree822c90b7035c77d445a5329fec3318dab09541b5
parent3396e7361159753047965d1ed134ff7af248d64c (diff)
mmc: sdhci-pxav3: Fix SDR50 and DDR50 capabilities for the Armada 38x flavor
According to erratum 'FE-2946959' both SDR50 and DDR50 modes require specific clock adjustments in SDIO3 Configuration register. However, this register was not part of the device tree binding. Even if the binding can (and will) be extended we still need handling the case where this register was not available. In this case we use the SDHCI_QUIRK_MISSING_CAPS quirk remove them from the capabilities. This commit is based on the work done by Marcin Wojtas<mw@semihalf.com> Fixes: 5491ce3f79ee ("mmc: sdhci-pxav3: add support for the Armada 38x SDHCI controller") Cc: <stable@vger.kernel.org> # v3.15+ Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com> Signed-off-by: Marcin Wojtas <mw@semihalf.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
-rw-r--r--drivers/mmc/host/sdhci-pxav3.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/mmc/host/sdhci-pxav3.c b/drivers/mmc/host/sdhci-pxav3.c
index f1c6362648c1..1529efcbb733 100644
--- a/drivers/mmc/host/sdhci-pxav3.c
+++ b/drivers/mmc/host/sdhci-pxav3.c
@@ -118,6 +118,20 @@ static int mv_conf_mbus_windows(struct platform_device *pdev,
118 return 0; 118 return 0;
119} 119}
120 120
121static int armada_38x_quirks(struct sdhci_host *host)
122{
123 host->quirks |= SDHCI_QUIRK_MISSING_CAPS;
124 /*
125 * According to erratum 'FE-2946959' both SDR50 and DDR50
126 * modes require specific clock adjustments in SDIO3
127 * Configuration register, if the adjustment is not done,
128 * remove them from the capabilities.
129 */
130 host->caps1 = sdhci_readl(host, SDHCI_CAPABILITIES_1);
131 host->caps1 &= ~(SDHCI_SUPPORT_SDR50 | SDHCI_SUPPORT_DDR50);
132 return 0;
133}
134
121static void pxav3_reset(struct sdhci_host *host, u8 mask) 135static void pxav3_reset(struct sdhci_host *host, u8 mask)
122{ 136{
123 struct platform_device *pdev = to_platform_device(mmc_dev(host->mmc)); 137 struct platform_device *pdev = to_platform_device(mmc_dev(host->mmc));
@@ -319,6 +333,9 @@ static int sdhci_pxav3_probe(struct platform_device *pdev)
319 clk_prepare_enable(pxa->clk_core); 333 clk_prepare_enable(pxa->clk_core);
320 334
321 if (of_device_is_compatible(np, "marvell,armada-380-sdhci")) { 335 if (of_device_is_compatible(np, "marvell,armada-380-sdhci")) {
336 ret = armada_38x_quirks(host);
337 if (ret < 0)
338 goto err_clk_get;
322 ret = mv_conf_mbus_windows(pdev, mv_mbus_dram_info()); 339 ret = mv_conf_mbus_windows(pdev, mv_mbus_dram_info());
323 if (ret < 0) 340 if (ret < 0)
324 goto err_mbus_win; 341 goto err_mbus_win;