[PATCH v4 6/7] mmc: zynq_sdhci: Wait till sd card detect state is stable

Jaehoon Chung jh80.chung at samsung.com
Tue Aug 3 00:14:51 CEST 2021


Hi Ashok,

On 8/2/21 7:16 PM, Ashok Reddy Soma wrote:
> From: T Karthik Reddy <t.karthik.reddy at xilinx.com>
> 
> As per SD spec when SD host controller is reset, it takes 1000msec
> to detect the card state. In case, if we enable the sd bus voltage &
> card detect state is not stable, then host controller will disable
> the sd bus voltage.
> 
> In case of warm/subsystem reboot, due to unstable card detect state
> host controller is disabling the sd bus voltage to sd card causing
> sd card timeout error. So we wait for a maximum of 1000msec to get
> the card detect state stable before we enable the sd bus voltage.
> 
> This current fix is workaround for now, this needs to be analysed
> further. Zynqmp platform should behave the same as Versal, but we
> did not encounter this issue as of now. So we are fixing it for
> Versal only.
> 
> Signed-off-by: T Karthik Reddy <t.karthik.reddy at xilinx.com>
> Signed-off-by: Ashok Reddy Soma <ashok.reddy.soma at xilinx.com>
> ---
> 
> (no changes since v2)
> 
> Changes in v2:
>  - Changed return error from -EIO to -ETIMEDOUT in arasan_sdhci_probe()
>    in card detect state stable workaround
> 
>  drivers/mmc/zynq_sdhci.c | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
> 
> diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c
> index 9a1693940a..89776f48eb 100644
> --- a/drivers/mmc/zynq_sdhci.c
> +++ b/drivers/mmc/zynq_sdhci.c
> @@ -776,6 +776,23 @@ static int arasan_sdhci_probe(struct udevice *dev)
>  		return ret;
>  	upriv->mmc = host->mmc;
>  
> +	/*
> +	 * Wait for 1000msec till the card detect state gets stable
> +	 * else host controller will set sd power bus voltage to 0.
> +	 */

According to commit-msg, this is workaround code, right?
Then could you add FIXME or WORKAROUND in comment.

Best Regards,
Jaehoon Chung

> +	if (IS_ENABLED(CONFIG_ARCH_VERSAL)) {
> +		u32 timeout = 1000;
> +
> +		while (((sdhci_readl(host, SDHCI_PRESENT_STATE) &
> +			 SDHCI_CARD_STATE_STABLE) == 0) && timeout--) {
> +			mdelay(1);
> +		}
> +		if (!timeout) {
> +			dev_err(dev, "Sdhci card detect state not stable\n");
> +			return -ETIMEDOUT;
> +		}
> +	}
> +
>  	return sdhci_probe(dev);
>  }
>  
> 



More information about the U-Boot mailing list