summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/pci/controller/dwc/pcie-qcom.c53
1 files changed, 16 insertions, 37 deletions
diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
index 0ed235d560e3..23dc01212508 100644
--- a/drivers/pci/controller/dwc/pcie-qcom.c
+++ b/drivers/pci/controller/dwc/pcie-qcom.c
@@ -112,10 +112,10 @@ struct qcom_pcie_resources_2_3_2 {
112 struct regulator_bulk_data supplies[QCOM_PCIE_2_3_2_MAX_SUPPLY]; 112 struct regulator_bulk_data supplies[QCOM_PCIE_2_3_2_MAX_SUPPLY];
113}; 113};
114 114
115#define QCOM_PCIE_2_4_0_MAX_CLOCKS 3
115struct qcom_pcie_resources_2_4_0 { 116struct qcom_pcie_resources_2_4_0 {
116 struct clk *aux_clk; 117 struct clk_bulk_data clks[QCOM_PCIE_2_4_0_MAX_CLOCKS];
117 struct clk *master_clk; 118 int num_clks;
118 struct clk *slave_clk;
119 struct reset_control *axi_m_reset; 119 struct reset_control *axi_m_reset;
120 struct reset_control *axi_s_reset; 120 struct reset_control *axi_s_reset;
121 struct reset_control *pipe_reset; 121 struct reset_control *pipe_reset;
@@ -638,18 +638,17 @@ static int qcom_pcie_get_resources_2_4_0(struct qcom_pcie *pcie)
638 struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0; 638 struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0;
639 struct dw_pcie *pci = pcie->pci; 639 struct dw_pcie *pci = pcie->pci;
640 struct device *dev = pci->dev; 640 struct device *dev = pci->dev;
641 int ret;
641 642
642 res->aux_clk = devm_clk_get(dev, "aux"); 643 res->clks[0].id = "aux";
643 if (IS_ERR(res->aux_clk)) 644 res->clks[1].id = "master_bus";
644 return PTR_ERR(res->aux_clk); 645 res->clks[2].id = "slave_bus";
645 646
646 res->master_clk = devm_clk_get(dev, "master_bus"); 647 res->num_clks = 3;
647 if (IS_ERR(res->master_clk))
648 return PTR_ERR(res->master_clk);
649 648
650 res->slave_clk = devm_clk_get(dev, "slave_bus"); 649 ret = devm_clk_bulk_get(dev, res->num_clks, res->clks);
651 if (IS_ERR(res->slave_clk)) 650 if (ret < 0)
652 return PTR_ERR(res->slave_clk); 651 return ret;
653 652
654 res->axi_m_reset = devm_reset_control_get_exclusive(dev, "axi_m"); 653 res->axi_m_reset = devm_reset_control_get_exclusive(dev, "axi_m");
655 if (IS_ERR(res->axi_m_reset)) 654 if (IS_ERR(res->axi_m_reset))
@@ -719,9 +718,7 @@ static void qcom_pcie_deinit_2_4_0(struct qcom_pcie *pcie)
719 reset_control_assert(res->axi_m_sticky_reset); 718 reset_control_assert(res->axi_m_sticky_reset);
720 reset_control_assert(res->pwr_reset); 719 reset_control_assert(res->pwr_reset);
721 reset_control_assert(res->ahb_reset); 720 reset_control_assert(res->ahb_reset);
722 clk_disable_unprepare(res->aux_clk); 721 clk_bulk_disable_unprepare(res->num_clks, res->clks);
723 clk_disable_unprepare(res->master_clk);
724 clk_disable_unprepare(res->slave_clk);
725} 722}
726 723
727static int qcom_pcie_init_2_4_0(struct qcom_pcie *pcie) 724static int qcom_pcie_init_2_4_0(struct qcom_pcie *pcie)
@@ -850,23 +847,9 @@ static int qcom_pcie_init_2_4_0(struct qcom_pcie *pcie)
850 847
851 usleep_range(10000, 12000); 848 usleep_range(10000, 12000);
852 849
853 ret = clk_prepare_enable(res->aux_clk); 850 ret = clk_bulk_prepare_enable(res->num_clks, res->clks);
854 if (ret) { 851 if (ret)
855 dev_err(dev, "cannot prepare/enable iface clock\n"); 852 goto err_clks;
856 goto err_clk_aux;
857 }
858
859 ret = clk_prepare_enable(res->master_clk);
860 if (ret) {
861 dev_err(dev, "cannot prepare/enable core clock\n");
862 goto err_clk_axi_m;
863 }
864
865 ret = clk_prepare_enable(res->slave_clk);
866 if (ret) {
867 dev_err(dev, "cannot prepare/enable phy clock\n");
868 goto err_clk_axi_s;
869 }
870 853
871 /* enable PCIe clocks and resets */ 854 /* enable PCIe clocks and resets */
872 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); 855 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL);
@@ -891,11 +874,7 @@ static int qcom_pcie_init_2_4_0(struct qcom_pcie *pcie)
891 874
892 return 0; 875 return 0;
893 876
894err_clk_axi_s: 877err_clks:
895 clk_disable_unprepare(res->master_clk);
896err_clk_axi_m:
897 clk_disable_unprepare(res->aux_clk);
898err_clk_aux:
899 reset_control_assert(res->ahb_reset); 878 reset_control_assert(res->ahb_reset);
900err_rst_ahb: 879err_rst_ahb:
901 reset_control_assert(res->pwr_reset); 880 reset_control_assert(res->pwr_reset);