On 7/24/21 5:10 PM, Ashok Reddy Soma wrote:
> From: T Karthik Reddy <[email protected]>
> 
> 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 <[email protected]>
> Signed-off-by: Ashok Reddy Soma <[email protected]>
> ---
> 
>  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 8ffa8c1269..a192f60320 100644
> --- a/drivers/mmc/zynq_sdhci.c
> +++ b/drivers/mmc/zynq_sdhci.c
> @@ -686,6 +686,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.
> +      */
> +     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 -EIO;

-EIO is not correct, -ETIMEDOUT or -EBUSY?

Best Regards,
Jaehoon Chung

> +             }
> +     }
> +
>       return sdhci_probe(dev);
>  }
>  
> 

Reply via email to