Even in failed case of pm_runtime_get_sync, the usage_count is incremented. In order to keep the usage_count with correct value and runtime power management to behave correctly, call pm_runtime_put(_sync) in such case. Signed-off-by Liu Chuansheng <chuansheng.liu@xxxxxxxxx> Signed-off-by: Li Fei <fei.li@xxxxxxxxx> --- drivers/mmc/core/sdio.c | 3 +-- drivers/mmc/core/sdio_bus.c | 4 +++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index aa0719a..45ab6f32 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -874,6 +874,7 @@ static void mmc_sdio_detect(struct mmc_host *host) mmc_release_host(host); +out: /* * Tell PM core it's OK to power off the card now. * @@ -887,8 +888,6 @@ static void mmc_sdio_detect(struct mmc_host *host) */ if (host->caps & MMC_CAP_POWER_OFF_CARD) pm_runtime_put_sync(&host->card->dev); - -out: if (err) { mmc_sdio_remove(host); diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c index 5e57048..d572b31 100644 --- a/drivers/mmc/core/sdio_bus.c +++ b/drivers/mmc/core/sdio_bus.c @@ -136,8 +136,10 @@ static int sdio_bus_probe(struct device *dev) */ if (func->card->host->caps & MMC_CAP_POWER_OFF_CARD) { ret = pm_runtime_get_sync(dev); - if (ret < 0) + if (ret < 0) { + pm_runtime_put_sync(dev); goto out; + } } /* Set the default block size so the driver is sure it's something -- 1.7.4.1 -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html