Generic udelay() with watchdog support
authorIngo van Lil <inguin@gmx.de>
Tue, 24 Nov 2009 13:09:21 +0000 (14:09 +0100)
committerWolfgang Denk <wd@denx.de>
Sat, 5 Dec 2009 00:08:53 +0000 (01:08 +0100)
According to the PPC reference implementation the udelay() function is
responsible for resetting the watchdog timer as frequently as needed.
Most other architectures do not meet that requirement, so long-running
operations might result in a watchdog reset.

This patch adds a generic udelay() function which takes care of
resetting the watchdog before calling an architecture-specific
__udelay().

Signed-off-by: Ingo van Lil <inguin@gmx.de>
47 files changed:
board/armltd/integrator/timer.c
board/freescale/mpc8313erdb/sdram.c
cpu/arm1136/mx31/timer.c
cpu/arm1136/omap24xx/timer.c
cpu/arm1176/s3c64xx/timer.c
cpu/arm720t/interrupts.c
cpu/arm920t/at91rm9200/timer.c
cpu/arm920t/imx/timer.c
cpu/arm920t/ks8695/timer.c
cpu/arm920t/s3c24x0/timer.c
cpu/arm925t/timer.c
cpu/arm926ejs/at91/timer.c
cpu/arm926ejs/davinci/timer.c
cpu/arm926ejs/kirkwood/timer.c
cpu/arm926ejs/mx27/timer.c
cpu/arm926ejs/nomadik/timer.c
cpu/arm926ejs/omap/timer.c
cpu/arm926ejs/versatile/timer.c
cpu/arm_cortexa8/omap3/timer.c
cpu/arm_cortexa8/s5pc1xx/timer.c
cpu/at32ap/interrupts.c
cpu/blackfin/interrupts.c
cpu/i386/sc520/sc520_timer.c
cpu/ixp/start.S
cpu/ixp/timer.c
cpu/lh7a40x/timer.c
cpu/mcf547x_8x/slicetimer.c
cpu/pxa/timer.c
cpu/s3c44b0/timer.c
cpu/sa1100/timer.c
examples/api/Makefile
examples/api/libgenwrap.c
include/asm-blackfin/delay.h
include/common.h
include/exports.h
lib_generic/Makefile
lib_generic/time.c [new file with mode: 0644]
lib_i386/pcat_timer.c
lib_m68k/time.c
lib_microblaze/time.c
lib_mips/time.c
lib_nios/time.c
lib_nios2/time.c
lib_ppc/time.c
lib_sh/time.c
lib_sh/time_sh2.c
lib_sparc/time.c

index 087cf596221fdb46887339b04f203630e05a1f82..7562ffa87d71141fe17cae13d8dbde65fef18ec2 100644 (file)
@@ -124,7 +124,7 @@ void set_timer (ulong ticks)
 }
 
 /* delay usec useconds */
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        ulong tmo, tmp;
 
index cb138296ba0fc14a4250592e03de36f2a9011686..0c4fd6854d46757e9eeb96997eee2d58b2aa4257 100644 (file)
@@ -72,7 +72,7 @@ static long fixed_sdram(void)
         * Erratum DDR3 requires a 50ms delay after clearing DDRCDR[DDR_cfg],
         * or the DDR2 controller may fail to initialize correctly.
         */
-       udelay(50000);
+       __udelay(50000);
 
        im->ddr.csbnds[0].csbnds = (msize - 1) >> 24;
        im->ddr.cs_config[0] = CONFIG_SYS_DDR_CONFIG;
index 29b484e4482fc6b025047a146f2c141d23af89a3..7972ba0dd7481f88a45fe0b0961a413d13fa62ee 100644 (file)
@@ -152,7 +152,7 @@ void set_timer (ulong t)
 }
 
 /* delay x useconds AND perserve advance timstamp value */
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        unsigned long long tmp;
        ulong tmo;
index 8dd8d7b008d83f3223b68ca0d4b9e0ebc7a73ef1..67547490fdaaad0e5e7f4420471aed4af174af94 100644 (file)
@@ -74,7 +74,7 @@ void set_timer (ulong t)
 }
 
 /* delay x useconds AND perserve advance timstamp value */
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        ulong tmo, tmp;
 
index 85ce9cd998bcec7f69bbcc04c1fe814155678e34..9768319efa07992375a03eafeec80bcbe30b4eec 100644 (file)
@@ -164,7 +164,7 @@ void set_timer(ulong t)
        timestamp = t * (timer_load_val / (100 * CONFIG_SYS_HZ));
 }
 
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        unsigned long long tmp;
        ulong tmo;
index 91d552cd28a755d43c016c0c777c09e7878062ed..eb8d4253181c12a6136ce9ac8bec21a069c49f38 100644 (file)
@@ -224,7 +224,7 @@ void set_timer (ulong t)
        timestamp = t;
 }
 
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        ulong tmo;
 
@@ -296,7 +296,7 @@ ulong get_timer (ulong base)
        return timestamp - base;
 }
 
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        u32 ticks;
 
index 235d1073886f6a07a364c3df58fde50e628690d1..9c54bbedbe646d8cd79e3a0ad7596d12f727afe2 100644 (file)
@@ -87,7 +87,7 @@ void set_timer (ulong t)
        timestamp = t;
 }
 
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        udelay_masked(usec);
 }
index 31ec588d9194684641ec842a9328f1ed10e2208e..b06b518f03b2801de67622f54d34a8d2ac2b12cf 100644 (file)
@@ -89,7 +89,7 @@ void udelay_masked (unsigned long usec)
        } while (diff >= 0);
 }
 
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        udelay_masked(usec);
 }
index 22987bc48bec43bc08a00235d608be30dfccc723..886e370596287310dc411a5d1d47bf62412c320b 100644 (file)
@@ -81,7 +81,7 @@ void set_timer(ulong t)
        timer_ticks = t;
 }
 
-void udelay(ulong usec)
+void __udelay(ulong usec)
 {
        ulong start = get_timer_masked();
        ulong end;
index cd06f6b5808288cf6c5ceb5067d0fd38cb98550b..fcc6c0cb1b1f536c337b53205c5a242e0ffdfc50 100644 (file)
@@ -99,7 +99,7 @@ void set_timer(ulong t)
        timestamp = t;
 }
 
-void udelay(unsigned long usec)
+void __udelay (unsigned long usec)
 {
        ulong tmo;
        ulong start = get_ticks();
index c16ef2577f8abb9b88bd953d416e8cb3903c59e8..7dfe2b56463b6c03f7c5551b2fc569631aa0dd12 100644 (file)
@@ -81,7 +81,7 @@ void set_timer (ulong t)
 }
 
 /* delay x useconds AND preserve advance timestamp value */
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        int32_t tmo = usec * (TIMER_CLOCK / 1000) / 1000;
        uint32_t now, last = __raw_readl(CONFIG_SYS_TIMERBASE + READ_TIM);
index 811bb3c5906d8fc73fabd0fe72dd3941e5596ab8..7352b5c3379ebddb126fdac767cf090cec08d39a 100644 (file)
@@ -105,7 +105,7 @@ ulong get_timer_masked(void)
        return tick_to_time(get_ticks());
 }
 
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        unsigned long long tmp;
        ulong tmo;
index 7c2c208253c0510d9b5bc9f87eefaf2a6ac70839..9da7443f30b5fea4df134a932ac49739f6c9e1ee 100644 (file)
@@ -112,7 +112,7 @@ void set_timer(ulong t)
        timestamp = t;
 }
 
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        ulong tmo;
        ulong endtime;
index 817ff4284f230a1315777c348867636eecfb094f..2ec6a93807e9775856c3d42ac42ad8442ef7e7d8 100644 (file)
@@ -125,7 +125,7 @@ void set_timer(ulong t)
        timestamp = t;
 }
 
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        uint current;
        ulong delayticks;
index 90110581ef6a73a9457efe2e84b97217cd74ca30..8f1d47bba775716ec21afd2a5e662c617b7a24d4 100644 (file)
@@ -177,7 +177,7 @@ void set_timer (ulong t)
 }
 
 /* delay x useconds AND preserve advance timstamp value */
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        unsigned long long tmp;
        ulong tmo;
index 16067c900ae25f41b2fe486590c597f8ecdb2258..047b9e35130a014922200063d385def309f9244c 100644 (file)
@@ -59,7 +59,7 @@ ulong get_timer(ulong base)
 }
 
 /* Delay x useconds */
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        ulong ini, end;
 
index 392b158d508eb30c3dddb817ad80e10ee304d135..2ac38c40b774e9f22a5b69c823873a9439cd4603 100644 (file)
@@ -80,7 +80,7 @@ void set_timer (ulong t)
 }
 
 /* delay x useconds AND perserve advance timstamp value */
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        ulong tmo, tmp;
 
index 50c13350a06bb6909f90de225c637aa766eafea1..563db3654867c6fdd7d71873b83063e6addffa52 100755 (executable)
@@ -109,7 +109,7 @@ void set_timer (ulong t)
 }
 
 /* delay x useconds AND perserve advance timstamp value */
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        ulong tmo, tmp;
 
index 12a16b3210aeb401feb0767c6c3e61336e03ab8b..401bfe6d09799525aa8ee71cebf80cfd2630f25f 100644 (file)
@@ -82,7 +82,7 @@ void set_timer(ulong t)
 }
 
 /* delay x useconds */
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        long tmo = usec * (TIMER_CLOCK / 1000) / 1000;
        unsigned long now, last = readl(&timer_base->tcrr);
index cdba5d934279f65af2ff597f5c42507658254bf9..c5df5c5ab53b7a641c64c33252d142cf66560a02 100644 (file)
@@ -115,7 +115,7 @@ void set_timer(unsigned long t)
 }
 
 /* delay x useconds */
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        unsigned long tmo, tmp;
 
index 75cc39e94c33eb02684efd845500df0458d98c0e..c6d8d16e39e8aecd95abbd2cf866b88b6438ca53 100644 (file)
@@ -96,7 +96,7 @@ void set_timer(unsigned long t)
 /*
  * For short delays only. It will overflow after a few seconds.
  */
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        unsigned long cycles;
        unsigned long base;
index 19456e5c1476f999812e0247e8cb4b05cba9c03b..921bfe0c0f15bcdb644a2142415fcace283f4fc3 100644 (file)
@@ -64,7 +64,7 @@ int disable_interrupts(void)
        return 1;
 }
 
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        unsigned long delay, start, stop;
        unsigned long cclk;
index 25c9a24b709677adfed271ed0db53ec2907ba656..93b5b555c3014e68ff81bec4ed1eed7b2bc29e63 100644 (file)
@@ -68,7 +68,7 @@ int timer_init(void)
        return 0;
 }
 
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        int m = 0;
        long u;
index 196ba5db2eaf760c750b1c4a8b0ac41ea18b1cf6..5ebce5338cb41bf1b1416e5aacec7d223fe8fb59 100644 (file)
@@ -505,8 +505,8 @@ reset_endless:
 /*
  * 0 <= r0 <= 2000
  */
-.globl udelay
-udelay:
+.globl __udelay
+__udelay:
        mov     r2,     #0x6800
        orr     r2, r2, #0x00db
        mul     r0, r2, r0
index 685614966b72de124151f12364dfc2ffa4c8b64f..edf341ff9f9b24dbac9fc7c4b19539b358900be8 100644 (file)
@@ -99,7 +99,7 @@ void ixp425_udelay(unsigned long usec)
        while (!(*IXP425_OSST & IXP425_OSST_TIMER_1_PEND));
 }
 
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        while (usec--) ixp425_udelay(1);
 }
index f9b5be01042d84a6f4b3a01cf8ea4c25fa4a31ce..2691315d84f71c84dbed5a895b6b76770ff19e2e 100644 (file)
@@ -90,7 +90,7 @@ void set_timer (ulong t)
        timestamp = t;
 }
 
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        ulong tmo,tmp;
 
index 67e81894af4a23dc0059a270fb7ecfe84bb58755..8dc010a3521aca6219a5a7d596ecfdda049a4167 100644 (file)
@@ -40,7 +40,7 @@ static ulong timestamp;
 #endif
 extern void dtimer_intr_setup(void);
 
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        volatile slt_t *timerp = (slt_t *) (CONFIG_SYS_UDELAY_BASE);
        u32 now, freq;
index e2df3a57fcbabb90b07ed3a0d6aac60ee3c65a3f..8d0f82679b0a12707ce428d2a9a2bde13e1211a2 100644 (file)
@@ -78,7 +78,7 @@ void set_timer (ulong t)
        /* nop */
 }
 
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        udelay_masked (usec);
 }
index 34184abb735b81891264aa57ce9265f6e31aa4ba..6f1d8f677afbdf849860ba1ee7bed935421ba10b 100644 (file)
@@ -75,7 +75,7 @@ void set_timer (ulong t)
        timestamp = t;
 }
 
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        ulong tmo;
 
index 3f77e815cb61729e05851b1a449e4867c46f0800..020750125af3929c6d94547a0a8832eae685db24 100644 (file)
@@ -49,7 +49,7 @@ void set_timer (ulong t)
        /* nop */
 }
 
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        udelay_masked (usec);
 }
index 04a270b450127a088da3de626a756b04ff7d8814..d4c5ca2559f431d12494a4350b4645430d9efef9 100644 (file)
@@ -44,6 +44,7 @@ EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/crc32.o
 EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/ctype.o
 EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/div64.o
 EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/string.o
+EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/time.o
 EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/vsprintf.o
 ifeq ($(ARCH),ppc)
 EXT_SOBJ_FILES-$(CONFIG_API) += lib_ppc/ppcstring.o
index 2b62badfb88e32b8162d6410cb7423b2cf404f00..2b107d9797f45eaaf3bc5bee1ef7d8eac93cd62e 100644 (file)
@@ -74,7 +74,7 @@ void putc (const char c)
        ub_putc(c);
 }
 
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        ub_udelay(usec);
 }
index ea0b3664e01bf690254cdeff9540d3f0f49e2059..3af6ad3e7171e6d2b65fae0ee6fb3d1192768049 100644 (file)
@@ -47,7 +47,7 @@ extern __inline__ void __delay(unsigned long loops)
  * first constant multiplications gets optimized away if the delay is
  * a constant)
  */
-extern __inline__ void udelay(unsigned long usecs)
+extern __inline__ void __udelay(unsigned long usecs)
 {
        __delay(usecs);
 }
index 30a4b7affb3fc8ec7e2ef73f80669c35ef129c4a..749d35cabe6e2731ba57d8d5bd0e8ce8cd8643b9 100644 (file)
@@ -607,11 +607,14 @@ unsigned long long get_ticks(void);
 void   wait_ticks    (unsigned long);
 
 /* lib_$(ARCH)/time.c */
-void   udelay        (unsigned long);
+void   __udelay      (unsigned long);
 ulong  usec2ticks    (unsigned long usec);
 ulong  ticks2usec    (unsigned long ticks);
 int    init_timebase (void);
 
+/* lib_generic/time.c */
+void   udelay        (unsigned long);
+
 /* lib_generic/vsprintf.c */
 ulong  simple_strtoul(const char *cp,char **endp,unsigned int base);
 #ifdef CONFIG_SYS_64BIT_VSPRINTF
index 2e8fd8b8b41331dcee601ae07e95231201b1ab14..c3a5d2f32e76903927e723642401ac29668f0f4b 100644 (file)
@@ -16,7 +16,7 @@ void install_hdlr(int, interrupt_handler_t*, void*);
 void free_hdlr(int);
 void *malloc(size_t);
 void free(void*);
-void udelay(unsigned long);
+void __udelay(unsigned long);
 unsigned long get_timer(unsigned long);
 void vprintf(const char *, va_list);
 void do_reset (void);
index 686601cc18932b28c2040490accdfdddd583d2ca..7291fa3963fb2763f8558e2e3279783b3d689511 100644 (file)
@@ -44,6 +44,7 @@ COBJS-y += sha1.o
 COBJS-$(CONFIG_SHA256) += sha256.o
 COBJS-y += string.o
 COBJS-y        += strmhz.o
+COBJS-y += time.o
 COBJS-y += vsprintf.o
 COBJS-y += zlib.o
 COBJS-$(CONFIG_RBTREE) += rbtree.o
diff --git a/lib_generic/time.c b/lib_generic/time.c
new file mode 100644 (file)
index 0000000..a309c26
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * (C) Copyright 2000-2009
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <watchdog.h>
+
+#ifndef CONFIG_WD_PERIOD
+# define CONFIG_WD_PERIOD      (10 * 1000 * 1000)      /* 10 seconds default*/
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+void udelay(unsigned long usec)
+{
+       ulong kv;
+
+       do {
+               WATCHDOG_RESET();
+               kv = usec > CONFIG_WD_PERIOD ? CONFIG_WD_PERIOD : usec;
+               __udelay (kv);
+               usec -= kv;
+       } while(usec);
+}
index c351b23b6334ac5f46b613f8a6a21b304b761b35..1373fd125c81d1f792788ebf8ba837cf4dc9fee1 100644 (file)
@@ -71,7 +71,7 @@ static u16 read_pit(void)
 }
 
 /* this is not very exact */
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        int counter;
        int wraps;
index 29269f655b9c1248ee9b91b2e5dee1d31e6791bc..7eaea5e7f77deddffede0a00cd5cdc03c4c45e5b 100644 (file)
@@ -47,7 +47,7 @@ static volatile ulong timestamp = 0;
 #endif
 extern void dtimer_intr_setup(void);
 
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        volatile dtmr_t *timerp = (dtmr_t *) (CONFIG_SYS_UDELAY_BASE);
        uint start, now, tmp;
@@ -139,7 +139,7 @@ void set_timer(ulong t)
 
 static unsigned short lastinc;
 
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        volatile pit_t *timerp = (pit_t *) (CONFIG_SYS_UDELAY_BASE);
        uint tmp;
index cbb43414f9cf860b0ad83bb899012e2bbb58d454..da016a0015c0a156fa4895203c4365511b3110f1 100644 (file)
 #include <common.h>
 
 #ifdef CONFIG_SYS_TIMER_0
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        int i;
        i = get_timer (0);
        while ((get_timer (0) - i) < (usec / 1000)) ;
 }
 #else
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        unsigned int i;
        for (i = 0; i < (usec * CONFIG_XILINX_CLOCK_FREQ / 10000000); i++);
index 07e356d235653e031734cb0dc8c34fb4c49911f9..0e6644149b476f6b6e03071815490226721376d2 100644 (file)
@@ -70,7 +70,7 @@ void set_timer(ulong t)
        write_c0_compare(read_c0_count() + CYCLES_PER_JIFFY);
 }
 
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        unsigned int tmo;
 
index 25a233ea785a13d09e2e8d5a82b179d39572f8aa..d5096ee1290561b1ed5179dd60e5d8ef4bab14fd 100644 (file)
 
 extern void dly_clks( unsigned long ticks );
 
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        /* The Nios core doesn't have a timebase, so we do our
         * best for now and call a low-level loop that counts
         * cpu clocks.
         */
        unsigned long cnt = (CONFIG_SYS_CLK_FREQ/1000000) * usec;
-       WATCHDOG_RESET ();      /* trigger watchdog if needed */
        dly_clks (cnt);
 }
index 25a233ea785a13d09e2e8d5a82b179d39572f8aa..d5096ee1290561b1ed5179dd60e5d8ef4bab14fd 100644 (file)
 
 extern void dly_clks( unsigned long ticks );
 
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        /* The Nios core doesn't have a timebase, so we do our
         * best for now and call a low-level loop that counts
         * cpu clocks.
         */
        unsigned long cnt = (CONFIG_SYS_CLK_FREQ/1000000) * usec;
-       WATCHDOG_RESET ();      /* trigger watchdog if needed */
        dly_clks (cnt);
 }
index 173ffab3e8b371b457ee7d6f24f91a208851dd71..29099612db4f4d46d243eed2546a98d997c6597f 100644 (file)
 
 #include <common.h>
 
-#ifndef CONFIG_WD_PERIOD
-# define CONFIG_WD_PERIOD      (10 * 1000 * 1000)      /* 10 seconds default*/
-#endif
-
 /* ------------------------------------------------------------------------- */
 
 /*
@@ -54,16 +50,10 @@ unsigned long usec2ticks(unsigned long usec)
  * microseconds to wait) into a number of time base ticks; then we
  * watch the time base until it has incremented by that amount.
  */
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
-       ulong ticks, kv;
-
-       do {
-               kv = usec > CONFIG_WD_PERIOD ? CONFIG_WD_PERIOD : usec;
-               ticks = usec2ticks (kv);
-               wait_ticks (ticks);
-               usec -= kv;
-       } while(usec);
+       ulong ticks = usec2ticks (usec);
+       wait_ticks (ticks);
 }
 
 /* ------------------------------------------------------------------------- */
index 52dbcd06116860843a00cdfaf6770f72573be0cc..9a8f89aef60cf9cf183ec6367d91c7efd555afd1 100644 (file)
@@ -105,7 +105,7 @@ unsigned long long get_ticks (void)
        return 0 - readl(TCNT0);
 }
 
-void udelay (unsigned long usec)
+void __udelay (unsigned long usec)
 {
        unsigned long long tmp;
        ulong tmo;
index 5c6c9d4384f4fa0ad21fc7dd7410ba8b7aa515a6..789b46f0e0261273cfb2545f34bfc3254a7be29c 100644 (file)
@@ -103,7 +103,7 @@ void reset_timer(void)
        cmt_timer_start(0);
 }
 
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        unsigned long end = get_usec() + usec;
 
index 433f3eb5a0dd3fe95384e0d444cc020951bdb6e9..82b2a3abce5bd494808ece127ff944dd6a796fbd 100644 (file)
@@ -53,7 +53,7 @@ unsigned long usec2ticks(unsigned long usec)
  * microseconds to wait) into a number of time base ticks; then we
  * watch the time base until it has incremented by that amount.
  */
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        ulong ticks = usec2ticks(usec);