[PATCH v6 0/3] mmc: core: Keep the card powered across suspend when firmware needs it live
Kamal Dasu <[email protected]> Tue, 4 Aug 2026 16:38:15 -0400
| Newsgroups | org.kernel.vger.linux-mmc,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
This is v6, and grows from two patches to three per Ulf's review.
Background: on brcmstb boards with a Kioxia 016G01 eMMC, firmware
accesses the card directly during resume from Suspend-to-DRAM, before
the kernel's own resume path runs, in order to load boot code using
hard wired logic that is not field updatable. The card needs to stay
powered and responsive for that access to succeed, and since it is
never power-cycled, it also needs to be reset before the kernel
reuses it after resume.
Changes in v6:
- Split keeping the card powered and needing a reset before reuse
into two independent DT properties, per Ulf: extending
keep-power-in-suspend beyond SDIO (patch 1) no longer carries any
brcmstb-specific rationale, and a new reset-card-at-resume
property (patch 2) covers that instead. brcmstb sets both; SDIO's
existing keep-power-in-suspend users are unaffected.
- Patch 3 (the driver patch) reflects the split: the
mmc_set_clock()/mmc_set_initial_state() reset moved out of the
suspend-side fast path and into _mmc_resume(), gated on the new
MMC_CAP2_RESET_AT_RESUME, matching reset-card-at-resume's name
and description.
- Also per Ulf (raised on v4, applies equally to v5): dropped the
mention of sdio_set_host_pm_flags() and how Linux's SDIO stack
happens to expose this at runtime from the binding description --
that's a software implementation detail, not a hardware/platform
description.
Changes in v5:
- Patch 1: added Krzysztof's Reviewed-by.
- Patch 2: only set host->pm_flags |= MMC_PM_KEEP_POWER after
mmc_deselect_cards() succeeds, instead of unconditionally before
it. Otherwise, if the deselect fails, the card is never marked
suspended, _mmc_resume() takes its early exit, and the flag never
gets cleared -- leaking it for the rest of uptime.
Changes in v4:
- Dropped the no-mmc-poweroff-suspend DT property and
MMC_CAP2_NO_POWEROFF_SUSPEND host capability entirely. Krzysztof
pointed out they described exactly the same contract as the
existing keep-power-in-suspend property (don't power off the card
across suspend/resume). Extended keep-power-in-suspend's scope
beyond SDIO instead, and reworked _mmc_suspend() to check
host->pm_caps & MMC_PM_KEEP_POWER directly rather than adding a
new capability.
- Gated the fast path on pm_type == MMC_POWEROFF_SUSPEND; it was
previously unconditional, so it wrongly skipped the required
power-off/notify handling during shutdown, unbind and
undervoltage as well.
- Set/clear host->pm_flags |= MMC_PM_KEEP_POWER around the suspend/
resume, mirroring the SDIO convention, so host drivers can tell
power was preserved if they need to.
Changes in v3:
- Reworked the fix in _mmc_suspend() (drivers/mmc/core/mmc.c) to
skip the poweroff-notify/sleep/power-off sequence entirely.
- Renamed no-mmc-sleep/MMC_CAP2_NO_SLEEP_CMD to
no-mmc-poweroff-suspend/MMC_CAP2_NO_POWEROFF_SUSPEND.
Changes in v2:
- Replaced v1's card-level MMC_QUIRK_BROKEN_SLEEP quirk with a host
capability and matching DT property, per Ulf's suggestion.
- Added Reported-by/Closes tags crediting Florian.
Kamal Dasu (3):
dt-bindings: mmc: Extend keep-power-in-suspend beyond SDIO
dt-bindings: mmc: Add reset-card-at-resume property
mmc: core: Honor keep-power-in-suspend/reset-card-at-resume for (e)MMC
.../bindings/mmc/mmc-controller-common.yaml | 9 ++++++-
drivers/mmc/core/host.c | 2 ++
drivers/mmc/core/mmc.c | 33 ++++++++++++++++++++++
include/linux/mmc/host.h | 1 +
4 files changed, 44 insertions(+), 1 deletion(-)
--
2.34.1