sh: clkfwk: modify for_each_frequency end condition
Kuninori Morimoto [Mon, 18 Oct 2010 03:50:29 +0000 (03:50 +0000)]
The end condition of for_each_frequency should care about
both clk_rate_table_round and clk_rate_div_range_round,
and using "correct max size" is a natural idea in later function.
To avoid data over flow, this patch didn't modify
clk_rate_div_range_round side as .max = div_max + 1.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>

drivers/sh/clk.c

index c76f972..dae64ee 100644 (file)
@@ -82,7 +82,7 @@ struct clk_rate_round_data {
 
 #define for_each_frequency(pos, r, freq)                       \
        for (pos = r->min, freq = r->func(pos, r);              \
-            pos < r->max; pos++, freq = r->func(pos, r))       \
+            pos <= r->max; pos++, freq = r->func(pos, r))      \
                if (unlikely(freq == 0))                        \
                        ;                                       \
                else
@@ -139,12 +139,15 @@ long clk_rate_table_round(struct clk *clk,
 {
        struct clk_rate_round_data table_round = {
                .min    = 0,
-               .max    = clk->nr_freqs,
+               .max    = clk->nr_freqs - 1,
                .func   = clk_rate_table_iter,
                .arg    = freq_table,
                .rate   = rate,
        };
 
+       if (clk->nr_freqs < 1)
+               return 0;
+
        return clk_rate_round_helper(&table_round);
 }