summaryrefslogtreecommitdiff
path: root/firmware/target/arm
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm')
-rw-r--r--firmware/target/arm/as3525/system-as3525.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/firmware/target/arm/as3525/system-as3525.c b/firmware/target/arm/as3525/system-as3525.c
index 5a7d25a1f7..90535fc170 100644
--- a/firmware/target/arm/as3525/system-as3525.c
+++ b/firmware/target/arm/as3525/system-as3525.c
@@ -433,35 +433,41 @@ void set_cpu_frequency(long frequency)
433#else /* as3525v2 */ 433#else /* as3525v2 */
434void set_cpu_frequency(long frequency) 434void set_cpu_frequency(long frequency)
435{ 435{
436 int oldstatus = disable_irq_save();
437 int delay;
438
436 if(frequency == CPUFREQ_MAX) 439 if(frequency == CPUFREQ_MAX)
437 { 440 {
438 int oldstatus = disable_irq_save();
439 /* Change PCLK while FCLK is low, so it doesn't go too high */ 441 /* Change PCLK while FCLK is low, so it doesn't go too high */
440 CGU_PERI = (CGU_PERI & ~(0x1F << 2)) | (AS3525_PCLK_DIV0 << 2); 442 CGU_PERI = (CGU_PERI & ~(0x1F << 2)) | (AS3525_PCLK_DIV0 << 2);
441 443
444 delay = 40; while(delay--) ;
445
442 CGU_PROC = ((AS3525_FCLK_POSTDIV << 4) | 446 CGU_PROC = ((AS3525_FCLK_POSTDIV << 4) |
443 (AS3525_FCLK_PREDIV << 2) | 447 (AS3525_FCLK_PREDIV << 2) |
444 AS3525_FCLK_SEL); 448 AS3525_FCLK_SEL);
445 449
446 restore_irq(oldstatus); 450 delay = 40; while(delay--) ;
447 451
448 cpu_frequency = CPUFREQ_MAX;
449 } 452 }
450 else 453 else
451 { 454 {
452 int oldstatus = disable_irq_save(); 455 frequency = CPUFREQ_NORMAL; /* We only have 2 settings */
453 456
454 CGU_PROC = ((AS3525_FCLK_POSTDIV_UNBOOSTED << 4) | 457 CGU_PROC = ((AS3525_FCLK_POSTDIV_UNBOOSTED << 4) |
455 (AS3525_FCLK_PREDIV << 2) | 458 (AS3525_FCLK_PREDIV << 2) |
456 AS3525_FCLK_SEL); 459 AS3525_FCLK_SEL);
457 460
461 delay = 40; while(delay--) ;
462
458 /* Change PCLK after FCLK is low, so it doesn't go too high */ 463 /* Change PCLK after FCLK is low, so it doesn't go too high */
459 CGU_PERI = (CGU_PERI & ~(0x1F << 2)) | (AS3525_PCLK_DIV0_UNBOOSTED << 2); 464 CGU_PERI = (CGU_PERI & ~(0x1F << 2)) | (AS3525_PCLK_DIV0_UNBOOSTED << 2);
465 delay = 40; while(delay--) ;
466 }
460 467
461 restore_irq(oldstatus); 468 cpu_frequency = frequency;
462 469
463 cpu_frequency = CPUFREQ_NORMAL; 470 restore_irq(oldstatus);
464 }
465} 471}
466#endif 472#endif
467 473