]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
usb: dwc2: gadget: Fix exiting from clock gating
authorMinas Harutyunyan <Minas.Harutyunyan@synopsys.com>
Wed, 13 Mar 2024 09:22:01 +0000 (09:22 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 10 Apr 2024 14:19:33 +0000 (16:19 +0200)
commit 31f42da31417bec88158f3cf62d19db836217f1e upstream.

Added exiting from the clock gating mode on USB Reset Detect interrupt
if core in the clock gating mode.
Added new condition to check core in clock gating mode or no.

Fixes: 9b4965d77e11 ("usb: dwc2: Add exit clock gating from session request interrupt")
Fixes: 5d240efddc7f ("usb: dwc2: Add exit clock gating from wakeup interrupt")
Fixes: 16c729f90bdf ("usb: dwc2: Allow exit clock gating in urb enqueue")
Fixes: 401411bbc4e6 ("usb: dwc2: Add exit clock gating before removing driver")
CC: stable@vger.kernel.org
Signed-off-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
Link: https://lore.kernel.org/r/cbcc2ccd37e89e339130797ed68ae4597db773ac.1708938774.git.Minas.Harutyunyan@synopsys.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc2/core_intr.c
drivers/usb/dwc2/gadget.c
drivers/usb/dwc2/hcd.c
drivers/usb/dwc2/platform.c

index a5c52b237e723753e9574dfe7236d0a445cf06cb..2288cf86d230a4bcf22e1021aa2f006f1a93b630 100644 (file)
@@ -327,7 +327,8 @@ static void dwc2_handle_session_req_intr(struct dwc2_hsotg *hsotg)
 
                        /* Exit gadget mode clock gating. */
                        if (hsotg->params.power_down ==
-                           DWC2_POWER_DOWN_PARAM_NONE && hsotg->bus_suspended)
+                           DWC2_POWER_DOWN_PARAM_NONE && hsotg->bus_suspended &&
+                           !hsotg->params.no_clock_gating)
                                dwc2_gadget_exit_clock_gating(hsotg, 0);
                }
 
@@ -438,7 +439,8 @@ static void dwc2_handle_wakeup_detected_intr(struct dwc2_hsotg *hsotg)
 
                        /* Exit gadget mode clock gating. */
                        if (hsotg->params.power_down ==
-                           DWC2_POWER_DOWN_PARAM_NONE && hsotg->bus_suspended)
+                           DWC2_POWER_DOWN_PARAM_NONE && hsotg->bus_suspended &&
+                           !hsotg->params.no_clock_gating)
                                dwc2_gadget_exit_clock_gating(hsotg, 0);
                } else {
                        /* Change to L0 state */
@@ -455,7 +457,8 @@ static void dwc2_handle_wakeup_detected_intr(struct dwc2_hsotg *hsotg)
                        }
 
                        if (hsotg->params.power_down ==
-                           DWC2_POWER_DOWN_PARAM_NONE && hsotg->bus_suspended)
+                           DWC2_POWER_DOWN_PARAM_NONE && hsotg->bus_suspended &&
+                           !hsotg->params.no_clock_gating)
                                dwc2_host_exit_clock_gating(hsotg, 1);
 
                        /*
index 519bb82b00e80788433ff5a552b090ec2360005f..7cd33a7ff34f3d466e52b2e14338eb96b3af598d 100644 (file)
@@ -3728,6 +3728,12 @@ irq_retry:
                if (hsotg->in_ppd && hsotg->lx_state == DWC2_L2)
                        dwc2_exit_partial_power_down(hsotg, 0, true);
 
+               /* Exit gadget mode clock gating. */
+               if (hsotg->params.power_down ==
+                   DWC2_POWER_DOWN_PARAM_NONE && hsotg->bus_suspended &&
+                   !hsotg->params.no_clock_gating)
+                       dwc2_gadget_exit_clock_gating(hsotg, 0);
+
                hsotg->lx_state = DWC2_L0;
        }
 
index 2701db3a9714da72f20a689d7df966231a2db8af..f6195f44e548a7c647d5e23163e0e879cccf4059 100644 (file)
@@ -4690,7 +4690,7 @@ static int _dwc2_hcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
        }
 
        if (hsotg->params.power_down == DWC2_POWER_DOWN_PARAM_NONE &&
-           hsotg->bus_suspended) {
+           hsotg->bus_suspended && !hsotg->params.no_clock_gating) {
                if (dwc2_is_device_mode(hsotg))
                        dwc2_gadget_exit_clock_gating(hsotg, 0);
                else
index 6496bfbd34ed9371091868f4bbd4d12ee6e7bbf3..79094384d8fd46f87a1609e689f8fbe27cc537e7 100644 (file)
@@ -344,7 +344,7 @@ static int dwc2_driver_remove(struct platform_device *dev)
 
        /* Exit clock gating when driver is removed. */
        if (hsotg->params.power_down == DWC2_POWER_DOWN_PARAM_NONE &&
-           hsotg->bus_suspended) {
+           hsotg->bus_suspended && !hsotg->params.no_clock_gating) {
                if (dwc2_is_device_mode(hsotg))
                        dwc2_gadget_exit_clock_gating(hsotg, 0);
                else