summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;