2017-09-21 17:47:59

by Kyle Roeschley

[permalink] [raw]
Subject: [PATCH] mmc: core: Wait for Vdd to settle on card power off

The SD spec version 6.0 section 6.4.1.5 requires that Vdd must be
lowered to less than 0.5V for a minimum of 1 ms when powering off a
card. Increase our wait to 10 ms so that voltage has time to drain down
to 0.5V and cards can power off correctly.

Signed-off-by: Kyle Roeschley <[email protected]>
---
drivers/mmc/core/core.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 66c9cf49ad2f..38630246de26 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -1679,18 +1679,16 @@ void mmc_power_off(struct mmc_host *host)
mmc_set_initial_state(host);

/*
- * Some configurations, such as the 802.11 SDIO card in the OLPC
- * XO-1.5, require a short delay after poweroff before the card
- * can be successfully turned on again.
+ * The SD spec requires at least 1 ms with Vdd at less than 0.5 V
+ * before a card can be re-powered, but we need to wait longer so that
+ * the voltage has time to drain.
*/
- mmc_delay(1);
+ mmc_delay(10);
}

void mmc_power_cycle(struct mmc_host *host, u32 ocr)
{
mmc_power_off(host);
- /* Wait at least 1 ms according to SD spec */
- mmc_delay(1);
mmc_power_up(host, ocr);
}

--
2.14.1


2017-09-22 09:38:43

by Ulf Hansson

[permalink] [raw]
Subject: Re: [PATCH] mmc: core: Wait for Vdd to settle on card power off

On 21 September 2017 at 19:47, Kyle Roeschley <[email protected]> wrote:
> The SD spec version 6.0 section 6.4.1.5 requires that Vdd must be
> lowered to less than 0.5V for a minimum of 1 ms when powering off a
> card. Increase our wait to 10 ms so that voltage has time to drain down
> to 0.5V and cards can power off correctly.
>
> Signed-off-by: Kyle Roeschley <[email protected]>
> ---
> drivers/mmc/core/core.c | 10 ++++------
> 1 file changed, 4 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
> index 66c9cf49ad2f..38630246de26 100644
> --- a/drivers/mmc/core/core.c
> +++ b/drivers/mmc/core/core.c
> @@ -1679,18 +1679,16 @@ void mmc_power_off(struct mmc_host *host)
> mmc_set_initial_state(host);
>
> /*
> - * Some configurations, such as the 802.11 SDIO card in the OLPC
> - * XO-1.5, require a short delay after poweroff before the card
> - * can be successfully turned on again.
> + * The SD spec requires at least 1 ms with Vdd at less than 0.5 V
> + * before a card can be re-powered, but we need to wait longer so that
> + * the voltage has time to drain.
> */
> - mmc_delay(1);
> + mmc_delay(10);

No, this isn't the proper place of adding more "magic" delays.

Instead, make sure the related ->set_ios() callback in the mmc host
driver deals with this instead. In case it uses an external regulator,
via the regulator API, then this is something that should be
controlled with the definition of the regulator.

> }
>
> void mmc_power_cycle(struct mmc_host *host, u32 ocr)
> {
> mmc_power_off(host);
> - /* Wait at least 1 ms according to SD spec */
> - mmc_delay(1);

Ditto.

> mmc_power_up(host, ocr);
> }
>
> --
> 2.14.1
>

Kind regards
Uffe

2017-09-22 14:09:42

by Kyle Roeschley

[permalink] [raw]
Subject: Re: [PATCH] mmc: core: Wait for Vdd to settle on card power off

On Fri, Sep 22, 2017 at 11:38:40AM +0200, Ulf Hansson wrote:
> On 21 September 2017 at 19:47, Kyle Roeschley <[email protected]> wrote:
> > The SD spec version 6.0 section 6.4.1.5 requires that Vdd must be
> > lowered to less than 0.5V for a minimum of 1 ms when powering off a
> > card. Increase our wait to 10 ms so that voltage has time to drain down
> > to 0.5V and cards can power off correctly.
> >
> > Signed-off-by: Kyle Roeschley <[email protected]>
> > ---
> > drivers/mmc/core/core.c | 10 ++++------
> > 1 file changed, 4 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
> > index 66c9cf49ad2f..38630246de26 100644
> > --- a/drivers/mmc/core/core.c
> > +++ b/drivers/mmc/core/core.c
> > @@ -1679,18 +1679,16 @@ void mmc_power_off(struct mmc_host *host)
> > mmc_set_initial_state(host);
> >
> > /*
> > - * Some configurations, such as the 802.11 SDIO card in the OLPC
> > - * XO-1.5, require a short delay after poweroff before the card
> > - * can be successfully turned on again.
> > + * The SD spec requires at least 1 ms with Vdd at less than 0.5 V
> > + * before a card can be re-powered, but we need to wait longer so that
> > + * the voltage has time to drain.
> > */
> > - mmc_delay(1);
> > + mmc_delay(10);
>
> No, this isn't the proper place of adding more "magic" delays.
>
> Instead, make sure the related ->set_ios() callback in the mmc host
> driver deals with this instead. In case it uses an external regulator,
> via the regulator API, then this is something that should be
> controlled with the definition of the regulator.
>

Thanks for pointing me in the right direction, I'll reimplement the fix there.

--
Kyle Roeschley
Software Engineer
National Instruments