Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

phy: freescale: imx8m-pcie: assert phy reset and perst in power off

Ensure the PHY reset and perst is asserted during power-off to
guarantee it is in a reset state upon repeated power-on calls. This
resolves an issue where the PHY may not properly initialize during
subsequent power-on cycles. Power-on will deassert the reset at the
appropriate time after tuning the PHY parameters.

During suspend/resume cycles, we observed that the PHY PLL failed to
lock during resume when the CPU temperature increased from 65C to 75C.
The observed errors were:
phy phy-32f00000.pcie-phy.3: phy poweron failed --> -110
imx6q-pcie 33800000.pcie: waiting for PHY ready timeout!
imx6q-pcie 33800000.pcie: PM: dpm_run_callback(): genpd_resume_noirq+0x0/0x80 returns -110
imx6q-pcie 33800000.pcie: PM: failed to resume noirq: error -110

This resulted in a complete CPU freeze, which is resolved by ensuring
the PHY is in reset during power-on, thus preventing PHY PLL failures.

Cc: stable@vger.kernel.org
Fixes: 1aa97b002258 ("phy: freescale: pcie: Initialize the imx8 pcie standalone phy driver")
Signed-off-by: Stefan Eichenberger <stefan.eichenberger@toradex.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://lore.kernel.org/r/20250305144355.20364-3-eichest@gmail.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>

authored by

Stefan Eichenberger and committed by
Vinod Koul
aecb63e8 97e8a2ff

+11
+11
drivers/phy/freescale/phy-fsl-imx8m-pcie.c
··· 156 156 return ret; 157 157 } 158 158 159 + static int imx8_pcie_phy_power_off(struct phy *phy) 160 + { 161 + struct imx8_pcie_phy *imx8_phy = phy_get_drvdata(phy); 162 + 163 + reset_control_assert(imx8_phy->reset); 164 + reset_control_assert(imx8_phy->perst); 165 + 166 + return 0; 167 + } 168 + 159 169 static int imx8_pcie_phy_init(struct phy *phy) 160 170 { 161 171 struct imx8_pcie_phy *imx8_phy = phy_get_drvdata(phy); ··· 186 176 .init = imx8_pcie_phy_init, 187 177 .exit = imx8_pcie_phy_exit, 188 178 .power_on = imx8_pcie_phy_power_on, 179 + .power_off = imx8_pcie_phy_power_off, 189 180 .owner = THIS_MODULE, 190 181 }; 191 182