67 lines
2.1 KiB
Diff
67 lines
2.1 KiB
Diff
From git@z Thu Jan 1 00:00:00 1970
|
|
Subject: [PATCH v13 30/35] phy: rockchip: usbdp: Add phy reset notification
|
|
support
|
|
From: Sebastian Reichel <sebastian.reichel@collabora.com>
|
|
Date: Tue, 14 Jul 2026 21:26:31 +0200
|
|
Message-Id: <20260714-rockchip-usbdp-cleanup-v13-30-6cb3e769d4c5@collabora.com>
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset="utf-8"
|
|
Content-Transfer-Encoding: 7bit
|
|
|
|
To resolve issues with running into permanent "cmn ana lcpll lock
|
|
timeout" errors after a few device replugs, add support for reset
|
|
notifications, which will be handled by the DWC3 driver to gracefully
|
|
handle the PHY being disabled. This avoids corrupting the controller's
|
|
internal state and the PIPE interface between the USB3 controller and
|
|
the PHY, thus fixing the issue.
|
|
|
|
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
|
|
---
|
|
drivers/phy/rockchip/phy-rockchip-usbdp.c | 19 +++++++++++++++++--
|
|
1 file changed, 17 insertions(+), 2 deletions(-)
|
|
|
|
--- a/drivers/phy/rockchip/phy-rockchip-usbdp.c
|
|
+++ b/drivers/phy/rockchip/phy-rockchip-usbdp.c
|
|
@@ -1005,24 +1005,39 @@ static int rk_udphy_power_on(struct rk_u
|
|
}
|
|
|
|
if (udphy->status == UDPHY_MODE_NONE) {
|
|
+ phy_notify_reset(udphy->phy_u3, PHY_NOTIFY_PRE_RESET);
|
|
+
|
|
+ rk_udphy_u3_port_disable(udphy, true);
|
|
+ udelay(10);
|
|
+
|
|
ret = rk_udphy_setup(udphy);
|
|
- if (ret)
|
|
+ if (ret) {
|
|
+ phy_notify_reset(udphy->phy_u3, PHY_NOTIFY_POST_RESET);
|
|
return ret;
|
|
+ }
|
|
|
|
if (!udphy->hs && udphy->mode & UDPHY_MODE_USB)
|
|
rk_udphy_u3_port_disable(udphy, false);
|
|
udphy->phy_needs_reinit = false;
|
|
+
|
|
+ phy_notify_reset(udphy->phy_u3, PHY_NOTIFY_POST_RESET);
|
|
} else if (udphy->phy_needs_reinit) {
|
|
+ phy_notify_reset(udphy->phy_u3, PHY_NOTIFY_PRE_RESET);
|
|
+
|
|
rk_udphy_u3_port_disable(udphy, true);
|
|
udelay(10);
|
|
|
|
ret = rk_udphy_init(udphy);
|
|
- if (ret)
|
|
+ if (ret) {
|
|
+ phy_notify_reset(udphy->phy_u3, PHY_NOTIFY_POST_RESET);
|
|
return ret;
|
|
+ }
|
|
|
|
if (!udphy->hs && udphy->mode & UDPHY_MODE_USB)
|
|
rk_udphy_u3_port_disable(udphy, false);
|
|
udphy->phy_needs_reinit = false;
|
|
+
|
|
+ phy_notify_reset(udphy->phy_u3, PHY_NOTIFY_POST_RESET);
|
|
}
|
|
|
|
udphy->status |= mode;
|