This allows clk_get_parent() to work with non-CCF clock drivers.

Signed-off-by: Samuel Holland <sam...@sholland.org>
---

 drivers/clk/clk-uclass.c | 18 ++++++++++++------
 include/clk-uclass.h     |  2 ++
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c
index 53cfd819779..d0f8906cd60 100644
--- a/drivers/clk/clk-uclass.c
+++ b/drivers/clk/clk-uclass.c
@@ -485,6 +485,7 @@ ulong clk_get_rate(struct clk *clk)
 
 struct clk *clk_get_parent(struct clk *clk)
 {
+       const struct clk_ops *ops;
        struct udevice *pdev;
        struct clk *pclk;
 
@@ -492,12 +493,17 @@ struct clk *clk_get_parent(struct clk *clk)
        if (!clk_valid(clk))
                return ERR_PTR(-ENODEV);
 
-       pdev = dev_get_parent(clk->dev);
-       if (!pdev)
-               return ERR_PTR(-ENODEV);
-       pclk = dev_get_clk_ptr(pdev);
-       if (!pclk)
-               return ERR_PTR(-ENODEV);
+       ops = clk_dev_ops(clk->dev);
+       if (ops->get_parent) {
+               pclk = ops->get_parent(clk);
+       } else {
+               pdev = dev_get_parent(clk->dev);
+               if (!pdev)
+                       return ERR_PTR(-ENODEV);
+               pclk = dev_get_clk_ptr(pdev);
+               if (!pclk)
+                       return ERR_PTR(-ENODEV);
+       }
 
        return pclk;
 }
diff --git a/include/clk-uclass.h b/include/clk-uclass.h
index 65ebff9ed27..4d616720865 100644
--- a/include/clk-uclass.h
+++ b/include/clk-uclass.h
@@ -22,6 +22,7 @@ struct ofnode_phandle_args;
  * @round_rate: Adjust a rate to the exact rate a clock can provide.
  * @get_rate: Get current clock rate.
  * @set_rate: Set current clock rate.
+ * @get_parent: Get current clock parent
  * @set_parent: Set current clock parent
  * @enable: Enable a clock.
  * @disable: Disable a clock.
@@ -36,6 +37,7 @@ struct clk_ops {
        ulong (*round_rate)(struct clk *clk, ulong rate);
        ulong (*get_rate)(struct clk *clk);
        ulong (*set_rate)(struct clk *clk, ulong rate);
+       struct clk *(*get_parent)(struct clk *clk);
        int (*set_parent)(struct clk *clk, struct clk *parent);
        int (*enable)(struct clk *clk);
        int (*disable)(struct clk *clk);
-- 
2.39.2

Reply via email to