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