diff options
Diffstat (limited to 'drivers/usb/chipidea/udc.c')
-rw-r--r-- | drivers/usb/chipidea/udc.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index 6a5ee8e6da10..67ad40b0a05b 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c | |||
@@ -709,12 +709,6 @@ static int _gadget_stop_activity(struct usb_gadget *gadget) | |||
709 | struct ci_hdrc *ci = container_of(gadget, struct ci_hdrc, gadget); | 709 | struct ci_hdrc *ci = container_of(gadget, struct ci_hdrc, gadget); |
710 | unsigned long flags; | 710 | unsigned long flags; |
711 | 711 | ||
712 | spin_lock_irqsave(&ci->lock, flags); | ||
713 | ci->gadget.speed = USB_SPEED_UNKNOWN; | ||
714 | ci->remote_wakeup = 0; | ||
715 | ci->suspended = 0; | ||
716 | spin_unlock_irqrestore(&ci->lock, flags); | ||
717 | |||
718 | /* flush all endpoints */ | 712 | /* flush all endpoints */ |
719 | gadget_for_each_ep(ep, gadget) { | 713 | gadget_for_each_ep(ep, gadget) { |
720 | usb_ep_fifo_flush(ep); | 714 | usb_ep_fifo_flush(ep); |
@@ -732,6 +726,12 @@ static int _gadget_stop_activity(struct usb_gadget *gadget) | |||
732 | ci->status = NULL; | 726 | ci->status = NULL; |
733 | } | 727 | } |
734 | 728 | ||
729 | spin_lock_irqsave(&ci->lock, flags); | ||
730 | ci->gadget.speed = USB_SPEED_UNKNOWN; | ||
731 | ci->remote_wakeup = 0; | ||
732 | ci->suspended = 0; | ||
733 | spin_unlock_irqrestore(&ci->lock, flags); | ||
734 | |||
735 | return 0; | 735 | return 0; |
736 | } | 736 | } |
737 | 737 | ||
@@ -1303,6 +1303,10 @@ static int ep_disable(struct usb_ep *ep) | |||
1303 | return -EBUSY; | 1303 | return -EBUSY; |
1304 | 1304 | ||
1305 | spin_lock_irqsave(hwep->lock, flags); | 1305 | spin_lock_irqsave(hwep->lock, flags); |
1306 | if (hwep->ci->gadget.speed == USB_SPEED_UNKNOWN) { | ||
1307 | spin_unlock_irqrestore(hwep->lock, flags); | ||
1308 | return 0; | ||
1309 | } | ||
1306 | 1310 | ||
1307 | /* only internal SW should disable ctrl endpts */ | 1311 | /* only internal SW should disable ctrl endpts */ |
1308 | 1312 | ||
@@ -1392,6 +1396,10 @@ static int ep_queue(struct usb_ep *ep, struct usb_request *req, | |||
1392 | return -EINVAL; | 1396 | return -EINVAL; |
1393 | 1397 | ||
1394 | spin_lock_irqsave(hwep->lock, flags); | 1398 | spin_lock_irqsave(hwep->lock, flags); |
1399 | if (hwep->ci->gadget.speed == USB_SPEED_UNKNOWN) { | ||
1400 | spin_unlock_irqrestore(hwep->lock, flags); | ||
1401 | return 0; | ||
1402 | } | ||
1395 | retval = _ep_queue(ep, req, gfp_flags); | 1403 | retval = _ep_queue(ep, req, gfp_flags); |
1396 | spin_unlock_irqrestore(hwep->lock, flags); | 1404 | spin_unlock_irqrestore(hwep->lock, flags); |
1397 | return retval; | 1405 | return retval; |
@@ -1415,8 +1423,8 @@ static int ep_dequeue(struct usb_ep *ep, struct usb_request *req) | |||
1415 | return -EINVAL; | 1423 | return -EINVAL; |
1416 | 1424 | ||
1417 | spin_lock_irqsave(hwep->lock, flags); | 1425 | spin_lock_irqsave(hwep->lock, flags); |
1418 | 1426 | if (hwep->ci->gadget.speed != USB_SPEED_UNKNOWN) | |
1419 | hw_ep_flush(hwep->ci, hwep->num, hwep->dir); | 1427 | hw_ep_flush(hwep->ci, hwep->num, hwep->dir); |
1420 | 1428 | ||
1421 | list_for_each_entry_safe(node, tmpnode, &hwreq->tds, td) { | 1429 | list_for_each_entry_safe(node, tmpnode, &hwreq->tds, td) { |
1422 | dma_pool_free(hwep->td_pool, node->ptr, node->dma); | 1430 | dma_pool_free(hwep->td_pool, node->ptr, node->dma); |
@@ -1487,6 +1495,10 @@ static void ep_fifo_flush(struct usb_ep *ep) | |||
1487 | } | 1495 | } |
1488 | 1496 | ||
1489 | spin_lock_irqsave(hwep->lock, flags); | 1497 | spin_lock_irqsave(hwep->lock, flags); |
1498 | if (hwep->ci->gadget.speed == USB_SPEED_UNKNOWN) { | ||
1499 | spin_unlock_irqrestore(hwep->lock, flags); | ||
1500 | return; | ||
1501 | } | ||
1490 | 1502 | ||
1491 | hw_ep_flush(hwep->ci, hwep->num, hwep->dir); | 1503 | hw_ep_flush(hwep->ci, hwep->num, hwep->dir); |
1492 | 1504 | ||
@@ -1559,6 +1571,10 @@ static int ci_udc_wakeup(struct usb_gadget *_gadget) | |||
1559 | int ret = 0; | 1571 | int ret = 0; |
1560 | 1572 | ||
1561 | spin_lock_irqsave(&ci->lock, flags); | 1573 | spin_lock_irqsave(&ci->lock, flags); |
1574 | if (ci->gadget.speed == USB_SPEED_UNKNOWN) { | ||
1575 | spin_unlock_irqrestore(&ci->lock, flags); | ||
1576 | return 0; | ||
1577 | } | ||
1562 | if (!ci->remote_wakeup) { | 1578 | if (!ci->remote_wakeup) { |
1563 | ret = -EOPNOTSUPP; | 1579 | ret = -EOPNOTSUPP; |
1564 | goto out; | 1580 | goto out; |