| From 287b9df160b6159f8d385424904f8bac501280c1 Mon Sep 17 00:00:00 2001 |
| From: Russell King <rmk+kernel@armlinux.org.uk> |
| Date: Sat, 9 Jul 2016 10:58:16 +0100 |
| Subject: 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> |
| --- |
| drivers/pci/controller/pci-mvebu.c | 20 ++++++++++++++------ |
| 1 file changed, 14 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/pci/controller/pci-mvebu.c |
| +++ b/drivers/pci/controller/pci-mvebu.c |
| @@ -944,6 +944,7 @@ static int mvebu_pcie_powerup(struct mve |
| |
| 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); |
| @@ -951,7 +952,13 @@ static int mvebu_pcie_powerup(struct mve |
| 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; |
| @@ -1115,15 +1122,16 @@ static int mvebu_pcie_probe(struct platf |
| 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; |
| } |
| |