The ChipIdea driver enters into suspend immediately after seeing a VBUS disconnection. Some devices need an extra delay after losing VBUS, otherwise VBUS may be floating, preventing the PHY's suspending by the VBUS detection sensors. This problem was found on Tegra30 Asus Transformer TF700T tablet device, where the USB PHY wakes up immediately from suspend because VBUS sensor continues to detect VBUS as active after disconnection. A minimum delay of 20ms is needed in order to fix this issue, hence add 25ms delay before suspending the PHY. Reported-by: Maxim Schwalm <maxim.schwalm@xxxxxxxxx> # Asus TF700T Tested-by: Maxim Schwalm <maxim.schwalm@xxxxxxxxx> # Asus TF700T Signed-off-by: Dmitry Osipenko <digetx@xxxxxxxxx> --- drivers/usb/chipidea/ci_hdrc_tegra.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/usb/chipidea/ci_hdrc_tegra.c b/drivers/usb/chipidea/ci_hdrc_tegra.c index 60361141ac04..d1359b76a0e8 100644 --- a/drivers/usb/chipidea/ci_hdrc_tegra.c +++ b/drivers/usb/chipidea/ci_hdrc_tegra.c @@ -4,6 +4,7 @@ */ #include <linux/clk.h> +#include <linux/delay.h> #include <linux/io.h> #include <linux/module.h> #include <linux/of_device.h> @@ -255,6 +256,13 @@ static int tegra_ehci_hub_control(struct ci_hdrc *ci, u16 typeReq, u16 wValue, static void tegra_usb_enter_lpm(struct ci_hdrc *ci, bool enable) { + /* + * Give hardware time to settle down after VBUS disconnection, + * otherwise PHY may wake up from suspend immediately. + */ + if (enable) + msleep(25); + /* * Touching any register which belongs to AHB clock domain will * hang CPU if USB controller is put into low power mode because -- 2.30.2