PM / clk: Add support for adding a specific clock from device-tree
authorJon Hunter <jonathanh@nvidia.com>
Tue, 21 Jun 2016 10:33:25 +0000 (11:33 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 27 Jun 2016 22:42:10 +0000 (00:42 +0200)
Some drivers using the PM clocks framework need to add specific clocks
from device-tree using a name by calling the functions
of_clk_get_by_name() and then pm_clk_add_clk(). Rather than having
drivers call both functions, add a helper function of_pm_clk_add_clk()
that will call these functions so drivers can call a single function
to add a specific clock from device-tree.

Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/base/power/clock_ops.c
include/linux/pm_clock.h

index 761f5c21f9f0f02e7d6eba1132fb94a4c3a1a111..8e2e4757adcb02c9cd07a0b868a45e0bb3baa3eb 100644 (file)
@@ -140,6 +140,38 @@ int pm_clk_add_clk(struct device *dev, struct clk *clk)
 EXPORT_SYMBOL_GPL(pm_clk_add_clk);
 
 
+/**
+ * of_pm_clk_add_clk - Start using a device clock for power management.
+ * @dev: Device whose clock is going to be used for power management.
+ * @name: Name of clock that is going to be used for power management.
+ *
+ * Add the clock described in the 'clocks' device-tree node that matches
+ * with the 'name' provided, to the list of clocks used for the power
+ * management of @dev. On success, returns 0. Returns a negative error
+ * code if the clock is not found or cannot be added.
+ */
+int of_pm_clk_add_clk(struct device *dev, const char *name)
+{
+       struct clk *clk;
+       int ret;
+
+       if (!dev || !dev->of_node || !name)
+               return -EINVAL;
+
+       clk = of_clk_get_by_name(dev->of_node, name);
+       if (IS_ERR(clk))
+               return PTR_ERR(clk);
+
+       ret = pm_clk_add_clk(dev, clk);
+       if (ret) {
+               clk_put(clk);
+               return ret;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(of_pm_clk_add_clk);
+
 /**
  * of_pm_clk_add_clks - Start using device clock(s) for power management.
  * @dev: Device whose clock(s) is going to be used for power management.
index 308d6044f153b3c2fcfd58b6d6ffa3f5d28fc65a..09779b0ae7206bd2e0364864774d50015da5589e 100644 (file)
@@ -42,6 +42,7 @@ extern int pm_clk_create(struct device *dev);
 extern void pm_clk_destroy(struct device *dev);
 extern int pm_clk_add(struct device *dev, const char *con_id);
 extern int pm_clk_add_clk(struct device *dev, struct clk *clk);
+extern int of_pm_clk_add_clk(struct device *dev, const char *name);
 extern int of_pm_clk_add_clks(struct device *dev);
 extern void pm_clk_remove(struct device *dev, const char *con_id);
 extern void pm_clk_remove_clk(struct device *dev, struct clk *clk);