mmc: sdio: don't reinitialize nonremovable powered-resumed cards
Upon system resume, SDIO core must reinitialize cards that were
powered off during suspend.
If the card had its power kept during suspend (and thus it is
'powered-resumed'), SDIO core performs only a limited reinitializing,
mainly needed to make sure that the card wasn't removed/replaced.
If a __nonremovable__ card is powered-resumed, we can safely skip the
reinitializing phase.
Note: 9b966aa
(mmc: sdio: fully reconfigure oldcard on resume) removed
the bus width reconfiguration since mmc_sdio_init_card already does it.
It is brought back now in case mmc_sdio_init_card is skipped.
Signed-off-by: Ohad Ben-Cohen <ohad@wizery.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
This commit is contained in:
parent
e594573d79
commit
080bc9774b
@ -627,15 +627,27 @@ static int mmc_sdio_suspend(struct mmc_host *host)
|
|||||||
|
|
||||||
static int mmc_sdio_resume(struct mmc_host *host)
|
static int mmc_sdio_resume(struct mmc_host *host)
|
||||||
{
|
{
|
||||||
int i, err;
|
int i, err = 0;
|
||||||
|
|
||||||
BUG_ON(!host);
|
BUG_ON(!host);
|
||||||
BUG_ON(!host->card);
|
BUG_ON(!host->card);
|
||||||
|
|
||||||
/* Basic card reinitialization. */
|
/* Basic card reinitialization. */
|
||||||
mmc_claim_host(host);
|
mmc_claim_host(host);
|
||||||
err = mmc_sdio_init_card(host, host->ocr, host->card,
|
|
||||||
|
/* No need to reinitialize powered-resumed nonremovable cards */
|
||||||
|
if (mmc_card_is_removable(host) || !mmc_card_is_powered_resumed(host))
|
||||||
|
err = mmc_sdio_init_card(host, host->ocr, host->card,
|
||||||
(host->pm_flags & MMC_PM_KEEP_POWER));
|
(host->pm_flags & MMC_PM_KEEP_POWER));
|
||||||
|
else if (mmc_card_is_powered_resumed(host)) {
|
||||||
|
/* We may have switched to 1-bit mode during suspend */
|
||||||
|
err = sdio_enable_4bit_bus(host->card);
|
||||||
|
if (err > 0) {
|
||||||
|
mmc_set_bus_width(host, MMC_BUS_WIDTH_4);
|
||||||
|
err = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!err && host->sdio_irqs)
|
if (!err && host->sdio_irqs)
|
||||||
mmc_signal_sdio_irq(host);
|
mmc_signal_sdio_irq(host);
|
||||||
mmc_release_host(host);
|
mmc_release_host(host);
|
||||||
|
@ -320,5 +320,10 @@ static inline int mmc_card_is_removable(struct mmc_host *host)
|
|||||||
return !(host->caps & MMC_CAP_NONREMOVABLE) && mmc_assume_removable;
|
return !(host->caps & MMC_CAP_NONREMOVABLE) && mmc_assume_removable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int mmc_card_is_powered_resumed(struct mmc_host *host)
|
||||||
|
{
|
||||||
|
return host->pm_flags & MMC_PM_KEEP_POWER;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user