diff options
Diffstat (limited to 'drivers/usb/gadget/omap_udc.c')
-rw-r--r-- | drivers/usb/gadget/omap_udc.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c index b7885dc0f42f..41c96b0afbb3 100644 --- a/drivers/usb/gadget/omap_udc.c +++ b/drivers/usb/gadget/omap_udc.c | |||
@@ -691,7 +691,7 @@ static void next_out_dma(struct omap_ep *ep, struct omap_req *req) | |||
691 | } | 691 | } |
692 | 692 | ||
693 | static void | 693 | static void |
694 | finish_out_dma(struct omap_ep *ep, struct omap_req *req, int status) | 694 | finish_out_dma(struct omap_ep *ep, struct omap_req *req, int status, int one) |
695 | { | 695 | { |
696 | u16 count; | 696 | u16 count; |
697 | 697 | ||
@@ -699,6 +699,8 @@ finish_out_dma(struct omap_ep *ep, struct omap_req *req, int status) | |||
699 | ep->dma_counter = (u16) (req->req.dma + req->req.actual); | 699 | ep->dma_counter = (u16) (req->req.dma + req->req.actual); |
700 | count = dma_dest_len(ep, req->req.dma + req->req.actual); | 700 | count = dma_dest_len(ep, req->req.dma + req->req.actual); |
701 | count += req->req.actual; | 701 | count += req->req.actual; |
702 | if (one) | ||
703 | count--; | ||
702 | if (count <= req->req.length) | 704 | if (count <= req->req.length) |
703 | req->req.actual = count; | 705 | req->req.actual = count; |
704 | 706 | ||
@@ -747,7 +749,7 @@ static void dma_irq(struct omap_udc *udc, u16 irq_src) | |||
747 | if (!list_empty(&ep->queue)) { | 749 | if (!list_empty(&ep->queue)) { |
748 | req = container_of(ep->queue.next, | 750 | req = container_of(ep->queue.next, |
749 | struct omap_req, queue); | 751 | struct omap_req, queue); |
750 | finish_out_dma(ep, req, 0); | 752 | finish_out_dma(ep, req, 0, dman_stat & UDC_DMA_RX_SB); |
751 | } | 753 | } |
752 | UDC_IRQ_SRC_REG = UDC_RXN_EOT; | 754 | UDC_IRQ_SRC_REG = UDC_RXN_EOT; |
753 | 755 | ||
@@ -925,7 +927,7 @@ static void dma_channel_release(struct omap_ep *ep) | |||
925 | while (UDC_RXDMA_CFG_REG & mask) | 927 | while (UDC_RXDMA_CFG_REG & mask) |
926 | udelay(10); | 928 | udelay(10); |
927 | if (req) | 929 | if (req) |
928 | finish_out_dma(ep, req, -ECONNRESET); | 930 | finish_out_dma(ep, req, -ECONNRESET, 0); |
929 | } | 931 | } |
930 | omap_free_dma(ep->lch); | 932 | omap_free_dma(ep->lch); |
931 | ep->dma_channel = 0; | 933 | ep->dma_channel = 0; |
@@ -1786,8 +1788,12 @@ static void devstate_irq(struct omap_udc *udc, u16 irq_src) | |||
1786 | udc->driver->suspend(&udc->gadget); | 1788 | udc->driver->suspend(&udc->gadget); |
1787 | spin_lock(&udc->lock); | 1789 | spin_lock(&udc->lock); |
1788 | } | 1790 | } |
1791 | if (udc->transceiver) | ||
1792 | otg_set_suspend(udc->transceiver, 1); | ||
1789 | } else { | 1793 | } else { |
1790 | VDBG("resume\n"); | 1794 | VDBG("resume\n"); |
1795 | if (udc->transceiver) | ||
1796 | otg_set_suspend(udc->transceiver, 0); | ||
1791 | if (udc->gadget.speed == USB_SPEED_FULL | 1797 | if (udc->gadget.speed == USB_SPEED_FULL |
1792 | && udc->driver->resume) { | 1798 | && udc->driver->resume) { |
1793 | spin_unlock(&udc->lock); | 1799 | spin_unlock(&udc->lock); |
@@ -2943,6 +2949,7 @@ static int omap_udc_resume(struct device *dev) | |||
2943 | 2949 | ||
2944 | static struct device_driver udc_driver = { | 2950 | static struct device_driver udc_driver = { |
2945 | .name = (char *) driver_name, | 2951 | .name = (char *) driver_name, |
2952 | .owner = THIS_MODULE, | ||
2946 | .bus = &platform_bus_type, | 2953 | .bus = &platform_bus_type, |
2947 | .probe = omap_udc_probe, | 2954 | .probe = omap_udc_probe, |
2948 | .remove = __exit_p(omap_udc_remove), | 2955 | .remove = __exit_p(omap_udc_remove), |