diff options
author | Rafaël Carré <rafael.carre@gmail.com> | 2010-06-18 19:14:08 +0000 |
---|---|---|
committer | Rafaël Carré <rafael.carre@gmail.com> | 2010-06-18 19:14:08 +0000 |
commit | 7a9033179f34ba5175b5dc13c674d21235f2f98a (patch) | |
tree | 0c76fc01b163dae4b4fa9fbf9a828b539a10ea00 /firmware/target/arm/as3525/system-as3525.c | |
parent | 955bb4004fcfbc762db7c9364665a40fa2018e7e (diff) | |
download | rockbox-7a9033179f34ba5175b5dc13c674d21235f2f98a.tar.gz rockbox-7a9033179f34ba5175b5dc13c674d21235f2f98a.zip |
as3525*: make udelay() be a simple busy loop
it achieves all the requirements, work fine on c200v2, and is much simpler
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26933 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/as3525/system-as3525.c')
-rw-r--r-- | firmware/target/arm/as3525/system-as3525.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/firmware/target/arm/as3525/system-as3525.c b/firmware/target/arm/as3525/system-as3525.c index 940f183c63..aa98aff852 100644 --- a/firmware/target/arm/as3525/system-as3525.c +++ b/firmware/target/arm/as3525/system-as3525.c | |||
@@ -326,6 +326,26 @@ int system_memory_guard(int newmode) | |||
326 | return 0; | 326 | return 0; |
327 | } | 327 | } |
328 | 328 | ||
329 | void udelay(unsigned short usecs) | ||
330 | { | ||
331 | unsigned cycles_per_usec; | ||
332 | unsigned delay; | ||
333 | |||
334 | if (cpu_frequency == CPUFREQ_MAX) { | ||
335 | cycles_per_usec = (CPUFREQ_MAX + 999999) / 1000000; | ||
336 | } else { | ||
337 | cycles_per_usec = (CPUFREQ_NORMAL + 999999) / 1000000; | ||
338 | } | ||
339 | |||
340 | delay = (usecs * cycles_per_usec + 3) / 4; | ||
341 | |||
342 | asm volatile( | ||
343 | "1: subs %0, %0, #1 \n" /* 1 cycle */ | ||
344 | " bne 1b \n" /* 3 cycles */ | ||
345 | : : "r"(delay) | ||
346 | ); | ||
347 | } | ||
348 | |||
329 | #ifndef BOOTLOADER | 349 | #ifndef BOOTLOADER |
330 | #ifdef HAVE_ADJUSTABLE_CPU_FREQ | 350 | #ifdef HAVE_ADJUSTABLE_CPU_FREQ |
331 | 351 | ||