aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/pci/host/pci-imx6.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
index 25dde2c7b445..d81da4556c19 100644
--- a/drivers/pci/host/pci-imx6.c
+++ b/drivers/pci/host/pci-imx6.c
@@ -304,6 +304,25 @@ static void imx6_pcie_init_phy(struct pcie_port *pp)
304 IMX6Q_GPR8_TX_SWING_LOW, 127 << 25); 304 IMX6Q_GPR8_TX_SWING_LOW, 127 << 25);
305} 305}
306 306
307static int imx6_pcie_wait_for_link(struct pcie_port *pp)
308{
309 int count = 200;
310
311 while (!dw_pcie_link_up(pp)) {
312 usleep_range(100, 1000);
313 if (--count)
314 continue;
315
316 dev_err(pp->dev, "phy link never came up\n");
317 dev_dbg(pp->dev, "DEBUG_R0: 0x%08x, DEBUG_R1: 0x%08x\n",
318 readl(pp->dbi_base + PCIE_PHY_DEBUG_R0),
319 readl(pp->dbi_base + PCIE_PHY_DEBUG_R1));
320 return -EINVAL;
321 }
322
323 return 0;
324}
325
307static void imx6_pcie_host_init(struct pcie_port *pp) 326static void imx6_pcie_host_init(struct pcie_port *pp)
308{ 327{
309 int count = 0; 328 int count = 0;
@@ -320,20 +339,7 @@ static void imx6_pcie_host_init(struct pcie_port *pp)
320 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, 339 regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
321 IMX6Q_GPR12_PCIE_CTL_2, 1 << 10); 340 IMX6Q_GPR12_PCIE_CTL_2, 1 << 10);
322 341
323 while (!dw_pcie_link_up(pp)) { 342 imx6_pcie_wait_for_link(pp);
324 usleep_range(100, 1000);
325 count++;
326 if (count >= 200) {
327 dev_err(pp->dev, "phy link never came up\n");
328 dev_dbg(pp->dev,
329 "DEBUG_R0: 0x%08x, DEBUG_R1: 0x%08x\n",
330 readl(pp->dbi_base + PCIE_PHY_DEBUG_R0),
331 readl(pp->dbi_base + PCIE_PHY_DEBUG_R1));
332 break;
333 }
334 }
335
336 return;
337} 343}
338 344
339static void imx6_pcie_reset_phy(struct pcie_port *pp) 345static void imx6_pcie_reset_phy(struct pcie_port *pp)