usb: dwc2: Change hub-control to allow hibernation
authorVardan Mikayelyan <mvardan@synopsys.com>
Fri, 16 Feb 2018 10:12:02 +0000 (14:12 +0400)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Tue, 13 Mar 2018 08:47:57 +0000 (10:47 +0200)
Affected cases:
ClearPortFeature's
 USB_PORT_FEAT_SUSPEND

SetPortFeature's
 USB_PORT_FEAT_SUSPEND
 USB_PORT_FEAT_RESET

Signed-off-by: Vardan Mikayelyan <mvardan@synopsys.com>
Signed-off-by: John Youn <johnyoun@synopsys.com>
Signed-off-by: Grigor Tovmasyan <tovmasya@synopsys.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
drivers/usb/dwc2/hcd.c

index 4fbd0d3..66c0742 100644 (file)
@@ -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");