Message ID | 20240823073832.1702135-1-xu.yang_2@nxp.com (mailing list archive) |
---|---|
State | Accepted |
Commit | e4fdcc10092fb244218013bfe8ff01c55d54e8e4 |
Headers | show |
Series | usb: chipidea: udc: enable suspend interrupt after usb reset | expand |
On 24-08-23 15:38:32, Xu Yang wrote: > 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> > --- > drivers/usb/chipidea/udc.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c > index 2d7f616270c1..69ef3cd8d4f8 100644 > --- a/drivers/usb/chipidea/udc.c > +++ b/drivers/usb/chipidea/udc.c > @@ -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; > -- > 2.34.1 >
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index 2d7f616270c1..69ef3cd8d4f8 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c @@ -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;
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> --- drivers/usb/chipidea/udc.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)