diff options
Diffstat (limited to 'drivers/clk/qcom/lpass-gfm-sm8250.c')
-rw-r--r-- | drivers/clk/qcom/lpass-gfm-sm8250.c | 27 |
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; |