]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
clk: divider: Optimize clk_divider_bestdiv loop
authorMaxime COQUELIN <maxime.coquelin@st.com>
Wed, 29 Jan 2014 16:24:08 +0000 (17:24 +0100)
committerMike Turquette <mturquette@linaro.org>
Wed, 30 Apr 2014 18:51:27 +0000 (11:51 -0700)
Currently, the for-loop used to try all the different dividers to find the
one that best fit tries all the values from 1 to max_div, incrementing by one.
In case of power-of-two, or table based divider, the loop isn't optimal.

Instead of incrementing by one, this patch provides directly the next divider.

Signed-off-by: Maxime Coquelin <maxime.coquelin@st.com>
Signed-off-by: Mike Turquette <mturquette@linaro.org>
drivers/clk/clk-divider.c

index c57294563a98212d09e556b5e939e32dc394a247..b3c83966be1823bff4ad54ea52d7529b5884b422 100644 (file)
@@ -240,6 +240,18 @@ static bool _is_best_div(struct clk_divider *divider,
        return now <= rate && now > best;
 }
 
+static int _next_div(struct clk_divider *divider, int div)
+{
+       div++;
+
+       if (divider->flags & CLK_DIVIDER_POWER_OF_TWO)
+               return __roundup_pow_of_two(div);
+       if (divider->table)
+               return _round_up_table(divider->table, div);
+
+       return div;
+}
+
 static int clk_divider_bestdiv(struct clk_hw *hw, unsigned long rate,
                unsigned long *best_parent_rate)
 {
@@ -267,7 +279,7 @@ static int clk_divider_bestdiv(struct clk_hw *hw, unsigned long rate,
         */
        maxdiv = min(ULONG_MAX / rate, maxdiv);
 
-       for (i = 1; i <= maxdiv; i++) {
+       for (i = 1; i <= maxdiv; i = _next_div(divider, i)) {
                if (!_is_valid_div(divider, i))
                        continue;
                if (rate * i == parent_rate_saved) {