123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- 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/host/pci-mvebu.c | 20 ++++++++++++++------
- 1 file changed, 14 insertions(+), 6 deletions(-)
- --- a/drivers/pci/host/pci-mvebu.c
- +++ b/drivers/pci/host/pci-mvebu.c
- @@ -1167,6 +1167,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);
- @@ -1174,7 +1175,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;
- @@ -1261,15 +1268,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;
- }
-
|