Lines Matching full:pcie
3 * Qualcomm PCIe root complex driver
31 #include "pcie-designware.h"
176 int (*get_resources)(struct qcom_pcie *pcie);
177 int (*init)(struct qcom_pcie *pcie);
178 int (*post_init)(struct qcom_pcie *pcie);
179 void (*deinit)(struct qcom_pcie *pcie);
180 void (*post_deinit)(struct qcom_pcie *pcie);
181 void (*ltssm_enable)(struct qcom_pcie *pcie);
196 static void qcom_ep_reset_assert(struct qcom_pcie *pcie) in qcom_ep_reset_assert() argument
198 gpiod_set_value_cansleep(pcie->reset, 1); in qcom_ep_reset_assert()
202 static void qcom_ep_reset_deassert(struct qcom_pcie *pcie) in qcom_ep_reset_deassert() argument
206 gpiod_set_value_cansleep(pcie->reset, 0); in qcom_ep_reset_deassert()
210 static int qcom_pcie_establish_link(struct qcom_pcie *pcie) in qcom_pcie_establish_link() argument
212 struct dw_pcie *pci = pcie->pci; in qcom_pcie_establish_link()
218 if (pcie->ops->ltssm_enable) in qcom_pcie_establish_link()
219 pcie->ops->ltssm_enable(pcie); in qcom_pcie_establish_link()
224 static void qcom_pcie_2_1_0_ltssm_enable(struct qcom_pcie *pcie) in qcom_pcie_2_1_0_ltssm_enable() argument
229 val = readl(pcie->elbi + PCIE20_ELBI_SYS_CTRL); in qcom_pcie_2_1_0_ltssm_enable()
231 writel(val, pcie->elbi + PCIE20_ELBI_SYS_CTRL); in qcom_pcie_2_1_0_ltssm_enable()
234 static int qcom_pcie_get_resources_2_1_0(struct qcom_pcie *pcie) in qcom_pcie_get_resources_2_1_0() argument
236 struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0; in qcom_pcie_get_resources_2_1_0()
237 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_2_1_0()
289 static void qcom_pcie_deinit_2_1_0(struct qcom_pcie *pcie) in qcom_pcie_deinit_2_1_0() argument
291 struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0; in qcom_pcie_deinit_2_1_0()
301 writel(1, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_deinit_2_1_0()
306 static int qcom_pcie_init_2_1_0(struct qcom_pcie *pcie) in qcom_pcie_init_2_1_0() argument
308 struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0; in qcom_pcie_init_2_1_0()
309 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_2_1_0()
315 /* reset the PCIe interface as uboot can leave it undefined state */ in qcom_pcie_init_2_1_0()
323 writel(1, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_1_0()
371 /* enable PCIe clocks and resets */ in qcom_pcie_init_2_1_0()
372 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_1_0()
374 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_1_0()
376 if (of_device_is_compatible(node, "qcom,pcie-ipq8064") || in qcom_pcie_init_2_1_0()
377 of_device_is_compatible(node, "qcom,pcie-ipq8064-v2")) { in qcom_pcie_init_2_1_0()
381 pcie->parf + PCIE20_PARF_PCS_DEEMPH); in qcom_pcie_init_2_1_0()
384 pcie->parf + PCIE20_PARF_PCS_SWING); in qcom_pcie_init_2_1_0()
385 writel(PHY_RX0_EQ(4), pcie->parf + PCIE20_PARF_CONFIG_BITS); in qcom_pcie_init_2_1_0()
388 if (of_device_is_compatible(node, "qcom,pcie-ipq8064")) { in qcom_pcie_init_2_1_0()
390 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_1_0()
393 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_1_0()
397 val = readl(pcie->parf + PCIE20_PARF_PHY_REFCLK); in qcom_pcie_init_2_1_0()
399 if (!of_device_is_compatible(node, "qcom,pcie-apq8064")) in qcom_pcie_init_2_1_0()
402 writel(val, pcie->parf + PCIE20_PARF_PHY_REFCLK); in qcom_pcie_init_2_1_0()
433 static int qcom_pcie_get_resources_1_0_0(struct qcom_pcie *pcie) in qcom_pcie_get_resources_1_0_0() argument
435 struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0; in qcom_pcie_get_resources_1_0_0()
436 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_1_0_0()
463 static void qcom_pcie_deinit_1_0_0(struct qcom_pcie *pcie) in qcom_pcie_deinit_1_0_0() argument
465 struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0; in qcom_pcie_deinit_1_0_0()
475 static int qcom_pcie_init_1_0_0(struct qcom_pcie *pcie) in qcom_pcie_init_1_0_0() argument
477 struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0; in qcom_pcie_init_1_0_0()
478 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_1_0_0()
519 writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR); in qcom_pcie_init_1_0_0()
522 u32 val = readl(pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT); in qcom_pcie_init_1_0_0()
525 writel(val, pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT); in qcom_pcie_init_1_0_0()
543 static void qcom_pcie_2_3_2_ltssm_enable(struct qcom_pcie *pcie) in qcom_pcie_2_3_2_ltssm_enable() argument
548 val = readl(pcie->parf + PCIE20_PARF_LTSSM); in qcom_pcie_2_3_2_ltssm_enable()
550 writel(val, pcie->parf + PCIE20_PARF_LTSSM); in qcom_pcie_2_3_2_ltssm_enable()
553 static int qcom_pcie_get_resources_2_3_2(struct qcom_pcie *pcie) in qcom_pcie_get_resources_2_3_2() argument
555 struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2; in qcom_pcie_get_resources_2_3_2()
556 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_2_3_2()
587 static void qcom_pcie_deinit_2_3_2(struct qcom_pcie *pcie) in qcom_pcie_deinit_2_3_2() argument
589 struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2; in qcom_pcie_deinit_2_3_2()
599 static void qcom_pcie_post_deinit_2_3_2(struct qcom_pcie *pcie) in qcom_pcie_post_deinit_2_3_2() argument
601 struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2; in qcom_pcie_post_deinit_2_3_2()
606 static int qcom_pcie_init_2_3_2(struct qcom_pcie *pcie) in qcom_pcie_init_2_3_2() argument
608 struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2; in qcom_pcie_init_2_3_2()
609 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_2_3_2()
644 /* enable PCIe clocks and resets */ in qcom_pcie_init_2_3_2()
645 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_3_2()
647 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_3_2()
650 writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR); in qcom_pcie_init_2_3_2()
653 val = readl(pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_3_2()
655 writel(val, pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_3_2()
657 val = readl(pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_3_2()
659 writel(val, pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_3_2()
661 val = readl(pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2); in qcom_pcie_init_2_3_2()
663 writel(val, pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2); in qcom_pcie_init_2_3_2()
680 static int qcom_pcie_post_init_2_3_2(struct qcom_pcie *pcie) in qcom_pcie_post_init_2_3_2() argument
682 struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2; in qcom_pcie_post_init_2_3_2()
683 struct dw_pcie *pci = pcie->pci; in qcom_pcie_post_init_2_3_2()
696 static int qcom_pcie_get_resources_2_4_0(struct qcom_pcie *pcie) in qcom_pcie_get_resources_2_4_0() argument
698 struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0; in qcom_pcie_get_resources_2_4_0()
699 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_2_4_0()
701 bool is_ipq = of_device_is_compatible(dev->of_node, "qcom,pcie-ipq4019"); in qcom_pcie_get_resources_2_4_0()
709 /* qcom,pcie-ipq4019 is defined without "iface" */ in qcom_pcie_get_resources_2_4_0()
779 static void qcom_pcie_deinit_2_4_0(struct qcom_pcie *pcie) in qcom_pcie_deinit_2_4_0() argument
781 struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0; in qcom_pcie_deinit_2_4_0()
795 static int qcom_pcie_init_2_4_0(struct qcom_pcie *pcie) in qcom_pcie_init_2_4_0() argument
797 struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0; in qcom_pcie_init_2_4_0()
798 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_2_4_0()
925 /* enable PCIe clocks and resets */ in qcom_pcie_init_2_4_0()
926 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_4_0()
928 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_4_0()
931 writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR); in qcom_pcie_init_2_4_0()
934 val = readl(pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_4_0()
936 writel(val, pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_4_0()
938 val = readl(pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_4_0()
940 writel(val, pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_4_0()
942 val = readl(pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2); in qcom_pcie_init_2_4_0()
944 writel(val, pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2); in qcom_pcie_init_2_4_0()
969 static int qcom_pcie_get_resources_2_3_3(struct qcom_pcie *pcie) in qcom_pcie_get_resources_2_3_3() argument
971 struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3; in qcom_pcie_get_resources_2_3_3()
972 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_2_3_3()
1008 static void qcom_pcie_deinit_2_3_3(struct qcom_pcie *pcie) in qcom_pcie_deinit_2_3_3() argument
1010 struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3; in qcom_pcie_deinit_2_3_3()
1019 static int qcom_pcie_init_2_3_3(struct qcom_pcie *pcie) in qcom_pcie_init_2_3_3() argument
1021 struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3; in qcom_pcie_init_2_3_3()
1022 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_2_3_3()
1084 pcie->parf + PCIE20_v3_PARF_SLV_ADDR_SPACE_SIZE); in qcom_pcie_init_2_3_3()
1086 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_3_3()
1088 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_3_3()
1090 writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR); in qcom_pcie_init_2_3_3()
1095 pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_3_3()
1096 writel(0, pcie->parf + PCIE20_PARF_Q2A_FLUSH); in qcom_pcie_init_2_3_3()
1130 static int qcom_pcie_get_resources_2_7_0(struct qcom_pcie *pcie) in qcom_pcie_get_resources_2_7_0() argument
1132 struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; in qcom_pcie_get_resources_2_7_0()
1133 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_2_7_0()
1163 static int qcom_pcie_init_2_7_0(struct qcom_pcie *pcie) in qcom_pcie_init_2_7_0() argument
1165 struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; in qcom_pcie_init_2_7_0()
1166 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_2_7_0()
1201 /* configure PCIe to RC mode */ in qcom_pcie_init_2_7_0()
1202 writel(DEVICE_TYPE_RC, pcie->parf + PCIE20_PARF_DEVICE_TYPE); in qcom_pcie_init_2_7_0()
1204 /* enable PCIe clocks and resets */ in qcom_pcie_init_2_7_0()
1205 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_7_0()
1207 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_7_0()
1210 writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR); in qcom_pcie_init_2_7_0()
1213 val = readl(pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_7_0()
1215 writel(val, pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_7_0()
1217 val = readl(pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_7_0()
1219 writel(val, pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_7_0()
1222 val = readl(pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT); in qcom_pcie_init_2_7_0()
1224 writel(val, pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT); in qcom_pcie_init_2_7_0()
1236 static void qcom_pcie_deinit_2_7_0(struct qcom_pcie *pcie) in qcom_pcie_deinit_2_7_0() argument
1238 struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; in qcom_pcie_deinit_2_7_0()
1244 static int qcom_pcie_post_init_2_7_0(struct qcom_pcie *pcie) in qcom_pcie_post_init_2_7_0() argument
1246 struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; in qcom_pcie_post_init_2_7_0()
1251 static void qcom_pcie_post_deinit_2_7_0(struct qcom_pcie *pcie) in qcom_pcie_post_deinit_2_7_0() argument
1253 struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; in qcom_pcie_post_deinit_2_7_0()
1269 struct qcom_pcie *pcie = to_qcom_pcie(pci); in qcom_pcie_host_init() local
1272 qcom_ep_reset_assert(pcie); in qcom_pcie_host_init()
1274 ret = pcie->ops->init(pcie); in qcom_pcie_host_init()
1278 ret = phy_power_on(pcie->phy); in qcom_pcie_host_init()
1282 if (pcie->ops->post_init) { in qcom_pcie_host_init()
1283 ret = pcie->ops->post_init(pcie); in qcom_pcie_host_init()
1291 qcom_ep_reset_deassert(pcie); in qcom_pcie_host_init()
1293 ret = qcom_pcie_establish_link(pcie); in qcom_pcie_host_init()
1299 qcom_ep_reset_assert(pcie); in qcom_pcie_host_init()
1300 if (pcie->ops->post_deinit) in qcom_pcie_host_init()
1301 pcie->ops->post_deinit(pcie); in qcom_pcie_host_init()
1303 phy_power_off(pcie->phy); in qcom_pcie_host_init()
1305 pcie->ops->deinit(pcie); in qcom_pcie_host_init()
1376 struct qcom_pcie *pcie; in qcom_pcie_probe() local
1379 pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL); in qcom_pcie_probe()
1380 if (!pcie) in qcom_pcie_probe()
1396 pcie->pci = pci; in qcom_pcie_probe()
1398 pcie->ops = of_device_get_match_data(dev); in qcom_pcie_probe()
1400 pcie->reset = devm_gpiod_get_optional(dev, "perst", GPIOD_OUT_HIGH); in qcom_pcie_probe()
1401 if (IS_ERR(pcie->reset)) { in qcom_pcie_probe()
1402 ret = PTR_ERR(pcie->reset); in qcom_pcie_probe()
1406 pcie->parf = devm_platform_ioremap_resource_byname(pdev, "parf"); in qcom_pcie_probe()
1407 if (IS_ERR(pcie->parf)) { in qcom_pcie_probe()
1408 ret = PTR_ERR(pcie->parf); in qcom_pcie_probe()
1419 pcie->elbi = devm_platform_ioremap_resource_byname(pdev, "elbi"); in qcom_pcie_probe()
1420 if (IS_ERR(pcie->elbi)) { in qcom_pcie_probe()
1421 ret = PTR_ERR(pcie->elbi); in qcom_pcie_probe()
1425 pcie->phy = devm_phy_optional_get(dev, "pciephy"); in qcom_pcie_probe()
1426 if (IS_ERR(pcie->phy)) { in qcom_pcie_probe()
1427 ret = PTR_ERR(pcie->phy); in qcom_pcie_probe()
1431 ret = pcie->ops->get_resources(pcie); in qcom_pcie_probe()
1445 ret = phy_init(pcie->phy); in qcom_pcie_probe()
1451 platform_set_drvdata(pdev, pcie); in qcom_pcie_probe()
1470 { .compatible = "qcom,pcie-apq8084", .data = &ops_1_0_0 },
1471 { .compatible = "qcom,pcie-ipq8064", .data = &ops_2_1_0 },
1472 { .compatible = "qcom,pcie-ipq8064-v2", .data = &ops_2_1_0 },
1473 { .compatible = "qcom,pcie-apq8064", .data = &ops_2_1_0 },
1474 { .compatible = "qcom,pcie-msm8996", .data = &ops_2_3_2 },
1475 { .compatible = "qcom,pcie-ipq8074", .data = &ops_2_3_3 },
1476 { .compatible = "qcom,pcie-ipq4019", .data = &ops_2_4_0 },
1477 { .compatible = "qcom,pcie-qcs404", .data = &ops_2_4_0 },
1478 { .compatible = "qcom,pcie-sdm845", .data = &ops_2_7_0 },
1497 .name = "qcom-pcie",