[coreboot] New patch to review for coreboot: 8141a15 libpayload: Correct port power settings for EHCI root hub

Nico Huber (nico.huber@secunet.com) gerrit at coreboot.org
Thu May 31 15:41:35 CEST 2012


Nico Huber (nico.huber at secunet.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/1078

-gerrit

commit 8141a15f6aa96be6c388421fa190950cfbaf9f55
Author: Nico Huber <nico.huber at secunet.com>
Date:   Mon May 21 14:56:21 2012 +0200

    libpayload: Correct port power settings for EHCI root hub
    
    Enable power on EHCI root hub ports only if the controller supports it.
    Wait 20ms for the power to become stable.
    
    Change-Id: I8897756ed2bfcb88408fe5e9f9e3f8af5dd900ac
    Signed-off-by: Nico Huber <nico.huber at secunet.com>
---
 payloads/libpayload/drivers/usb/ehci_private.h |    1 +
 payloads/libpayload/drivers/usb/ehci_rh.c      |   13 ++++++++++++-
 2 files changed, 13 insertions(+), 1 deletions(-)

diff --git a/payloads/libpayload/drivers/usb/ehci_private.h b/payloads/libpayload/drivers/usb/ehci_private.h
index 6fa5f03..8ac15b3 100644
--- a/payloads/libpayload/drivers/usb/ehci_private.h
+++ b/payloads/libpayload/drivers/usb/ehci_private.h
@@ -49,6 +49,7 @@ typedef volatile u32 portsc_t;
 
 typedef volatile struct {
 #define HCS_NPORTS_MASK 0xf
+#define HCS_PORT_POWER_CONTROL 0x10
 	u8 caplength;
 	u8 res1;
 	u16 hciversion;
diff --git a/payloads/libpayload/drivers/usb/ehci_rh.c b/payloads/libpayload/drivers/usb/ehci_rh.c
index aeead3b..5f92bd7 100644
--- a/payloads/libpayload/drivers/usb/ehci_rh.c
+++ b/payloads/libpayload/drivers/usb/ehci_rh.c
@@ -159,10 +159,21 @@ ehci_rh_init (usbdev_t *dev)
 
 	debug("root hub has %x ports\n", RH_INST(dev)->n_ports);
 
+	/* If the host controller has port power control, enable power on
+	 * all ports and wait 20ms.
+	 */
+	if (EHCI_INST(dev->controller)->capabilities->hcsparams
+			& HCS_PORT_POWER_CONTROL) {
+		debug("host controller has port power control, "
+				"giving power to all ports.\n");
+		for (i=0; i < RH_INST(dev)->n_ports; i++)
+			RH_INST(dev)->ports[i] |= P_PP;
+	}
+	mdelay(20); // ehci spec 2.3.9
+
 	RH_INST(dev)->devices = malloc(RH_INST(dev)->n_ports * sizeof(int));
 	for (i=0; i < RH_INST(dev)->n_ports; i++) {
 		RH_INST(dev)->devices[i] = -1;
-		RH_INST(dev)->ports[i] |= P_PP;
 		ehci_rh_scanport(dev, i);
 	}
 




More information about the coreboot mailing list