]> git.baikalelectronics.ru Git - uboot.git/commitdiff
clk: export generic routines
authorDario Binacchi <dariobin@libero.it>
Tue, 29 Dec 2020 23:06:27 +0000 (00:06 +0100)
committerLokesh Vutla <lokeshvutla@ti.com>
Tue, 12 Jan 2021 04:51:41 +0000 (10:21 +0530)
Export routines that can be used by other drivers avoiding duplicating
code.

Signed-off-by: Dario Binacchi <dariobin@libero.it>
Reviewed-by: Simon Glass <sjg@chromium.org>
drivers/clk/clk-divider.c
include/linux/clk-provider.h

index 8f59d7fb72c9ec1f5c5493381c711a4c18d4bd8a..9df50a5e7238e28e2fb0bf77563588e8f7489533 100644 (file)
@@ -28,8 +28,8 @@
 
 #define UBOOT_DM_CLK_CCF_DIVIDER "ccf_clk_divider"
 
-static unsigned int _get_table_div(const struct clk_div_table *table,
-                                  unsigned int val)
+unsigned int clk_divider_get_table_div(const struct clk_div_table *table,
+                                      unsigned int val)
 {
        const struct clk_div_table *clkt;
 
@@ -49,7 +49,7 @@ static unsigned int _get_div(const struct clk_div_table *table,
        if (flags & CLK_DIVIDER_MAX_AT_ZERO)
                return val ? val : clk_div_mask(width) + 1;
        if (table)
-               return _get_table_div(table, val);
+               return clk_divider_get_table_div(table, val);
        return val + 1;
 }
 
@@ -89,8 +89,8 @@ static ulong clk_divider_recalc_rate(struct clk *clk)
                                   divider->flags, divider->width);
 }
 
-static bool _is_valid_table_div(const struct clk_div_table *table,
-                               unsigned int div)
+bool clk_divider_is_valid_table_div(const struct clk_div_table *table,
+                                   unsigned int div)
 {
        const struct clk_div_table *clkt;
 
@@ -100,18 +100,18 @@ static bool _is_valid_table_div(const struct clk_div_table *table,
        return false;
 }
 
-static bool _is_valid_div(const struct clk_div_table *table, unsigned int div,
-                         unsigned long flags)
+bool clk_divider_is_valid_div(const struct clk_div_table *table,
+                             unsigned int div, unsigned long flags)
 {
        if (flags & CLK_DIVIDER_POWER_OF_TWO)
                return is_power_of_2(div);
        if (table)
-               return _is_valid_table_div(table, div);
+               return clk_divider_is_valid_table_div(table, div);
        return true;
 }
 
-static unsigned int _get_table_val(const struct clk_div_table *table,
-                                  unsigned int div)
+unsigned int clk_divider_get_table_val(const struct clk_div_table *table,
+                                      unsigned int div)
 {
        const struct clk_div_table *clkt;
 
@@ -131,7 +131,7 @@ static unsigned int _get_val(const struct clk_div_table *table,
        if (flags & CLK_DIVIDER_MAX_AT_ZERO)
                return (div == clk_div_mask(width) + 1) ? 0 : div;
        if (table)
-               return  _get_table_val(table, div);
+               return clk_divider_get_table_val(table, div);
        return div - 1;
 }
 int divider_get_val(unsigned long rate, unsigned long parent_rate,
@@ -142,7 +142,7 @@ int divider_get_val(unsigned long rate, unsigned long parent_rate,
 
        div = DIV_ROUND_UP_ULL((u64)parent_rate, rate);
 
-       if (!_is_valid_div(table, div, flags))
+       if (!clk_divider_is_valid_div(table, div, flags))
                return -EINVAL;
 
        value = _get_val(table, div, flags, width);
index 75b16353dad2e3834033bdbb587bcc4997de0dc5..c871ea646d35d742c75136209bf10813b80da909 100644 (file)
@@ -76,6 +76,19 @@ struct clk_mux {
 extern const struct clk_ops clk_mux_ops;
 u8 clk_mux_get_parent(struct clk *clk);
 
+/**
+ * clk_mux_index_to_val() - Convert the parent index to the register value
+ *
+ * It returns the value to write in the hardware register to output the selected
+ * input clock parent.
+ *
+ * @table: array of register values corresponding to the parent index (optional)
+ * @flags: hardware-specific flags
+ * @index: parent clock index
+ * @return the register value
+ */
+unsigned int clk_mux_index_to_val(u32 *table, unsigned int flags, u8 index);
+
 struct clk_gate {
        struct clk      clk;
        void __iomem    *reg;
@@ -125,6 +138,50 @@ struct clk_divider {
 #define CLK_DIVIDER_READ_ONLY          BIT(5)
 #define CLK_DIVIDER_MAX_AT_ZERO                BIT(6)
 extern const struct clk_ops clk_divider_ops;
+
+/**
+ * clk_divider_get_table_div() - convert the register value to the divider
+ *
+ * @table:  array of register values corresponding to valid dividers
+ * @val: value to convert
+ * @return the divider
+ */
+unsigned int clk_divider_get_table_div(const struct clk_div_table *table,
+                                      unsigned int val);
+
+/**
+ * clk_divider_get_table_val() - convert the divider to the register value
+ *
+ * It returns the value to write in the hardware register to divide the input
+ * clock rate by @div.
+ *
+ * @table: array of register values corresponding to valid dividers
+ * @div: requested divider
+ * @return the register value
+ */
+unsigned int clk_divider_get_table_val(const struct clk_div_table *table,
+                                      unsigned int div);
+
+/**
+ * clk_divider_is_valid_div() - check if the divider is valid
+ *
+ * @table: array of valid dividers (optional)
+ * @div: divider to check
+ * @flags: hardware-specific flags
+ * @return true if the divider is valid, false otherwise
+ */
+bool clk_divider_is_valid_div(const struct clk_div_table *table,
+                             unsigned int div, unsigned long flags);
+
+/**
+ * clk_divider_is_valid_table_div - check if the divider is in the @table array
+ *
+ * @table: array of valid dividers
+ * @div: divider to check
+ * @return true if the divider is found in the @table array, false otherwise
+ */
+bool clk_divider_is_valid_table_div(const struct clk_div_table *table,
+                                   unsigned int div);
 unsigned long divider_recalc_rate(struct clk *hw, unsigned long parent_rate,
                                  unsigned int val,
                                  const struct clk_div_table *table,