[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