From 9885328d7f63e6aee05f65d972eeb31bb61ffb86 Mon Sep 17 00:00:00 2001 From: Pavankumar Kondeti Date: Thu, 24 Nov 2011 09:01:54 +0530 Subject: [PATCH] USB: ci13xxx_udc: Fix runtime PM sleeping bug Call pm_runtime_get_sync() and pm_runtime_put_sync() functions outside spin lock to fix "sleeping function called from invalid context" bug. Change-Id: Ib96797743f40d6f8e33a0c954f096a4afdd86fe3 Signed-off-by: Pavankumar Kondeti --- drivers/usb/gadget/ci13xxx_udc.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/usb/gadget/ci13xxx_udc.c b/drivers/usb/gadget/ci13xxx_udc.c index 11bfe9fea39..17fe8203386 100644 --- a/drivers/usb/gadget/ci13xxx_udc.c +++ b/drivers/usb/gadget/ci13xxx_udc.c @@ -2862,6 +2862,7 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver, udc->softconnect = 1; spin_unlock_irqrestore(udc->lock, flags); + pm_runtime_get_sync(&udc->gadget.dev); retval = bind(&udc->gadget); /* MAY SLEEP */ spin_lock_irqsave(udc->lock, flags); @@ -2871,13 +2872,11 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver, } udc->driver = driver; - pm_runtime_get_sync(&udc->gadget.dev); if (udc->udc_driver->flags & CI13XXX_PULLUP_ON_VBUS) { if (udc->vbus_active) { if (udc->udc_driver->flags & CI13XXX_REGS_SHARED) hw_device_reset(udc); } else { - pm_runtime_put_sync(&udc->gadget.dev); goto done; } } @@ -2886,11 +2885,11 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver, goto done; retval = hw_device_state(udc->ep0out.qh.dma); - if (retval) - pm_runtime_put_sync(&udc->gadget.dev); done: spin_unlock_irqrestore(udc->lock, flags); + if (retval) + pm_runtime_put_sync(&udc->gadget.dev); return retval; } EXPORT_SYMBOL(usb_gadget_probe_driver);