From 279dff1c21c17e6598c8597a7987ded0e526269c Mon Sep 17 00:00:00 2001 From: Fred Bauer Date: Tue, 14 Dec 2010 22:08:43 +0000 Subject: FS#11765: Improve AMSv1 Battery Life by Lowering CPU and Peripheral clocks. Unboosted CPU and peripheral clock is now 31MHz. Boosted CPU and pclk are 186MHz and 62MHz, respectively. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28834 a1c6a512-1295-4272-9138-f99709370657 --- firmware/target/arm/as3525/system-as3525.c | 42 ++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) (limited to 'firmware/target/arm/as3525/system-as3525.c') diff --git a/firmware/target/arm/as3525/system-as3525.c b/firmware/target/arm/as3525/system-as3525.c index d8059715d0..2c4543fa33 100644 --- a/firmware/target/arm/as3525/system-as3525.c +++ b/firmware/target/arm/as3525/system-as3525.c @@ -33,6 +33,12 @@ #include "backlight-target.h" #include "lcd.h" +/* FIXME */ +#define I2C2_CPSR0 *((volatile unsigned int *)(I2C_AUDIO_BASE + 0x1C)) +#define I2C2_CPSR1 *((volatile unsigned int *)(I2C_AUDIO_BASE + 0x20)) +extern void sd_set_boosted_divider(void); +extern void sd_set_unboosted_divider(void); + #define default_interrupt(name) \ extern __attribute__((weak,alias("UIRQ"))) void name (void) @@ -286,7 +292,12 @@ void system_init(void) #endif /* Initialize power management settings */ +#if CONFIG_CPU == AS3525 + ascodec_write(AS3514_CVDD_DCDC3, AS314_CP_DCDC3_SETTING|CVDD_1_10); +#else ascodec_write(AS3514_CVDD_DCDC3, AS314_CP_DCDC3_SETTING); +#endif + #if CONFIG_TUNER fmradio_i2c_init(); #endif @@ -354,7 +365,9 @@ void set_cpu_frequency(long frequency) { if(frequency == CPUFREQ_MAX) { -#ifdef HAVE_ADJUSTABLE_CPU_VOLTAGE +#if defined(HAVE_ADJUSTABLE_CPU_VOLTAGE) && (CPUFREQ_MAX > 200000000) + /* This doesn't work anymore. It was written before ascodec + was switched to use interrupts */ /* Increasing frequency so boost voltage before change */ ascodec_write(AS3514_CVDD_DCDC3, (AS314_CP_DCDC3_SETTING | CVDD_1_20)); @@ -374,10 +387,35 @@ void set_cpu_frequency(long frequency) "mcr p15, 0, r0, c1, c0 \n" : : : "r0" ); +#ifdef HAVE_MULTIDRIVE + /* Set uSD frequency */ + sd_set_boosted_divider(); +#endif + /* Set I2C frequency */ + I2C2_CPSR0 = AS3525_I2C_PRESCALER_BOOSTED & 0xFF; /* 8 lsb */ + I2C2_CPSR1 = (AS3525_I2C_PRESCALER_BOOSTED >> 8) & 0x3; /* 2 msb */ + /* Set PCLK frequency */ + CGU_PERI = ((CGU_PERI & ~0x7F) | /* reset divider & clksel bits */ + (AS3525_PCLK_DIV0_BOOSTED << 2) | + (AS3525_PCLK_DIV1_BOOSTED << 6) | + AS3525_PCLK_SEL); cpu_frequency = CPUFREQ_MAX; } else { + /* Set I2C frequency */ + I2C2_CPSR0 = AS3525_I2C_PRESCALER & 0xFF; /* 8 lsb */ + I2C2_CPSR1 = (AS3525_I2C_PRESCALER >> 8) & 0x3; /* 2 msb */ + /* Set PCLK frequency */ + CGU_PERI = ((CGU_PERI & ~0x7F) | /* reset divider & clksel bits */ + (AS3525_PCLK_DIV0 << 2) | + (AS3525_PCLK_DIV1 << 6) | + AS3525_PCLK_SEL); + +#ifdef HAVE_MULTIDRIVE + /* Set uSD frequency */ + sd_set_unboosted_divider(); +#endif asm volatile( "mrc p15, 0, r0, c1, c0 \n" "bic r0, r0, #3<<30 \n" /* fastbus clocking */ @@ -387,7 +425,7 @@ void set_cpu_frequency(long frequency) /* FCLK is unused so put it to the lowest freq we can */ CGU_PROC = ((0xf << 4) | (0x3 << 2) | AS3525_CLK_MAIN); -#ifdef HAVE_ADJUSTABLE_CPU_VOLTAGE +#if defined(HAVE_ADJUSTABLE_CPU_VOLTAGE) && (CPUFREQ_MAX > 200000000) /* Decreasing frequency so reduce voltage after change */ ascodec_write(AS3514_CVDD_DCDC3, (AS314_CP_DCDC3_SETTING | CVDD_1_10)); #endif /* HAVE_ADJUSTABLE_CPU_VOLTAGE */ -- cgit v1.2.3