clk: fixed-rate: Add clk flags for parent accuracy
authorStephen Boyd <sboyd@kernel.org>
Fri, 30 Aug 2019 15:09:18 +0000 (08:09 -0700)
committerStephen Boyd <sboyd@kernel.org>
Tue, 7 Jan 2020 07:07:34 +0000 (23:07 -0800)
Some clk providers want to use the accuracy of the parent clk and use
the fixed rate basic type clk to do that. This requires getting the
parent clk and extracting the accuracy before registering the fixed rate
clk. Let's add a flag for this and update the clk_ops to support this.

Cc: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Link: https://lkml.kernel.org/r/20190830150923.259497-8-sboyd@kernel.org
drivers/clk/clk-fixed-rate.c
include/linux/clk-provider.h

index e11ccdaf14a6fa2f5d1c50fbef7e6cb2ccfbc9be..77499a27c8fbfeb87e0393c9a135dca538c401bc 100644 (file)
@@ -35,7 +35,12 @@ static unsigned long clk_fixed_rate_recalc_rate(struct clk_hw *hw,
 static unsigned long clk_fixed_rate_recalc_accuracy(struct clk_hw *hw,
                unsigned long parent_accuracy)
 {
-       return to_clk_fixed_rate(hw)->fixed_accuracy;
+       struct clk_fixed_rate *fixed = to_clk_fixed_rate(hw);
+
+       if (fixed->flags & CLK_FIXED_RATE_PARENT_ACCURACY)
+               return parent_accuracy;
+
+       return fixed->fixed_accuracy;
 }
 
 const struct clk_ops clk_fixed_rate_ops = {
index bb0c4c916a160ec2222d0b99819a2fbad4c8cdd3..1a90fa46f5502996e3874d3080edb498b7e6c265 100644 (file)
@@ -323,6 +323,10 @@ struct clk_hw {
  * @fixed_rate:        constant frequency of clock
  * @fixed_accuracy: constant accuracy of clock in ppb (parts per billion)
  * @flags:     hardware specific flags
+ *
+ * Flags:
+ * * CLK_FIXED_RATE_PARENT_ACCURACY - Use the accuracy of the parent clk
+ *                                    instead of what's set in @fixed_accuracy.
  */
 struct clk_fixed_rate {
        struct          clk_hw hw;
@@ -331,6 +335,8 @@ struct clk_fixed_rate {
        unsigned long   flags;
 };
 
+#define CLK_FIXED_RATE_PARENT_ACCURACY         BIT(0)
+
 extern const struct clk_ops clk_fixed_rate_ops;
 struct clk_hw *__clk_hw_register_fixed_rate(struct device *dev,
                struct device_node *np, const char *name,