| From d3d4d028afb785e52c55024d779089654f8302e7 Mon Sep 17 00:00:00 2001 |
| From: Ansuel Smith <ansuelsmth@gmail.com> |
| Date: Tue, 1 Sep 2020 14:49:54 +0200 |
| Subject: PCI: qcom: Make sure PCIe is reset before init for rev 2.1.0 |
| |
| From: Ansuel Smith <ansuelsmth@gmail.com> |
| |
| commit d3d4d028afb785e52c55024d779089654f8302e7 upstream. |
| |
| 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: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/pci/controller/dwc/pcie-qcom.c | 13 +++++++++++++ |
| 1 file changed, 13 insertions(+) |
| |
| --- a/drivers/pci/controller/dwc/pcie-qcom.c |
| +++ b/drivers/pci/controller/dwc/pcie-qcom.c |
| @@ -302,6 +302,9 @@ static void qcom_pcie_deinit_2_1_0(struc |
| 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); |
| + |
| regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies); |
| } |
| |
| @@ -314,6 +317,16 @@ static int qcom_pcie_init_2_1_0(struct q |
| 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"); |