These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / usb / gadget / udc / pch_udc.c
index 613547f..7a04157 100644 (file)
@@ -330,7 +330,7 @@ struct pch_vbus_gpio_data {
  * @prot_stall:                protcol stall requested
  * @irq_registered:    irq registered with system
  * @mem_region:                device memory mapped
- * @registered:                driver regsitered with system
+ * @registered:                driver registered with system
  * @suspended:         driver in suspended state
  * @connected:         gadget driver associated
  * @vbus_session:      required vbus_session state
@@ -620,9 +620,9 @@ static inline void pch_udc_vbus_session(struct pch_udc_dev *dev,
                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;
@@ -1191,9 +1191,9 @@ static int pch_udc_pcd_pullup(struct usb_gadget *gadget, int is_on)
                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);
        }
@@ -1488,11 +1488,11 @@ static void complete_req(struct pch_udc_ep *ep, struct pch_udc_request *req,
                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;
 }
 
@@ -1793,7 +1793,7 @@ static struct usb_request *pch_udc_alloc_request(struct usb_ep *usbep,
        }
        /* prevent from using desc. - set HOST BUSY */
        dma_desc->status |= PCH_UDC_BS_HST_BSY;
-       dma_desc->dataptr = __constant_cpu_to_le32(DMA_ADDR_INVALID);
+       dma_desc->dataptr = cpu_to_le32(DMA_ADDR_INVALID);
        req->td_data = dma_desc;
        req->td_data_last = dma_desc;
        req->chain_len = 1;
@@ -2414,7 +2414,7 @@ static void pch_udc_svc_control_out(struct pch_udc_dev *dev)
                        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))
@@ -2422,7 +2422,7 @@ static void pch_udc_svc_control_out(struct pch_udc_dev *dev)
                /* 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 &
@@ -2594,9 +2594,9 @@ static void pch_udc_svc_ur_interrupt(struct pch_udc_dev *dev)
                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);
        }
 }
 
@@ -2675,9 +2675,9 @@ static void pch_udc_svc_intf_interrupt(struct pch_udc_dev *dev)
                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);
 }
 
 /**
@@ -2712,9 +2712,9 @@ static void pch_udc_svc_cfg_interrupt(struct pch_udc_dev *dev)
        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);
 }
 
 /**
@@ -2895,11 +2895,21 @@ static void pch_udc_pcd_reinit(struct pch_udc_dev *dev)
                ep->in = ~i & 1;
                ep->ep.name = ep_string[i];
                ep->ep.ops = &pch_udc_ep_ops;
-               if (ep->in)
+               if (ep->in) {
                        ep->offset_addr = ep->num * UDC_EP_REG_SHIFT;
-               else
+                       ep->ep.caps.dir_in = true;
+               } else {
                        ep->offset_addr = (UDC_EPINT_OUT_SHIFT + ep->num) *
                                          UDC_EP_REG_SHIFT;
+                       ep->ep.caps.dir_out = true;
+               }
+               if (i == UDC_EP0IN_IDX || i == UDC_EP0OUT_IDX) {
+                       ep->ep.caps.type_control = true;
+               } else {
+                       ep->ep.caps.type_iso = true;
+                       ep->ep.caps.type_bulk = true;
+                       ep->ep.caps.type_int = true;
+               }
                /* need to set ep->ep.maxpacket and set Default Configuration?*/
                usb_ep_set_maxpacket_limit(&ep->ep, UDC_BULK_MAX_PKT_SIZE);
                list_add_tail(&ep->ep.ep_list, &dev->gadget.ep_list);