On 2/20/23 00:59, Samuel Holland wrote:
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);

Missing documentation.

--Sean

Reply via email to