Skip to content

Commit

Permalink
usb: phy: tegra: Wait for VBUS wakeup status deassertion on suspend
Browse files Browse the repository at this point in the history
[ Upstream commit 6f8d39a ]

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: 3519200 ("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>
  • Loading branch information
digetx authored and gregkh committed Jul 14, 2021
1 parent 5edada4 commit e299a7a
Showing 1 changed file with 10 additions and 0 deletions.
10 changes: 10 additions & 0 deletions drivers/usb/phy/phy-tegra-usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 */
Expand Down

0 comments on commit e299a7a

Please sign in to comment.