[PATCH v2 3/3] phy: exynos5-usbdrd: fix HS phy init count imbalance on Exynos2200

From: Soheyb

Date: Tue Nov 10 2026 - 22:25:25 EST


exynos2200_usbdrd_utmi_init() calls phy_init() on the high-speed phy,
but exynos2200_usbdrd_phy_exit() never calls phy_exit() on it. The init
count of the high-speed phy therefore never drops back to zero: after
the first init, every later phy_init() of it returns early, and its
clocks and supplies stay enabled across an exit of the UTMI phy.

When the high-speed phy loses power while the controller is suspended,
it is thus not set up again on resume, and the DWC3 core soft reset
times out:

dwc3 11210000.usb: DWC3 controller soft reset failed

Exit the high-speed phy when the UTMI phy exits, last, once the rest of
the exit has succeeded: the phy core counts a failed exit as no exit,
so the high-speed phy has to stay initialized along with the UTMI phy.

Fixes: cc52a697f87e ("phy: exynos5-usbdrd: support Exynos USBDRD 3.2 4nm controller")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Soheyb <soheyb_boulaa@xxxxxxxxx>
---
v2: the high-speed phy exits last, once the rest of the exit has
succeeded, after Sashiko's review of v1; v1 exited it first. The comment
is dropped, after Ivaylo's review of v1. His Acked-by of v1 is left
out, since the exit has moved.

drivers/phy/samsung/phy-exynos5-usbdrd.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/phy/samsung/phy-exynos5-usbdrd.c b/drivers/phy/samsung/phy-exynos5-usbdrd.c
index cf0597a..041a555 100644
--- a/drivers/phy/samsung/phy-exynos5-usbdrd.c
+++ b/drivers/phy/samsung/phy-exynos5-usbdrd.c
@@ -1510,8 +1510,15 @@ static int exynos2200_usbdrd_phy_exit(struct phy *phy)
clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);

exynos5_usbdrd_phy_isol(inst, true);
- return regulator_bulk_disable(phy_drd->drv_data->n_regulators,
- phy_drd->regulators);
+ ret = regulator_bulk_disable(phy_drd->drv_data->n_regulators,
+ phy_drd->regulators);
+ if (ret)
+ return ret;
+
+ if (inst->phy_cfg->id == EXYNOS5_DRDPHY_UTMI)
+ return phy_exit(phy_drd->hs_phy);
+
+ return 0;
}

static const struct phy_ops exynos2200_usbdrd_phy_ops = {
--
2.56.0