Lines Matching +full:pcie +full:- +full:ipq8064
1 // SPDX-License-Identifier: GPL-2.0
3 * Qualcomm PCIe root complex driver
5 * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
8 * Author: Stanimir Varbanov <svarbanov@mm-sol.com>
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);
194 #define to_qcom_pcie(x) dev_get_drvdata((x)->dev)
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()
238 struct device *dev = pci->dev; in qcom_pcie_get_resources_2_1_0()
241 res->supplies[0].supply = "vdda"; in qcom_pcie_get_resources_2_1_0()
242 res->supplies[1].supply = "vdda_phy"; in qcom_pcie_get_resources_2_1_0()
243 res->supplies[2].supply = "vdda_refclk"; in qcom_pcie_get_resources_2_1_0()
244 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(res->supplies), in qcom_pcie_get_resources_2_1_0()
245 res->supplies); in qcom_pcie_get_resources_2_1_0()
249 res->clks[0].id = "iface"; in qcom_pcie_get_resources_2_1_0()
250 res->clks[1].id = "core"; in qcom_pcie_get_resources_2_1_0()
251 res->clks[2].id = "phy"; in qcom_pcie_get_resources_2_1_0()
252 res->clks[3].id = "aux"; in qcom_pcie_get_resources_2_1_0()
253 res->clks[4].id = "ref"; in qcom_pcie_get_resources_2_1_0()
256 ret = devm_clk_bulk_get(dev, 3, res->clks); in qcom_pcie_get_resources_2_1_0()
261 ret = devm_clk_bulk_get_optional(dev, 2, res->clks + 3); in qcom_pcie_get_resources_2_1_0()
265 res->pci_reset = devm_reset_control_get_exclusive(dev, "pci"); in qcom_pcie_get_resources_2_1_0()
266 if (IS_ERR(res->pci_reset)) in qcom_pcie_get_resources_2_1_0()
267 return PTR_ERR(res->pci_reset); in qcom_pcie_get_resources_2_1_0()
269 res->axi_reset = devm_reset_control_get_exclusive(dev, "axi"); in qcom_pcie_get_resources_2_1_0()
270 if (IS_ERR(res->axi_reset)) in qcom_pcie_get_resources_2_1_0()
271 return PTR_ERR(res->axi_reset); in qcom_pcie_get_resources_2_1_0()
273 res->ahb_reset = devm_reset_control_get_exclusive(dev, "ahb"); in qcom_pcie_get_resources_2_1_0()
274 if (IS_ERR(res->ahb_reset)) in qcom_pcie_get_resources_2_1_0()
275 return PTR_ERR(res->ahb_reset); in qcom_pcie_get_resources_2_1_0()
277 res->por_reset = devm_reset_control_get_exclusive(dev, "por"); in qcom_pcie_get_resources_2_1_0()
278 if (IS_ERR(res->por_reset)) in qcom_pcie_get_resources_2_1_0()
279 return PTR_ERR(res->por_reset); in qcom_pcie_get_resources_2_1_0()
281 res->ext_reset = devm_reset_control_get_optional_exclusive(dev, "ext"); in qcom_pcie_get_resources_2_1_0()
282 if (IS_ERR(res->ext_reset)) in qcom_pcie_get_resources_2_1_0()
283 return PTR_ERR(res->ext_reset); in qcom_pcie_get_resources_2_1_0()
285 res->phy_reset = devm_reset_control_get_exclusive(dev, "phy"); in qcom_pcie_get_resources_2_1_0()
286 return PTR_ERR_OR_ZERO(res->phy_reset); 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()
293 clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks); in qcom_pcie_deinit_2_1_0()
294 reset_control_assert(res->pci_reset); in qcom_pcie_deinit_2_1_0()
295 reset_control_assert(res->axi_reset); in qcom_pcie_deinit_2_1_0()
296 reset_control_assert(res->ahb_reset); in qcom_pcie_deinit_2_1_0()
297 reset_control_assert(res->por_reset); in qcom_pcie_deinit_2_1_0()
298 reset_control_assert(res->ext_reset); in qcom_pcie_deinit_2_1_0()
299 reset_control_assert(res->phy_reset); in qcom_pcie_deinit_2_1_0()
301 writel(1, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_deinit_2_1_0()
303 regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies); 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()
310 struct device *dev = pci->dev; in qcom_pcie_init_2_1_0()
311 struct device_node *node = dev->of_node; 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()
316 reset_control_assert(res->pci_reset); in qcom_pcie_init_2_1_0()
317 reset_control_assert(res->axi_reset); in qcom_pcie_init_2_1_0()
318 reset_control_assert(res->ahb_reset); in qcom_pcie_init_2_1_0()
319 reset_control_assert(res->por_reset); in qcom_pcie_init_2_1_0()
320 reset_control_assert(res->ext_reset); in qcom_pcie_init_2_1_0()
321 reset_control_assert(res->phy_reset); in qcom_pcie_init_2_1_0()
323 ret = regulator_bulk_enable(ARRAY_SIZE(res->supplies), res->supplies); in qcom_pcie_init_2_1_0()
329 ret = reset_control_deassert(res->ahb_reset); in qcom_pcie_init_2_1_0()
335 ret = reset_control_deassert(res->ext_reset); in qcom_pcie_init_2_1_0()
341 ret = reset_control_deassert(res->phy_reset); in qcom_pcie_init_2_1_0()
347 ret = reset_control_deassert(res->pci_reset); in qcom_pcie_init_2_1_0()
353 ret = reset_control_deassert(res->por_reset); in qcom_pcie_init_2_1_0()
359 ret = reset_control_deassert(res->axi_reset); in qcom_pcie_init_2_1_0()
365 /* enable PCIe clocks and resets */ in qcom_pcie_init_2_1_0()
366 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_1_0()
368 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_1_0()
370 ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks); in qcom_pcie_init_2_1_0()
374 if (of_device_is_compatible(node, "qcom,pcie-ipq8064") || in qcom_pcie_init_2_1_0()
375 of_device_is_compatible(node, "qcom,pcie-ipq8064-v2")) { in qcom_pcie_init_2_1_0()
379 pcie->parf + PCIE20_PARF_PCS_DEEMPH); in qcom_pcie_init_2_1_0()
382 pcie->parf + PCIE20_PARF_PCS_SWING); in qcom_pcie_init_2_1_0()
383 writel(PHY_RX0_EQ(4), pcie->parf + PCIE20_PARF_CONFIG_BITS); in qcom_pcie_init_2_1_0()
386 if (of_device_is_compatible(node, "qcom,pcie-ipq8064")) { in qcom_pcie_init_2_1_0()
388 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_1_0()
391 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_1_0()
395 val = readl(pcie->parf + PCIE20_PARF_PHY_REFCLK); in qcom_pcie_init_2_1_0()
397 if (!of_device_is_compatible(node, "qcom,pcie-apq8064")) in qcom_pcie_init_2_1_0()
400 writel(val, pcie->parf + PCIE20_PARF_PHY_REFCLK); in qcom_pcie_init_2_1_0()
407 pci->dbi_base + PCIE20_AXI_MSTR_RESP_COMP_CTRL0); in qcom_pcie_init_2_1_0()
409 pci->dbi_base + PCIE20_AXI_MSTR_RESP_COMP_CTRL1); in qcom_pcie_init_2_1_0()
414 reset_control_assert(res->axi_reset); in qcom_pcie_init_2_1_0()
416 reset_control_assert(res->por_reset); in qcom_pcie_init_2_1_0()
418 reset_control_assert(res->pci_reset); in qcom_pcie_init_2_1_0()
420 reset_control_assert(res->phy_reset); in qcom_pcie_init_2_1_0()
422 reset_control_assert(res->ext_reset); in qcom_pcie_init_2_1_0()
424 reset_control_assert(res->ahb_reset); in qcom_pcie_init_2_1_0()
426 regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies); in qcom_pcie_init_2_1_0()
431 static int qcom_pcie_get_resources_1_0_0(struct qcom_pcie *pcie) in qcom_pcie_get_resources_1_0_0() argument
433 struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0; in qcom_pcie_get_resources_1_0_0()
434 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_1_0_0()
435 struct device *dev = pci->dev; in qcom_pcie_get_resources_1_0_0()
437 res->vdda = devm_regulator_get(dev, "vdda"); in qcom_pcie_get_resources_1_0_0()
438 if (IS_ERR(res->vdda)) in qcom_pcie_get_resources_1_0_0()
439 return PTR_ERR(res->vdda); in qcom_pcie_get_resources_1_0_0()
441 res->iface = devm_clk_get(dev, "iface"); in qcom_pcie_get_resources_1_0_0()
442 if (IS_ERR(res->iface)) in qcom_pcie_get_resources_1_0_0()
443 return PTR_ERR(res->iface); in qcom_pcie_get_resources_1_0_0()
445 res->aux = devm_clk_get(dev, "aux"); in qcom_pcie_get_resources_1_0_0()
446 if (IS_ERR(res->aux)) in qcom_pcie_get_resources_1_0_0()
447 return PTR_ERR(res->aux); in qcom_pcie_get_resources_1_0_0()
449 res->master_bus = devm_clk_get(dev, "master_bus"); in qcom_pcie_get_resources_1_0_0()
450 if (IS_ERR(res->master_bus)) in qcom_pcie_get_resources_1_0_0()
451 return PTR_ERR(res->master_bus); in qcom_pcie_get_resources_1_0_0()
453 res->slave_bus = devm_clk_get(dev, "slave_bus"); in qcom_pcie_get_resources_1_0_0()
454 if (IS_ERR(res->slave_bus)) in qcom_pcie_get_resources_1_0_0()
455 return PTR_ERR(res->slave_bus); in qcom_pcie_get_resources_1_0_0()
457 res->core = devm_reset_control_get_exclusive(dev, "core"); in qcom_pcie_get_resources_1_0_0()
458 return PTR_ERR_OR_ZERO(res->core); in qcom_pcie_get_resources_1_0_0()
461 static void qcom_pcie_deinit_1_0_0(struct qcom_pcie *pcie) in qcom_pcie_deinit_1_0_0() argument
463 struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0; in qcom_pcie_deinit_1_0_0()
465 reset_control_assert(res->core); in qcom_pcie_deinit_1_0_0()
466 clk_disable_unprepare(res->slave_bus); in qcom_pcie_deinit_1_0_0()
467 clk_disable_unprepare(res->master_bus); in qcom_pcie_deinit_1_0_0()
468 clk_disable_unprepare(res->iface); in qcom_pcie_deinit_1_0_0()
469 clk_disable_unprepare(res->aux); in qcom_pcie_deinit_1_0_0()
470 regulator_disable(res->vdda); in qcom_pcie_deinit_1_0_0()
473 static int qcom_pcie_init_1_0_0(struct qcom_pcie *pcie) in qcom_pcie_init_1_0_0() argument
475 struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0; in qcom_pcie_init_1_0_0()
476 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_1_0_0()
477 struct device *dev = pci->dev; in qcom_pcie_init_1_0_0()
480 ret = reset_control_deassert(res->core); in qcom_pcie_init_1_0_0()
486 ret = clk_prepare_enable(res->aux); in qcom_pcie_init_1_0_0()
492 ret = clk_prepare_enable(res->iface); in qcom_pcie_init_1_0_0()
498 ret = clk_prepare_enable(res->master_bus); in qcom_pcie_init_1_0_0()
504 ret = clk_prepare_enable(res->slave_bus); in qcom_pcie_init_1_0_0()
510 ret = regulator_enable(res->vdda); in qcom_pcie_init_1_0_0()
517 writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR); in qcom_pcie_init_1_0_0()
520 u32 val = readl(pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT); in qcom_pcie_init_1_0_0()
523 writel(val, pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT); in qcom_pcie_init_1_0_0()
528 clk_disable_unprepare(res->slave_bus); in qcom_pcie_init_1_0_0()
530 clk_disable_unprepare(res->master_bus); in qcom_pcie_init_1_0_0()
532 clk_disable_unprepare(res->iface); in qcom_pcie_init_1_0_0()
534 clk_disable_unprepare(res->aux); in qcom_pcie_init_1_0_0()
536 reset_control_assert(res->core); in qcom_pcie_init_1_0_0()
541 static void qcom_pcie_2_3_2_ltssm_enable(struct qcom_pcie *pcie) in qcom_pcie_2_3_2_ltssm_enable() argument
546 val = readl(pcie->parf + PCIE20_PARF_LTSSM); in qcom_pcie_2_3_2_ltssm_enable()
548 writel(val, pcie->parf + PCIE20_PARF_LTSSM); in qcom_pcie_2_3_2_ltssm_enable()
551 static int qcom_pcie_get_resources_2_3_2(struct qcom_pcie *pcie) in qcom_pcie_get_resources_2_3_2() argument
553 struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2; in qcom_pcie_get_resources_2_3_2()
554 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_2_3_2()
555 struct device *dev = pci->dev; in qcom_pcie_get_resources_2_3_2()
558 res->supplies[0].supply = "vdda"; in qcom_pcie_get_resources_2_3_2()
559 res->supplies[1].supply = "vddpe-3v3"; in qcom_pcie_get_resources_2_3_2()
560 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(res->supplies), in qcom_pcie_get_resources_2_3_2()
561 res->supplies); in qcom_pcie_get_resources_2_3_2()
565 res->aux_clk = devm_clk_get(dev, "aux"); in qcom_pcie_get_resources_2_3_2()
566 if (IS_ERR(res->aux_clk)) in qcom_pcie_get_resources_2_3_2()
567 return PTR_ERR(res->aux_clk); in qcom_pcie_get_resources_2_3_2()
569 res->cfg_clk = devm_clk_get(dev, "cfg"); in qcom_pcie_get_resources_2_3_2()
570 if (IS_ERR(res->cfg_clk)) in qcom_pcie_get_resources_2_3_2()
571 return PTR_ERR(res->cfg_clk); in qcom_pcie_get_resources_2_3_2()
573 res->master_clk = devm_clk_get(dev, "bus_master"); in qcom_pcie_get_resources_2_3_2()
574 if (IS_ERR(res->master_clk)) in qcom_pcie_get_resources_2_3_2()
575 return PTR_ERR(res->master_clk); in qcom_pcie_get_resources_2_3_2()
577 res->slave_clk = devm_clk_get(dev, "bus_slave"); in qcom_pcie_get_resources_2_3_2()
578 if (IS_ERR(res->slave_clk)) in qcom_pcie_get_resources_2_3_2()
579 return PTR_ERR(res->slave_clk); in qcom_pcie_get_resources_2_3_2()
581 res->pipe_clk = devm_clk_get(dev, "pipe"); in qcom_pcie_get_resources_2_3_2()
582 return PTR_ERR_OR_ZERO(res->pipe_clk); in qcom_pcie_get_resources_2_3_2()
585 static void qcom_pcie_deinit_2_3_2(struct qcom_pcie *pcie) in qcom_pcie_deinit_2_3_2() argument
587 struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2; in qcom_pcie_deinit_2_3_2()
589 clk_disable_unprepare(res->slave_clk); in qcom_pcie_deinit_2_3_2()
590 clk_disable_unprepare(res->master_clk); in qcom_pcie_deinit_2_3_2()
591 clk_disable_unprepare(res->cfg_clk); in qcom_pcie_deinit_2_3_2()
592 clk_disable_unprepare(res->aux_clk); in qcom_pcie_deinit_2_3_2()
594 regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies); in qcom_pcie_deinit_2_3_2()
597 static void qcom_pcie_post_deinit_2_3_2(struct qcom_pcie *pcie) in qcom_pcie_post_deinit_2_3_2() argument
599 struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2; in qcom_pcie_post_deinit_2_3_2()
601 clk_disable_unprepare(res->pipe_clk); in qcom_pcie_post_deinit_2_3_2()
604 static int qcom_pcie_init_2_3_2(struct qcom_pcie *pcie) in qcom_pcie_init_2_3_2() argument
606 struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2; in qcom_pcie_init_2_3_2()
607 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_2_3_2()
608 struct device *dev = pci->dev; in qcom_pcie_init_2_3_2()
612 ret = regulator_bulk_enable(ARRAY_SIZE(res->supplies), res->supplies); in qcom_pcie_init_2_3_2()
618 ret = clk_prepare_enable(res->aux_clk); in qcom_pcie_init_2_3_2()
624 ret = clk_prepare_enable(res->cfg_clk); in qcom_pcie_init_2_3_2()
630 ret = clk_prepare_enable(res->master_clk); in qcom_pcie_init_2_3_2()
636 ret = clk_prepare_enable(res->slave_clk); in qcom_pcie_init_2_3_2()
642 /* enable PCIe clocks and resets */ in qcom_pcie_init_2_3_2()
643 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_3_2()
645 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_3_2()
648 writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR); in qcom_pcie_init_2_3_2()
651 val = readl(pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_3_2()
653 writel(val, pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_3_2()
655 val = readl(pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_3_2()
657 writel(val, pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_3_2()
659 val = readl(pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2); in qcom_pcie_init_2_3_2()
661 writel(val, pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2); in qcom_pcie_init_2_3_2()
666 clk_disable_unprepare(res->master_clk); in qcom_pcie_init_2_3_2()
668 clk_disable_unprepare(res->cfg_clk); in qcom_pcie_init_2_3_2()
670 clk_disable_unprepare(res->aux_clk); in qcom_pcie_init_2_3_2()
673 regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies); in qcom_pcie_init_2_3_2()
678 static int qcom_pcie_post_init_2_3_2(struct qcom_pcie *pcie) in qcom_pcie_post_init_2_3_2() argument
680 struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2; in qcom_pcie_post_init_2_3_2()
681 struct dw_pcie *pci = pcie->pci; in qcom_pcie_post_init_2_3_2()
682 struct device *dev = pci->dev; in qcom_pcie_post_init_2_3_2()
685 ret = clk_prepare_enable(res->pipe_clk); in qcom_pcie_post_init_2_3_2()
694 static int qcom_pcie_get_resources_2_4_0(struct qcom_pcie *pcie) in qcom_pcie_get_resources_2_4_0() argument
696 struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0; in qcom_pcie_get_resources_2_4_0()
697 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_2_4_0()
698 struct device *dev = pci->dev; in qcom_pcie_get_resources_2_4_0()
699 bool is_ipq = of_device_is_compatible(dev->of_node, "qcom,pcie-ipq4019"); in qcom_pcie_get_resources_2_4_0()
702 res->clks[0].id = "aux"; in qcom_pcie_get_resources_2_4_0()
703 res->clks[1].id = "master_bus"; in qcom_pcie_get_resources_2_4_0()
704 res->clks[2].id = "slave_bus"; in qcom_pcie_get_resources_2_4_0()
705 res->clks[3].id = "iface"; in qcom_pcie_get_resources_2_4_0()
707 /* qcom,pcie-ipq4019 is defined without "iface" */ in qcom_pcie_get_resources_2_4_0()
708 res->num_clks = is_ipq ? 3 : 4; in qcom_pcie_get_resources_2_4_0()
710 ret = devm_clk_bulk_get(dev, res->num_clks, res->clks); in qcom_pcie_get_resources_2_4_0()
714 res->axi_m_reset = devm_reset_control_get_exclusive(dev, "axi_m"); in qcom_pcie_get_resources_2_4_0()
715 if (IS_ERR(res->axi_m_reset)) in qcom_pcie_get_resources_2_4_0()
716 return PTR_ERR(res->axi_m_reset); in qcom_pcie_get_resources_2_4_0()
718 res->axi_s_reset = devm_reset_control_get_exclusive(dev, "axi_s"); in qcom_pcie_get_resources_2_4_0()
719 if (IS_ERR(res->axi_s_reset)) in qcom_pcie_get_resources_2_4_0()
720 return PTR_ERR(res->axi_s_reset); in qcom_pcie_get_resources_2_4_0()
727 res->pipe_reset = devm_reset_control_get_exclusive(dev, "pipe"); in qcom_pcie_get_resources_2_4_0()
728 if (IS_ERR(res->pipe_reset)) in qcom_pcie_get_resources_2_4_0()
729 return PTR_ERR(res->pipe_reset); in qcom_pcie_get_resources_2_4_0()
731 res->axi_m_vmid_reset = devm_reset_control_get_exclusive(dev, in qcom_pcie_get_resources_2_4_0()
733 if (IS_ERR(res->axi_m_vmid_reset)) in qcom_pcie_get_resources_2_4_0()
734 return PTR_ERR(res->axi_m_vmid_reset); in qcom_pcie_get_resources_2_4_0()
736 res->axi_s_xpu_reset = devm_reset_control_get_exclusive(dev, in qcom_pcie_get_resources_2_4_0()
738 if (IS_ERR(res->axi_s_xpu_reset)) in qcom_pcie_get_resources_2_4_0()
739 return PTR_ERR(res->axi_s_xpu_reset); in qcom_pcie_get_resources_2_4_0()
741 res->parf_reset = devm_reset_control_get_exclusive(dev, "parf"); in qcom_pcie_get_resources_2_4_0()
742 if (IS_ERR(res->parf_reset)) in qcom_pcie_get_resources_2_4_0()
743 return PTR_ERR(res->parf_reset); in qcom_pcie_get_resources_2_4_0()
745 res->phy_reset = devm_reset_control_get_exclusive(dev, "phy"); in qcom_pcie_get_resources_2_4_0()
746 if (IS_ERR(res->phy_reset)) in qcom_pcie_get_resources_2_4_0()
747 return PTR_ERR(res->phy_reset); in qcom_pcie_get_resources_2_4_0()
750 res->axi_m_sticky_reset = devm_reset_control_get_exclusive(dev, in qcom_pcie_get_resources_2_4_0()
752 if (IS_ERR(res->axi_m_sticky_reset)) in qcom_pcie_get_resources_2_4_0()
753 return PTR_ERR(res->axi_m_sticky_reset); in qcom_pcie_get_resources_2_4_0()
755 res->pipe_sticky_reset = devm_reset_control_get_exclusive(dev, in qcom_pcie_get_resources_2_4_0()
757 if (IS_ERR(res->pipe_sticky_reset)) in qcom_pcie_get_resources_2_4_0()
758 return PTR_ERR(res->pipe_sticky_reset); in qcom_pcie_get_resources_2_4_0()
760 res->pwr_reset = devm_reset_control_get_exclusive(dev, "pwr"); in qcom_pcie_get_resources_2_4_0()
761 if (IS_ERR(res->pwr_reset)) in qcom_pcie_get_resources_2_4_0()
762 return PTR_ERR(res->pwr_reset); in qcom_pcie_get_resources_2_4_0()
764 res->ahb_reset = devm_reset_control_get_exclusive(dev, "ahb"); in qcom_pcie_get_resources_2_4_0()
765 if (IS_ERR(res->ahb_reset)) in qcom_pcie_get_resources_2_4_0()
766 return PTR_ERR(res->ahb_reset); in qcom_pcie_get_resources_2_4_0()
769 res->phy_ahb_reset = devm_reset_control_get_exclusive(dev, "phy_ahb"); in qcom_pcie_get_resources_2_4_0()
770 if (IS_ERR(res->phy_ahb_reset)) in qcom_pcie_get_resources_2_4_0()
771 return PTR_ERR(res->phy_ahb_reset); in qcom_pcie_get_resources_2_4_0()
777 static void qcom_pcie_deinit_2_4_0(struct qcom_pcie *pcie) in qcom_pcie_deinit_2_4_0() argument
779 struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0; in qcom_pcie_deinit_2_4_0()
781 reset_control_assert(res->axi_m_reset); in qcom_pcie_deinit_2_4_0()
782 reset_control_assert(res->axi_s_reset); in qcom_pcie_deinit_2_4_0()
783 reset_control_assert(res->pipe_reset); in qcom_pcie_deinit_2_4_0()
784 reset_control_assert(res->pipe_sticky_reset); in qcom_pcie_deinit_2_4_0()
785 reset_control_assert(res->phy_reset); in qcom_pcie_deinit_2_4_0()
786 reset_control_assert(res->phy_ahb_reset); in qcom_pcie_deinit_2_4_0()
787 reset_control_assert(res->axi_m_sticky_reset); in qcom_pcie_deinit_2_4_0()
788 reset_control_assert(res->pwr_reset); in qcom_pcie_deinit_2_4_0()
789 reset_control_assert(res->ahb_reset); in qcom_pcie_deinit_2_4_0()
790 clk_bulk_disable_unprepare(res->num_clks, res->clks); in qcom_pcie_deinit_2_4_0()
793 static int qcom_pcie_init_2_4_0(struct qcom_pcie *pcie) in qcom_pcie_init_2_4_0() argument
795 struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0; in qcom_pcie_init_2_4_0()
796 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_2_4_0()
797 struct device *dev = pci->dev; in qcom_pcie_init_2_4_0()
801 ret = reset_control_assert(res->axi_m_reset); in qcom_pcie_init_2_4_0()
807 ret = reset_control_assert(res->axi_s_reset); in qcom_pcie_init_2_4_0()
815 ret = reset_control_assert(res->pipe_reset); in qcom_pcie_init_2_4_0()
821 ret = reset_control_assert(res->pipe_sticky_reset); in qcom_pcie_init_2_4_0()
827 ret = reset_control_assert(res->phy_reset); in qcom_pcie_init_2_4_0()
833 ret = reset_control_assert(res->phy_ahb_reset); in qcom_pcie_init_2_4_0()
841 ret = reset_control_assert(res->axi_m_sticky_reset); in qcom_pcie_init_2_4_0()
847 ret = reset_control_assert(res->pwr_reset); in qcom_pcie_init_2_4_0()
853 ret = reset_control_assert(res->ahb_reset); in qcom_pcie_init_2_4_0()
861 ret = reset_control_deassert(res->phy_ahb_reset); in qcom_pcie_init_2_4_0()
867 ret = reset_control_deassert(res->phy_reset); in qcom_pcie_init_2_4_0()
873 ret = reset_control_deassert(res->pipe_reset); in qcom_pcie_init_2_4_0()
879 ret = reset_control_deassert(res->pipe_sticky_reset); in qcom_pcie_init_2_4_0()
887 ret = reset_control_deassert(res->axi_m_reset); in qcom_pcie_init_2_4_0()
893 ret = reset_control_deassert(res->axi_m_sticky_reset); in qcom_pcie_init_2_4_0()
899 ret = reset_control_deassert(res->axi_s_reset); in qcom_pcie_init_2_4_0()
905 ret = reset_control_deassert(res->pwr_reset); in qcom_pcie_init_2_4_0()
911 ret = reset_control_deassert(res->ahb_reset); in qcom_pcie_init_2_4_0()
919 ret = clk_bulk_prepare_enable(res->num_clks, res->clks); in qcom_pcie_init_2_4_0()
923 /* enable PCIe clocks and resets */ in qcom_pcie_init_2_4_0()
924 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_4_0()
926 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_4_0()
929 writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR); in qcom_pcie_init_2_4_0()
932 val = readl(pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_4_0()
934 writel(val, pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_4_0()
936 val = readl(pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_4_0()
938 writel(val, pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_4_0()
940 val = readl(pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2); in qcom_pcie_init_2_4_0()
942 writel(val, pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2); in qcom_pcie_init_2_4_0()
947 reset_control_assert(res->ahb_reset); in qcom_pcie_init_2_4_0()
949 reset_control_assert(res->pwr_reset); in qcom_pcie_init_2_4_0()
951 reset_control_assert(res->axi_s_reset); in qcom_pcie_init_2_4_0()
953 reset_control_assert(res->axi_m_sticky_reset); in qcom_pcie_init_2_4_0()
955 reset_control_assert(res->axi_m_reset); in qcom_pcie_init_2_4_0()
957 reset_control_assert(res->pipe_sticky_reset); in qcom_pcie_init_2_4_0()
959 reset_control_assert(res->pipe_reset); in qcom_pcie_init_2_4_0()
961 reset_control_assert(res->phy_reset); in qcom_pcie_init_2_4_0()
963 reset_control_assert(res->phy_ahb_reset); in qcom_pcie_init_2_4_0()
967 static int qcom_pcie_get_resources_2_3_3(struct qcom_pcie *pcie) in qcom_pcie_get_resources_2_3_3() argument
969 struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3; in qcom_pcie_get_resources_2_3_3()
970 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_2_3_3()
971 struct device *dev = pci->dev; in qcom_pcie_get_resources_2_3_3()
977 res->iface = devm_clk_get(dev, "iface"); in qcom_pcie_get_resources_2_3_3()
978 if (IS_ERR(res->iface)) in qcom_pcie_get_resources_2_3_3()
979 return PTR_ERR(res->iface); in qcom_pcie_get_resources_2_3_3()
981 res->axi_m_clk = devm_clk_get(dev, "axi_m"); in qcom_pcie_get_resources_2_3_3()
982 if (IS_ERR(res->axi_m_clk)) in qcom_pcie_get_resources_2_3_3()
983 return PTR_ERR(res->axi_m_clk); in qcom_pcie_get_resources_2_3_3()
985 res->axi_s_clk = devm_clk_get(dev, "axi_s"); in qcom_pcie_get_resources_2_3_3()
986 if (IS_ERR(res->axi_s_clk)) in qcom_pcie_get_resources_2_3_3()
987 return PTR_ERR(res->axi_s_clk); in qcom_pcie_get_resources_2_3_3()
989 res->ahb_clk = devm_clk_get(dev, "ahb"); in qcom_pcie_get_resources_2_3_3()
990 if (IS_ERR(res->ahb_clk)) in qcom_pcie_get_resources_2_3_3()
991 return PTR_ERR(res->ahb_clk); in qcom_pcie_get_resources_2_3_3()
993 res->aux_clk = devm_clk_get(dev, "aux"); in qcom_pcie_get_resources_2_3_3()
994 if (IS_ERR(res->aux_clk)) in qcom_pcie_get_resources_2_3_3()
995 return PTR_ERR(res->aux_clk); in qcom_pcie_get_resources_2_3_3()
998 res->rst[i] = devm_reset_control_get(dev, rst_names[i]); in qcom_pcie_get_resources_2_3_3()
999 if (IS_ERR(res->rst[i])) in qcom_pcie_get_resources_2_3_3()
1000 return PTR_ERR(res->rst[i]); in qcom_pcie_get_resources_2_3_3()
1006 static void qcom_pcie_deinit_2_3_3(struct qcom_pcie *pcie) in qcom_pcie_deinit_2_3_3() argument
1008 struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3; in qcom_pcie_deinit_2_3_3()
1010 clk_disable_unprepare(res->iface); in qcom_pcie_deinit_2_3_3()
1011 clk_disable_unprepare(res->axi_m_clk); in qcom_pcie_deinit_2_3_3()
1012 clk_disable_unprepare(res->axi_s_clk); in qcom_pcie_deinit_2_3_3()
1013 clk_disable_unprepare(res->ahb_clk); in qcom_pcie_deinit_2_3_3()
1014 clk_disable_unprepare(res->aux_clk); in qcom_pcie_deinit_2_3_3()
1017 static int qcom_pcie_init_2_3_3(struct qcom_pcie *pcie) in qcom_pcie_init_2_3_3() argument
1019 struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3; in qcom_pcie_init_2_3_3()
1020 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_2_3_3()
1021 struct device *dev = pci->dev; in qcom_pcie_init_2_3_3()
1026 for (i = 0; i < ARRAY_SIZE(res->rst); i++) { in qcom_pcie_init_2_3_3()
1027 ret = reset_control_assert(res->rst[i]); in qcom_pcie_init_2_3_3()
1036 for (i = 0; i < ARRAY_SIZE(res->rst); i++) { in qcom_pcie_init_2_3_3()
1037 ret = reset_control_deassert(res->rst[i]); in qcom_pcie_init_2_3_3()
1051 ret = clk_prepare_enable(res->iface); in qcom_pcie_init_2_3_3()
1057 ret = clk_prepare_enable(res->axi_m_clk); in qcom_pcie_init_2_3_3()
1063 ret = clk_prepare_enable(res->axi_s_clk); in qcom_pcie_init_2_3_3()
1069 ret = clk_prepare_enable(res->ahb_clk); in qcom_pcie_init_2_3_3()
1075 ret = clk_prepare_enable(res->aux_clk); in qcom_pcie_init_2_3_3()
1082 pcie->parf + PCIE20_v3_PARF_SLV_ADDR_SPACE_SIZE); in qcom_pcie_init_2_3_3()
1084 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_3_3()
1086 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_3_3()
1088 writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR); in qcom_pcie_init_2_3_3()
1093 pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_3_3()
1094 writel(0, pcie->parf + PCIE20_PARF_Q2A_FLUSH); in qcom_pcie_init_2_3_3()
1096 writel(PCI_COMMAND_MASTER, pci->dbi_base + PCI_COMMAND); in qcom_pcie_init_2_3_3()
1097 writel(DBI_RO_WR_EN, pci->dbi_base + PCIE20_MISC_CONTROL_1_REG); in qcom_pcie_init_2_3_3()
1098 writel(PCIE_CAP_LINK1_VAL, pci->dbi_base + offset + PCI_EXP_SLTCAP); in qcom_pcie_init_2_3_3()
1100 val = readl(pci->dbi_base + offset + PCI_EXP_LNKCAP); in qcom_pcie_init_2_3_3()
1102 writel(val, pci->dbi_base + offset + PCI_EXP_LNKCAP); in qcom_pcie_init_2_3_3()
1104 writel(PCI_EXP_DEVCTL2_COMP_TMOUT_DIS, pci->dbi_base + offset + in qcom_pcie_init_2_3_3()
1110 clk_disable_unprepare(res->ahb_clk); in qcom_pcie_init_2_3_3()
1112 clk_disable_unprepare(res->axi_s_clk); in qcom_pcie_init_2_3_3()
1114 clk_disable_unprepare(res->axi_m_clk); in qcom_pcie_init_2_3_3()
1116 clk_disable_unprepare(res->iface); in qcom_pcie_init_2_3_3()
1122 for (i = 0; i < ARRAY_SIZE(res->rst); i++) in qcom_pcie_init_2_3_3()
1123 reset_control_assert(res->rst[i]); in qcom_pcie_init_2_3_3()
1128 static int qcom_pcie_get_resources_2_7_0(struct qcom_pcie *pcie) in qcom_pcie_get_resources_2_7_0() argument
1130 struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; in qcom_pcie_get_resources_2_7_0()
1131 struct dw_pcie *pci = pcie->pci; in qcom_pcie_get_resources_2_7_0()
1132 struct device *dev = pci->dev; in qcom_pcie_get_resources_2_7_0()
1135 res->pci_reset = devm_reset_control_get_exclusive(dev, "pci"); in qcom_pcie_get_resources_2_7_0()
1136 if (IS_ERR(res->pci_reset)) in qcom_pcie_get_resources_2_7_0()
1137 return PTR_ERR(res->pci_reset); in qcom_pcie_get_resources_2_7_0()
1139 res->supplies[0].supply = "vdda"; in qcom_pcie_get_resources_2_7_0()
1140 res->supplies[1].supply = "vddpe-3v3"; in qcom_pcie_get_resources_2_7_0()
1141 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(res->supplies), in qcom_pcie_get_resources_2_7_0()
1142 res->supplies); in qcom_pcie_get_resources_2_7_0()
1146 res->clks[0].id = "aux"; in qcom_pcie_get_resources_2_7_0()
1147 res->clks[1].id = "cfg"; in qcom_pcie_get_resources_2_7_0()
1148 res->clks[2].id = "bus_master"; in qcom_pcie_get_resources_2_7_0()
1149 res->clks[3].id = "bus_slave"; in qcom_pcie_get_resources_2_7_0()
1150 res->clks[4].id = "slave_q2a"; in qcom_pcie_get_resources_2_7_0()
1151 res->clks[5].id = "tbu"; in qcom_pcie_get_resources_2_7_0()
1153 ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks); in qcom_pcie_get_resources_2_7_0()
1157 res->pipe_clk = devm_clk_get(dev, "pipe"); in qcom_pcie_get_resources_2_7_0()
1158 return PTR_ERR_OR_ZERO(res->pipe_clk); in qcom_pcie_get_resources_2_7_0()
1161 static int qcom_pcie_init_2_7_0(struct qcom_pcie *pcie) in qcom_pcie_init_2_7_0() argument
1163 struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; in qcom_pcie_init_2_7_0()
1164 struct dw_pcie *pci = pcie->pci; in qcom_pcie_init_2_7_0()
1165 struct device *dev = pci->dev; in qcom_pcie_init_2_7_0()
1169 ret = regulator_bulk_enable(ARRAY_SIZE(res->supplies), res->supplies); in qcom_pcie_init_2_7_0()
1175 ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks); in qcom_pcie_init_2_7_0()
1179 ret = reset_control_assert(res->pci_reset); in qcom_pcie_init_2_7_0()
1187 ret = reset_control_deassert(res->pci_reset); in qcom_pcie_init_2_7_0()
1193 /* configure PCIe to RC mode */ in qcom_pcie_init_2_7_0()
1194 writel(DEVICE_TYPE_RC, pcie->parf + PCIE20_PARF_DEVICE_TYPE); in qcom_pcie_init_2_7_0()
1196 /* enable PCIe clocks and resets */ in qcom_pcie_init_2_7_0()
1197 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_7_0()
1199 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); in qcom_pcie_init_2_7_0()
1202 writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR); in qcom_pcie_init_2_7_0()
1205 val = readl(pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_7_0()
1207 writel(val, pcie->parf + PCIE20_PARF_SYS_CTRL); in qcom_pcie_init_2_7_0()
1209 val = readl(pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_7_0()
1211 writel(val, pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL); in qcom_pcie_init_2_7_0()
1213 val = readl(pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2); in qcom_pcie_init_2_7_0()
1215 writel(val, pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2); in qcom_pcie_init_2_7_0()
1219 clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks); in qcom_pcie_init_2_7_0()
1221 regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies); in qcom_pcie_init_2_7_0()
1226 static void qcom_pcie_deinit_2_7_0(struct qcom_pcie *pcie) in qcom_pcie_deinit_2_7_0() argument
1228 struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; in qcom_pcie_deinit_2_7_0()
1230 clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks); in qcom_pcie_deinit_2_7_0()
1231 regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies); in qcom_pcie_deinit_2_7_0()
1234 static int qcom_pcie_post_init_2_7_0(struct qcom_pcie *pcie) in qcom_pcie_post_init_2_7_0() argument
1236 struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; in qcom_pcie_post_init_2_7_0()
1238 return clk_prepare_enable(res->pipe_clk); in qcom_pcie_post_init_2_7_0()
1241 static void qcom_pcie_post_deinit_2_7_0(struct qcom_pcie *pcie) in qcom_pcie_post_deinit_2_7_0() argument
1243 struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; in qcom_pcie_post_deinit_2_7_0()
1245 clk_disable_unprepare(res->pipe_clk); in qcom_pcie_post_deinit_2_7_0()
1251 u16 val = readw(pci->dbi_base + offset + PCI_EXP_LNKSTA); in qcom_pcie_link_up()
1259 struct qcom_pcie *pcie = to_qcom_pcie(pci); in qcom_pcie_host_init() local
1262 qcom_ep_reset_assert(pcie); in qcom_pcie_host_init()
1264 ret = pcie->ops->init(pcie); in qcom_pcie_host_init()
1268 ret = phy_power_on(pcie->phy); in qcom_pcie_host_init()
1272 if (pcie->ops->post_init) { in qcom_pcie_host_init()
1273 ret = pcie->ops->post_init(pcie); in qcom_pcie_host_init()
1281 qcom_ep_reset_deassert(pcie); in qcom_pcie_host_init()
1283 ret = qcom_pcie_establish_link(pcie); in qcom_pcie_host_init()
1289 qcom_ep_reset_assert(pcie); in qcom_pcie_host_init()
1290 if (pcie->ops->post_deinit) in qcom_pcie_host_init()
1291 pcie->ops->post_deinit(pcie); in qcom_pcie_host_init()
1293 phy_power_off(pcie->phy); in qcom_pcie_host_init()
1295 pcie->ops->deinit(pcie); in qcom_pcie_host_init()
1362 struct device *dev = &pdev->dev; in qcom_pcie_probe()
1366 struct qcom_pcie *pcie; in qcom_pcie_probe() local
1369 pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL); in qcom_pcie_probe()
1370 if (!pcie) in qcom_pcie_probe()
1371 return -ENOMEM; in qcom_pcie_probe()
1375 return -ENOMEM; in qcom_pcie_probe()
1382 pci->dev = dev; in qcom_pcie_probe()
1383 pci->ops = &dw_pcie_ops; in qcom_pcie_probe()
1384 pp = &pci->pp; in qcom_pcie_probe()
1386 pcie->pci = pci; in qcom_pcie_probe()
1388 pcie->ops = of_device_get_match_data(dev); in qcom_pcie_probe()
1390 pcie->reset = devm_gpiod_get_optional(dev, "perst", GPIOD_OUT_HIGH); in qcom_pcie_probe()
1391 if (IS_ERR(pcie->reset)) { in qcom_pcie_probe()
1392 ret = PTR_ERR(pcie->reset); in qcom_pcie_probe()
1396 pcie->parf = devm_platform_ioremap_resource_byname(pdev, "parf"); in qcom_pcie_probe()
1397 if (IS_ERR(pcie->parf)) { in qcom_pcie_probe()
1398 ret = PTR_ERR(pcie->parf); in qcom_pcie_probe()
1403 pci->dbi_base = devm_pci_remap_cfg_resource(dev, res); in qcom_pcie_probe()
1404 if (IS_ERR(pci->dbi_base)) { in qcom_pcie_probe()
1405 ret = PTR_ERR(pci->dbi_base); in qcom_pcie_probe()
1409 pcie->elbi = devm_platform_ioremap_resource_byname(pdev, "elbi"); in qcom_pcie_probe()
1410 if (IS_ERR(pcie->elbi)) { in qcom_pcie_probe()
1411 ret = PTR_ERR(pcie->elbi); in qcom_pcie_probe()
1415 pcie->phy = devm_phy_optional_get(dev, "pciephy"); in qcom_pcie_probe()
1416 if (IS_ERR(pcie->phy)) { in qcom_pcie_probe()
1417 ret = PTR_ERR(pcie->phy); in qcom_pcie_probe()
1421 ret = pcie->ops->get_resources(pcie); in qcom_pcie_probe()
1425 pp->ops = &qcom_pcie_dw_ops; in qcom_pcie_probe()
1428 pp->msi_irq = platform_get_irq_byname(pdev, "msi"); in qcom_pcie_probe()
1429 if (pp->msi_irq < 0) { in qcom_pcie_probe()
1430 ret = pp->msi_irq; in qcom_pcie_probe()
1435 ret = phy_init(pcie->phy); in qcom_pcie_probe()
1439 platform_set_drvdata(pdev, pcie); in qcom_pcie_probe()
1450 phy_exit(pcie->phy); in qcom_pcie_probe()
1459 { .compatible = "qcom,pcie-apq8084", .data = &ops_1_0_0 },
1460 { .compatible = "qcom,pcie-ipq8064", .data = &ops_2_1_0 },
1461 { .compatible = "qcom,pcie-ipq8064-v2", .data = &ops_2_1_0 },
1462 { .compatible = "qcom,pcie-apq8064", .data = &ops_2_1_0 },
1463 { .compatible = "qcom,pcie-msm8996", .data = &ops_2_3_2 },
1464 { .compatible = "qcom,pcie-ipq8074", .data = &ops_2_3_3 },
1465 { .compatible = "qcom,pcie-ipq4019", .data = &ops_2_4_0 },
1466 { .compatible = "qcom,pcie-qcs404", .data = &ops_2_4_0 },
1467 { .compatible = "qcom,pcie-sdm845", .data = &ops_2_7_0 },
1473 dev->class = PCI_CLASS_BRIDGE_PCI << 8; in qcom_fixup_class()
1486 .name = "qcom-pcie",