A common operation for a clock signal generator is to shift the phase of
that signal. This patch introduces a new function to the clk.h API to
dynamically adjust the phase of a clock signal. Additionally this patch
introduces support for the new function in the clock framework via the
.set_phase & .get_phase callback in struct clk_ops.

Signed-off-by: Ziyuan Xu <xzy...@rock-chips.com>
---

 drivers/clk/clk-uclass.c | 20 ++++++++++++++++++++
 include/clk-uclass.h     | 17 +++++++++++++++++
 include/clk.h            | 20 ++++++++++++++++++++
 3 files changed, 57 insertions(+)

diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c
index 6fcfd69..47628b1 100644
--- a/drivers/clk/clk-uclass.c
+++ b/drivers/clk/clk-uclass.c
@@ -165,6 +165,26 @@ ulong clk_set_rate(struct clk *clk, ulong rate)
        return ops->set_rate(clk, rate);
 }
 
+int clk_get_phase(struct clk *clk)
+{
+       struct clk_ops *ops = clk_dev_ops(clk->dev);
+
+       if (!ops->get_phase)
+               return -ENOSYS;
+
+       return ops->get_phase(clk);
+}
+
+int clk_set_phase(struct clk *clk, int degrees)
+{
+       struct clk_ops *ops = clk_dev_ops(clk->dev);
+
+       if (!ops->set_phase)
+               return -ENOSYS;
+
+       return ops->set_phase(clk, degrees);
+}
+
 int clk_enable(struct clk *clk)
 {
        struct clk_ops *ops = clk_dev_ops(clk->dev);
diff --git a/include/clk-uclass.h b/include/clk-uclass.h
index 07c1065..0e56daa 100644
--- a/include/clk-uclass.h
+++ b/include/clk-uclass.h
@@ -77,6 +77,23 @@ struct clk_ops {
         */
        ulong (*set_rate)(struct clk *clk, ulong rate);
        /**
+        * clk_get_phase() - Get the phase shift of a clock signal.
+        *
+        * @clk:        The clock to manipulate.
+        * @return the phase shift of a clock node in degrees,
+        *              otherwise returns -ve error code.
+        */
+       int (*get_phase)(struct clk *clk);
+
+       /**
+        * clk_set_rate() - Adjust the phase shift of a clock signal.
+        *
+        * @clk:        The clock to manipulate.
+        * @degrees:    Numberof degrees the signal is shifted.
+        * @return 0 on success, or -ve error code.
+        */
+       int (*set_phase)(struct clk *clk, int degrees);
+       /**
         * enable() - Enable a clock.
         *
         * @clk:        The clock to manipulate.
diff --git a/include/clk.h b/include/clk.h
index 5a5c2ff..1858fef 100644
--- a/include/clk.h
+++ b/include/clk.h
@@ -157,6 +157,26 @@ ulong clk_get_rate(struct clk *clk);
 ulong clk_set_rate(struct clk *clk, ulong rate);
 
 /**
+ * clk_get_phase() - Get the phase shift of a clock signal.
+ *
+ * @clk:       A clock struct that was previously successfully requested by
+ *             clk_request/get_by_*().
+ * @return the phase shift of a clock node in degrees, otherwise returns
+ *             -ve error code.
+ */
+int clk_get_phase(struct clk *clk);
+
+/**
+ * clk_set_rate() - Adjust the phase shift of a clock signal.
+ *
+ * @clk:       A clock struct that was previously successfully requested by
+ *             clk_request/get_by_*().
+ * @degrees:   Numberof degrees the signal is shifted.
+ * @return 0 on success, or -ve error code.
+ */
+int clk_set_phase(struct clk *clk, int degrees);
+
+/**
  * clk_enable() - Enable (turn on) a clock.
  *
  * @clk:       A clock struct that was previously successfully requested by
-- 
2.7.4


_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to