[PATCH v10 3/6] mmc: core: Add option to keep an eMMC powered on at system suspend

From: Ulf Hansson

Date: Tue Oct 27 2026 - 10:48:58 EST


The DT property keep-power-in-suspend, allows us to specify whether the
platform is capable of keeping the power to the card during system suspend.
Up until now, this has been restricted to be used for SDIO cards only, but
let's add the initial support to allow this for eMMC too.

Signed-off-by: Ulf Hansson <ulf.hansson@xxxxxxxxxxxxxxxx>
---
drivers/mmc/core/mmc.c | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index a02b04938e1a..c936272bcd81 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -38,6 +38,7 @@ enum mmc_poweroff_type {
MMC_POWEROFF_SHUTDOWN,
MMC_POWEROFF_UNDERVOLTAGE,
MMC_POWEROFF_UNBIND,
+ MMC_NO_POWEROFF_SUSPEND,
};

static const unsigned int tran_exp[] = {
@@ -2157,6 +2158,15 @@ static int _mmc_suspend(struct mmc_host *host, enum mmc_poweroff_type pm_type)
goto out;
}

+ if (pm_type == MMC_NO_POWEROFF_SUSPEND) {
+ if (host->retune_period) {
+ mmc_retune_timer_stop(host);
+ mmc_retune_needed(host);
+ }
+ mmc_card_set_suspended(host->card);
+ goto out;
+ }
+
if (mmc_card_can_poweroff_notify(host->card) &&
mmc_host_can_poweroff_notify(host, pm_type))
err = mmc_poweroff_notify(host->card, notify_type);
@@ -2193,9 +2203,15 @@ static void mmc_remove(struct mmc_host *host)
*/
static int mmc_suspend(struct mmc_host *host)
{
+ enum mmc_poweroff_type pm_type = MMC_POWEROFF_SUSPEND;
int err;

- err = _mmc_suspend(host, MMC_POWEROFF_SUSPEND);
+ if (mmc_card_keep_power(host)) {
+ pm_runtime_resume(&host->card->dev);
+ pm_type = MMC_NO_POWEROFF_SUSPEND;
+ }
+
+ err = _mmc_suspend(host, pm_type);
if (!err) {
pm_runtime_disable(&host->card->dev);
pm_runtime_set_suspended(&host->card->dev);
@@ -2260,7 +2276,13 @@ static int mmc_shutdown(struct mmc_host *host)
*/
static int mmc_resume(struct mmc_host *host)
{
+ if (mmc_card_keep_power(host)) {
+ pm_runtime_set_active(&host->card->dev);
+ mmc_card_clr_suspended(host->card);
+ }
+
pm_runtime_enable(&host->card->dev);
+ host->pm_flags &= ~MMC_PM_KEEP_POWER;
return 0;
}

--
2.43.0