Commit 2986d0bf authored by Pierre Ossman's avatar Pierre Ossman

mmc: Don't hold lock when releasing an added card

When the card has been added to the device model, it might be bound
to a card driver. Therefore, we have to release the host lock when
trying to remove it as we otherwise might deadlock with the driver.
Signed-off-by: default avatarPierre Ossman <drzeus@drzeus.cx>
parent cf795bfb
...@@ -499,14 +499,17 @@ static void mmc_resume(struct mmc_host *host) ...@@ -499,14 +499,17 @@ static void mmc_resume(struct mmc_host *host)
BUG_ON(!host->card); BUG_ON(!host->card);
mmc_claim_host(host); mmc_claim_host(host);
err = mmc_init_card(host, host->ocr, host->card); err = mmc_init_card(host, host->ocr, host->card);
mmc_release_host(host);
if (err != MMC_ERR_NONE) { if (err != MMC_ERR_NONE) {
mmc_remove(host); mmc_remove(host);
mmc_claim_host(host);
mmc_detach_bus(host); mmc_detach_bus(host);
mmc_release_host(host);
} }
mmc_release_host(host);
} }
#else #else
...@@ -567,14 +570,14 @@ int mmc_attach_mmc(struct mmc_host *host, u32 ocr) ...@@ -567,14 +570,14 @@ int mmc_attach_mmc(struct mmc_host *host, u32 ocr)
err = mmc_add_card(host->card); err = mmc_add_card(host->card);
if (err) if (err)
goto reclaim_host; goto remove_card;
return 0; return 0;
reclaim_host: remove_card:
mmc_claim_host(host);
mmc_remove_card(host->card); mmc_remove_card(host->card);
host->card = NULL; host->card = NULL;
mmc_claim_host(host);
err: err:
mmc_detach_bus(host); mmc_detach_bus(host);
mmc_release_host(host); mmc_release_host(host);
......
...@@ -573,14 +573,17 @@ static void mmc_sd_resume(struct mmc_host *host) ...@@ -573,14 +573,17 @@ static void mmc_sd_resume(struct mmc_host *host)
BUG_ON(!host->card); BUG_ON(!host->card);
mmc_claim_host(host); mmc_claim_host(host);
err = mmc_sd_init_card(host, host->ocr, host->card); err = mmc_sd_init_card(host, host->ocr, host->card);
mmc_release_host(host);
if (err != MMC_ERR_NONE) { if (err != MMC_ERR_NONE) {
mmc_sd_remove(host); mmc_sd_remove(host);
mmc_claim_host(host);
mmc_detach_bus(host); mmc_detach_bus(host);
mmc_release_host(host);
} }
mmc_release_host(host);
} }
#else #else
...@@ -648,14 +651,14 @@ int mmc_attach_sd(struct mmc_host *host, u32 ocr) ...@@ -648,14 +651,14 @@ int mmc_attach_sd(struct mmc_host *host, u32 ocr)
err = mmc_add_card(host->card); err = mmc_add_card(host->card);
if (err) if (err)
goto reclaim_host; goto remove_card;
return 0; return 0;
reclaim_host: remove_card:
mmc_claim_host(host);
mmc_remove_card(host->card); mmc_remove_card(host->card);
host->card = NULL; host->card = NULL;
mmc_claim_host(host);
err: err:
mmc_detach_bus(host); mmc_detach_bus(host);
mmc_release_host(host); mmc_release_host(host);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment