summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSrinivas Kandagatla <srinivas.kandagatla@linaro.org>2023-03-21 11:28:43 +0000
committerAmit Pundir <amit.pundir@linaro.org>2023-03-22 17:50:35 +0530
commit95761c76004111acb4bdf45e23c74eaad1a75535 (patch)
tree5b6b85ce5571ac15c9d5c82bbd04e37263b8a3ae
parente173ceb6362491a2bf9238cb4a3034506a2b4a1f (diff)
FROMLIST: clk: qcom: gfm-mux: get runtime pm while accessing registersrbX-6.3-rc1
gfm mux driver does support runtime pm but we never use it while accessing registers. Looks like this driver was getting lucky and totally depending on other drivers to leave the clk on. Fix this by doing runtime pm while accessing registers. Fixes: a2d8f507803e ("clk: qcom: Add support to LPASS AUDIO_CC Glitch Free Mux clocks") Cc: stable@vger.kernel.org Reported-by: Amit Pundir <amit.pundir@linaro.org> Change-Id: I64bfe641639eb7452ad4c88b52599b6ec5582436 Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
-rw-r--r--drivers/clk/qcom/lpass-gfm-sm8250.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/drivers/clk/qcom/lpass-gfm-sm8250.c b/drivers/clk/qcom/lpass-gfm-sm8250.c
index 96f476f24eb2..afab30750dfc 100644
--- a/drivers/clk/qcom/lpass-gfm-sm8250.c
+++ b/drivers/clk/qcom/lpass-gfm-sm8250.c
@@ -38,14 +38,35 @@ struct clk_gfm {
static u8 clk_gfm_get_parent(struct clk_hw *hw)
{
struct clk_gfm *clk = to_clk_gfm(hw);
+ int ret;
+ u8 parent;
+
+ ret = pm_runtime_resume_and_get(clk->priv->dev);
+ if (ret < 0 && ret != -EACCES) {
+ dev_err_ratelimited(clk->priv->dev,
+ "pm_runtime_resume_and_get failed in %s, ret %d\n",
+ __func__, ret);
+ }
+
+ parent = readl(clk->gfm_mux) & clk->mux_mask;
- return readl(clk->gfm_mux) & clk->mux_mask;
+ pm_runtime_mark_last_busy(clk->priv->dev);
+
+ return parent;
}
static int clk_gfm_set_parent(struct clk_hw *hw, u8 index)
{
struct clk_gfm *clk = to_clk_gfm(hw);
unsigned int val;
+ int ret;
+
+ ret = pm_runtime_resume_and_get(clk->priv->dev);
+ if (ret < 0 && ret != -EACCES) {
+ dev_err_ratelimited(clk->priv->dev,
+ "pm_runtime_resume_and_get failed in %s, ret %d\n",
+ __func__, ret);
+ }
val = readl(clk->gfm_mux);
@@ -57,6 +78,8 @@ static int clk_gfm_set_parent(struct clk_hw *hw, u8 index)
writel(val, clk->gfm_mux);
+ pm_runtime_mark_last_busy(clk->priv->dev);
+
return 0;
}
@@ -251,6 +274,8 @@ static int lpass_gfm_clk_driver_probe(struct platform_device *pdev)
if (IS_ERR(cc->base))
return PTR_ERR(cc->base);
+ cc->dev = dev;
+
err = devm_pm_runtime_enable(dev);
if (err)
return err;