diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index a1b92cdbe83d..8e24ddfb51db 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -1259,7 +1259,8 @@ EXPORT_SYMBOL(mmc_check_bkops); * mmc_start_manual_bkops - start BKOPS for supported cards * @card: MMC card to start BKOPS * - * Send START_BKOPS to the card. + * Send START_BKOPS to the card. + * The function should be called with claimed host. */ void mmc_start_manual_bkops(struct mmc_card *card) { @@ -1273,7 +1274,6 @@ void mmc_start_manual_bkops(struct mmc_card *card) if (mmc_card_doing_bkops(card)) return; - mmc_claim_host(card->host); mmc_retune_hold(card->host); err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BKOPS_START, @@ -1288,7 +1288,6 @@ void mmc_start_manual_bkops(struct mmc_card *card) } mmc_retune_release(card->host); - mmc_release_host(card->host); } EXPORT_SYMBOL(mmc_start_manual_bkops); diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 4eac93303776..3a23cf434159 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -2587,6 +2587,9 @@ static int mmc_runtime_idle(struct mmc_host *host) bool halt_cmdq; BUG_ON(!host->card); + + mmc_claim_host(host); + halt_cmdq = mmc_card_cmdq(host->card) && (host->card->bkops.needs_check || host->card->bkops.needs_manual); @@ -2611,10 +2614,9 @@ static int mmc_runtime_idle(struct mmc_host *host) host->card->bkops.needs_check = false; if (host->card->bkops.needs_check) { - mmc_claim_host(host); mmc_check_bkops(host->card); host->card->bkops.needs_check = false; - mmc_release_host(host); + } if (host->card->bkops.needs_manual) @@ -2626,6 +2628,7 @@ static int mmc_runtime_idle(struct mmc_host *host) pr_err("%s: %s failed to unhalt cmdq (%d)\n", mmc_hostname(host), __func__, err); } + out: /* * TODO: consider prolonging suspend when bkops @@ -2634,6 +2637,7 @@ out: * */ pm_schedule_suspend(&host->card->dev, MMC_AUTOSUSPEND_DELAY_MS); no_suspend: + mmc_release_host(host); pm_runtime_mark_last_busy(&host->card->dev); /* return negative value in order to avoid autosuspend */ return (err) ? err : NO_AUTOSUSPEND;