dm: clk: Define clk_get_parent() for clk operations
authorLukasz Majewski <lukma@denx.de>
Mon, 24 Jun 2019 13:50:42 +0000 (15:50 +0200)
committerStefano Babic <sbabic@denx.de>
Fri, 19 Jul 2019 12:50:30 +0000 (14:50 +0200)
This commit adds the clk_get_parent() function, which is responsible
for getting the parent's struct clock pointer.

U-Boot's DM support for getting parent is different (the parent
relationship is in udevice) than the one in Common Clock Framework [CCF]
in Linux. To obtain the pointer to struct clk of parent the
pdev->uclass_priv field is read via dev_get_clk_ptr() wrapper.

Signed-off-by: Lukasz Majewski <lukma@denx.de>
Reviewed-by: Peng Fan <peng.fan@nxp.com>
drivers/clk/clk-uclass.c
include/clk.h

index 79b3b0494c652c947ef9b114ebb48a97154b650f..4346c61eea16e62c5b06c79b88d6ce1c39aa5675 100644 (file)
@@ -13,6 +13,7 @@
 #include <dm/read.h>
 #include <dt-structs.h>
 #include <errno.h>
+#include <linux/clk-provider.h>
 
 static inline const struct clk_ops *clk_dev_ops(struct udevice *dev)
 {
@@ -379,6 +380,21 @@ ulong clk_get_rate(struct clk *clk)
        return ops->get_rate(clk);
 }
 
+struct clk *clk_get_parent(struct clk *clk)
+{
+       struct udevice *pdev;
+       struct clk *pclk;
+
+       debug("%s(clk=%p)\n", __func__, clk);
+
+       pdev = dev_get_parent(clk->dev);
+       pclk = dev_get_clk_ptr(pdev);
+       if (!pclk)
+               return ERR_PTR(-ENODEV);
+
+       return pclk;
+}
+
 ulong clk_set_rate(struct clk *clk, ulong rate)
 {
        const struct clk_ops *ops = clk_dev_ops(clk->dev);
index b10c0013b14dc75ef1ab7695ad4824bd5904909e..e20641ee982877fe1f19bb4e83fc38d50ae251c6 100644 (file)
@@ -258,6 +258,15 @@ int clk_free(struct clk *clk);
  */
 ulong clk_get_rate(struct clk *clk);
 
+/**
+ * clk_get_parent() - Get current clock's parent.
+ *
+ * @clk:       A clock struct that was previously successfully requested by
+ *             clk_request/get_by_*().
+ * @return pointer to parent's struct clk, or error code passed as pointer
+ */
+struct clk *clk_get_parent(struct clk *clk);
+
 /**
  * clk_set_rate() - Set current clock rate.
  *