Skip to content

Commit 11ee51a

Browse files
eichenbergerjfvogel
authored andcommitted
phy: freescale: imx8m-pcie: assert phy reset and perst in power off
commit aecb63e88c5e5fb9afb782a1577264c76f179af9 upstream. 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: [email protected] Fixes: 1aa97b0 ("phy: freescale: pcie: Initialize the imx8 pcie standalone phy driver") Signed-off-by: Stefan Eichenberger <[email protected]> Reviewed-by: Frank Li <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Vinod Koul <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]> (cherry picked from commit beb9a5cb7aa57e712ff5b7827e6bf3e2ed42aa99) Signed-off-by: Jack Vogel <[email protected]>
1 parent 5b4427f commit 11ee51a

File tree

1 file changed

+11
-0
lines changed

1 file changed

+11
-0
lines changed

drivers/phy/freescale/phy-fsl-imx8m-pcie.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,16 @@ static int imx8_pcie_phy_power_on(struct phy *phy)
162162
return ret;
163163
}
164164

165+
static int imx8_pcie_phy_power_off(struct phy *phy)
166+
{
167+
struct imx8_pcie_phy *imx8_phy = phy_get_drvdata(phy);
168+
169+
reset_control_assert(imx8_phy->reset);
170+
reset_control_assert(imx8_phy->perst);
171+
172+
return 0;
173+
}
174+
165175
static int imx8_pcie_phy_init(struct phy *phy)
166176
{
167177
struct imx8_pcie_phy *imx8_phy = phy_get_drvdata(phy);
@@ -182,6 +192,7 @@ static const struct phy_ops imx8_pcie_phy_ops = {
182192
.init = imx8_pcie_phy_init,
183193
.exit = imx8_pcie_phy_exit,
184194
.power_on = imx8_pcie_phy_power_on,
195+
.power_off = imx8_pcie_phy_power_off,
185196
.owner = THIS_MODULE,
186197
};
187198

0 commit comments

Comments
 (0)