USB updates from our internal tree
- support MMC2 devices
- make usb stack more solid
- drop some unused functions
- fix lowspeed/speed naming
- add support for "quirks"
- improve usbhid driver

Signed-off-by: Stefan Reinauer <stepan@coresystems.de>
Acked-by: Joseph Smith <joe@settoplinux.org>


git-svn-id: svn://svn.coreboot.org/coreboot/trunk@5299 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
diff --git a/payloads/libpayload/drivers/usb/usbinit.c b/payloads/libpayload/drivers/usb/usbinit.c
index ead9846..adaba34 100644
--- a/payloads/libpayload/drivers/usb/usbinit.c
+++ b/payloads/libpayload/drivers/usb/usbinit.c
@@ -1,7 +1,7 @@
 /*
  * This file is part of the libpayload project.
  *
- * Copyright (C) 2008 coresystems GmbH
+ * Copyright (C) 2008-2010 coresystems GmbH
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -30,6 +30,9 @@
 #include <libpayload-config.h>
 #include <usb/usb.h>
 #include "uhci.h"
+//#include "ohci.h"
+//#include "ehci.h"
+//#include "xhci.h"
 #include <usb/usbdisk.h>
 
 /**
@@ -58,20 +61,19 @@
 	/* enable busmaster */
 #define PCI_COMMAND 4
 #define PCI_COMMAND_MASTER 4
-	pci_write_config32 (addr, PCI_COMMAND,
-			    pci_read_config32 (addr,
-					       PCI_COMMAND) |
-			    PCI_COMMAND_MASTER);
-
 	if (devclass == 0xc03) {
+		u32 pci_command;
+
+		pci_command =pci_read_config32(addr, PCI_COMMAND);
+		pci_command |= PCI_COMMAND_MASTER;
+		pci_write_config32(addr, PCI_COMMAND, pci_command);
+
 		printf ("%02x:%02x.%x %04x:%04x.%d ", 0, dev, func,
 			pciid >> 16, pciid & 0xFFFF, func);
 		if (prog_if == 0) {
 			printf ("UHCI controller\n");
 #ifdef CONFIG_USB_UHCI
 			uhci_init (addr);
-			usb_poll ();
-			usb_poll ();
 #else
 			printf ("Not supported.\n");
 #endif
@@ -79,7 +81,8 @@
 		if (prog_if == 0x10) {
 			printf ("OHCI controller\n");
 #ifdef CONFIG_USB_OHCI
-			// ohci_init(addr);
+			//ohci_init(addr);
+			printf ("Not supported.\n");
 #else
 			printf ("Not supported.\n");
 #endif
@@ -88,7 +91,18 @@
 		if (prog_if == 0x20) {
 			printf ("EHCI controller\n");
 #ifdef CONFIG_USB_EHCI
-			// ehci_init(addr);
+			//ehci_init(addr);
+			printf ("Not supported.\n");
+#else
+			printf ("Not supported.\n");
+#endif
+
+		}
+		if (prog_if == 0x30) {
+			printf ("XHCI controller\n");
+#ifdef CONFIG_USB_XHCI
+			//xhci_init(addr);
+			printf ("Not supported.\n");
 #else
 			printf ("Not supported.\n");
 #endif
@@ -106,10 +120,17 @@
 usb_initialize (void)
 {
 	int bus, dev, func;
+	/* EHCI is defined by standards to be at a
+	 * higher function than the USB1 controllers.
+	 * We don't want to init USB1 + devices just to
+	 * "steal" those for USB2, so make sure USB2
+	 * comes first.
+	 */
 	for (bus = 0; bus < 256; bus++)
 		for (dev = 0; dev < 32; dev++)
-			for (func = 0; func < 8; func++)
+			for (func = 7; func >= 0 ; func--)
 				usb_controller_initialize (bus, dev, func);
+	usb_poll();
 	return 0;
 }