static void exynos_pcie_assert_phy_reset(struct pcie_port *pp) { struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); exynos_blk_writel(exynos_pcie, 0, PCIE_PHY_MAC_RESET); exynos_blk_writel(exynos_pcie, 1, PCIE_PHY_GLOBAL_RESET); }
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 void exynos_pcie_deassert_phy_reset(struct exynos_pcie *exynos_pcie) { exynos_blk_writel(exynos_pcie, 0, PCIE_PHY_GLOBAL_RESET); exynos_elb_writel(exynos_pcie, 1, PCIE_PWR_RESET); exynos_blk_writel(exynos_pcie, 0, PCIE_PHY_COMMON_RESET); exynos_blk_writel(exynos_pcie, 0, PCIE_PHY_CMN_REG); exynos_blk_writel(exynos_pcie, 0, PCIE_PHY_TRSVREG_RESET); exynos_blk_writel(exynos_pcie, 0, PCIE_PHY_TRSV_RESET); }
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; }
static void exynos_pcie_deassert_core_reset(struct exynos_pcie *exynos_pcie) { u32 val; val = exynos_elb_readl(exynos_pcie, PCIE_CORE_RESET); val |= PCIE_CORE_RESET_ENABLE; exynos_elb_writel(exynos_pcie, val, PCIE_CORE_RESET); exynos_elb_writel(exynos_pcie, 1, PCIE_STICKY_RESET); exynos_elb_writel(exynos_pcie, 1, PCIE_NONSTICKY_RESET); exynos_elb_writel(exynos_pcie, 1, PCIE_APP_INIT_RESET); exynos_elb_writel(exynos_pcie, 0, PCIE_APP_INIT_RESET); exynos_blk_writel(exynos_pcie, 1, PCIE_PHY_MAC_RESET); }
static void exynos_pcie_assert_phy_reset(struct exynos_pcie *exynos_pcie) { exynos_blk_writel(exynos_pcie, 0, PCIE_PHY_MAC_RESET); exynos_blk_writel(exynos_pcie, 1, PCIE_PHY_GLOBAL_RESET); }