aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/controller/dwc
diff options
context:
space:
mode:
authorBjorn Andersson <bjorn.andersson@linaro.org>2019-05-28 20:57:08 -0400
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>2019-05-29 12:12:24 -0400
commit5aa180974e4d53f397f7d02bbce2c1105e8e538b (patch)
tree949ce4cedf7b5d1be856045a91cd37d0ce48d884 /drivers/pci/controller/dwc
parenta188339ca5a396acc588e5851ed7e19f66b0ebd9 (diff)
PCI: qcom: Use clk bulk API for 2.4.0 controllers
Before introducing the QCS404 platform, which uses the same PCIe controller as IPQ4019, migrate this to use the bulk clock API, in order to make the error paths slighly cleaner. Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Reviewed-by: Niklas Cassel <niklas.cassel@linaro.org> Reviewed-by: Vinod Koul <vkoul@kernel.org> Acked-by: Stanimir Varbanov <svarbanov@mm-sol.com>
Diffstat (limited to 'drivers/pci/controller/dwc')
-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);