If wakeup capable devices are connected to the controller (directly
or through hubs) at suspend time keep the power domain on in order
to support wakeup from these devices.
Signed-off-by: Sandeep Maheswaram <[email protected]>
---
drivers/usb/dwc3/dwc3-qcom.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c
index 356f4f8..23bf2c1 100644
--- a/drivers/usb/dwc3/dwc3-qcom.c
+++ b/drivers/usb/dwc3/dwc3-qcom.c
@@ -17,6 +17,7 @@
#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/phy/phy.h>
+#include <linux/pm_domain.h>
#include <linux/usb/of.h>
#include <linux/reset.h>
#include <linux/iopoll.h>
@@ -340,10 +341,15 @@ static int dwc3_qcom_suspend(struct dwc3_qcom *qcom)
{
u32 val;
int i, ret;
+ struct dwc3 *dwc = platform_get_drvdata(qcom->dwc3);
+ struct generic_pm_domain *genpd = pd_to_genpd(qcom->dev->pm_domain);
if (qcom->is_suspended)
return 0;
+ if (device_may_wakeup(&dwc->xhci->dev) && dwc->xhci)
+ genpd->flags |= GENPD_FLAG_ACTIVE_WAKEUP;
+
val = readl(qcom->qscratch_base + PWR_EVNT_IRQ_STAT_REG);
if (!(val & PWR_EVNT_LPM_IN_L2_MASK))
dev_err(qcom->dev, "HS-PHY not in L2\n");
@@ -367,10 +373,15 @@ static int dwc3_qcom_resume(struct dwc3_qcom *qcom)
{
int ret;
int i;
+ struct dwc3 *dwc = platform_get_drvdata(qcom->dwc3);
+ struct generic_pm_domain *genpd = pd_to_genpd(qcom->dev->pm_domain);
if (!qcom->is_suspended)
return 0;
+ if (dwc->xhci)
+ genpd->flags &= ~GENPD_FLAG_ACTIVE_WAKEUP;
+
if (device_may_wakeup(qcom->dev))
dwc3_qcom_disable_interrupts(qcom);
--
2.7.4