summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVeerabhadrarao Badiganti <vbadigan@codeaurora.org>2017-04-28 13:07:37 +0530
committerVeerabhadrarao Badiganti <vbadigan@codeaurora.org>2017-04-28 13:52:58 +0530
commit4c2bdc58793f9f252e8c84de09f182e5a09e73fc (patch)
tree19649a26ee575907794b4bf6d4aee61aa829cdb7
parent0abd412d833e1f914d366a89d533bcb5cd6be7c7 (diff)
mmc: core: Update the logic of controlling clk scaling through sysfs
mmc clock scaling can be disabled/enabled through sysfs. The present logic in this path deregisters/registers with devfreq every time. Instead of this, we can simply suspend/resume the clock scaling when requested for disabling/enabling clock scaling. This patch updates the mentioned logic. With original logic, observed deadlock between devfreq registration and cmdqd thread in low memory conditions. The updated logic fixes this deadlock condition aswell. Change-Id: Ifee1ffbe24b13b8f5dc1c9f0579ce9ddf4b4faf3 Signed-off-by: Veerabhadrarao Badiganti <vbadigan@codeaurora.org>
-rw-r--r--drivers/mmc/core/host.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
index e8294502a701..9ca73a2b86db 100644
--- a/drivers/mmc/core/host.c
+++ b/drivers/mmc/core/host.c
@@ -653,19 +653,19 @@ static ssize_t store_enable(struct device *dev,
mmc_get_card(host->card);
if (!value) {
- /*turning off clock scaling*/
- mmc_exit_clk_scaling(host);
+ /* Suspend the clock scaling and mask host capability */
+ if (host->clk_scaling.enable)
+ mmc_suspend_clk_scaling(host);
host->caps2 &= ~MMC_CAP2_CLK_SCALE;
host->clk_scaling.state = MMC_LOAD_HIGH;
/* Set to max. frequency when disabling */
mmc_clk_update_freq(host, host->card->clk_scaling_highest,
host->clk_scaling.state);
} else if (value) {
- /* starting clock scaling, will restart in case started */
+ /* Unmask host capability and resume scaling */
host->caps2 |= MMC_CAP2_CLK_SCALE;
- if (host->clk_scaling.enable)
- mmc_exit_clk_scaling(host);
- mmc_init_clk_scaling(host);
+ if (!host->clk_scaling.enable)
+ mmc_resume_clk_scaling(host);
}
mmc_put_card(host->card);