OSDN Git Service

PM: runtime: add devm_pm_clk_create helper
authorDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Sat, 31 Jul 2021 19:50:33 +0000 (22:50 +0300)
committerStephen Boyd <sboyd@kernel.org>
Thu, 26 Aug 2021 18:28:07 +0000 (11:28 -0700)
A typical code pattern for pm_clk_create() call is to call it in the
_probe function and to call pm_clk_destroy() both from _probe error path
and from _remove function. For some drivers the whole remove function
would consist of the call to pm_remove_disable().

Add helper function to replace this bolierplate piece of code. Calling
devm_pm_clk_create() removes the need for calling pm_clk_destroy() both
in the probe()'s error path and in the remove() function.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Link: https://lore.kernel.org/r/20210731195034.979084-3-dmitry.baryshkov@linaro.org
Acked-by: Rafael J. Wysocki <rafael@kernel.org>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
drivers/base/power/clock_ops.c
include/linux/pm_clock.h

index 0251f3e..4110c19 100644 (file)
@@ -519,6 +519,23 @@ void pm_clk_destroy(struct device *dev)
 }
 EXPORT_SYMBOL_GPL(pm_clk_destroy);
 
+static void pm_clk_destroy_action(void *data)
+{
+       pm_clk_destroy(data);
+}
+
+int devm_pm_clk_create(struct device *dev)
+{
+       int ret;
+
+       ret = pm_clk_create(dev);
+       if (ret)
+               return ret;
+
+       return devm_add_action_or_reset(dev, pm_clk_destroy_action, dev);
+}
+EXPORT_SYMBOL_GPL(devm_pm_clk_create);
+
 /**
  * pm_clk_suspend - Disable clocks in a device's PM clock list.
  * @dev: Device to disable the clocks for.
index 8ddc786..ada3a0a 100644 (file)
@@ -47,6 +47,7 @@ extern void pm_clk_remove(struct device *dev, const char *con_id);
 extern void pm_clk_remove_clk(struct device *dev, struct clk *clk);
 extern int pm_clk_suspend(struct device *dev);
 extern int pm_clk_resume(struct device *dev);
+extern int devm_pm_clk_create(struct device *dev);
 #else
 static inline bool pm_clk_no_clocks(struct device *dev)
 {
@@ -83,6 +84,10 @@ static inline void pm_clk_remove(struct device *dev, const char *con_id)
 static inline void pm_clk_remove_clk(struct device *dev, struct clk *clk)
 {
 }
+static inline int devm_pm_clk_create(struct device *dev)
+{
+       return -EINVAL;
+}
 #endif
 
 #ifdef CONFIG_HAVE_CLK