summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcin Bukat <marcin.bukat@gmail.com>2013-04-12 09:27:16 +0200
committerMarcin Bukat <marcin.bukat@gmail.com>2013-04-12 09:27:41 +0200
commit3c802a95eda109adf16b28386c636697e6836fae (patch)
tree16f9fe696a5787e032973f04215112dbf700e1b8
parent6be80976517709e16d587e3e30f020e41610be42 (diff)
downloadrockbox-3c802a95eda109adf16b28386c636697e6836fae.tar.gz
rockbox-3c802a95eda109adf16b28386c636697e6836fae.zip
rk27xx: make udelay() more accurate
Change-Id: Ic448c4e5ec52af6aaeebccee4feea49954394677
-rw-r--r--firmware/target/arm/rk27xx/system-rk27xx.c10
1 files changed, 2 insertions, 8 deletions
diff --git a/firmware/target/arm/rk27xx/system-rk27xx.c b/firmware/target/arm/rk27xx/system-rk27xx.c
index 9f089e8170..a36b4e9581 100644
--- a/firmware/target/arm/rk27xx/system-rk27xx.c
+++ b/firmware/target/arm/rk27xx/system-rk27xx.c
@@ -177,19 +177,13 @@ int system_memory_guard(int newmode)
177/* usecs may be at most 2^32/200 (~21 seconds) for 200MHz max cpu freq */ 177/* usecs may be at most 2^32/200 (~21 seconds) for 200MHz max cpu freq */
178void udelay(unsigned usecs) 178void udelay(unsigned usecs)
179{ 179{
180 unsigned cycles_per_usec;
181 unsigned delay; 180 unsigned delay;
182 181
183 if (cpu_frequency == CPUFREQ_MAX) { 182 delay = (usecs * (cpu_frequency/1000000)) / 5;
184 cycles_per_usec = (CPUFREQ_MAX + 999999) / 1000000;
185 } else {
186 cycles_per_usec = (CPUFREQ_NORMAL + 999999) / 1000000;
187 }
188
189 delay = (usecs * cycles_per_usec + 3) / 4;
190 183
191 asm volatile( 184 asm volatile(
192 "1: subs %0, %0, #1 \n" /* 1 cycle */ 185 "1: subs %0, %0, #1 \n" /* 1 cycle */
186 " nop \n" /* 1 cycle */
193 " bne 1b \n" /* 3 cycles */ 187 " bne 1b \n" /* 3 cycles */
194 : : "r"(delay) 188 : : "r"(delay)
195 ); 189 );