Re: [PATCH] mmc: sdhci: use udelay instead of mdelay

From: Arnd Bergmann
Date: Mon May 30 2016 - 04:00:29 EST


On Monday, May 30, 2016 7:55:55 AM CEST Baranowska, BeataX wrote:
> From: Chuanxiao Dong <chuanxiao.dong@xxxxxxxxx>
>
> This patch will use udelay instead of mdelay when waiting for
> SDHCI hardware to be stable. udelay can help to reduce the waiting
> time when is in critical region which is protected by spinlock.
>
> With this patch, __sdhci_set_ios only take a few microseconds to be
> done.
>
> Signed-off-by: Chuanxiao Dong <chuanxiao.dong@xxxxxxxxx>
> ---
> drivers/mmc/host/sdhci.c | 18 +++++++++---------
> 1 file changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index e010ea4eb6f5..56d2c7567d97 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -173,8 +173,8 @@ void sdhci_reset(struct sdhci_host *host, u8 mask)
> sdhci_runtime_pm_bus_off(host);
> }
>
> - /* Wait max 100 ms */
> - timeout = 100;
> + /* Wait max 10000 ms */
> + timeout = 10000;
>
> /* hw clears the bit when it's done */
> while (sdhci_readb(host, SDHCI_SOFTWARE_RESET) & mask) {
> @@ -185,7 +185,7 @@ void sdhci_reset(struct sdhci_host *host, u8 mask)
> return;
> }
> timeout--;
> - mdelay(1);
> + udelay(10);
> }
> }
> EXPORT_SYMBOL_GPL(sdhci_reset);

This can significantly increase the timeout length. I think you should
instead use time_before() to see how many jiffies have passed since
the start.

However, the real question is why the reset function gets called under
a spinlock in the first place. Can you try to rearrange the code so
it doesn't need the lock at all and you can just use msleep() instead?

Arnd