Re: [PATCH RESEND] mmc: mmci: manage MMC_PM_KEEP_POWER per variant config

From: Yann Gautier
Date: Mon Mar 14 2022 - 08:35:04 EST


On 3/14/22 12:17, Ulf Hansson wrote:
On Mon, 14 Mar 2022 at 10:53, Yann Gautier <yann.gautier@xxxxxxxxxxx> wrote:

Add a disable_keep_power field in variant_data struct. The
MMC_PM_KEEP_POWER flag will be enabled if disable_keep_power is not set.
It is only set to true for stm32_sdmmc variants.

The issue was seen on STM32MP157C-DK2 board, which embeds a wifi chip.
It doesn't correctly support low power, and we need to unbind the wifi
driver before a suspend sequence. But the wifi chip firmware is then
lost, and the communication with SDIO fails if MMC_PM_KEEP_POWER is
enabled.

So the platform supports to maintain the power for the embedded wifi
chip during system suspend, but the SDIO func driver (for the WiFi
chip) doesn't implement its part correctly. Did I get that right?

In that case, it sounds to me like we should try to fix the support
for power management in the SDIO func driver instead, no?
I am happy to help with guidance/review if that is needed. What SDIO
func driver is this about?

Kind regards
Uffe


Hi Ulf,

I blindly pushed the patch without rechecking it.
I rephrased it in our downstream to better explain the issue:

The issue was seen on STM32MP157C-DK2 board, which embeds a wifi chip.
It doesn't correctly support low power on this board. The Wifi chip
awaits an always-on regulator, but it was connected to v3v3 which is off
in low-power sequence. MMC_PM_KEEP_POWER should then be disabled.

If it's OK for you, I'll resend the patch with the updated commit message.

Best regards,
Yann

The flag can still be enabled through DT property: keep-power-in-suspend.

Signed-off-by: Yann Gautier <yann.gautier@xxxxxxxxxxx>
---
Resend the patch alone. It was previoulsy in a series [1] for which the
other patches will be reworked.

[1] https://lore.kernel.org/lkml/20220304135134.47827-1-yann.gautier@xxxxxxxxxxx/

drivers/mmc/host/mmci.c | 5 ++++-
drivers/mmc/host/mmci.h | 1 +
2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
index 45b8608c935c..0e2f2f5d6a52 100644
--- a/drivers/mmc/host/mmci.c
+++ b/drivers/mmc/host/mmci.c
@@ -274,6 +274,7 @@ static struct variant_data variant_stm32_sdmmc = {
.busy_detect = true,
.busy_detect_flag = MCI_STM32_BUSYD0,
.busy_detect_mask = MCI_STM32_BUSYD0ENDMASK,
+ .disable_keep_power = true,
.init = sdmmc_variant_init,
};

@@ -301,6 +302,7 @@ static struct variant_data variant_stm32_sdmmcv2 = {
.busy_detect = true,
.busy_detect_flag = MCI_STM32_BUSYD0,
.busy_detect_mask = MCI_STM32_BUSYD0ENDMASK,
+ .disable_keep_power = true,
.init = sdmmc_variant_init,
};

@@ -2172,7 +2174,8 @@ static int mmci_probe(struct amba_device *dev,
host->stop_abort.flags = MMC_RSP_R1B | MMC_CMD_AC;

/* We support these PM capabilities. */
- mmc->pm_caps |= MMC_PM_KEEP_POWER;
+ if (!variant->disable_keep_power)
+ mmc->pm_caps |= MMC_PM_KEEP_POWER;

/*
* We can do SGIO
diff --git a/drivers/mmc/host/mmci.h b/drivers/mmc/host/mmci.h
index e1a9b96a3396..2cad1ef9766a 100644
--- a/drivers/mmc/host/mmci.h
+++ b/drivers/mmc/host/mmci.h
@@ -361,6 +361,7 @@ struct variant_data {
u32 opendrain;
u8 dma_lli:1;
u32 stm32_idmabsize_mask;
+ u8 disable_keep_power:1;
void (*init)(struct mmci_host *host);
};

--
2.25.1