Fix some endianness issues related to the generic ohci driver
diff --git a/drivers/usb_ohci.c b/drivers/usb_ohci.c
index 482633f..c5e4c38 100644
--- a/drivers/usb_ohci.c
+++ b/drivers/usb_ohci.c
@@ -62,15 +62,20 @@
 #include <usb.h>
 #include "usb_ohci.h"
 
-#undef S3C24X0_merge
+#define S3C24X0_merge
 
 #if defined(CONFIG_ARM920T) || \
     defined(CONFIG_S3C2400) || \
-    defined(CONFIG_S3C2410)
+    defined(CONFIG_S3C2410) || \
+    defined(CONFIG_440EP) || \
+    defined(CONFIG_MPC5200)
 # define OHCI_USE_NPS		/* force NoPowerSwitching mode */
 #endif
 
 #undef OHCI_VERBOSE_DEBUG	/* not always helpful */
+#undef DEBUG
+#undef SHOW_INFO
+#undef OHCI_FILL_TRACE
 
 /* For initializing controller (mask in an HCFS mode too) */
 #define OHCI_CONTROL_INIT \
@@ -95,8 +100,13 @@
 #define info(format, arg...) do {} while(0)
 #endif
 
-#define m16_swap(x) swap_16(x)
-#define m32_swap(x) swap_32(x)
+#if defined(CONFIG_440EP) || defined(CONFIG_MPC5200)
+# define m16_swap(x) (x)
+# define m32_swap(x) (x)
+#else
+# define m16_swap(x) swap_16(x)
+# define m32_swap(x) swap_32(x)
+#endif
 
 /* global ohci_t */
 static ohci_t gohci;
@@ -523,7 +533,7 @@
 		if (ohci->ed_controltail == NULL) {
 			writel (ed, &ohci->regs->ed_controlhead);
 		} else {
-			ohci->ed_controltail->hwNextED = m32_swap (ed);
+			ohci->ed_controltail->hwNextED = m32_swap ((unsigned long)ed);
 		}
 		ed->ed_prev = ohci->ed_controltail;
 		if (!ohci->ed_controltail && !ohci->ed_rm_list[0] &&
@@ -539,7 +549,7 @@
 		if (ohci->ed_bulktail == NULL) {
 			writel (ed, &ohci->regs->ed_bulkhead);
 		} else {
-			ohci->ed_bulktail->hwNextED = m32_swap (ed);
+			ohci->ed_bulktail->hwNextED = m32_swap ((unsigned long)ed);
 		}
 		ed->ed_prev = ohci->ed_bulktail;
 		if (!ohci->ed_bulktail && !ohci->ed_rm_list[0] &&
@@ -635,7 +645,7 @@
 		ed->hwINFO = m32_swap (OHCI_ED_SKIP); /* skip ed */
 		/* dummy td; end of td list for ed */
 		td = td_alloc (usb_dev);
-		ed->hwTailP = m32_swap (td);
+		ed->hwTailP = m32_swap ((unsigned long)td);
 		ed->hwHeadP = ed->hwTailP;
 		ed->state = ED_UNLINK;
 		ed->type = usb_pipetype (pipe);
@@ -693,12 +703,12 @@
 		data = 0;
 
 	td->hwINFO = m32_swap (info);
-	td->hwCBP = m32_swap (data);
+	td->hwCBP = m32_swap ((unsigned long)data);
 	if (data)
-		td->hwBE = m32_swap (data + len - 1);
+		td->hwBE = m32_swap ((unsigned long)(data + len - 1));
 	else
 		td->hwBE = 0;
-	td->hwNextTD = m32_swap (td_pt);
+	td->hwNextTD = m32_swap ((unsigned long)td_pt);
 #ifndef S3C24X0_merge
 	td->hwPSW [0] = m16_swap (((__u32)data & 0x0FFF) | 0xE000);
 #endif
@@ -875,7 +885,12 @@
 		/* see if this done list makes for all TD's of current URB,
 		 * and mark the URB finished if so */
 		if (++(lurb_priv->td_cnt) == lurb_priv->length) {
+#if 1
+			if ((ed->state & (ED_OPER | ED_UNLINK)) &&
+			    (lurb_priv->state != URB_DEL))
+#else
 			if ((ed->state & (ED_OPER | ED_UNLINK)))
+#endif
 				urb_finished = 1;
 			else
 				dbg("dl_done_list: strange.., ED state %x, ed->state\n");
@@ -1068,9 +1083,15 @@
 	}
 
 	bmRType_bReq  = cmd->requesttype | (cmd->request << 8);
+#if defined(CONFIG_440EP) || defined(CONFIG_MPC5200)
+	wValue	      = __swap_16(cmd->value);
+	wIndex	      = __swap_16(cmd->index);
+	wLength	      = __swap_16(cmd->length);
+#else
 	wValue	      = m16_swap (cmd->value);
 	wIndex	      = m16_swap (cmd->index);
 	wLength	      = m16_swap (cmd->length);
+#endif /* CONFIG_440EP || CONFIG_MPC5200 */
 
 	info("Root-Hub: adr: %2x cmd(%1x): %08x %04x %04x %04x",
 		dev->devnum, 8, bmRType_bReq, wValue, wIndex, wLength);
@@ -1084,6 +1105,20 @@
 	   RH_OTHER | RH_CLASS	almost ever means HUB_PORT here
 	*/
 
+#if defined(CONFIG_440EP) || defined(CONFIG_MPC5200)
+	case RH_GET_STATUS:
+			*(__u16 *) data_buf = __swap_16(1); OK (2);
+	case RH_GET_STATUS | RH_INTERFACE:
+			*(__u16 *) data_buf = __swap_16(0); OK (2);
+	case RH_GET_STATUS | RH_ENDPOINT:
+			*(__u16 *) data_buf = __swap_16(0); OK (2);
+	case RH_GET_STATUS | RH_CLASS:
+			*(__u32 *) data_buf = __swap_32(
+				RD_RH_STAT & ~(RH_HS_CRWE | RH_HS_DRWE));
+			OK (4);
+	case RH_GET_STATUS | RH_OTHER | RH_CLASS:
+			*(__u32 *) data_buf = __swap_32(RD_RH_PORTSTAT); OK (4);
+#else
 	case RH_GET_STATUS:
 			*(__u16 *) data_buf = m16_swap (1); OK (2);
 	case RH_GET_STATUS | RH_INTERFACE:
@@ -1096,6 +1131,7 @@
 			OK (4);
 	case RH_GET_STATUS | RH_OTHER | RH_CLASS:
 			*(__u32 *) data_buf = m32_swap (RD_RH_PORTSTAT); OK (4);
+#endif /* CONFIG_440EP || CONFIG_MPC5200 */
 
 	case RH_CLEAR_FEATURE | RH_ENDPOINT:
 		switch (wValue) {
@@ -1294,8 +1330,10 @@
 		return -1;
 	}
 
+#if 0
 	wait_ms(10);
 	/* ohci_dump_status(&gohci); */
+#endif
 
 	/* allow more time for a BULK device to react - some are slow */
 #define BULK_TO	 5000	/* timeout in milliseconds */
@@ -1337,6 +1375,7 @@
 			err("CTL:TIMEOUT ");
 #ifdef S3C24X0_merge
 			dbg("submit_common_msg: TO status %x\n", stat);
+			stat = USB_ST_CRC_ERR;
 			urb_finished = 1;
 #endif
 			stat = USB_ST_CRC_ERR;
@@ -1755,5 +1794,4 @@
 
 	return 0;
 }
-
 #endif /* CONFIG_USB_OHCI_NEW */
diff --git a/include/configs/IceCube.h b/include/configs/IceCube.h
index 1152f83..8753b9f 100644
--- a/include/configs/IceCube.h
+++ b/include/configs/IceCube.h
@@ -94,9 +94,16 @@
 
 /* USB */
 #if 1
-#define CONFIG_USB_OHCI
+#define CONFIG_USB_OHCI_NEW
 #define ADD_USB_CMD             CFG_CMD_USB | CFG_CMD_FAT
 #define CONFIG_USB_STORAGE
+
+#undef CFG_USB_OHCI_BOARD_INIT
+#define CFG_USB_OHCI_CPU_INIT
+#define CFG_USB_OHCI_REGS_BASE	MPC5XXX_USB
+#define CFG_USB_OHCI_SLOT_NAME	"mpc5200"
+#define CFG_USB_OHCI_MAX_ROOT_PORTS	15
+
 #else
 #define ADD_USB_CMD             0
 #endif
diff --git a/include/usb.h b/include/usb.h
index fafac89..419a7e3 100644
--- a/include/usb.h
+++ b/include/usb.h
@@ -230,16 +230,12 @@
 
 /* big endian -> little endian conversion */
 /* some CPUs are already little endian e.g. the ARM920T */
-#ifdef LITTLEENDIAN
-#define swap_16(x) ((unsigned short)(x))
-#define swap_32(x) ((unsigned long)(x))
-#else
-#define swap_16(x) \
+#define __swap_16(x) \
 	({ unsigned short x_ = (unsigned short)x; \
 	 (unsigned short)( \
 		((x_ & 0x00FFU) << 8) | ((x_ & 0xFF00U) >> 8) ); \
 	})
-#define swap_32(x) \
+#define __swap_32(x) \
 	({ unsigned long x_ = (unsigned long)x; \
 	 (unsigned long)( \
 		((x_ & 0x000000FFUL) << 24) | \
@@ -247,6 +243,13 @@
 		((x_ & 0x00FF0000UL) >>	 8) | \
 		((x_ & 0xFF000000UL) >> 24) ); \
 	})
+
+#ifdef LITTLEENDIAN
+# define swap_16(x) (x)
+# define swap_32(x) (x)
+#else
+# define swap_16(x) __swap_16(x)
+# define swap_32(x) __swap_32(x)
 #endif /* LITTLEENDIAN */
 
 /*