From: Ulf Hansson Date: Mon, 7 Apr 2025 15:27:55 +0000 (+0200) Subject: mmc: core: Add support for graceful host removal for SD X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=dfc29a10c43d3f2aec853c9bf8b0d9e8f0251a2f;p=users%2Fdwmw2%2Flinux.git mmc: core: Add support for graceful host removal for SD An mmc host driver may allow to unbind from its corresponding host device. If an SD card is attached to the host, the mmc core will just try to cut the power for it, without obeying to the SD spec that potentially may damage the card. Let's fix this problem by implementing a graceful power-down of the card at host removal. Reviewed-by: Wolfram Sang Tested-by: Wolfram Sang Signed-off-by: Ulf Hansson Link: https://lore.kernel.org/r/20250407152759.25160-6-ulf.hansson@linaro.org --- diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index 6847b3fe8887a..08ab076fe2f9e 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -1612,15 +1612,6 @@ free_card: return err; } -/* - * Host is being removed. Free up the current card. - */ -static void mmc_sd_remove(struct mmc_host *host) -{ - mmc_remove_card(host->card); - host->card = NULL; -} - /* * Card detection - card is alive. */ @@ -1646,7 +1637,8 @@ static void mmc_sd_detect(struct mmc_host *host) mmc_put_card(host->card, NULL); if (err) { - mmc_sd_remove(host); + mmc_remove_card(host->card); + host->card = NULL; mmc_claim_host(host); mmc_detach_bus(host); @@ -1746,6 +1738,19 @@ out: return err; } +/* + * Host is being removed. Free up the current card and do a graceful power-off. + */ +static void mmc_sd_remove(struct mmc_host *host) +{ + get_device(&host->card->dev); + mmc_remove_card(host->card); + + _mmc_sd_suspend(host); + + put_device(&host->card->dev); + host->card = NULL; +} /* * Callback for suspend */