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 <pkondeti@codeaurora.org>
This commit is contained in:
Pavankumar Kondeti
2011-11-24 09:09:23 +05:30
parent 0ee27887be
commit 9885328d7f
+3 -4
View File
@@ -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);