Commit 1f1929f3 authored by Yangbo Lu's avatar Yangbo Lu Committed by Ulf Hansson

mmc: sdhci-of-esdhc: add quirk to ignore command inhibit for data

For some controllers, in Present State Register, Data Line
Active bit is not reliable for commands (such as CMD6, CMD7,
CMD12, CMD28, CMD29, or CMD38) with busy signal. DLA affects
Command with Data Inhibit bit. Therefore, software driver
may not know the busy status in DLA/CDIHB.

Futunately MMC core driver has already polled card status
with CMD13 after sending any command with busy signal. So
we can just ignore CDIHB never released issue for such
controllers. This patch is to add a quirk to handle this.
Signed-off-by: default avatarYangbo Lu <yangbo.lu@nxp.com>
Signed-off-by: default avatarYinbo Zhu <yinbo.zhu@nxp.com>
Acked-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent b214fe59
...@@ -82,6 +82,7 @@ struct sdhci_esdhc { ...@@ -82,6 +82,7 @@ struct sdhci_esdhc {
bool quirk_limited_clk_division; bool quirk_limited_clk_division;
bool quirk_unreliable_pulse_detection; bool quirk_unreliable_pulse_detection;
bool quirk_fixup_tuning; bool quirk_fixup_tuning;
bool quirk_ignore_data_inhibit;
unsigned int peripheral_clock; unsigned int peripheral_clock;
const struct esdhc_clk_fixup *clk_fixup; const struct esdhc_clk_fixup *clk_fixup;
u32 div_ratio; u32 div_ratio;
...@@ -148,6 +149,19 @@ static u32 esdhc_readl_fixup(struct sdhci_host *host, ...@@ -148,6 +149,19 @@ static u32 esdhc_readl_fixup(struct sdhci_host *host,
return ret; return ret;
} }
/*
* Some controllers have unreliable Data Line Active
* bit for commands with busy signal. This affects
* Command Inhibit (data) bit. Just ignore it since
* MMC core driver has already polled card status
* with CMD13 after any command with busy siganl.
*/
if ((spec_reg == SDHCI_PRESENT_STATE) &&
(esdhc->quirk_ignore_data_inhibit == true)) {
ret = value & ~SDHCI_DATA_INHIBIT;
return ret;
}
ret = value; ret = value;
return ret; return ret;
} }
...@@ -1115,12 +1129,14 @@ static int sdhci_esdhc_probe(struct platform_device *pdev) ...@@ -1115,12 +1129,14 @@ static int sdhci_esdhc_probe(struct platform_device *pdev)
if (of_device_is_compatible(np, "fsl,ls1021a-esdhc")) if (of_device_is_compatible(np, "fsl,ls1021a-esdhc"))
host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL; host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
esdhc->quirk_ignore_data_inhibit = false;
if (of_device_is_compatible(np, "fsl,p2020-esdhc")) { if (of_device_is_compatible(np, "fsl,p2020-esdhc")) {
/* /*
* Freescale messed up with P2020 as it has a non-standard * Freescale messed up with P2020 as it has a non-standard
* host control register * host control register
*/ */
host->quirks2 |= SDHCI_QUIRK2_BROKEN_HOST_CONTROL; host->quirks2 |= SDHCI_QUIRK2_BROKEN_HOST_CONTROL;
esdhc->quirk_ignore_data_inhibit = true;
} }
/* call to generic mmc_of_parse to support additional capabilities */ /* call to generic mmc_of_parse to support additional capabilities */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment