diff options
author | Linux Build Service Account <lnxbuild@quicinc.com> | 2017-05-25 15:51:51 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-05-25 15:51:51 -0700 |
commit | b133f848d1457fe77bb13240ed6ad9dbe9e48f9e (patch) | |
tree | 1c9154173d483bdc50699282947fb2c94726df1a /drivers | |
parent | 8a4a2650e08116e68cc4541737628cb95913417e (diff) | |
parent | 7b46835e9f0ebe022974d4bafc5be32a90dd2e74 (diff) |
Merge "mmc: block: Disable clock scaling during shutdown"
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mmc/card/block.c | 4 | ||||
-rw-r--r-- | drivers/mmc/core/core.c | 9 | ||||
-rw-r--r-- | drivers/mmc/core/mmc.c | 17 |
3 files changed, 24 insertions, 6 deletions
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index e9f1a19dfe3f..a22defee763a 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -4695,10 +4695,6 @@ static int _mmc_blk_suspend(struct mmc_card *card, bool wait) static void mmc_blk_shutdown(struct mmc_card *card) { _mmc_blk_suspend(card, 1); - - /* send power off notification */ - if (mmc_card_mmc(card)) - mmc_send_pon(card); } #ifdef CONFIG_PM_SLEEP diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index c462eee4a5f7..ef3ffd87d94f 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -790,10 +790,15 @@ int mmc_resume_clk_scaling(struct mmc_host *host) if (!mmc_can_scale_clk(host)) return 0; + /* + * If clock scaling is already exited when resume is called, like + * during mmc shutdown, it is not an error and should not fail the + * API calling this. + */ if (!host->clk_scaling.devfreq) { - pr_err("%s: %s: no devfreq is assosiated with this device\n", + pr_warn("%s: %s: no devfreq is assosiated with this device\n", mmc_hostname(host), __func__); - return -EPERM; + return 0; } atomic_set(&host->clk_scaling.devfreq_abort, 0); diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 5eda4f4fb0fe..df60774b02af 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -2933,6 +2933,22 @@ static int mmc_reset(struct mmc_host *host) return ret; } +static int mmc_shutdown(struct mmc_host *host) +{ + struct mmc_card *card = host->card; + + /* + * Exit clock scaling so that it doesn't kick in after + * power off notification is sent + */ + if (host->caps2 & MMC_CAP2_CLK_SCALE) + mmc_exit_clk_scaling(card->host); + /* send power off notification */ + if (mmc_card_mmc(card)) + mmc_send_pon(card); + return 0; +} + static const struct mmc_bus_ops mmc_ops = { .remove = mmc_remove, .detect = mmc_detect, @@ -2943,6 +2959,7 @@ static const struct mmc_bus_ops mmc_ops = { .alive = mmc_alive, .change_bus_speed = mmc_change_bus_speed, .reset = mmc_reset, + .shutdown = mmc_shutdown, }; /* |