clk: add devm variant of clk_notifier_register
authorJerome Brunet <jbrunet@baylibre.com>
Wed, 21 Oct 2020 16:38:46 +0000 (18:38 +0200)
committerStephen Boyd <sboyd@kernel.org>
Sat, 14 Nov 2020 20:58:30 +0000 (12:58 -0800)
Add a memory managed variant of clk_notifier_register() to make life easier
on clock consumers using notifiers

Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
Link: https://lore.kernel.org/r/20201021163847.595189-2-jbrunet@baylibre.com
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
drivers/clk/clk.c
include/linux/clk.h

index 48931f4..6cf59e3 100644 (file)
@@ -4395,6 +4395,42 @@ int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb)
 }
 EXPORT_SYMBOL_GPL(clk_notifier_unregister);
 
+struct clk_notifier_devres {
+       struct clk *clk;
+       struct notifier_block *nb;
+};
+
+static void devm_clk_notifier_release(struct device *dev, void *res)
+{
+       struct clk_notifier_devres *devres = res;
+
+       clk_notifier_unregister(devres->clk, devres->nb);
+}
+
+int devm_clk_notifier_register(struct device *dev, struct clk *clk,
+                              struct notifier_block *nb)
+{
+       struct clk_notifier_devres *devres;
+       int ret;
+
+       devres = devres_alloc(devm_clk_notifier_release,
+                             sizeof(*devres), GFP_KERNEL);
+
+       if (!devres)
+               return -ENOMEM;
+
+       ret = clk_notifier_register(clk, nb);
+       if (!ret) {
+               devres->clk = clk;
+               devres->nb = nb;
+       } else {
+               devres_free(devres);
+       }
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(devm_clk_notifier_register);
+
 #ifdef CONFIG_OF
 static void clk_core_reparent_orphans(void)
 {
index 7fd6a1f..f53afdf 100644 (file)
@@ -110,6 +110,16 @@ int clk_notifier_register(struct clk *clk, struct notifier_block *nb);
 int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb);
 
 /**
+ * devm_clk_notifier_register - register a managed rate-change notifier callback
+ * @dev: device for clock "consumer"
+ * @clk: clock whose rate we are interested in
+ * @nb: notifier block with callback function pointer
+ *
+ * Returns 0 on success, -EERROR otherwise
+ */
+int devm_clk_notifier_register(struct device *dev, struct clk *clk, struct notifier_block *nb);
+
+/**
  * clk_get_accuracy - obtain the clock accuracy in ppb (parts per billion)
  *                   for a clock source.
  * @clk: clock source