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@secunet.com> Reviewed-on: http://review.coreboot.org/1078 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
This commit is contained in:
parent
5f595cb6eb
commit
5c4e7aa9e5
|
@ -49,6 +49,7 @@ typedef volatile u32 portsc_t;
|
||||||
|
|
||||||
typedef volatile struct {
|
typedef volatile struct {
|
||||||
#define HCS_NPORTS_MASK 0xf
|
#define HCS_NPORTS_MASK 0xf
|
||||||
|
#define HCS_PORT_POWER_CONTROL 0x10
|
||||||
u8 caplength;
|
u8 caplength;
|
||||||
u8 res1;
|
u8 res1;
|
||||||
u16 hciversion;
|
u16 hciversion;
|
||||||
|
|
|
@ -137,10 +137,21 @@ ehci_rh_init (usbdev_t *dev)
|
||||||
|
|
||||||
debug("root hub has %x ports\n", RH_INST(dev)->n_ports);
|
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));
|
RH_INST(dev)->devices = malloc(RH_INST(dev)->n_ports * sizeof(int));
|
||||||
for (i=0; i < RH_INST(dev)->n_ports; i++) {
|
for (i=0; i < RH_INST(dev)->n_ports; i++) {
|
||||||
RH_INST(dev)->devices[i] = -1;
|
RH_INST(dev)->devices[i] = -1;
|
||||||
RH_INST(dev)->ports[i] |= P_PP;
|
|
||||||
ehci_rh_scanport(dev, i);
|
ehci_rh_scanport(dev, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue