[ARM] 4254/1: i.MX/MX1 CPU Frequency scaling honor boot loader set BCLK_DIV.

The minimal bus clock prescaler should be kept at value
selected by the board / boot loader designer.
Switching frequency above startup limit could
lead to the external memory/devices misbehave.

Signed-off-by: Pavel Pisa <pisa@cmp.felk.cvut.cz>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>

authored by Pavel Pisa and committed by Russell King 83b84c4e a45570eb

+6 -3
+6 -3
arch/arm/mach-imx/cpufreq.c
··· 50 50 #define CR_920T_ASYNC_MODE 0xC0000000 51 51 52 52 static u32 mpctl0_at_boot; 53 + static u32 bclk_div_at_boot; 53 54 54 55 static void imx_set_async_mode(void) 55 56 { ··· 183 182 unsigned long flags; 184 183 long freq; 185 184 long sysclk; 186 - unsigned int bclk_div = 1; 185 + unsigned int bclk_div = bclk_div_at_boot; 187 186 188 187 /* 189 188 * Some governors do not respects CPU and policy lower limits ··· 203 202 204 203 sysclk = imx_get_system_clk(); 205 204 206 - if (freq > sysclk + 1000000) { 205 + if (freq > sysclk / bclk_div_at_boot + 1000000) { 207 206 freq = imx_compute_mpctl(&mpctl0, mpctl0_at_boot, freq, relation); 208 207 if (freq < 0) { 209 208 printk(KERN_WARNING "imx: target frequency %ld Hz cannot be set\n", freq); ··· 218 217 219 218 if(bclk_div > 16) 220 219 bclk_div = 16; 220 + if(bclk_div < bclk_div_at_boot) 221 + bclk_div = bclk_div_at_boot; 221 222 } 222 223 freq = (sysclk + bclk_div / 2) / bclk_div; 223 224 } ··· 288 285 289 286 static int __init imx_cpufreq_init(void) 290 287 { 291 - 288 + bclk_div_at_boot = __mfld2val(CSCR_BCLK_DIV, CSCR) + 1; 292 289 mpctl0_at_boot = 0; 293 290 294 291 if((CSCR & CSCR_MPEN) &&