Re: [PATCH v2 3/3] mmc: core: Add power-off-delay-us support
Ulf Hansson <[email protected]> Mon, 27 Jul 2026 17:16:46 +0200
| Newsgroups | org.kernel.vger.linux-mmc,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <CAPx+jO9w0utg5BhsKnUSgdCWeM1prOqoV0gCrTpaeuaWZouXoA@mail.gmail.com> |
On Wed, Jul 22, 2026 at 10:57=E2=80=AFPM Judith Mendez <[email protected]> wrote: > > Add support for power-off-delay-us which shall be used to specify > value of delay after deasserting power during MMC power cycles. > Default for delay is 1000us but custom delay can be passed in to work > around hardware issues such as slow RC discharge on MMC VDD rails. > > Signed-off-by: Judith Mendez <[email protected]> > --- > Changes since v1: > - Move delay to mmc_power_off > - Fix dt checks and remove print > - Move from mmc_host struct to mmc_ios struct > - Rename post-power-off-delay-ms to power_off_delay_us > --- > drivers/mmc/core/core.c | 2 +- > drivers/mmc/core/host.c | 8 ++++++++ > include/linux/mmc/host.h | 1 + > 3 files changed, 10 insertions(+), 1 deletion(-) > > diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c > index 29e80e5f928e9..9472041fe1c20 100644 > --- a/drivers/mmc/core/core.c > +++ b/drivers/mmc/core/core.c > @@ -1388,7 +1388,7 @@ void mmc_power_off(struct mmc_host *host) > * XO-1.5, require a short delay after poweroff before the card > * can be successfully turned on again. > */ > - mmc_delay(1); > + mmc_delay_us(host->ios.power_off_delay_us); > } > > void mmc_power_cycle(struct mmc_host *host, u32 ocr) > diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > index b7ce3137d4529..fac50a2860211 100644 > --- a/drivers/mmc/core/host.c > +++ b/drivers/mmc/core/host.c > @@ -421,6 +421,13 @@ int mmc_of_parse(struct mmc_host *host) > device_property_read_u32(dev, "post-power-on-delay-ms", > &host->ios.power_delay_ms); > > + device_property_read_u32(dev, "power-off-delay-us", > + &host->ios.power_off_delay_us); > + if (host->ios.power_off_delay_us < 1) > + host->ios.power_off_delay_us =3D 1000; If power-off-delay-us is specified and the value >=3D 0, I think we can respect it as is. This means we need to treat "0" a bit special and bail out in mmc_delay_us(= ). > + if (host->ios.power_off_delay_us > 10000000) > + host->ios.power_off_delay_us =3D 10000000; > + > return mmc_pwrseq_alloc(host); > } > > @@ -574,6 +581,7 @@ struct mmc_host *mmc_alloc_host(int extra, struct dev= ice *dev) > > host->fixed_drv_type =3D -EINVAL; > host->ios.power_delay_ms =3D 10; > + host->ios.power_off_delay_us =3D 1000; > host->ios.power_mode =3D MMC_POWER_UNDEFINED; > > return host; > diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h > index ba84f02c2a101..714417466707c 100644 > --- a/include/linux/mmc/host.h > +++ b/include/linux/mmc/host.h > @@ -23,6 +23,7 @@ struct mmc_ios { > unsigned int clock; /* clock rate */ > unsigned short vdd; > unsigned int power_delay_ms; /* waiting for stable pow= er */ > + unsigned int power_off_delay_us; /* waiting for power disc= harge */ > > /* vdd stores the bit number of the selected voltage range from below. *= / > > -- > 2.54.0 > Kind regards Uffe