summaryrefslogtreecommitdiff
path: root/firmware/target
diff options
context:
space:
mode:
authorRob Purchase <shotofadds@rockbox.org>2010-06-16 21:03:57 +0000
committerRob Purchase <shotofadds@rockbox.org>2010-06-16 21:03:57 +0000
commit6c94ce590dadf6e80a029828e65f676bf79e0537 (patch)
treebdc56435e7804e0fa983cbe4230cbc2d60fae2a1 /firmware/target
parentff8e76e9e534dde1e6a57a84d49b89dad847cafd (diff)
downloadrockbox-6c94ce590dadf6e80a029828e65f676bf79e0537.tar.gz
rockbox-6c94ce590dadf6e80a029828e65f676bf79e0537.zip
Re-write the Telechips I2C delay routine in assembler to stop the compiler optimising it away. Tested with EABI and non-EABI compilers.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26872 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target')
-rw-r--r--firmware/target/arm/i2c-telechips.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/firmware/target/arm/i2c-telechips.c b/firmware/target/arm/i2c-telechips.c
index 35f4cd41c5..511bbe8865 100644
--- a/firmware/target/arm/i2c-telechips.c
+++ b/firmware/target/arm/i2c-telechips.c
@@ -27,9 +27,10 @@
27/* Delay loop based on CPU frequency (FREQ>>22 is 7..45 for 32MHz..192MHz) */ 27/* Delay loop based on CPU frequency (FREQ>>22 is 7..45 for 32MHz..192MHz) */
28static inline void delay_loop(void) 28static inline void delay_loop(void)
29{ 29{
30 unsigned long x; 30 asm volatile (" mov %[freq], %[freq], asr#22 \n\t"
31 for (x = (unsigned)(FREQ>>22); x; x--) 31 "1: subs %[freq], %[freq], #1 \n\t"
32 asm volatile("nop"); 32 " bne 1b"
33 : : [freq] "r" (cpu_frequency) : "memory");
33} 34}
34 35
35#define DELAY delay_loop() 36#define DELAY delay_loop()