]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
usb: chipidea: udc: enable suspend interrupt after usb reset
authorXu Yang <xu.yang_2@nxp.com>
Fri, 23 Aug 2024 07:38:32 +0000 (15:38 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 3 Sep 2024 07:49:29 +0000 (09:49 +0200)
Currently, suspend interrupt is enabled before pullup enable operation.
This will cause a suspend interrupt assert right after pullup DP. This
suspend interrupt is meaningless, so this will ignore such interrupt
by enable it after usb reset completed.

Signed-off-by: Xu Yang <xu.yang_2@nxp.com>
Acked-by: Peter Chen <peter.chen@kernel.org>
Link: https://lore.kernel.org/r/20240823073832.1702135-1-xu.yang_2@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/chipidea/udc.c

index 2d7f616270c17ba8d488459d7a84c62d18b083f8..69ef3cd8d4f836ab52e9cbae847f1d461f966619 100644 (file)
@@ -86,7 +86,7 @@ static int hw_device_state(struct ci_hdrc *ci, u32 dma)
                hw_write(ci, OP_ENDPTLISTADDR, ~0, dma);
                /* interrupt, error, port change, reset, sleep/suspend */
                hw_write(ci, OP_USBINTR, ~0,
-                            USBi_UI|USBi_UEI|USBi_PCI|USBi_URI|USBi_SLI);
+                            USBi_UI|USBi_UEI|USBi_PCI|USBi_URI);
        } else {
                hw_write(ci, OP_USBINTR, ~0, 0);
        }
@@ -877,6 +877,7 @@ __releases(ci->lock)
 __acquires(ci->lock)
 {
        int retval;
+       u32 intr;
 
        spin_unlock(&ci->lock);
        if (ci->gadget.speed != USB_SPEED_UNKNOWN)
@@ -890,6 +891,11 @@ __acquires(ci->lock)
        if (retval)
                goto done;
 
+       /* clear SLI */
+       hw_write(ci, OP_USBSTS, USBi_SLI, USBi_SLI);
+       intr = hw_read(ci, OP_USBINTR, ~0);
+       hw_write(ci, OP_USBINTR, ~0, intr | USBi_SLI);
+
        ci->status = usb_ep_alloc_request(&ci->ep0in->ep, GFP_ATOMIC);
        if (ci->status == NULL)
                retval = -ENOMEM;