Commit f21d1875 authored by Kevin Hilman's avatar Kevin Hilman Committed by Tony Lindgren

ARM: OMAP: fix clock table walking for OMAP2 variants

The various places where the clock rate_table is walked are not all
checking whether the clock actually exists on the OMAP2 variant.

Among other things, this results in broken rounding for the OMAP2430
since the rounding code can potentially find matching speeds that are
marked as RATE_IN_242X.

It also results in confusing CPUfreq about what the current speed is.
Signed-off-by: default avatarKevin Hilman <khilman@mvista.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 5c6cd5d7
...@@ -49,6 +49,7 @@ static struct prcm_config *curr_prcm_set; ...@@ -49,6 +49,7 @@ static struct prcm_config *curr_prcm_set;
static u32 curr_perf_level = PRCM_FULL_SPEED; static u32 curr_perf_level = PRCM_FULL_SPEED;
static struct clk *vclk; static struct clk *vclk;
static struct clk *sclk; static struct clk *sclk;
static u8 cpu_mask;
/*------------------------------------------------------------------------- /*-------------------------------------------------------------------------
* Omap2 specific clock functions * Omap2 specific clock functions
...@@ -609,6 +610,8 @@ static long omap2_round_to_table_rate(struct clk * clk, unsigned long rate) ...@@ -609,6 +610,8 @@ static long omap2_round_to_table_rate(struct clk * clk, unsigned long rate)
highest_rate = -EINVAL; highest_rate = -EINVAL;
for (ptr = rate_table; ptr->mpu_speed; ptr++) { for (ptr = rate_table; ptr->mpu_speed; ptr++) {
if (!(ptr->flags & cpu_mask))
continue;
if (ptr->xtal_speed != sys_ck.rate) if (ptr->xtal_speed != sys_ck.rate)
continue; continue;
...@@ -996,19 +999,12 @@ static int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent) ...@@ -996,19 +999,12 @@ static int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent)
static int omap2_select_table_rate(struct clk * clk, unsigned long rate) static int omap2_select_table_rate(struct clk * clk, unsigned long rate)
{ {
u32 flags, cur_rate, done_rate, bypass = 0, tmp; u32 flags, cur_rate, done_rate, bypass = 0, tmp;
u8 cpu_mask = 0;
struct prcm_config *prcm; struct prcm_config *prcm;
unsigned long found_speed = 0; unsigned long found_speed = 0;
if (clk != &virt_prcm_set) if (clk != &virt_prcm_set)
return -EINVAL; return -EINVAL;
/* FIXME: Change cpu_is_omap2420() to cpu_is_omap242x() */
if (cpu_is_omap2420())
cpu_mask = RATE_IN_242X;
else if (cpu_is_omap2430())
cpu_mask = RATE_IN_243X;
for (prcm = rate_table; prcm->mpu_speed; prcm++) { for (prcm = rate_table; prcm->mpu_speed; prcm++) {
if (!(prcm->flags & cpu_mask)) if (!(prcm->flags & cpu_mask))
continue; continue;
...@@ -1191,9 +1187,16 @@ int __init omap2_clk_init(void) ...@@ -1191,9 +1187,16 @@ int __init omap2_clk_init(void)
} }
} }
if (cpu_is_omap242x())
cpu_mask = RATE_IN_242X;
else if (cpu_is_omap2430())
cpu_mask = RATE_IN_243X;
/* Check the MPU rate set by bootloader */ /* Check the MPU rate set by bootloader */
clkrate = omap2_get_dpll_rate(&dpll_ck); clkrate = omap2_get_dpll_rate(&dpll_ck);
for (prcm = rate_table; prcm->mpu_speed; prcm++) { for (prcm = rate_table; prcm->mpu_speed; prcm++) {
if (!(prcm->flags & cpu_mask))
continue;
if (prcm->xtal_speed != sys_ck.rate) if (prcm->xtal_speed != sys_ck.rate)
continue; continue;
if (prcm->dpll_speed <= clkrate) if (prcm->dpll_speed <= clkrate)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment