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 inline void exynos_pcie_writel_rc(struct pcie_port *pp, u32 val, void __iomem *dbi_base) { exynos_pcie_sideband_dbi_w_mode(pp, true); writel(val, dbi_base); exynos_pcie_sideband_dbi_w_mode(pp, false); }
static void exynos_pcie_writel_rc(struct pcie_port *pp, u32 reg, u32 val) { struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); exynos_pcie_sideband_dbi_w_mode(exynos_pcie, true); writel(val, pp->dbi_base + reg); exynos_pcie_sideband_dbi_w_mode(exynos_pcie, false); }
static void exynos_pcie_write_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg, size_t size, u32 val) { struct exynos_pcie *ep = to_exynos_pcie(pci); exynos_pcie_sideband_dbi_w_mode(ep, true); dw_pcie_write(base + reg, size, val); exynos_pcie_sideband_dbi_w_mode(ep, false); }
static int exynos_pcie_wr_own_conf(struct pcie_port *pp, int where, int size, u32 val) { int ret; exynos_pcie_sideband_dbi_w_mode(pp, true); ret = cfg_write(pp->dbi_base + (where & ~0x3), where, size, val); exynos_pcie_sideband_dbi_w_mode(pp, false); return ret; }
static int exynos_pcie_wr_own_conf(struct pcie_port *pp, int where, int size, u32 val) { struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); int ret; exynos_pcie_sideband_dbi_w_mode(exynos_pcie, true); ret = dw_pcie_cfg_write(pp->dbi_base + where, size, val); exynos_pcie_sideband_dbi_w_mode(exynos_pcie, false); return ret; }
static int exynos_pcie_wr_own_conf(struct pcie_port *pp, int where, int size, u32 val) { struct dw_pcie *pci = to_dw_pcie_from_pp(pp); struct exynos_pcie *ep = to_exynos_pcie(pci); int ret; exynos_pcie_sideband_dbi_w_mode(ep, true); ret = dw_pcie_write(pci->dbi_base + where, size, val); exynos_pcie_sideband_dbi_w_mode(ep, false); return ret; }