static int exynos_pcie_establish_link(struct pcie_port *pp) { struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); void __iomem *elbi_base = exynos_pcie->elbi_base; void __iomem *pmu_base = exynos_pcie->pmu_base; if (dw_pcie_link_up(pp)) { dev_err(pp->dev, "Link already up\n"); return 0; } writel(1, pmu_base + PCIE_PHY_CONTROL); exynos_pcie_assert_phy_reset(pp); exynos_pcie_sideband_dbi_r_mode(pp, true); exynos_pcie_sideband_dbi_w_mode(pp, true); /* setup root complex */ dw_pcie_setup_rc(pp); exynos_pcie_sideband_dbi_r_mode(pp, false); exynos_pcie_sideband_dbi_w_mode(pp, false); /* assert LTSSM enable */ writel(PCIE_ELBI_LTSSM_ENABLE, elbi_base + PCIE_APP_LTSSM_ENABLE); dev_info(pp->dev, "Link up\n"); return 0; }
static int exynos_pcie_establish_link(struct pcie_port *pp) { u32 val; int count = 0; struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); if (dw_pcie_link_up(pp)) { dev_err(pp->dev, "Link already up\n"); return 0; } /* assert reset signals */ exynos_pcie_assert_core_reset(pp); exynos_pcie_assert_phy_reset(pp); /* de-assert phy reset */ exynos_pcie_deassert_phy_reset(pp); /* initialize phy */ exynos_pcie_init_phy(pp); /* pulse for common reset */ exynos_blk_writel(exynos_pcie, 1, PCIE_PHY_COMMON_RESET); udelay(500); exynos_blk_writel(exynos_pcie, 0, PCIE_PHY_COMMON_RESET); /* de-assert core reset */ exynos_pcie_deassert_core_reset(pp); /* setup root complex */ dw_pcie_setup_rc(pp); /* assert reset signal */ exynos_pcie_assert_reset(pp); /* assert LTSSM enable */ exynos_elb_writel(exynos_pcie, PCIE_ELBI_LTSSM_ENABLE, PCIE_APP_LTSSM_ENABLE); /* check if the link is up or not */ while (!dw_pcie_link_up(pp)) { mdelay(100); count++; if (count == 10) { while (exynos_phy_readl(exynos_pcie, PCIE_PHY_PLL_LOCKED) == 0) { val = exynos_blk_readl(exynos_pcie, PCIE_PHY_PLL_LOCKED); dev_info(pp->dev, "PLL Locked: 0x%x\n", val); } dev_err(pp->dev, "PCIe Link Fail\n"); return -EINVAL; } } dev_info(pp->dev, "Link up\n"); return 0; }
static int exynos_pcie_establish_link(struct exynos_pcie *exynos_pcie) { struct pcie_port *pp = &exynos_pcie->pp; struct device *dev = pp->dev; u32 val; if (dw_pcie_link_up(pp)) { dev_err(dev, "Link already up\n"); return 0; } exynos_pcie_assert_core_reset(exynos_pcie); exynos_pcie_assert_phy_reset(exynos_pcie); exynos_pcie_deassert_phy_reset(exynos_pcie); exynos_pcie_power_on_phy(exynos_pcie); exynos_pcie_init_phy(exynos_pcie); /* pulse for common reset */ exynos_blk_writel(exynos_pcie, 1, PCIE_PHY_COMMON_RESET); udelay(500); exynos_blk_writel(exynos_pcie, 0, PCIE_PHY_COMMON_RESET); exynos_pcie_deassert_core_reset(exynos_pcie); dw_pcie_setup_rc(pp); exynos_pcie_assert_reset(exynos_pcie); /* assert LTSSM enable */ exynos_elb_writel(exynos_pcie, PCIE_ELBI_LTSSM_ENABLE, PCIE_APP_LTSSM_ENABLE); /* check if the link is up or not */ if (!dw_pcie_wait_for_link(pp)) return 0; while (exynos_phy_readl(exynos_pcie, PCIE_PHY_PLL_LOCKED) == 0) { val = exynos_blk_readl(exynos_pcie, PCIE_PHY_PLL_LOCKED); dev_info(dev, "PLL Locked: 0x%x\n", val); } exynos_pcie_power_off_phy(exynos_pcie); return -ETIMEDOUT; }