diff -Naur u-boot-2006-05-10-1800/cpu/microblaze/timer.c u-boot-2006-05-10-1800-microblaze/cpu/microblaze/timer.c
--- u-boot-2006-05-10-1800/cpu/microblaze/timer.c	1970-01-01 01:00:00.000000000 +0100
+++ u-boot-2006-05-10-1800-microblaze/cpu/microblaze/timer.c	2006-06-15 21:06:15.000000000 +0200
@@ -0,0 +1,66 @@
+/*
+ * (C) Copyright 2006 Michal Simek
+ *
+ * Michal  SIMEK <www.monstr.eu>
+ *
+ * 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 <asm/microblaze_timer.h>
+
+volatile int timestamp = 0;
+
+void reset_timer(void)
+{
+	timestamp = 0;
+}
+
+ulong get_timer(ulong base)
+{
+	return(timestamp-base);
+}
+
+void set_timer(ulong t)
+{
+	timestamp = t;
+}
+
+#ifdef CFG_INTC_0
+#ifdef CFG_TIMER_0
+extern void install_interrupt_handler(int irq, interrupt_handler_t *hdlr, void *arg);
+
+microblaze_timer_t *tmr=(microblaze_timer_t *) (CFG_TIMER_0_ADDR);
+
+void timer_isr(void *arg)
+{
+	timestamp++;
+	tmr->control=tmr->control | TIMER_INTERRUPT;
+}
+
+void timer_init(void) /* setting timer */
+{
+	tmr->loadreg=CFG_TIMER_0_PRELOAD; /* setting timer vaulue for preload */
+	tmr->control=TIMER_INTERRUPT | TIMER_RESET;
+	tmr->control=TIMER_ENABLE | TIMER_ENABLE_INTR | TIMER_RELOAD |TIMER_DOWN_COUNT;
+	reset_timer();
+	install_interrupt_handler (CFG_TIMER_0_IRQ,timer_isr,(void *)tmr);
+}
+#endif
+#endif
diff -Naur u-boot-2006-05-10-1800/include/asm-microblaze/microblaze_timer.h u-boot-2006-05-10-1800-microblaze/include/asm-microblaze/microblaze_timer.h
--- u-boot-2006-05-10-1800/include/asm-microblaze/microblaze_timer.h	1970-01-01 01:00:00.000000000 +0100
+++ u-boot-2006-05-10-1800-microblaze/include/asm-microblaze/microblaze_timer.h	2006-06-15 21:10:40.000000000 +0200
@@ -0,0 +1,42 @@
+/*
+ * (C) Copyright 2006 Michal Simek
+ *
+ * Michal  SIMEK <www.monstr.cz>
+ *
+ * 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
+ */
+
+#define TIMER_ENABLE_ALL    0x400 /* ENALL */
+#define TIMER_PWM           0x200 /* PWMA0 */
+#define TIMER_INTERRUPT     0x100 /* T0INT */
+#define TIMER_ENABLE        0x080 /* ENT0 */
+#define TIMER_ENABLE_INTR   0x040 /* ENIT0 */
+#define TIMER_RESET         0x020 /* LOAD0 */
+#define TIMER_RELOAD        0x010 /* ARHT0 */
+#define TIMER_EXT_CAPTURE   0x008 /* CAPT0 */
+#define TIMER_EXT_COMPARE   0x004 /* GENT0 */
+#define TIMER_DOWN_COUNT    0x002 /* UDT0 */
+#define TIMER_CAPTURE_MODE  0x001 /* MDT0 */
+
+typedef volatile struct microblaze_timer_t {
+	int control; //control/statuc register TCSR
+	int loadreg; //load register TLR
+	int counter; //timer/counter register
+} microblaze_timer_t;
+
diff -Naur u-boot-2006-05-10-1800/lib_microblaze/time.c u-boot-2006-05-10-1800-microblaze/lib_microblaze/time.c
--- u-boot-2006-05-10-1800/lib_microblaze/time.c	2006-05-10 17:43:20.000000000 +0200
+++ u-boot-2006-05-10-1800-microblaze/lib_microblaze/time.c	2006-06-15 21:07:05.000000000 +0200
@@ -1,6 +1,8 @@
 /*
+ * (C) Copyright 2006 Michal Simek
  * (C) Copyright 2004 Atmark Techno, Inc.
  *
+ * Michal  SIMEK <www.monstr.eu>
  * Yasushi SHOJI <yashi@atmark-techno.com>
  *
  * See file CREDITS for list of people who contributed to this
@@ -22,6 +24,12 @@
  * MA 02111-1307 USA
  */

+#include <common.h>
+
 void udelay(unsigned long usec)
 {
+	int i,j;
+	i=get_timer(0);
+	while((get_timer(0)-i)<(usec/1000));
 }
+

