From f21d18754ccafa79befae3c750d3a95bd7193be5 Mon Sep 17 00:00:00 2001 From: Kevin Hilman Date: Thu, 21 Jun 2007 04:55:49 -0700 Subject: [PATCH] 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: Kevin Hilman Signed-off-by: Tony Lindgren --- arch/arm/mach-omap2/clock.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index a7792d385b7..62faecdbf09 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c @@ -49,6 +49,7 @@ static struct prcm_config *curr_prcm_set; static u32 curr_perf_level = PRCM_FULL_SPEED; static struct clk *vclk; static struct clk *sclk; +static u8 cpu_mask; /*------------------------------------------------------------------------- * Omap2 specific clock functions @@ -609,6 +610,8 @@ static long omap2_round_to_table_rate(struct clk * clk, unsigned long rate) highest_rate = -EINVAL; for (ptr = rate_table; ptr->mpu_speed; ptr++) { + if (!(ptr->flags & cpu_mask)) + continue; if (ptr->xtal_speed != sys_ck.rate) continue; @@ -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) { u32 flags, cur_rate, done_rate, bypass = 0, tmp; - u8 cpu_mask = 0; struct prcm_config *prcm; unsigned long found_speed = 0; if (clk != &virt_prcm_set) 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++) { if (!(prcm->flags & cpu_mask)) continue; @@ -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 */ clkrate = omap2_get_dpll_rate(&dpll_ck); for (prcm = rate_table; prcm->mpu_speed; prcm++) { + if (!(prcm->flags & cpu_mask)) + continue; if (prcm->xtal_speed != sys_ck.rate) continue; if (prcm->dpll_speed <= clkrate) -- 2.41.1