From 903ae6416934c14b06e674a4d890079aca4b2f40 Mon Sep 17 00:00:00 2001 From: Peter Chen Date: Thu, 21 Dec 2017 09:05:45 +0800 Subject: [PATCH] MLK-17261-1 usb: cdns3: gadget: fix the spinlock recursion problem when detach cable The __cdns3_gadget_stop holds spinlock before calling usb_ss->gadget_driver->disconnect which calls ep_disable, and ep_disable tries to hold spinlock too. To fix it, let spinlock only protect the variable and register access. Acked-by: Jun Li Signed-off-by: Peter Chen --- drivers/usb/cdns3/gadget.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/usb/cdns3/gadget.c b/drivers/usb/cdns3/gadget.c index c2e42f8a4085..135fa5a64bad 100644 --- a/drivers/usb/cdns3/gadget.c +++ b/drivers/usb/cdns3/gadget.c @@ -2227,14 +2227,13 @@ static void __cdns3_gadget_stop(struct cdns3 *cdns) unsigned long flags; usb_ss = container_of(cdns->gadget_dev, struct usb_ss_dev, dev); + if (usb_ss->gadget_driver) + usb_ss->gadget_driver->disconnect(&usb_ss->gadget); + usb_gadget_disconnect(&usb_ss->gadget); spin_lock_irqsave(&usb_ss->lock, flags); - /* disable interrupt for device */ gadget_writel(usb_ss, &usb_ss->regs->usb_ien, 0); gadget_writel(usb_ss, &usb_ss->regs->usb_conf, USB_CONF__DEVDS__MASK); - if (usb_ss->gadget_driver) - usb_ss->gadget_driver->disconnect(&usb_ss->gadget); - usb_gadget_disconnect(&usb_ss->gadget); usb_ss->start_gadget = 0; spin_unlock_irqrestore(&usb_ss->lock, flags); } -- 2.17.1