libpayload: Add init() function to hci_t and rework uhci_reset()

uhci_reset() differs in semantics compared to the other HCI's reset()
implementations. uhci_reset() does some initialization work after a
controller reset. So move the initialization part to a new function,
uhci_reinit(), which get's exported through a new entry in hci_t:
hci_t.init().

Warning: This breaks code that relies on the current, special,
counterintuitive behaviour of uhci_reset(). If one wants a working host
controller after calling hci_t.reset(), he should call hci_t.init()
afterwards.

Change-Id: Ia7ce80865d12d11157645ce251f77f349f8e3c34
Signed-off-by: Nico Huber <nico.huber@secunet.com>
Reviewed-on: http://review.coreboot.org/1851
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
diff --git a/payloads/libpayload/drivers/usb/uhci.c b/payloads/libpayload/drivers/usb/uhci.c
index ab4f798..2eea375 100644
--- a/payloads/libpayload/drivers/usb/uhci.c
+++ b/payloads/libpayload/drivers/usb/uhci.c
@@ -114,7 +114,11 @@
 		udelay (500);
 	if (timeout < 0)
 		usb_debug ("Warning: uhci: host controller reset timed out.\n");
+}
 
+static void
+uhci_reinit (hci_t *controller)
+{
 	uhci_reg_write32 (controller, FLBASEADD,
 			  (u32) virt_to_phys (UHCI_INST (controller)->
 					      framelistptr));
@@ -152,6 +156,7 @@
 	controller->start = uhci_start;
 	controller->stop = uhci_stop;
 	controller->reset = uhci_reset;
+	controller->init = uhci_reinit;
 	controller->shutdown = uhci_shutdown;
 	controller->bulk = uhci_bulk;
 	controller->control = uhci_control;
@@ -228,6 +233,7 @@
 	controller->devices[0]->init = uhci_rh_init;
 	controller->devices[0]->init (controller->devices[0]);
 	uhci_reset (controller);
+	uhci_reinit (controller);
 	return controller;
 }