summaryrefslogtreecommitdiff
path: root/firmware/target/arm/as3525/system-as3525.c
diff options
context:
space:
mode:
authorRafaël Carré <rafael.carre@gmail.com>2010-04-29 03:15:18 +0000
committerRafaël Carré <rafael.carre@gmail.com>2010-04-29 03:15:18 +0000
commit893180d47d7dd606e208987d57b95b29a57dfcc0 (patch)
tree496e51501a5ba42a96afa5acdb9b19582777bbfc /firmware/target/arm/as3525/system-as3525.c
parent2a180e80398a7915b7fd2fdc6cf404b6fd019fbd (diff)
downloadrockbox-893180d47d7dd606e208987d57b95b29a57dfcc0.tar.gz
rockbox-893180d47d7dd606e208987d57b95b29a57dfcc0.zip
as3525v2: crashless cpufreq switching
delays after modifying the registers seems not to be needed moving RAM operation (cpu_frequency variable) before modifying the register also seems to help git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25754 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/as3525/system-as3525.c')
-rw-r--r--firmware/target/arm/as3525/system-as3525.c11
1 files changed, 3 insertions, 8 deletions
diff --git a/firmware/target/arm/as3525/system-as3525.c b/firmware/target/arm/as3525/system-as3525.c
index 2b3e163611..47cb465c62 100644
--- a/firmware/target/arm/as3525/system-as3525.c
+++ b/firmware/target/arm/as3525/system-as3525.c
@@ -453,34 +453,29 @@ void set_cpu_frequency(long frequency)
453void set_cpu_frequency(long frequency) 453void set_cpu_frequency(long frequency)
454{ 454{
455 int oldstatus = disable_irq_save(); 455 int oldstatus = disable_irq_save();
456 int delay; 456
457 /* We only have 2 settings */
458 cpu_frequency = (frequency == CPUFREQ_MAX) ? frequency : CPUFREQ_NORMAL;
457 459
458 if(frequency == CPUFREQ_MAX) 460 if(frequency == CPUFREQ_MAX)
459 { 461 {
460 /* Change PCLK while FCLK is low, so it doesn't go too high */ 462 /* Change PCLK while FCLK is low, so it doesn't go too high */
461 CGU_PERI = (CGU_PERI & ~(0xF << 2)) | (AS3525_PCLK_DIV0 << 2); 463 CGU_PERI = (CGU_PERI & ~(0xF << 2)) | (AS3525_PCLK_DIV0 << 2);
462 464
463 delay = 40; while(delay--) asm("nop");
464
465 CGU_PROC = ((AS3525_FCLK_POSTDIV << 4) | 465 CGU_PROC = ((AS3525_FCLK_POSTDIV << 4) |
466 (AS3525_FCLK_PREDIV << 2) | 466 (AS3525_FCLK_PREDIV << 2) |
467 AS3525_FCLK_SEL); 467 AS3525_FCLK_SEL);
468 } 468 }
469 else 469 else
470 { 470 {
471 frequency = CPUFREQ_NORMAL; /* We only have 2 settings */
472
473 CGU_PROC = ((AS3525_FCLK_POSTDIV_UNBOOSTED << 4) | 471 CGU_PROC = ((AS3525_FCLK_POSTDIV_UNBOOSTED << 4) |
474 (AS3525_FCLK_PREDIV << 2) | 472 (AS3525_FCLK_PREDIV << 2) |
475 AS3525_FCLK_SEL); 473 AS3525_FCLK_SEL);
476 474
477 /* Change PCLK after FCLK is low, so it doesn't go too high */ 475 /* Change PCLK after FCLK is low, so it doesn't go too high */
478 CGU_PERI = (CGU_PERI & ~(0xF << 2)) | (AS3525_PCLK_DIV0_UNBOOSTED << 2); 476 CGU_PERI = (CGU_PERI & ~(0xF << 2)) | (AS3525_PCLK_DIV0_UNBOOSTED << 2);
479 delay = 40; while(delay--) asm("nop");
480 } 477 }
481 478
482 cpu_frequency = frequency;
483
484 restore_irq(oldstatus); 479 restore_irq(oldstatus);
485} 480}
486#endif 481#endif