usb: phy: mxs: disconnect line when USB charger is attached
authorXu Yang <xu.yang_2@nxp.com>
Tue, 27 Jun 2023 11:03:53 +0000 (19:03 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 25 Jul 2023 16:24:17 +0000 (18:24 +0200)
For mxs PHY, if there is a vbus but the bus is not enumerated, we need
to force the dp/dm as SE0 from the controller side. If not, there is
possible USB wakeup due to unstable dp/dm, since there is possible no
pull on dp/dm, such as there is a USB charger on the port.

Signed-off-by: Xu Yang <xu.yang_2@nxp.com>
Acked-by: Peter Chen <peter.chen@kernel.org>
Link: https://lore.kernel.org/r/20230627110353.1879477-3-xu.yang_2@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/phy/phy-mxs-usb.c

index 6572b91702a55f27b3a20c81b9fbf1f5590a0c6c..acd46b72899e900d126dde72922423b55300e401 100644 (file)
@@ -395,6 +395,7 @@ static bool mxs_phy_is_otg_host(struct mxs_phy *mxs_phy)
 static void mxs_phy_disconnect_line(struct mxs_phy *mxs_phy, bool on)
 {
        bool vbus_is_on = false;
+       enum usb_phy_events last_event = mxs_phy->phy.last_event;
 
        /* If the SoCs don't need to disconnect line without vbus, quit */
        if (!(mxs_phy->data->flags & MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS))
@@ -406,7 +407,8 @@ static void mxs_phy_disconnect_line(struct mxs_phy *mxs_phy, bool on)
 
        vbus_is_on = mxs_phy_get_vbus_status(mxs_phy);
 
-       if (on && !vbus_is_on && !mxs_phy_is_otg_host(mxs_phy))
+       if (on && ((!vbus_is_on && !mxs_phy_is_otg_host(mxs_phy))
+               || (last_event == USB_EVENT_VBUS)))
                __mxs_phy_disconnect_line(mxs_phy, true);
        else
                __mxs_phy_disconnect_line(mxs_phy, false);