Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 049fd767 authored by Ulf Hansson's avatar Ulf Hansson Committed by Greg Kroah-Hartman
Browse files

mmc: sdio: Don't re-initialize powered-on removable SDIO cards at resume



[ Upstream commit 6ebc581c3f9e6fd11a1c9da492a5e05bbe96885a ]

It looks like the original idea behind always doing a re-initialization of
a removable SDIO card during system resume in mmc_sdio_resume(), is to try
to play safe to detect whether the card has been removed.

However, this seems like a really a bad idea as it will most likely screw
things up, especially when the card is expected to remain powered on during
system suspend by the SDIO func driver.

Let's fix this, simply by trusting that the detect work checks if the card
is alive and inserted, which is being scheduled at the PM_POST_SUSPEND
notification anyway.

Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Tested-by: default avatarDouglas Anderson <dianders@chromium.org>
Reviewed-by: default avatarDouglas Anderson <dianders@chromium.org>
Stable-dep-of: 32a9cdb8869d ("mmc: core: sdio: hold retuning if sdio in 1-bit mode")
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 4a82dfcb
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -963,7 +963,11 @@ static int mmc_sdio_resume(struct mmc_host *host)
	/* Basic card reinitialization. */
	mmc_claim_host(host);

	/* Restore power if needed */
	/*
	 * Restore power and reinitialize the card when needed. Note that a
	 * removable card is checked from a detect work later on in the resume
	 * process.
	 */
	if (!mmc_card_keep_power(host)) {
		mmc_power_up(host, host->card->ocr);
		/*
@@ -977,12 +981,8 @@ static int mmc_sdio_resume(struct mmc_host *host)
			pm_runtime_set_active(&host->card->dev);
			pm_runtime_enable(&host->card->dev);
		}
	}

	/* No need to reinitialize powered-resumed nonremovable cards */
	if (mmc_card_is_removable(host) || !mmc_card_keep_power(host)) {
		err = mmc_sdio_reinit_card(host, mmc_card_keep_power(host));
	} else if (mmc_card_keep_power(host) && mmc_card_wake_sdio_irq(host)) {
		err = mmc_sdio_reinit_card(host, 0);
	} else if (mmc_card_wake_sdio_irq(host)) {
		/* We may have switched to 1-bit mode during suspend */
		err = sdio_enable_4bit_bus(host->card);
	}