clk: fractional-divider: Export approximation algorithm to the CCF users
[linux-2.6-microblaze.git] / drivers / clk / rockchip / clk.c
index 049e5e0..b7be7e1 100644 (file)
@@ -22,6 +22,8 @@
 #include <linux/regmap.h>
 #include <linux/reboot.h>
 #include <linux/rational.h>
+
+#include "../clk-fractional-divider.h"
 #include "clk.h"
 
 /*
@@ -178,10 +180,8 @@ static void rockchip_fractional_approximation(struct clk_hw *hw,
                unsigned long rate, unsigned long *parent_rate,
                unsigned long *m, unsigned long *n)
 {
-       struct clk_fractional_divider *fd = to_clk_fd(hw);
        unsigned long p_rate, p_parent_rate;
        struct clk_hw *p_parent;
-       unsigned long scale;
 
        p_rate = clk_hw_get_rate(clk_hw_get_parent(hw));
        if ((rate * 20 > p_rate) && (p_rate % rate != 0)) {
@@ -190,18 +190,7 @@ static void rockchip_fractional_approximation(struct clk_hw *hw,
                *parent_rate = p_parent_rate;
        }
 
-       /*
-        * Get rate closer to *parent_rate to guarantee there is no overflow
-        * for m and n. In the result it will be the nearest rate left shifted
-        * by (scale - fd->nwidth) bits.
-        */
-       scale = fls_long(*parent_rate / rate - 1);
-       if (scale > fd->nwidth)
-               rate <<= scale - fd->nwidth;
-
-       rational_best_approximation(rate, *parent_rate,
-                       GENMASK(fd->mwidth - 1, 0), GENMASK(fd->nwidth - 1, 0),
-                       m, n);
+       clk_fractional_divider_general_approximation(hw, rate, parent_rate, m, n);
 }
 
 static struct clk *rockchip_clk_register_frac_branch(