|
@@ -3506,8 +3506,12 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,
|
|
|
dev_dbg(hsotg->dev,
|
|
|
"ClearPortFeature USB_PORT_FEAT_SUSPEND\n");
|
|
|
|
|
|
- if (hsotg->bus_suspended)
|
|
|
- dwc2_port_resume(hsotg);
|
|
|
+ if (hsotg->bus_suspended) {
|
|
|
+ if (hsotg->hibernated)
|
|
|
+ dwc2_exit_hibernation(hsotg, 0, 0, 1);
|
|
|
+ else
|
|
|
+ dwc2_port_resume(hsotg);
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
case USB_PORT_FEAT_POWER:
|
|
@@ -3715,7 +3719,10 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,
|
|
|
"SetPortFeature - USB_PORT_FEAT_SUSPEND\n");
|
|
|
if (windex != hsotg->otg_port)
|
|
|
goto error;
|
|
|
- dwc2_port_suspend(hsotg, windex);
|
|
|
+ if (hsotg->params.power_down == 2)
|
|
|
+ dwc2_enter_hibernation(hsotg, 1);
|
|
|
+ else
|
|
|
+ dwc2_port_suspend(hsotg, windex);
|
|
|
break;
|
|
|
|
|
|
case USB_PORT_FEAT_POWER:
|
|
@@ -3727,6 +3734,9 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,
|
|
|
break;
|
|
|
|
|
|
case USB_PORT_FEAT_RESET:
|
|
|
+ if (hsotg->params.power_down == 2 &&
|
|
|
+ hsotg->hibernated)
|
|
|
+ dwc2_exit_hibernation(hsotg, 0, 1, 1);
|
|
|
hprt0 = dwc2_read_hprt0(hsotg);
|
|
|
dev_dbg(hsotg->dev,
|
|
|
"SetPortFeature - USB_PORT_FEAT_RESET\n");
|