]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
PCI: qcom: Make sure PCIe is reset before init for rev 2.1.0
authorAnsuel Smith <ansuelsmth@gmail.com>
Tue, 1 Sep 2020 12:49:54 +0000 (14:49 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 18 Nov 2020 18:20:16 +0000 (19:20 +0100)
[ Upstream commit d3d4d028afb785e52c55024d779089654f8302e7 ]

Qsdk U-Boot can incorrectly leave the PCIe interface in an undefined
state if bootm command is used instead of bootipq. This is caused by the
not deinit of PCIe when bootm is called. Reset the PCIe before init
anyway to fix this U-Boot bug.

Link: https://lore.kernel.org/r/20200901124955.137-1-ansuelsmth@gmail.com
Fixes: 82a823833f4e ("PCI: qcom: Add Qualcomm PCIe controller driver")
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Cc: stable@vger.kernel.org # v4.19+
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/pci/controller/dwc/pcie-qcom.c

index 374db5d59cf874c648f47bb1f89c199d0efa8f8a..14196c0287a245cd6e107e97e672cb94fb79339d 100644 (file)
@@ -303,6 +303,9 @@ static void qcom_pcie_deinit_2_1_0(struct qcom_pcie *pcie)
        clk_disable_unprepare(res->core_clk);
        clk_disable_unprepare(res->aux_clk);
        clk_disable_unprepare(res->ref_clk);
+
+       writel(1, pcie->parf + PCIE20_PARF_PHY_CTRL);
+
        regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies);
 }
 
@@ -315,6 +318,16 @@ static int qcom_pcie_init_2_1_0(struct qcom_pcie *pcie)
        u32 val;
        int ret;
 
+       /* reset the PCIe interface as uboot can leave it undefined state */
+       reset_control_assert(res->pci_reset);
+       reset_control_assert(res->axi_reset);
+       reset_control_assert(res->ahb_reset);
+       reset_control_assert(res->por_reset);
+       reset_control_assert(res->ext_reset);
+       reset_control_assert(res->phy_reset);
+
+       writel(1, pcie->parf + PCIE20_PARF_PHY_CTRL);
+
        ret = regulator_bulk_enable(ARRAY_SIZE(res->supplies), res->supplies);
        if (ret < 0) {
                dev_err(dev, "cannot enable regulators\n");