mirror-linux/drivers/phy/qualcomm
Stephan Gerhold 6cb8c1f957 phy: qcom: qmp-pcie: Fix PHY initialization when powered down by firmware
Commit 0cc22f5a86 ("phy: qcom: qmp-pcie: Add PHY register retention
support") added support for using the "no_csr" reset to skip configuration
of the PHY if the init sequence was already applied by the boot firmware.
The expectation is that the PHY is only turned on/off by using the "no_csr"
reset, instead of powering it down and re-programming it after a full
reset.

The boot firmware on X1E does not fully conform to this expectation: If the
PCIe3 link fails to come up (e.g. because no PCIe card is inserted), the
firmware powers down the PHY using the QPHY_PCS_POWER_DOWN_CONTROL
register. The QPHY_START_CTRL register is kept as-is, so the driver assumes
the PHY is already initialized and skips the configuration/power up
sequence. The PHY won't come up again without clearing the
QPHY_PCS_POWER_DOWN_CONTROL, so eventually initialization fails:

  qcom-qmp-pcie-phy 1be0000.phy: phy initialization timed-out
  phy phy-1be0000.phy.0: phy poweron failed --> -110
  qcom-pcie 1bd0000.pcie: cannot initialize host
  qcom-pcie 1bd0000.pcie: probe with driver qcom-pcie failed with error -110

This can be reliably reproduced on the X1E CRD, QCP and Devkit when no card
is inserted for PCIe3.

Fix this by checking the QPHY_PCS_POWER_DOWN_CONTROL register in addition
to QPHY_START_CTRL. If the PHY is powered down with the register, it
doesn't conform to the expectations for using the "no_csr" reset, so we
fully re-initialize with the normal reset sequence.

Also check the register more carefully to ensure all of the bits we expect
are actually set. A simple !!(readl()) is not enough, because the PHY might
be only partially set up with some of the expected bits set.

Cc: stable@vger.kernel.org
Fixes: 0cc22f5a86 ("phy: qcom: qmp-pcie: Add PHY register retention support")
Signed-off-by: Stephan Gerhold <stephan.gerhold@linaro.org>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Link: https://lore.kernel.org/r/20250821-phy-qcom-qmp-pcie-nocsr-fix-v3-1-4898db0cc07c@linaro.org
Signed-off-by: Vinod Koul <vkoul@kernel.org>
2025-09-01 22:29:20 +05:30
..
Kconfig phy: qcom: Add M31 based eUSB2 PHY driver 2025-06-15 21:58:52 +05:30
Makefile phy: qcom: Add M31 based eUSB2 PHY driver 2025-06-15 21:58:52 +05:30
phy-ath79-usb.c
phy-qcom-apq8064-sata.c phy: Switch back to struct platform_driver::remove() 2024-10-17 20:33:03 +05:30
phy-qcom-edp.c phy: qcom: edp: Add support for eDP PHY on SA8775P 2024-10-17 20:16:30 +05:30
phy-qcom-eusb2-repeater.c phy: qualcomm: phy-qcom-eusb2-repeater: fix override properties 2025-08-12 16:04:51 +05:30
phy-qcom-ipq806x-sata.c phy: Switch back to struct platform_driver::remove() 2024-10-17 20:33:03 +05:30
phy-qcom-ipq806x-usb.c
phy-qcom-ipq4019-usb.c
phy-qcom-m31-eusb2.c phy: qcom: m31-eusb2: drop registration printk 2025-06-26 17:10:37 -07:00
phy-qcom-m31.c phy: qcom: phy-qcom-m31: Update IPQ5332 M31 USB phy initialization sequence 2025-07-22 19:00:06 +05:30
phy-qcom-pcie2.c
phy-qcom-qmp-combo.c phy: qcom: qmp-combo: Add missing PLL (VCO) configuration on SM8750 2025-06-26 17:11:08 -07:00
phy-qcom-qmp-common.h phy: qcom: qmp: Add debug prints for register writes 2024-07-31 22:23:07 +05:30
phy-qcom-qmp-dp-com-v3.h phy: qcom: qmp: split DP PHY registers to separate headers 2024-01-30 22:35:38 +05:30
phy-qcom-qmp-dp-phy-v3.h phy: qcom: qmp: split DP PHY registers to separate headers 2024-01-30 22:35:38 +05:30
phy-qcom-qmp-dp-phy-v4.h phy: qcom: qmp: split DP PHY registers to separate headers 2024-01-30 22:35:38 +05:30
phy-qcom-qmp-dp-phy-v5.h phy: qcom: qmp-combo: fix VCO div offset on v5_5nm and v6 2024-04-12 16:56:28 +05:30
phy-qcom-qmp-dp-phy-v6.h phy: qcom: qmp-combo: fix VCO div offset on v5_5nm and v6 2024-04-12 16:56:28 +05:30
phy-qcom-qmp-dp-phy.h phy: qcom: qmp: split DP PHY registers to separate headers 2024-01-30 22:35:38 +05:30
phy-qcom-qmp-pcie-msm8996.c phy: qcom: qmp-pcie-msm8996: Simplify with scoped for each OF child loop 2024-08-30 13:26:37 +05:30
phy-qcom-qmp-pcie-qhp.h
phy-qcom-qmp-pcie.c phy: qcom: qmp-pcie: Fix PHY initialization when powered down by firmware 2025-09-01 22:29:20 +05:30
phy-qcom-qmp-pcs-misc-v3.h
phy-qcom-qmp-pcs-misc-v4.h
phy-qcom-qmp-pcs-pcie-v4.h
phy-qcom-qmp-pcs-pcie-v4_20.h phy: qualcomm: qmp-pcie: split PCS_LANE1 region 2024-12-08 21:30:08 +05:30
phy-qcom-qmp-pcs-pcie-v5.h phy: qcom-qmp: Add missing register definitions for PCS V5 2024-06-03 19:32:32 +05:30
phy-qcom-qmp-pcs-pcie-v5_20.h phy: qcom: qmp-pcie: Update PHY settings for QCS8300 & SA8775P 2025-06-26 16:38:46 -07:00
phy-qcom-qmp-pcs-pcie-v6.h phy: qualcomm: qmp-pcie: define several new registers 2024-12-08 21:30:08 +05:30
phy-qcom-qmp-pcs-pcie-v6_20.h phy: qcom: qmp-pcie: Update PCIe1 PHY settings for SM8550 2024-01-30 22:34:54 +05:30
phy-qcom-qmp-pcs-pcie-v6_30.h phy: qcom: qmp: Add phy register and clk setting for x1e80100 PCIe3 2024-10-17 18:21:52 +05:30
phy-qcom-qmp-pcs-sgmii.h phy: qcom: sgmii-eth: move PCS registers to separate header 2024-01-30 22:35:39 +05:30
phy-qcom-qmp-pcs-ufs-v2.h
phy-qcom-qmp-pcs-ufs-v3.h
phy-qcom-qmp-pcs-ufs-v4.h
phy-qcom-qmp-pcs-ufs-v5.h
phy-qcom-qmp-pcs-ufs-v6.h phy: qcom: qmp-ufs: update SM8650 tables for Gear 4 & 5 2024-04-12 15:14:08 +05:30
phy-qcom-qmp-pcs-usb-v4.h
phy-qcom-qmp-pcs-usb-v5.h
phy-qcom-qmp-pcs-usb-v6.h
phy-qcom-qmp-pcs-usb-v7.h
phy-qcom-qmp-pcs-usb-v8.h phy: qcom: qmp-combo: Add new PHY sequences for SM8750 2025-06-15 21:58:52 +05:30
phy-qcom-qmp-pcs-v2.h phy: qcom: qmp: Add phy register and clk setting for QCS615 PCIe 2024-12-04 19:11:17 +05:30
phy-qcom-qmp-pcs-v3.h
phy-qcom-qmp-pcs-v4.h
phy-qcom-qmp-pcs-v4_20.h
phy-qcom-qmp-pcs-v5.h
phy-qcom-qmp-pcs-v5_20.h phy: qcom: qmp-pcie: Update PHY settings for QCS8300 & SA8775P 2025-06-26 16:38:46 -07:00
phy-qcom-qmp-pcs-v6-n4.h phy: qcom-qmp: pcs: Add missing v6 N4 register offsets 2024-06-03 19:30:47 +05:30
phy-qcom-qmp-pcs-v6.h phy: qualcomm: qmp-pcie: define several new registers 2024-12-08 21:30:08 +05:30
phy-qcom-qmp-pcs-v6_20.h phy: qcom: qmp-pcie: Update PCIe1 PHY settings for SM8550 2024-01-30 22:34:54 +05:30
phy-qcom-qmp-pcs-v6_30.h phy: qcom: qmp: Add phy register and clk setting for x1e80100 PCIe3 2024-10-17 18:21:52 +05:30
phy-qcom-qmp-pcs-v7.h
phy-qcom-qmp-pcs-v8.h phy: qcom: qmp-combo: Add new PHY sequences for SM8750 2025-06-15 21:58:52 +05:30
phy-qcom-qmp-qserdes-com-v3.h
phy-qcom-qmp-qserdes-com-v4.h
phy-qcom-qmp-qserdes-com-v5.h
phy-qcom-qmp-qserdes-com-v6.h phy: qcom-qmp-ufs: Add PHY Configuration support for sm8750 2025-03-11 12:24:46 +01:00
phy-qcom-qmp-qserdes-com-v7.h
phy-qcom-qmp-qserdes-com-v8.h phy: qcom: qmp-combo: Add new PHY sequences for SM8750 2025-06-15 21:58:52 +05:30
phy-qcom-qmp-qserdes-com.h
phy-qcom-qmp-qserdes-ln-shrd-v5.h phy: qcom: qmp-pcie: Update PHY settings for QCS8300 & SA8775P 2025-06-26 16:38:46 -07:00
phy-qcom-qmp-qserdes-ln-shrd-v6.h
phy-qcom-qmp-qserdes-pll.h phy: qcom-qmp: Add missing offsets for Qserdes PLL registers. 2024-06-03 19:32:32 +05:30
phy-qcom-qmp-qserdes-txrx-ufs-v6.h phy: qcom: qmp-ufs: update SM8650 tables for Gear 4 & 5 2024-04-12 15:14:08 +05:30
phy-qcom-qmp-qserdes-txrx-ufs-v7.h phy: qcom-qmp-ufs: Add PHY Configuration support for sm8750 2025-03-11 12:24:46 +01:00
phy-qcom-qmp-qserdes-txrx-v3.h
phy-qcom-qmp-qserdes-txrx-v4.h
phy-qcom-qmp-qserdes-txrx-v4_20.h
phy-qcom-qmp-qserdes-txrx-v5.h
phy-qcom-qmp-qserdes-txrx-v5_5nm.h
phy-qcom-qmp-qserdes-txrx-v5_20.h
phy-qcom-qmp-qserdes-txrx-v6.h phy: qualcomm: qmp-pcie: define several new registers 2024-12-08 21:30:08 +05:30
phy-qcom-qmp-qserdes-txrx-v6_20.h phy: qcom: qmp-pcie: Update PCIe1 PHY settings for SM8550 2024-01-30 22:34:54 +05:30
phy-qcom-qmp-qserdes-txrx-v6_n4.h phy: qcom-qmp: qserdes-txrx: Add missing registers offsets 2024-06-03 19:30:47 +05:30
phy-qcom-qmp-qserdes-txrx-v7.h
phy-qcom-qmp-qserdes-txrx-v8.h phy: qcom: qmp-combo: Add new PHY sequences for SM8750 2025-06-15 21:58:52 +05:30
phy-qcom-qmp-qserdes-txrx.h
phy-qcom-qmp-ufs.c phy: qcom-qmp-ufs: refactor qmp_ufs_power_off 2025-06-15 19:53:24 +05:30
phy-qcom-qmp-usb-legacy.c phy: qcom: qmp-usb-legacy: fix NULL-deref on runtime suspend 2024-10-17 18:33:46 +05:30
phy-qcom-qmp-usb.c phy: qcom-qmp-usb: Fix an NULL vs IS_ERR() bug 2025-05-14 09:29:44 +01:00
phy-qcom-qmp-usbc.c phy: qcom: qmp-usbc: Add qmp configuration for QCS615 2025-03-11 01:13:30 +05:30
phy-qcom-qmp.h phy: qcom: qmp-pcie: Update PHY settings for QCS8300 & SA8775P 2025-06-26 16:38:46 -07:00
phy-qcom-qusb2.c phy: drop probe registration printks 2025-06-16 22:54:21 +05:30
phy-qcom-sgmii-eth.c phy: qcom: sgmii-eth: move PCS registers to separate header 2024-01-30 22:35:39 +05:30
phy-qcom-snps-femto-v2.c
phy-qcom-uniphy-pcie-28lp.c phy: qualcomm: qcom-uniphy-pcie 28LP add support for IPQ5018 2025-04-11 17:11:47 +05:30
phy-qcom-usb-hs-28nm.c
phy-qcom-usb-hs.c
phy-qcom-usb-hsic.c
phy-qcom-usb-ss.c