diff options
Diffstat (limited to 'drivers/usb/musb/musb_gadget.c')
-rw-r--r-- | drivers/usb/musb/musb_gadget.c | 41 |
1 files changed, 22 insertions, 19 deletions
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index 5d815049cbaa..36cfd060dbe5 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
@@ -644,10 +644,8 @@ static void rxstate(struct musb *musb, struct musb_request *req) | |||
644 | */ | 644 | */ |
645 | 645 | ||
646 | csr |= MUSB_RXCSR_DMAENAB; | 646 | csr |= MUSB_RXCSR_DMAENAB; |
647 | if (!musb_ep->hb_mult && | ||
648 | musb_ep->hw_ep->rx_double_buffered) | ||
649 | csr |= MUSB_RXCSR_AUTOCLEAR; | ||
650 | #ifdef USE_MODE1 | 647 | #ifdef USE_MODE1 |
648 | csr |= MUSB_RXCSR_AUTOCLEAR; | ||
651 | /* csr |= MUSB_RXCSR_DMAMODE; */ | 649 | /* csr |= MUSB_RXCSR_DMAMODE; */ |
652 | 650 | ||
653 | /* this special sequence (enabling and then | 651 | /* this special sequence (enabling and then |
@@ -656,6 +654,10 @@ static void rxstate(struct musb *musb, struct musb_request *req) | |||
656 | */ | 654 | */ |
657 | musb_writew(epio, MUSB_RXCSR, | 655 | musb_writew(epio, MUSB_RXCSR, |
658 | csr | MUSB_RXCSR_DMAMODE); | 656 | csr | MUSB_RXCSR_DMAMODE); |
657 | #else | ||
658 | if (!musb_ep->hb_mult && | ||
659 | musb_ep->hw_ep->rx_double_buffered) | ||
660 | csr |= MUSB_RXCSR_AUTOCLEAR; | ||
659 | #endif | 661 | #endif |
660 | musb_writew(epio, MUSB_RXCSR, csr); | 662 | musb_writew(epio, MUSB_RXCSR, csr); |
661 | 663 | ||
@@ -807,7 +809,7 @@ void musb_g_rx(struct musb *musb, u8 epnum) | |||
807 | 809 | ||
808 | #if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_TUSB_OMAP_DMA) | 810 | #if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_TUSB_OMAP_DMA) |
809 | /* Autoclear doesn't clear RxPktRdy for short packets */ | 811 | /* Autoclear doesn't clear RxPktRdy for short packets */ |
810 | if ((dma->desired_mode == 0) | 812 | if ((dma->desired_mode == 0 && !hw_ep->rx_double_buffered) |
811 | || (dma->actual_len | 813 | || (dma->actual_len |
812 | & (musb_ep->packet_sz - 1))) { | 814 | & (musb_ep->packet_sz - 1))) { |
813 | /* ack the read! */ | 815 | /* ack the read! */ |
@@ -818,8 +820,16 @@ void musb_g_rx(struct musb *musb, u8 epnum) | |||
818 | /* incomplete, and not short? wait for next IN packet */ | 820 | /* incomplete, and not short? wait for next IN packet */ |
819 | if ((request->actual < request->length) | 821 | if ((request->actual < request->length) |
820 | && (musb_ep->dma->actual_len | 822 | && (musb_ep->dma->actual_len |
821 | == musb_ep->packet_sz)) | 823 | == musb_ep->packet_sz)) { |
824 | /* In double buffer case, continue to unload fifo if | ||
825 | * there is Rx packet in FIFO. | ||
826 | **/ | ||
827 | csr = musb_readw(epio, MUSB_RXCSR); | ||
828 | if ((csr & MUSB_RXCSR_RXPKTRDY) && | ||
829 | hw_ep->rx_double_buffered) | ||
830 | goto exit; | ||
822 | return; | 831 | return; |
832 | } | ||
823 | #endif | 833 | #endif |
824 | musb_g_giveback(musb_ep, request, 0); | 834 | musb_g_giveback(musb_ep, request, 0); |
825 | 835 | ||
@@ -827,7 +837,7 @@ void musb_g_rx(struct musb *musb, u8 epnum) | |||
827 | if (!request) | 837 | if (!request) |
828 | return; | 838 | return; |
829 | } | 839 | } |
830 | 840 | exit: | |
831 | /* Analyze request */ | 841 | /* Analyze request */ |
832 | rxstate(musb, to_musb_request(request)); | 842 | rxstate(musb, to_musb_request(request)); |
833 | } | 843 | } |
@@ -916,13 +926,9 @@ static int musb_gadget_enable(struct usb_ep *ep, | |||
916 | * likewise high bandwidth periodic tx | 926 | * likewise high bandwidth periodic tx |
917 | */ | 927 | */ |
918 | /* Set TXMAXP with the FIFO size of the endpoint | 928 | /* Set TXMAXP with the FIFO size of the endpoint |
919 | * to disable double buffering mode. Currently, It seems that double | 929 | * to disable double buffering mode. |
920 | * buffering has problem if musb RTL revision number < 2.0. | ||
921 | */ | 930 | */ |
922 | if (musb->hwvers < MUSB_HWVERS_2000) | 931 | musb_writew(regs, MUSB_TXMAXP, musb_ep->packet_sz | (musb_ep->hb_mult << 11)); |
923 | musb_writew(regs, MUSB_TXMAXP, hw_ep->max_packet_sz_tx); | ||
924 | else | ||
925 | musb_writew(regs, MUSB_TXMAXP, musb_ep->packet_sz | (musb_ep->hb_mult << 11)); | ||
926 | 932 | ||
927 | csr = MUSB_TXCSR_MODE | MUSB_TXCSR_CLRDATATOG; | 933 | csr = MUSB_TXCSR_MODE | MUSB_TXCSR_CLRDATATOG; |
928 | if (musb_readw(regs, MUSB_TXCSR) | 934 | if (musb_readw(regs, MUSB_TXCSR) |
@@ -958,10 +964,7 @@ static int musb_gadget_enable(struct usb_ep *ep, | |||
958 | /* Set RXMAXP with the FIFO size of the endpoint | 964 | /* Set RXMAXP with the FIFO size of the endpoint |
959 | * to disable double buffering mode. | 965 | * to disable double buffering mode. |
960 | */ | 966 | */ |
961 | if (musb->hwvers < MUSB_HWVERS_2000) | 967 | musb_writew(regs, MUSB_RXMAXP, musb_ep->packet_sz | (musb_ep->hb_mult << 11)); |
962 | musb_writew(regs, MUSB_RXMAXP, hw_ep->max_packet_sz_rx); | ||
963 | else | ||
964 | musb_writew(regs, MUSB_RXMAXP, musb_ep->packet_sz | (musb_ep->hb_mult << 11)); | ||
965 | 968 | ||
966 | /* force shared fifo to OUT-only mode */ | 969 | /* force shared fifo to OUT-only mode */ |
967 | if (hw_ep->is_shared_fifo) { | 970 | if (hw_ep->is_shared_fifo) { |
@@ -1166,8 +1169,6 @@ static int musb_gadget_queue(struct usb_ep *ep, struct usb_request *req, | |||
1166 | : DMA_FROM_DEVICE); | 1169 | : DMA_FROM_DEVICE); |
1167 | request->mapped = 0; | 1170 | request->mapped = 0; |
1168 | } | 1171 | } |
1169 | } else if (!req->buf) { | ||
1170 | return -ENODATA; | ||
1171 | } else | 1172 | } else |
1172 | request->mapped = 0; | 1173 | request->mapped = 0; |
1173 | 1174 | ||
@@ -1695,8 +1696,10 @@ int __init musb_gadget_setup(struct musb *musb) | |||
1695 | musb_platform_try_idle(musb, 0); | 1696 | musb_platform_try_idle(musb, 0); |
1696 | 1697 | ||
1697 | status = device_register(&musb->g.dev); | 1698 | status = device_register(&musb->g.dev); |
1698 | if (status != 0) | 1699 | if (status != 0) { |
1700 | put_device(&musb->g.dev); | ||
1699 | the_gadget = NULL; | 1701 | the_gadget = NULL; |
1702 | } | ||
1700 | return status; | 1703 | return status; |
1701 | } | 1704 | } |
1702 | 1705 | ||