diff options
Diffstat (limited to 'firmware/target/arm/as3525/system-as3525.c')
-rw-r--r-- | firmware/target/arm/as3525/system-as3525.c | 72 |
1 files changed, 41 insertions, 31 deletions
diff --git a/firmware/target/arm/as3525/system-as3525.c b/firmware/target/arm/as3525/system-as3525.c index a5f34d9b80..2f320e91ab 100644 --- a/firmware/target/arm/as3525/system-as3525.c +++ b/firmware/target/arm/as3525/system-as3525.c | |||
@@ -229,29 +229,25 @@ void system_init(void) | |||
229 | CGU_PROC = 0; /* fclk 24 MHz */ | 229 | CGU_PROC = 0; /* fclk 24 MHz */ |
230 | CGU_PERI &= ~0x7f; /* pclk 24 MHz */ | 230 | CGU_PERI &= ~0x7f; /* pclk 24 MHz */ |
231 | 231 | ||
232 | asm volatile( | ||
233 | "mrc p15, 0, r0, c1, c0 \n" | ||
234 | "orr r0, r0, #0xC0000000 \n" /* asynchronous clocking */ | ||
235 | "mcr p15, 0, r0, c1, c0 \n" | ||
236 | : : : "r0" ); | ||
237 | |||
238 | CGU_PLLA = AS3525_PLLA_SETTING; | 232 | CGU_PLLA = AS3525_PLLA_SETTING; |
239 | while(!(CGU_INTCTRL & (1<<0))); /* wait until PLLA is locked */ | 233 | while(!(CGU_INTCTRL & (1<<0))); /* wait until PLLA is locked */ |
240 | 234 | ||
241 | CGU_PROC = (AS3525_CPU_PREDIV << 2) | 1; | 235 | /* Set FCLK frequency */ |
242 | 236 | CGU_PROC = ((AS3525_FCLK_POSTDIV << 4) | | |
243 | CGU_PERI |= ((CLK_DIV(AS3525_PLLA_FREQ, AS3525_PCLK_FREQ) - 1) << 2) | 237 | (AS3525_FCLK_PREDIV << 2) | |
244 | | 1; /* clk_in = PLLA */ | 238 | AS3525_FCLK_SEL); |
239 | /* Set PCLK frequency */ | ||
240 | CGU_PERI = ((CGU_PERI & 0xffffff80) | /* reset divider bits 0:6 */ | ||
241 | (AS3525_PCLK_DIV0 << 2) | | ||
242 | (AS3525_PCLK_DIV1 << 6) | | ||
243 | AS3525_PCLK_SEL); | ||
245 | 244 | ||
246 | |||
247 | /* FIXME: dcache will not be active, since the mmu is not running | ||
248 | * See arm922t datasheet */ | ||
249 | asm volatile( | 245 | asm volatile( |
250 | "mov r0, #0 \n" | 246 | "mov r0, #0 \n" |
251 | "mcr p15, 0, r0, c7, c7 \n" /* invalidate icache & dcache */ | 247 | "mcr p15, 0, r0, c7, c7 \n" /* invalidate icache & dcache */ |
252 | "mrc p15, 0, r0, c1, c0 \n" /* control register */ | 248 | "mrc p15, 0, r0, c1, c0 \n" /* control register */ |
253 | "orr r0, r0, #0x1000 \n" /* enable icache */ | 249 | "bic r0, r0, #3<<30 \n" /* clears bus bits & sets fastbus */ |
254 | "orr r0, r0, #4 \n" /* enable dcache */ | 250 | "orr r0, r0, #1<<12 \n" /* enable icache */ |
255 | "mcr p15, 0, r0, c1, c0 \n" | 251 | "mcr p15, 0, r0, c1, c0 \n" |
256 | : : : "r0" ); | 252 | : : : "r0" ); |
257 | 253 | ||
@@ -281,10 +277,6 @@ void system_init(void) | |||
281 | fmradio_i2c_init(); | 277 | fmradio_i2c_init(); |
282 | #endif | 278 | #endif |
283 | #endif /* !BOOTLOADER */ | 279 | #endif /* !BOOTLOADER */ |
284 | |||
285 | #ifdef HAVE_ADJUSTABLE_CPU_FREQ | ||
286 | set_cpu_frequency(CPUFREQ_DEFAULT); | ||
287 | #endif | ||
288 | } | 280 | } |
289 | 281 | ||
290 | void system_reboot(void) | 282 | void system_reboot(void) |
@@ -311,16 +303,34 @@ int system_memory_guard(int newmode) | |||
311 | #ifdef HAVE_ADJUSTABLE_CPU_FREQ | 303 | #ifdef HAVE_ADJUSTABLE_CPU_FREQ |
312 | void set_cpu_frequency(long frequency) | 304 | void set_cpu_frequency(long frequency) |
313 | { | 305 | { |
314 | int divider = frequency ? (CPUFREQ_MAX / frequency) : 16 /* minimal */ ; | 306 | if(frequency == CPUFREQ_MAX) |
307 | { | ||
315 | 308 | ||
316 | if(divider > 16) | 309 | asm volatile( |
317 | divider = 16; | 310 | "mrc p15, 0, r0, c1, c0 \n" |
318 | else if(divider < 1) | ||
319 | divider = 1; | ||
320 | 311 | ||
321 | cpu_frequency = CPUFREQ_MAX / divider; | 312 | #ifdef ASYNCHRONOUS_BUS |
313 | "orr r0, r0, #3<<30 \n" /* asynchronous bus clocking */ | ||
314 | #else | ||
315 | "bic r0, r0, #3<<30 \n" /* clear bus bits */ | ||
316 | "orr r0, r0, #1<<30 \n" /* synchronous bus clocking */ | ||
317 | #endif | ||
322 | 318 | ||
323 | CGU_PROC = (CGU_PROC & 0x0f) | ((divider-1) << 4); | 319 | "mcr p15, 0, r0, c1, c0 \n" |
320 | : : : "r0" ); | ||
321 | |||
322 | cpu_frequency = CPUFREQ_MAX; | ||
323 | } | ||
324 | else | ||
325 | { | ||
326 | asm volatile( | ||
327 | "mrc p15, 0, r0, c1, c0 \n" | ||
328 | "bic r0, r0, #3<<30 \n" /* fastbus clocking */ | ||
329 | "mcr p15, 0, r0, c1, c0 \n" | ||
330 | : : : "r0" ); | ||
331 | |||
332 | cpu_frequency = CPUFREQ_NORMAL; | ||
333 | } | ||
324 | } | 334 | } |
325 | #endif /* HAVE_ADJUSTABLE_CPU_FREQ */ | 335 | #endif /* HAVE_ADJUSTABLE_CPU_FREQ */ |
326 | #endif /* BOOTLOADER */ | 336 | #endif /* !BOOTLOADER */ |