* Patches by Reinhard Meyer, 14 Feb 2004:
  - update board/emk tree; use common flash driver
  - Corrected tested bits in machine check exception in cpu/mpc5xxx/traps.c
    [adapted for other PPC CPUs -- wd]
  - Added support for the M48T08 on the EVAL5200 board in rtc/mk48t59.c

* Patch by Jon Diekema, 13 Feb 2004:
  Call show_boot_progress() whenever POST "FAILED" is printed.

* Patch by Nishant Kamat, 13 Feb 2004:
  Add support for TI OMAP1610 H2 Board
  Fixes for cpu/arm926ejs/interrupt.c
       (based on Richard Woodruff's patch for arm925, 16 Oct 03)
  Fix for a timer bug in OMAP1610 Innovator
  Add support for CS0 (ROM)/CS3 (Flash) boot in OMAP1610 Innovator and H2

* Patches by Stephan Linz, 12 Feb 2004:
  - add support for NIOS timer with variable period preload counter value
  - prepare POST framework support for NIOS targets

* Patch by Denis Peter, 11 Feb 2004:
  add POST support for the MIP405 board
diff --git a/cpu/74xx_7xx/traps.c b/cpu/74xx_7xx/traps.c
index 6e94601..ac5f8bf 100644
--- a/cpu/74xx_7xx/traps.c
+++ b/cpu/74xx_7xx/traps.c
@@ -140,19 +140,18 @@
 	printf("Machine check in kernel mode.\n");
 	printf("Caused by (from msr): ");
 	printf("regs %p ",regs);
-	switch( regs->msr & 0x0000F000)
-	{
-	case (1<<12) :
+	switch( regs->msr & 0x000F0000) {
+	case (0x80000000>>12):
 		printf("Machine check signal - probably due to mm fault\n"
 			"with mmu off\n");
 		break;
-	case (1<<13) :
+	case (0x80000000>>13):
 		printf("Transfer error ack signal\n");
 		break;
-	case (1<<14) :
+	case (0x80000000>>14):
 		printf("Data parity signal\n");
 		break;
-	case (1<<15) :
+	case (0x80000000>>15):
 		printf("Address parity signal\n");
 		break;
 	default:
diff --git a/cpu/arm926ejs/interrupts.c b/cpu/arm926ejs/interrupts.c
index 3985217..4d6efeb 100644
--- a/cpu/arm926ejs/interrupts.c
+++ b/cpu/arm926ejs/interrupts.c
@@ -1,4 +1,7 @@
 /*
+ * (C) Copyright 2003
+ * Texas Instruments <www.ti.com>
+ *
  * (C) Copyright 2002
  * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
  * Marius Groeger <mgroeger@sysgo.de>
@@ -31,7 +34,6 @@
 
 #include <common.h>
 #include <arm925t.h>
-#include <configs/omap1510.h>
 
 #include <asm/proc-armv/ptrace.h>
 
@@ -47,12 +49,14 @@
 {
 	unsigned long temp;
 	__asm__ __volatile__("mrs %0, cpsr\n"
-		"bic %0, %0, #0x80\n"
-		"msr cpsr_c, %0"
-		: "=r" (temp)
-		: "memory");
+			     "bic %0, %0, #0x80\n"
+			     "msr cpsr_c, %0"
+			     : "=r" (temp)
+			     :
+			     : "memory");
 }
 
+
 /*
  * disable IRQ/FIQ interrupts
  * returns true if interrupts had been enabled before we disabled them
@@ -61,10 +65,11 @@
 {
 	unsigned long old,temp;
 	__asm__ __volatile__("mrs %0, cpsr\n"
-		"orr %1, %0, #0xc0\n"
-		"msr cpsr_c, %1"
-		: "=r" (old), "=r" (temp)
-		: "memory");
+			     "orr %1, %0, #0xc0\n"
+			     "msr cpsr_c, %1"
+			     : "=r" (old), "=r" (temp)
+			     :
+			     : "memory");
 	return (old & 0x80) == 0;
 }
 #else
@@ -179,10 +184,14 @@
 {
 	int32_t val;
 
+	/* Start the decrementer ticking down from 0xffffffff */
 	*((int32_t *) (CFG_TIMERBASE + LOAD_TIM)) = TIMER_LOAD_VAL;
-	val = MPUTIM_ST | MPUTIM_AR | MPUTIM_CLOCK_ENABLE |
-			(CFG_PVT << MPUTIM_PTV_BIT);
+	val = MPUTIM_ST | MPUTIM_AR | MPUTIM_CLOCK_ENABLE | (CFG_PVT << MPUTIM_PTV_BIT);
 	*((int32_t *) (CFG_TIMERBASE + CNTL_TIMER)) = val;
+
+	/* init the timestamp and lastdec value */
+	reset_timer_masked();
+
 	return (0);
 }
 
@@ -205,44 +214,50 @@
 	timestamp = t;
 }
 
-/* very rough timer... */
+/* delay x useconds AND perserve advance timstamp value */
 void udelay (unsigned long usec)
 {
-#ifdef CONFIG_INNOVATOROMAP1610
-#define LOOPS_PER_MSEC 100		/* tuned on omap1610 */
-	volatile int i, time_remaining = LOOPS_PER_MSEC * usec;
+	ulong tmo, tmp;
 
-	for (i = time_remaining; i > 0; i--) {
+	if(usec >= 1000){               /* if "big" number, spread normalization to seconds */
+		tmo = usec / 1000;      /* start to normalize for usec to ticks per sec */
+		tmo *= CFG_HZ;          /* find number of "ticks" to wait to achieve target */
+		tmo /= 1000;            /* finish normalize. */
+	}else{                          /* else small number, don't kill it prior to HZ multiply */
+		tmo = usec * CFG_HZ;
+		tmo /= (1000*1000);
 	}
-#else
 
-	ulong tmo;
-	tmo = usec / 1000;
-	tmo *= CFG_HZ;
-	tmo /= 1000;
-	tmo += get_timer (0);
-	while (get_timer_masked () < tmo)
+	tmp = get_timer (0);		/* get current timestamp */
+	if( (tmo + tmp) < tmp ) 	/* if setting this fordward will roll time stamp */
+		reset_timer_masked ();	/* reset "advancing" timestamp to 0, set lastdec value */
+	else
+		tmo += tmp;		/* else, set advancing stamp wake up time */
+
+	while (get_timer_masked () < tmo)/* loop till event */
 		/*NOP*/;
-#endif
 }
 
 void reset_timer_masked (void)
 {
 	/* reset time */
-	lastdec = READ_TIMER;
-	timestamp = 0;
+	lastdec = READ_TIMER;  /* capure current decrementer value time */
+	timestamp = 0;         /* start "advancing" time stamp from 0 */
 }
 
 ulong get_timer_masked (void)
 {
 	ulong now = READ_TIMER;		/* current tick value */
 
-	if (lastdec >= now) {		/* did I roll (rem decrementer) */
+	if (lastdec >= now) {		/* normal mode (non roll) */
 		/* normal mode */
-		/* record amount of time since last check */
-		timestamp += lastdec - now;
-	} else {
-		/* we have an overflow ... */
+		timestamp += lastdec - now; /* move stamp fordward with absoulte diff ticks */
+	} else {			/* we have overflow of the count down timer */
+		/* nts = ts + ld + (TLV - now)
+		 * ts=old stamp, ld=time that passed before passing through -1
+		 * (TLV-now) amount of time after passing though -1
+		 * nts = new "advancing time stamp"...it could also roll and cause problems.
+		 */
 		timestamp += lastdec + TIMER_LOAD_VAL - now;
 	}
 	lastdec = now;
@@ -250,25 +265,24 @@
 	return timestamp;
 }
 
+/* waits specified delay value and resets timestamp */
 void udelay_masked (unsigned long usec)
 {
-#ifdef CONFIG_INNOVATOROMAP1610
-	#define LOOPS_PER_MSEC 100 /* tuned on omap1610 */
-	volatile int i, time_remaining = LOOPS_PER_MSEC*usec;
-	for (i=time_remaining; i>0; i--) { }
-#else
+	ulong tmo, tmp;
 
-	ulong tmo;
+	if(usec >= 1000){               /* if "big" number, spread normalization to seconds */
+		tmo = usec / 1000;      /* start to normalize for usec to ticks per sec */
+		tmo *= CFG_HZ;          /* find number of "ticks" to wait to achieve target */
+		tmo /= 1000;            /* finish normalize. */
+	}else{                          /* else small number, don't kill it prior to HZ multiply */
+		tmo = usec * CFG_HZ;
+		tmo /= (1000*1000);
+	}
 
-	tmo = usec / 1000;
-	tmo *= CFG_HZ;
-	tmo /= 1000;
+	reset_timer_masked ();	/* set "advancing" timestamp to 0, set lastdec vaule */
 
-	reset_timer_masked ();
-
-	while (get_timer_masked () < tmo)
+	while (get_timer_masked () < tmo) /* wait for time stamp to overtake tick number.*/
 		/*NOP*/;
-#endif
 }
 
 /*
@@ -287,6 +301,7 @@
 ulong get_tbclk (void)
 {
 	ulong tbclk;
+
 	tbclk = CFG_HZ;
 	return tbclk;
 }
diff --git a/cpu/mpc5xx/traps.c b/cpu/mpc5xx/traps.c
index 41939c1..14fd59e 100644
--- a/cpu/mpc5xx/traps.c
+++ b/cpu/mpc5xx/traps.c
@@ -139,18 +139,17 @@
 	printf("Machine check in kernel mode.\n");
 	printf("Caused by (from msr): ");
 	printf("regs %p ",regs);
-	switch( regs->msr & 0x0000F000)
-	{
-	case (1<<12) :
+	switch( regs->msr & 0x000F0000) {
+	case (0x80000000>>12):
 		printf("Machine check signal\n");
 		break;
-	case (1<<13) :
+	case (0x80000000>>13):
 		printf("Transfer error ack signal\n");
 		break;
-	case (1<<14) :
+	case (0x80000000>>14):
 		printf("Data parity signal\n");
 		break;
-	case (1<<15) :
+	case (0x80000000>>15):
 		printf("Address parity signal\n");
 		break;
 	default:
diff --git a/cpu/mpc5xxx/traps.c b/cpu/mpc5xxx/traps.c
index 5d43394..2ee782b 100644
--- a/cpu/mpc5xxx/traps.c
+++ b/cpu/mpc5xxx/traps.c
@@ -5,6 +5,7 @@
  *
  * Modified by Cort Dougan (cort@cs.nmt.edu)
  * and Paul Mackerras (paulus@cs.anu.edu.au)
+ * fixed Machine Check Reasons by Reinhard Meyer (r.meyer@emk-elektronik.de)
  *
  * (C) Copyright 2000-2003
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -130,19 +131,20 @@
 	printf("Machine check in kernel mode.\n");
 	printf("Caused by (from msr): ");
 	printf("regs %p ",regs);
-	switch( regs->msr & 0x0000F000)
+	/* refer to 603e Manual (MPC603EUM/AD), chapter 4.5.2.1 */
+	switch( regs->msr & 0x000F0000)
 	{
-	case (1<<12) :
+	case (0x80000000>>12) :
 		printf("Machine check signal - probably due to mm fault\n"
 			"with mmu off\n");
 		break;
-	case (1<<13) :
+	case (0x80000000>>13) :
 		printf("Transfer error ack signal\n");
 		break;
-	case (1<<14) :
+	case (0x80000000>>14) :
 		printf("Data parity signal\n");
 		break;
-	case (1<<15) :
+	case (0x80000000>>15) :
 		printf("Address parity signal\n");
 		break;
 	default:
diff --git a/cpu/mpc824x/traps.c b/cpu/mpc824x/traps.c
index 956244f..071d003 100644
--- a/cpu/mpc824x/traps.c
+++ b/cpu/mpc824x/traps.c
@@ -120,19 +120,18 @@
 	printf("Machine check in kernel mode.\n");
 	printf("Caused by (from msr): ");
 	printf("regs %p ",regs);
-	switch( regs->msr & 0x0000F000)
-	{
-	case (1<<12) :
+	switch( regs->msr & 0x000F0000) {
+	case (0x80000000>>12):
 		printf("Machine check signal - probably due to mm fault\n"
 			"with mmu off\n");
 		break;
-	case (1<<13) :
+	case (0x80000000>>13):
 		printf("Transfer error ack signal\n");
 		break;
-	case (1<<14) :
+	case (0x80000000>>14):
 		printf("Data parity signal\n");
 		break;
-	case (1<<15) :
+	case (0x80000000>>15):
 		printf("Address parity signal\n");
 		break;
 	default:
diff --git a/cpu/mpc8260/traps.c b/cpu/mpc8260/traps.c
index deab808..693db39 100644
--- a/cpu/mpc8260/traps.c
+++ b/cpu/mpc8260/traps.c
@@ -158,18 +158,18 @@
 	printf("Machine check in kernel mode.\n");
 	printf("Caused by (from msr): ");
 	printf("regs %p ",regs);
-	switch( regs->msr & 0x0000F000) {
-	case (1<<12) :
+	switch( regs->msr & 0x000F0000) {
+	case (0x80000000>>12):
 		printf("Machine check signal - probably due to mm fault\n"
 			"with mmu off\n");
 		break;
-	case (1<<13) :
+	case (0x80000000>>13):
 		printf("Transfer error ack signal\n");
 		break;
-	case (1<<14) :
+	case (0x80000000>>14):
 		printf("Data parity signal\n");
 		break;
-	case (1<<15) :
+	case (0x80000000>>15):
 		printf("Address parity signal\n");
 		break;
 	default:
diff --git a/cpu/mpc85xx/traps.c b/cpu/mpc85xx/traps.c
index fd0b436..a348eab 100644
--- a/cpu/mpc85xx/traps.c
+++ b/cpu/mpc85xx/traps.c
@@ -164,19 +164,18 @@
 	printf("Machine check in kernel mode.\n");
 	printf("Caused by (from msr): ");
 	printf("regs %p ",regs);
-	switch( regs->msr & 0x0000F000)
-	{
-	case (1<<12) :
+	switch( regs->msr & 0x000F0000) {
+	case (0x80000000>>12):
 		printf("Machine check signal - probably due to mm fault\n"
 		       "with mmu off\n");
 		break;
-	case (1<<13) :
+	case (0x80000000>>13):
 		printf("Transfer error ack signal\n");
 		break;
-	case (1<<14) :
+	case (0x80000000>>14):
 		printf("Data parity signal\n");
 		break;
-	case (1<<15) :
+	case (0x80000000>>15):
 		printf("Address parity signal\n");
 		break;
 	default:
diff --git a/cpu/mpc8xx/traps.c b/cpu/mpc8xx/traps.c
index c432be6..67b75cc 100644
--- a/cpu/mpc8xx/traps.c
+++ b/cpu/mpc8xx/traps.c
@@ -134,19 +134,18 @@
 	printf("Machine check in kernel mode.\n");
 	printf("Caused by (from msr): ");
 	printf("regs %p ",regs);
-	switch( regs->msr & 0x0000F000)
-	{
-	case (1<<12) :
+	switch( regs->msr & 0x000F0000) {
+	case (0x80000000>>12):
 		printf("Machine check signal - probably due to mm fault\n"
 			"with mmu off\n");
 		break;
-	case (1<<13) :
+	case (0x80000000>>13):
 		printf("Transfer error ack signal\n");
 		break;
-	case (1<<14) :
+	case (0x80000000>>14):
 		printf("Data parity signal\n");
 		break;
-	case (1<<15) :
+	case (0x80000000>>15):
 		printf("Address parity signal\n");
 		break;
 	default:
diff --git a/cpu/nios/interrupts.c b/cpu/nios/interrupts.c
index 31eabde..450946b 100644
--- a/cpu/nios/interrupts.c
+++ b/cpu/nios/interrupts.c
@@ -128,6 +128,10 @@
 
 	tmr->control &= ~NIOS_TIMER_ITO;
 	tmr->control |= NIOS_TIMER_STOP;
+#if defined(CFG_NIOS_TMRCNT)
+	tmr->periodl = CFG_NIOS_TMRCNT & 0xffff;
+	tmr->periodh = (CFG_NIOS_TMRCNT >> 16) & 0xffff;
+#endif
 #endif
 
 	for (vec=0; vec<64; vec++ ) {
diff --git a/cpu/ppc4xx/Makefile b/cpu/ppc4xx/Makefile
index 9b54d32..a841109 100644
--- a/cpu/ppc4xx/Makefile
+++ b/cpu/ppc4xx/Makefile
@@ -28,7 +28,7 @@
 START	= start.o resetvec.o kgdb.o
 AOBJS	= dcr.o
 COBJS	= 405gp_enet.o 405gp_pci.o 440gx_enet.o \
-	  bedbug_405.o \
+	  bedbug_405.o commproc.o \
 	  cpu.o cpu_init.o i2c.o interrupts.o \
 	  miiphy.o miiphy_440.o sdram.o serial.o \
 	  spd_sdram.o speed.o traps.o
diff --git a/cpu/ppc4xx/commproc.c b/cpu/ppc4xx/commproc.c
new file mode 100644
index 0000000..68aab5b
--- /dev/null
+++ b/cpu/ppc4xx/commproc.c
@@ -0,0 +1,69 @@
+/*
+ * (C) Copyright 2000-2004
+ * 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
+ *
+ *
+ * Atapted for ppc4XX by Denis Peter
+ */
+
+#include <common.h>
+#include <commproc.h>
+
+
+#if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER)
+
+void post_word_store (ulong a)
+{
+	volatile void *save_addr = (volatile void *)(CFG_OCM_DATA_ADDR + CFG_POST_WORD_ADDR);
+	*(volatile ulong *) save_addr = a;
+}
+
+ulong post_word_load (void)
+{
+	volatile void *save_addr = (volatile void *)(CFG_OCM_DATA_ADDR + CFG_POST_WORD_ADDR);
+	return *(volatile ulong *) save_addr;
+}
+
+#endif	/* CONFIG_POST || CONFIG_LOGBUFFER*/
+
+#ifdef CONFIG_BOOTCOUNT_LIMIT
+
+void bootcount_store (ulong a)
+{
+	volatile ulong *save_addr =
+		(volatile ulong *)(CFG_OCM_DATA_ADDR + CFG_BOOTCOUNT_ADDR);
+
+	save_addr[0] = a;
+	save_addr[1] = BOOTCOUNT_MAGIC;
+}
+
+ulong bootcount_load (void)
+{
+	volatile ulong *save_addr =
+		(volatile ulong *)(CFG_OCM_DATA_ADDR + CFG_BOOTCOUNT_ADDR);
+
+	if (save_addr[1] != BOOTCOUNT_MAGIC)
+		return 0;
+	else
+		return save_addr[0];
+}
+
+#endif /* CONFIG_BOOTCOUNT_LIMIT */
diff --git a/cpu/ppc4xx/traps.c b/cpu/ppc4xx/traps.c
index 1cf899e..6aecca2 100644
--- a/cpu/ppc4xx/traps.c
+++ b/cpu/ppc4xx/traps.c
@@ -164,19 +164,18 @@
 	printf("Machine check in kernel mode.\n");
 	printf("Caused by (from msr): ");
 	printf("regs %p ",regs);
-	switch( regs->msr & 0x0000F000)
-	{
-	case (1<<12) :
+	switch( regs->msr & 0x000F0000) {
+	case (0x80000000>>12):
 		printf("Machine check signal - probably due to mm fault\n"
 		       "with mmu off\n");
 		break;
-	case (1<<13) :
+	case (0x80000000>>13):
 		printf("Transfer error ack signal\n");
 		break;
-	case (1<<14) :
+	case (0x80000000>>14):
 		printf("Data parity signal\n");
 		break;
-	case (1<<15) :
+	case (0x80000000>>15):
 		printf("Address parity signal\n");
 		break;
 	default: