lkml.org 
[lkml]   [2021]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.13 722/800] usb: phy: tegra: Wait for VBUS wakeup status deassertion on suspend
    Date
    From: Dmitry Osipenko <digetx@gmail.com>

    [ Upstream commit 6f8d39a8ef55efde414b6e574384acbce70c3119 ]

    Some devices need an extra delay after losing VBUS, otherwise VBUS may
    be detected as active at suspend time, preventing the PHY's suspension
    by the VBUS detection sensor. This problem was found on Asus Transformer
    TF700T (Tegra30) tablet device, where the USB PHY wakes up immediately
    from suspend because VBUS sensor continues to detect VBUS as active after
    disconnection. We need to poll the PHY's VBUS wakeup status until it's
    deasserted before suspending PHY in order to fix this minor trouble.

    Fixes: 35192007d28d ("usb: phy: tegra: Support waking up from a low power mode")
    Reported-by: Maxim Schwalm <maxim.schwalm@gmail.com> # Asus TF700T
    Tested-by: Maxim Schwalm <maxim.schwalm@gmail.com> # Asus TF700T
    Reviewed-by: Peter Chen <peter.chen@kernel.org>
    Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
    Link: https://lore.kernel.org/r/20210613145936.9902-1-digetx@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/usb/phy/phy-tegra-usb.c | 10 ++++++++++
    1 file changed, 10 insertions(+)

    diff --git a/drivers/usb/phy/phy-tegra-usb.c b/drivers/usb/phy/phy-tegra-usb.c
    index a48452a6172b..10fafcf9801b 100644
    --- a/drivers/usb/phy/phy-tegra-usb.c
    +++ b/drivers/usb/phy/phy-tegra-usb.c
    @@ -64,6 +64,7 @@
    #define A_VBUS_VLD_WAKEUP_EN BIT(30)

    #define USB_PHY_VBUS_WAKEUP_ID 0x408
    +#define VBUS_WAKEUP_STS BIT(10)
    #define VBUS_WAKEUP_WAKEUP_EN BIT(30)

    #define USB1_LEGACY_CTRL 0x410
    @@ -642,6 +643,15 @@ static int utmi_phy_power_off(struct tegra_usb_phy *phy)
    void __iomem *base = phy->regs;
    u32 val;

    + /*
    + * Give hardware time to settle down after VBUS disconnection,
    + * otherwise PHY will immediately wake up from suspend.
    + */
    + if (phy->wakeup_enabled && phy->mode != USB_DR_MODE_HOST)
    + readl_relaxed_poll_timeout(base + USB_PHY_VBUS_WAKEUP_ID,
    + val, !(val & VBUS_WAKEUP_STS),
    + 5000, 100000);
    +
    utmi_phy_clk_disable(phy);

    /* PHY won't resume if reset is asserted */
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-07-12 11:09    [W:2.690 / U:0.576 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site