dev->vbus_session = 1;
        } else {
                if (dev->driver && dev->driver->disconnect) {
-                       spin_unlock(&dev->lock);
-                       dev->driver->disconnect(&dev->gadget);
                        spin_lock(&dev->lock);
+                       dev->driver->disconnect(&dev->gadget);
+                       spin_unlock(&dev->lock);
                }
                pch_udc_set_disconnect(dev);
                dev->vbus_session = 0;
                pch_udc_reconnect(dev);
        } else {
                if (dev->driver && dev->driver->disconnect) {
-                       spin_unlock(&dev->lock);
-                       dev->driver->disconnect(&dev->gadget);
                        spin_lock(&dev->lock);
+                       dev->driver->disconnect(&dev->gadget);
+                       spin_unlock(&dev->lock);
                }
                pch_udc_set_disconnect(dev);
        }
                req->dma_mapped = 0;
        }
        ep->halted = 1;
-       spin_unlock(&dev->lock);
+       spin_lock(&dev->lock);
        if (!ep->in)
                pch_udc_ep_clear_rrdy(ep);
        usb_gadget_giveback_request(&ep->ep, &req->req);
-       spin_lock(&dev->lock);
+       spin_unlock(&dev->lock);
        ep->halted = halted;
 }
 
                        dev->gadget.ep0 = &dev->ep[UDC_EP0IN_IDX].ep;
                else /* OUT */
                        dev->gadget.ep0 = &ep->ep;
-               spin_unlock(&dev->lock);
+               spin_lock(&dev->lock);
                /* If Mass storage Reset */
                if ((dev->setup_data.bRequestType == 0x21) &&
                    (dev->setup_data.bRequest == 0xFF))
                /* call gadget with setup data received */
                setup_supported = dev->driver->setup(&dev->gadget,
                                                     &dev->setup_data);
-               spin_lock(&dev->lock);
+               spin_unlock(&dev->lock);
 
                if (dev->setup_data.bRequestType & USB_DIR_IN) {
                        ep->td_data->status = (ep->td_data->status &
                empty_req_queue(ep);
        }
        if (dev->driver) {
-               spin_unlock(&dev->lock);
-               usb_gadget_udc_reset(&dev->gadget, dev->driver);
                spin_lock(&dev->lock);
+               usb_gadget_udc_reset(&dev->gadget, dev->driver);
+               spin_unlock(&dev->lock);
        }
 }
 
                dev->ep[i].halted = 0;
        }
        dev->stall = 0;
-       spin_unlock(&dev->lock);
-       ret = dev->driver->setup(&dev->gadget, &dev->setup_data);
        spin_lock(&dev->lock);
+       ret = dev->driver->setup(&dev->gadget, &dev->setup_data);
+       spin_unlock(&dev->lock);
 }
 
 /**
        dev->stall = 0;
 
        /* call gadget zero with setup data received */
-       spin_unlock(&dev->lock);
-       ret = dev->driver->setup(&dev->gadget, &dev->setup_data);
        spin_lock(&dev->lock);
+       ret = dev->driver->setup(&dev->gadget, &dev->setup_data);
+       spin_unlock(&dev->lock);
 }
 
 /**
        if (dev_intr & UDC_DEVINT_US) {
                if (dev->driver
                        && dev->driver->suspend) {
-                       spin_unlock(&dev->lock);
-                       dev->driver->suspend(&dev->gadget);
                        spin_lock(&dev->lock);
+                       dev->driver->suspend(&dev->gadget);
+                       spin_unlock(&dev->lock);
                }
 
                vbus = pch_vbus_gpio_get_value(dev);
                if ((dev->vbus_session == 0)
                        && (vbus != 1)) {
                        if (dev->driver && dev->driver->disconnect) {
-                               spin_unlock(&dev->lock);
-                               dev->driver->disconnect(&dev->gadget);
                                spin_lock(&dev->lock);
+                               dev->driver->disconnect(&dev->gadget);
+                               spin_unlock(&dev->lock);
                        }
                        pch_udc_reconnect(dev);
                } else if ((dev->vbus_session == 0)