summaryrefslogtreecommitdiff
path: root/firmware/target/arm/as3525/system-as3525.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/as3525/system-as3525.c')
-rw-r--r--firmware/target/arm/as3525/system-as3525.c72
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
290void system_reboot(void) 282void 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
312void set_cpu_frequency(long frequency) 304void 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 */