Re: [PATCH v3 5/5] mmc: sdhci: add quirk to ignore command inhibit for data

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 */
> 




[Index of Archives]     [Linux Memonry Technology]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux