diff --git a/drivers/usb/otg/msm_otg.c b/drivers/usb/otg/msm_otg.c index 886dbe47db8..a9f18128901 100644 --- a/drivers/usb/otg/msm_otg.c +++ b/drivers/usb/otg/msm_otg.c @@ -843,10 +843,14 @@ static int msm_otg_suspend(struct msm_otg *motg) clk_disable_unprepare(motg->core_clk); /* usb phy no more require TCXO clock, hence vote for TCXO disable */ - ret = msm_xo_mode_vote(motg->xo_handle, MSM_XO_MODE_OFF); - if (ret) - dev_err(otg->dev, "%s failed to devote for " - "TCXO D0 buffer%d\n", __func__, ret); + if (!host_bus_suspend) { + ret = msm_xo_mode_vote(motg->xo_handle, MSM_XO_MODE_OFF); + if (ret) + dev_err(phy->dev, "%s failed to devote for " + "TCXO D0 buffer%d\n", __func__, ret); + else + motg->lpm_flags |= XO_SHUTDOWN; + } if (motg->caps & ALLOW_PHY_POWER_COLLAPSE && !host_bus_suspend && !dcp) { @@ -891,10 +895,13 @@ static int msm_otg_resume(struct msm_otg *motg) wake_lock(&motg->wlock); /* Vote for TCXO when waking up the phy */ - ret = msm_xo_mode_vote(motg->xo_handle, MSM_XO_MODE_ON); - if (ret) - dev_err(phy->dev, "%s failed to vote for " - "TCXO D0 buffer%d\n", __func__, ret); + if (motg->lpm_flags & XO_SHUTDOWN) { + ret = msm_xo_mode_vote(motg->xo_handle, MSM_XO_MODE_ON); + if (ret) + dev_err(phy->dev, "%s failed to vote for " + "TCXO D0 buffer%d\n", __func__, ret); + motg->lpm_flags &= ~XO_SHUTDOWN; + } clk_prepare_enable(motg->core_clk); diff --git a/include/linux/usb/msm_hsusb.h b/include/linux/usb/msm_hsusb.h index e2a0392d0fa..f8329dd932d 100644 --- a/include/linux/usb/msm_hsusb.h +++ b/include/linux/usb/msm_hsusb.h @@ -335,6 +335,7 @@ struct msm_otg { unsigned long lpm_flags; #define PHY_PWR_COLLAPSED BIT(0) #define PHY_RETENTIONED BIT(1) +#define XO_SHUTDOWN BIT(2) int reset_counter; unsigned long b_last_se0_sess; unsigned long tmouts;