diff options
author | Russell King <rmk+kernel@armlinux.org.uk> | 2016-07-09 10:58:16 +0100 |
---|---|---|
committer | Russell King <rmk+kernel@armlinux.org.uk> | 2017-07-07 16:01:02 +0100 |
commit | 115ad55a086b7025d24afca19bf7b89be818e70d (patch) | |
tree | 1d4241ae319b7cba8e1cce92b7c07dba8dccf3d2 | |
parent | 6f7da290413ba713f0cdd9ff1a2a9bb129ef4f6c (diff) |
pci: mvebu: time out reset on link up
If the port reports that the link is up while we are resetting, there's
little point in waiting for the full duration.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-rw-r--r-- | drivers/pci/host/pci-mvebu.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/pci/host/pci-mvebu.c b/drivers/pci/host/pci-mvebu.c index f353a6eb2f01..e0300c67abf6 100644 --- a/drivers/pci/host/pci-mvebu.c +++ b/drivers/pci/host/pci-mvebu.c @@ -1167,6 +1167,7 @@ static int mvebu_pcie_powerup(struct mvebu_pcie_port *port) if (port->reset_gpio) { u32 reset_udelay = PCI_PM_D3COLD_WAIT * 1000; + unsigned int i; of_property_read_u32(port->dn, "reset-delay-us", &reset_udelay); @@ -1174,7 +1175,13 @@ static int mvebu_pcie_powerup(struct mvebu_pcie_port *port) udelay(100); gpiod_set_value_cansleep(port->reset_gpio, 0); - msleep(reset_udelay / 1000); + for (i = 0; i < reset_udelay; i += 1000) { + if (mvebu_pcie_link_up(port)) + break; + msleep(1); + } + + printk("%s: reset completed in %dus\n", port->name, i); } return 0; @@ -1262,15 +1269,16 @@ static int mvebu_pcie_probe(struct platform_device *pdev) if (!child) continue; - ret = mvebu_pcie_powerup(port); - if (ret < 0) - continue; - port->base = mvebu_pcie_map_registers(pdev, child, port); if (IS_ERR(port->base)) { dev_err(dev, "%s: cannot map registers\n", port->name); port->base = NULL; - mvebu_pcie_powerdown(port); + continue; + } + + ret = mvebu_pcie_powerup(port); + if (ret < 0) { + port->base = NULL; continue; } |