diff --git a/drivers/clk/qcom/clk-regmap.c b/drivers/clk/qcom/clk-regmap.c index f16dcb24b325..d2ede9cb6e30 100644 --- a/drivers/clk/qcom/clk-regmap.c +++ b/drivers/clk/qcom/clk-regmap.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "clk-regmap.h" @@ -271,6 +272,8 @@ int devm_clk_register_regmap(struct device *dev, struct clk_regmap *rclk) { int ret; + rclk->dev = dev; + if (dev && dev_get_regmap(dev, NULL)) rclk->regmap = dev_get_regmap(dev, NULL); else if (dev && dev->parent) @@ -283,3 +286,24 @@ int devm_clk_register_regmap(struct device *dev, struct clk_regmap *rclk) return ret; } EXPORT_SYMBOL_GPL(devm_clk_register_regmap); + +int clk_runtime_get_regmap(struct clk_regmap *rclk) +{ + int ret; + + if (pm_runtime_enabled(rclk->dev)) { + ret = pm_runtime_get_sync(rclk->dev); + if (ret < 0) + return ret; + } + + return 0; +} +EXPORT_SYMBOL(clk_runtime_get_regmap); + +void clk_runtime_put_regmap(struct clk_regmap *rclk) +{ + if (pm_runtime_enabled(rclk->dev)) + pm_runtime_put_sync(rclk->dev); +} +EXPORT_SYMBOL(clk_runtime_put_regmap); diff --git a/drivers/clk/qcom/clk-regmap.h b/drivers/clk/qcom/clk-regmap.h index 6da39a7bdfe9..9b9d218bbfea 100644 --- a/drivers/clk/qcom/clk-regmap.h +++ b/drivers/clk/qcom/clk-regmap.h @@ -47,6 +47,7 @@ struct clk_regmap { struct clk_vdd_class_data vdd_data; struct clk_regmap_ops *ops; struct list_head list_node; + struct device *dev; }; static inline struct clk_regmap *to_clk_regmap(struct clk_hw *hw) @@ -66,4 +67,7 @@ int clk_post_change_regmap(struct clk_hw *hw, unsigned long old_rate, int devm_clk_register_regmap(struct device *dev, struct clk_regmap *rclk); bool clk_is_regmap_clk(struct clk_hw *hw); +int clk_runtime_get_regmap(struct clk_regmap *rclk); +void clk_runtime_put_regmap(struct clk_regmap *rclk); + #endif