summaryrefslogtreecommitdiff
path: root/firmware/target/arm/imx233/system-imx233.c
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2012-08-30 20:56:39 +0200
committerAmaury Pouly <amaury.pouly@gmail.com>2012-08-30 20:56:39 +0200
commitc9ad8688f16a271e0ab2f0cd26dc2f9ac89625c3 (patch)
treefa3c54aebb4e2aade59587e8514f64b4a233a669 /firmware/target/arm/imx233/system-imx233.c
parent6c2190ea04f5031b2b7e439318b76eb9bdc65fd8 (diff)
downloadrockbox-c9ad8688f16a271e0ab2f0cd26dc2f9ac89625c3.tar.gz
rockbox-c9ad8688f16a271e0ab2f0cd26dc2f9ac89625c3.zip
imx233: implement basic frequency scaling and enable auto-slow
This does not scale the EMI frequency and keep the processor betweel 261MHz and 454MHz. It can still be improve. The auto-slow divisor could still be change, 8 seems reasonable for now Change-Id: I639bb3f6b7f8efedc7dc58d08127849156eeb1b6
Diffstat (limited to 'firmware/target/arm/imx233/system-imx233.c')
-rw-r--r--firmware/target/arm/imx233/system-imx233.c54
1 files changed, 45 insertions, 9 deletions
diff --git a/firmware/target/arm/imx233/system-imx233.c b/firmware/target/arm/imx233/system-imx233.c
index bcdb47ebaa..46574f4b33 100644
--- a/firmware/target/arm/imx233/system-imx233.c
+++ b/firmware/target/arm/imx233/system-imx233.c
@@ -35,6 +35,8 @@
35#include "icoll-imx233.h" 35#include "icoll-imx233.h"
36#include "lradc-imx233.h" 36#include "lradc-imx233.h"
37#include "rtc-imx233.h" 37#include "rtc-imx233.h"
38#include "power-imx233.h"
39#include "emi-imx233.h"
38#include "lcd.h" 40#include "lcd.h"
39#include "backlight-target.h" 41#include "backlight-target.h"
40#include "button.h" 42#include "button.h"
@@ -115,6 +117,14 @@ void system_init(void)
115 defined(CREATIVE_ZENXFI3) || defined(CREATIVE_ZENXFI2)) 117 defined(CREATIVE_ZENXFI3) || defined(CREATIVE_ZENXFI2))
116 fmradio_i2c_init(); 118 fmradio_i2c_init();
117#endif 119#endif
120 imx233_clkctrl_enable_auto_slow_monitor(AS_CPU_INSTR, true);
121 imx233_clkctrl_enable_auto_slow_monitor(AS_CPU_DATA, true);
122 imx233_clkctrl_enable_auto_slow_monitor(AS_TRAFFIC, true);
123 imx233_clkctrl_enable_auto_slow_monitor(AS_TRAFFIC_JAM, true);
124 imx233_clkctrl_enable_auto_slow_monitor(AS_APBXDMA, true);
125 imx233_clkctrl_enable_auto_slow_monitor(AS_APBHDMA, true);
126 imx233_clkctrl_set_auto_slow_divisor(AS_DIV_8);
127 imx233_clkctrl_enable_auto_slow(true);
118} 128}
119 129
120bool imx233_us_elapsed(uint32_t ref, unsigned us_delay) 130bool imx233_us_elapsed(uint32_t ref, unsigned us_delay)
@@ -151,18 +161,44 @@ void set_cpu_frequency(long frequency)
151{ 161{
152 switch(frequency) 162 switch(frequency)
153 { 163 {
154 #if 0
155 case IMX233_CPUFREQ_454_MHz: 164 case IMX233_CPUFREQ_454_MHz:
156 /* clk_h@clk_p/3 */ 165 /* go back to a known state: everything at 24MHz ! */
157 imx233_set_clock_divisor(CLK_AHB, 3); 166 imx233_clkctrl_set_bypass_pll(CLK_CPU, true);
158 /* clk_p@ref_cpu/1*18/19 */ 167 imx233_clkctrl_set_clock_divisor(CLK_HBUS, 1);
159 imx233_set_fractional_divisor(CLK_CPU, 19); 168 _logf("set freq 454MHz");
160 imx233_set_clock_divisor(CLK_CPU, 1); 169 /* set VDDD to 1.550 mV (brownout at 1.450 mV) */
170 imx233_power_set_regulator(REGULATOR_VDDD, 1550, 1450);
171 /* clk_h@clk_p/2 */
172 imx233_clkctrl_set_clock_divisor(CLK_HBUS, 3);
173 /* clk_p@ref_cpu/1*18/33 */
174 imx233_clkctrl_set_fractional_divisor(CLK_CPU, 19);
175 imx233_clkctrl_set_clock_divisor(CLK_CPU, 1);
176 imx233_clkctrl_set_bypass_pll(CLK_CPU, false);
161 /* ref_cpu@480 MHz 177 /* ref_cpu@480 MHz
162 * clk_p@454.74 MHz 178 * ref_emi@480 MHz
163 * clk_h@151.58 MHz */ 179 * clk_emi@130.91 MHz
180 * clk_p@261.82 MHz
181 * clk_h@130.91 MHz */
182 break;
183 case IMX233_CPUFREQ_261_MHz:
184 /* go back to a known state: everything at 24MHz ! */
185 imx233_clkctrl_set_bypass_pll(CLK_CPU, true);
186 imx233_clkctrl_set_clock_divisor(CLK_HBUS, 1);
187 _logf("set freq 261MHz");
188 /* set VDDD to 1.550 mV (brownout at 1.275 mV) */
189 imx233_power_set_regulator(REGULATOR_VDDD, 1275, 1175);
190 /* clk_h@clk_p/2 */
191 imx233_clkctrl_set_clock_divisor(CLK_HBUS, 2);
192 /* clk_p@ref_cpu/1*18/33 */
193 imx233_clkctrl_set_fractional_divisor(CLK_CPU, 33);
194 imx233_clkctrl_set_clock_divisor(CLK_CPU, 1);
195 imx233_clkctrl_set_bypass_pll(CLK_CPU, false);
196 /* ref_cpu@480 MHz
197 * ref_emi@480 MHz
198 * clk_emi@130.91 MHz
199 * clk_p@261.82 MHz
200 * clk_h@130.91 MHz */
164 break; 201 break;
165 #endif
166 default: 202 default:
167 break; 203 break;
168 } 204 }