summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCristian Birsan <cristian.birsan@microchip.com>2020-04-10 15:14:52 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2020-05-02 09:48:43 +0300
commit9dcb1844f884e8294e46ff317b0532068784eb5f (patch)
tree04a7909702238dbba3e14a83e85ff24bcb83f4e2
parent7155416143dd92957505f355bf117b2708af6221 (diff)
downloadlinux-9dcb1844f884e8294e46ff317b0532068784eb5f.tar.xz
usb: gadget: udc: atmel: Fix vbus disconnect handling
commit 12b94da411f9c6d950beb067d913024fd5617a61 upstream. A DMA transfer can be in progress while vbus is lost due to a cable disconnect. For endpoints that use DMA, this condition can lead to peripheral hang. The patch ensures that endpoints are disabled before the clocks are stopped to prevent this issue. Fixes: a64ef71ddc13 ("usb: gadget: atmel_usba_udc: condition clocks to vbus state") Signed-off-by: Cristian Birsan <cristian.birsan@microchip.com> Signed-off-by: Felipe Balbi <balbi@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/usb/gadget/udc/atmel_usba_udc.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c b/drivers/usb/gadget/udc/atmel_usba_udc.c
index 1d0d8952a74b..58e5b015d40e 100644
--- a/drivers/usb/gadget/udc/atmel_usba_udc.c
+++ b/drivers/usb/gadget/udc/atmel_usba_udc.c
@@ -1950,10 +1950,10 @@ static irqreturn_t usba_vbus_irq_thread(int irq, void *devid)
usba_start(udc);
} else {
udc->suspended = false;
- usba_stop(udc);
-
if (udc->driver->disconnect)
udc->driver->disconnect(&udc->gadget);
+
+ usba_stop(udc);
}
udc->vbus_prev = vbus;
}