On 5/03/19 4:59 AM, Yinbo Zhu wrote: > From: Yangbo Lu <yangbo.lu@xxxxxxx> > > 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: Yangbo Lu <yangbo.lu@xxxxxxx> > Signed-off-by: Yinbo Zhu <yinbo.zhu@xxxxxxx> Acked-by: Adrian Hunter <adrian.hunter@xxxxxxxxx> > --- > Change in v3: > move the quirk to sdhci_esdhc and remove the patch[6/6] > > drivers/mmc/host/sdhci-of-esdhc.c | 16 ++++++++++++++++ > 1 files changed, 16 insertions(+), 0 deletions(-) > > diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c > index ef36f46..da7d538 100644 > --- a/drivers/mmc/host/sdhci-of-esdhc.c > +++ b/drivers/mmc/host/sdhci-of-esdhc.c > @@ -82,6 +82,7 @@ struct sdhci_esdhc { > bool quirk_limited_clk_division; > bool quirk_unreliable_pulse_detection; > bool quirk_fixup_tuning; > + bool quirk_ignore_data_inhibit; > unsigned int peripheral_clock; > const struct esdhc_clk_fixup *clk_fixup; > u32 div_ratio; > @@ -148,6 +149,19 @@ static u32 esdhc_readl_fixup(struct sdhci_host *host, > 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; > return ret; > } > @@ -1111,12 +1125,14 @@ static int sdhci_esdhc_probe(struct platform_device *pdev) > if (of_device_is_compatible(np, "fsl,ls1021a-esdhc")) > host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL; > > + esdhc->quirk_ignore_data_inhibit = false; > if (of_device_is_compatible(np, "fsl,p2020-esdhc")) { > /* > * Freescale messed up with P2020 as it has a non-standard > * host control register > */ > host->quirks2 |= SDHCI_QUIRK2_BROKEN_HOST_CONTROL; > + esdhc->quirk_ignore_data_inhibit = true; > } > > /* call to generic mmc_of_parse to support additional capabilities */ >