Message ID | 20250220074429.2906141-4-o.rempel@pengutronix.de (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mmc: handle undervoltage events and prevent eMMC corruption | expand |
On 2/20/25 07:44, Oleksij Rempel wrote: > Introduce an is_undervoltage parameter to _mmc_suspend() to apply a > short power-off sequence and optionally flush the cache. This refactoring > prepares for undervoltage support in a follow-up patch. > > Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> > --- > drivers/mmc/core/mmc.c | 25 ++++++++++++++++--------- > 1 file changed, 16 insertions(+), 9 deletions(-) > > diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c > index 6a23be214543..86b608843232 100644 > --- a/drivers/mmc/core/mmc.c > +++ b/drivers/mmc/core/mmc.c > @@ -2104,20 +2104,27 @@ static int _mmc_flush_cache(struct mmc_host *host) > return err; > } > > -static int _mmc_suspend(struct mmc_host *host, bool is_suspend) > +static int _mmc_suspend(struct mmc_host *host, bool is_suspend, > + bool is_undervoltage) I see, sorry about missing this on 4/6 :/ > { > + unsigned int notify_type; > int err = 0; > - unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT : > - EXT_CSD_POWER_OFF_LONG; > + > + if (is_undervoltage || is_suspend) > + notify_type = EXT_CSD_POWER_OFF_SHORT; > + else > + notify_type = EXT_CSD_POWER_OFF_LONG; > > mmc_claim_host(host); > > if (mmc_card_suspended(host->card)) > goto out; > > - err = _mmc_flush_cache(host); > - if (err) > - goto out; > + if (is_undervoltage) { > + err = _mmc_flush_cache(host); > + if (err) > + goto out; > + } This is supposed to be !is_undervoltage, isn't it? > > if (mmc_can_poweroff_notify(host->card) && > ((host->caps2 & MMC_CAP2_FULL_PWR_CYCLE) || !is_suspend || > @@ -2144,7 +2151,7 @@ static int mmc_suspend(struct mmc_host *host) > { > int err; > > - err = _mmc_suspend(host, true); > + err = _mmc_suspend(host, true, false); > if (!err) { > pm_runtime_disable(&host->card->dev); > pm_runtime_set_suspended(&host->card->dev); > @@ -2191,7 +2198,7 @@ static int mmc_shutdown(struct mmc_host *host) > err = _mmc_resume(host); > > if (!err) > - err = _mmc_suspend(host, false); > + err = _mmc_suspend(host, false, false); > > return err; > } > @@ -2215,7 +2222,7 @@ static int mmc_runtime_suspend(struct mmc_host *host) > if (!(host->caps & MMC_CAP_AGGRESSIVE_PM)) > return 0; > > - err = _mmc_suspend(host, true); > + err = _mmc_suspend(host, true, false); > if (err) > pr_err("%s: error %d doing aggressive suspend\n", > mmc_hostname(host), err);
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 6a23be214543..86b608843232 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -2104,20 +2104,27 @@ static int _mmc_flush_cache(struct mmc_host *host) return err; } -static int _mmc_suspend(struct mmc_host *host, bool is_suspend) +static int _mmc_suspend(struct mmc_host *host, bool is_suspend, + bool is_undervoltage) { + unsigned int notify_type; int err = 0; - unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT : - EXT_CSD_POWER_OFF_LONG; + + if (is_undervoltage || is_suspend) + notify_type = EXT_CSD_POWER_OFF_SHORT; + else + notify_type = EXT_CSD_POWER_OFF_LONG; mmc_claim_host(host); if (mmc_card_suspended(host->card)) goto out; - err = _mmc_flush_cache(host); - if (err) - goto out; + if (is_undervoltage) { + err = _mmc_flush_cache(host); + if (err) + goto out; + } if (mmc_can_poweroff_notify(host->card) && ((host->caps2 & MMC_CAP2_FULL_PWR_CYCLE) || !is_suspend || @@ -2144,7 +2151,7 @@ static int mmc_suspend(struct mmc_host *host) { int err; - err = _mmc_suspend(host, true); + err = _mmc_suspend(host, true, false); if (!err) { pm_runtime_disable(&host->card->dev); pm_runtime_set_suspended(&host->card->dev); @@ -2191,7 +2198,7 @@ static int mmc_shutdown(struct mmc_host *host) err = _mmc_resume(host); if (!err) - err = _mmc_suspend(host, false); + err = _mmc_suspend(host, false, false); return err; } @@ -2215,7 +2222,7 @@ static int mmc_runtime_suspend(struct mmc_host *host) if (!(host->caps & MMC_CAP_AGGRESSIVE_PM)) return 0; - err = _mmc_suspend(host, true); + err = _mmc_suspend(host, true, false); if (err) pr_err("%s: error %d doing aggressive suspend\n", mmc_hostname(host), err);
Introduce an is_undervoltage parameter to _mmc_suspend() to apply a short power-off sequence and optionally flush the cache. This refactoring prepares for undervoltage support in a follow-up patch. Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- drivers/mmc/core/mmc.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-)