Patchwork [04/14] usb: dwc2: Fix suspend state in host mode for partial power down.

login
register
mail settings
Submitter Artur Petrosyan
Date April 12, 2019, 1:39 p.m.
Message ID <88aedc90b7b786cbfbfb80a84abbf707b5777c12.1555075928.git.arturp@synopsys.com>
Download mbox | patch
Permalink /patch/771833/
State New
Headers show

Comments

Artur Petrosyan - April 12, 2019, 1:39 p.m.
- In dwc2_port_suspend() function added waiting for the
  HPRT0.PrtSusp register field to be set.

- In _dwc2_hcd_suspend() function added checking of
  "hsotg->flags.b.port_connect_status" port connection
  status if port connection status is 0 then skipping
  power saving (entering partial power down mode).
  Because if there is no device connected there would
  be no need to enter partial power down mode.

- Added "hsotg->bus_suspended = true" beceuse after
  entering partial power down in host mode the
  bus_suspended flag must be set.

Signed-off-by: Artur Petrosyan <arturp@synopsys.com>

---
 drivers/usb/dwc2/hcd.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

-- 
2.11.0

Patch

diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c

index dd82fa516f3f..1d18258b5ff8 100644

--- a/drivers/usb/dwc2/hcd.c

+++ b/drivers/usb/dwc2/hcd.c

@@ -3479,6 +3479,10 @@  static void dwc2_port_suspend(struct dwc2_hsotg *hsotg, u16 windex)

 	hprt0 |= HPRT0_SUSP;
 	dwc2_writel(hsotg, hprt0, HPRT0);
 
+	/* Wait for the HPRT0.PrtSusp register field to be set */

+	if (dwc2_hsotg_wait_bit_set(hsotg, HPRT0, HPRT0_SUSP, 3000))

+		dev_warn(hsotg->dev, "Suspend wasn't generated\n");

+

 	hsotg->bus_suspended = true;
 
 	/*
@@ -4488,7 +4492,8 @@  static int _dwc2_hcd_suspend(struct usb_hcd *hcd)

 	if (hsotg->op_state == OTG_STATE_B_PERIPHERAL)
 		goto unlock;
 
-	if (hsotg->params.power_down != DWC2_POWER_DOWN_PARAM_PARTIAL)

+	if (hsotg->params.power_down != DWC2_POWER_DOWN_PARAM_PARTIAL ||

+	    hsotg->flags.b.port_connect_status == 0)

 		goto skip_power_saving;
 
 	/*
@@ -4514,6 +4519,8 @@  static int _dwc2_hcd_suspend(struct usb_hcd *hcd)

 		goto skip_power_saving;
 	}
 
+	hsotg->bus_suspended = true;

+

 	/* Ask phy to be suspended */
 	if (!IS_ERR_OR_NULL(hsotg->uphy)) {
 		spin_unlock_irqrestore(&hsotg->lock, flags);