]> git.karo-electronics.de Git - linux-beck.git/commitdiff
sh: reinstate clock framework rate rounding.
authorPaul Mundt <lethal@linux-sh.org>
Fri, 20 Aug 2010 10:10:38 +0000 (19:10 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Fri, 20 Aug 2010 10:10:38 +0000 (19:10 +0900)
This was killed off by a simplification patch previously that failed to
take the cpufreq use case in to account, so reinstate the old bounding
logic. The lowest rate bounding on the other hand was broken in that it
never actually got assigned a rate and the best fit rate was instead just
getting lucky based on the ordering of the rate table, fix this up so the
code actually does what it was intended to do originally.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
drivers/sh/clk.c

index cede14e34507aa0dd6d9551a937822a5257f3f85..b9c57a640c244fa753ff8acf3170f9f01a3a3d70 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * drivers/sh/clk.c - SuperH clock framework
  *
- *  Copyright (C) 2005 - 2009  Paul Mundt
+ *  Copyright (C) 2005 - 2010  Paul Mundt
  *
  * This clock framework is derived from the OMAP version by:
  *
@@ -73,14 +73,23 @@ long clk_rate_table_round(struct clk *clk,
 {
        unsigned long rate_error, rate_error_prev = ~0UL;
        unsigned long rate_best_fit = rate;
+       unsigned long highest, lowest;
        int i;
 
+       highest = 0;
+       lowest = ~0UL;
+
        for (i = 0; freq_table[i].frequency != CPUFREQ_TABLE_END; i++) {
                unsigned long freq = freq_table[i].frequency;
 
                if (freq == CPUFREQ_ENTRY_INVALID)
                        continue;
 
+               if (freq > highest)
+                       highest = freq;
+               if (freq < lowest)
+                       lowest = freq;
+
                rate_error = abs(freq - rate);
                if (rate_error < rate_error_prev) {
                        rate_best_fit = freq;
@@ -91,6 +100,11 @@ long clk_rate_table_round(struct clk *clk,
                        break;
        }
 
+       if (rate >= highest)
+               rate_best_fit = highest;
+       if (rate <= lowest)
+               rate_best_fit = lowest;
+
        return rate_best_fit;
 }