summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@quicinc.com>2017-05-25 15:51:51 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-05-25 15:51:51 -0700
commitb133f848d1457fe77bb13240ed6ad9dbe9e48f9e (patch)
tree1c9154173d483bdc50699282947fb2c94726df1a /drivers
parent8a4a2650e08116e68cc4541737628cb95913417e (diff)
parent7b46835e9f0ebe022974d4bafc5be32a90dd2e74 (diff)
Merge "mmc: block: Disable clock scaling during shutdown"
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mmc/card/block.c4
-rw-r--r--drivers/mmc/core/core.c9
-rw-r--r--drivers/mmc/core/mmc.c17
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,
};
/*