diff options
Diffstat (limited to 'drivers/usb/musb')
-rw-r--r-- | drivers/usb/musb/Kconfig | 3 | ||||
-rw-r--r-- | drivers/usb/musb/am35x.c | 1 | ||||
-rw-r--r-- | drivers/usb/musb/da8xx.c | 1 | ||||
-rw-r--r-- | drivers/usb/musb/davinci.c | 2 | ||||
-rw-r--r-- | drivers/usb/musb/musb_core.c | 3 | ||||
-rw-r--r-- | drivers/usb/musb/musb_debugfs.c | 6 | ||||
-rw-r--r-- | drivers/usb/musb/musb_gadget.c | 77 | ||||
-rw-r--r-- | drivers/usb/musb/musb_gadget_ep0.c | 8 | ||||
-rw-r--r-- | drivers/usb/musb/musb_host.c | 2 | ||||
-rw-r--r-- | drivers/usb/musb/musbhsdma.c | 2 |
10 files changed, 61 insertions, 44 deletions
diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig index fc34b8b11910..07a03460a598 100644 --- a/drivers/usb/musb/Kconfig +++ b/drivers/usb/musb/Kconfig | |||
@@ -11,6 +11,7 @@ config USB_MUSB_HDRC | |||
11 | select TWL4030_USB if MACH_OMAP_3430SDP | 11 | select TWL4030_USB if MACH_OMAP_3430SDP |
12 | select TWL6030_USB if MACH_OMAP_4430SDP || MACH_OMAP4_PANDA | 12 | select TWL6030_USB if MACH_OMAP_4430SDP || MACH_OMAP4_PANDA |
13 | select USB_OTG_UTILS | 13 | select USB_OTG_UTILS |
14 | select USB_GADGET_DUALSPEED | ||
14 | tristate 'Inventra Highspeed Dual Role Controller (TI, ADI, ...)' | 15 | tristate 'Inventra Highspeed Dual Role Controller (TI, ADI, ...)' |
15 | help | 16 | help |
16 | Say Y here if your system has a dual role high speed USB | 17 | Say Y here if your system has a dual role high speed USB |
@@ -60,7 +61,7 @@ config USB_MUSB_BLACKFIN | |||
60 | 61 | ||
61 | config USB_MUSB_UX500 | 62 | config USB_MUSB_UX500 |
62 | tristate "U8500 and U5500" | 63 | tristate "U8500 and U5500" |
63 | depends on (ARCH_U8500 && AB8500_USB) || (ARCH_U5500) | 64 | depends on (ARCH_U8500 && AB8500_USB) |
64 | 65 | ||
65 | endchoice | 66 | endchoice |
66 | 67 | ||
diff --git a/drivers/usb/musb/am35x.c b/drivers/usb/musb/am35x.c index 08f1d0b662a3..e233d2b7d335 100644 --- a/drivers/usb/musb/am35x.c +++ b/drivers/usb/musb/am35x.c | |||
@@ -27,6 +27,7 @@ | |||
27 | */ | 27 | */ |
28 | 28 | ||
29 | #include <linux/init.h> | 29 | #include <linux/init.h> |
30 | #include <linux/module.h> | ||
30 | #include <linux/clk.h> | 31 | #include <linux/clk.h> |
31 | #include <linux/io.h> | 32 | #include <linux/io.h> |
32 | #include <linux/platform_device.h> | 33 | #include <linux/platform_device.h> |
diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c index 4da7492ddbdb..2613bfdb09b6 100644 --- a/drivers/usb/musb/da8xx.c +++ b/drivers/usb/musb/da8xx.c | |||
@@ -27,6 +27,7 @@ | |||
27 | */ | 27 | */ |
28 | 28 | ||
29 | #include <linux/init.h> | 29 | #include <linux/init.h> |
30 | #include <linux/module.h> | ||
30 | #include <linux/clk.h> | 31 | #include <linux/clk.h> |
31 | #include <linux/io.h> | 32 | #include <linux/io.h> |
32 | #include <linux/platform_device.h> | 33 | #include <linux/platform_device.h> |
diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c index 8bdf25a8b023..f9a3f62a83b5 100644 --- a/drivers/usb/musb/davinci.c +++ b/drivers/usb/musb/davinci.c | |||
@@ -35,7 +35,7 @@ | |||
35 | 35 | ||
36 | #include <mach/hardware.h> | 36 | #include <mach/hardware.h> |
37 | #include <mach/memory.h> | 37 | #include <mach/memory.h> |
38 | #include <mach/gpio.h> | 38 | #include <asm/gpio.h> |
39 | #include <mach/cputype.h> | 39 | #include <mach/cputype.h> |
40 | 40 | ||
41 | #include <asm/mach-types.h> | 41 | #include <asm/mach-types.h> |
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index 20a28731c338..c1fa12ec7a9a 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
@@ -1477,8 +1477,7 @@ static int __init musb_core_init(u16 musb_type, struct musb *musb) | |||
1477 | /*-------------------------------------------------------------------------*/ | 1477 | /*-------------------------------------------------------------------------*/ |
1478 | 1478 | ||
1479 | #if defined(CONFIG_SOC_OMAP2430) || defined(CONFIG_SOC_OMAP3430) || \ | 1479 | #if defined(CONFIG_SOC_OMAP2430) || defined(CONFIG_SOC_OMAP3430) || \ |
1480 | defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_ARCH_U8500) || \ | 1480 | defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_ARCH_U8500) |
1481 | defined(CONFIG_ARCH_U5500) | ||
1482 | 1481 | ||
1483 | static irqreturn_t generic_interrupt(int irq, void *__hci) | 1482 | static irqreturn_t generic_interrupt(int irq, void *__hci) |
1484 | { | 1483 | { |
diff --git a/drivers/usb/musb/musb_debugfs.c b/drivers/usb/musb/musb_debugfs.c index b0176e4569e0..61f4ee466df7 100644 --- a/drivers/usb/musb/musb_debugfs.c +++ b/drivers/usb/musb/musb_debugfs.c | |||
@@ -41,12 +41,6 @@ | |||
41 | #include <linux/debugfs.h> | 41 | #include <linux/debugfs.h> |
42 | #include <linux/seq_file.h> | 42 | #include <linux/seq_file.h> |
43 | 43 | ||
44 | #ifdef CONFIG_ARM | ||
45 | #include <mach/hardware.h> | ||
46 | #include <mach/memory.h> | ||
47 | #include <asm/mach-types.h> | ||
48 | #endif | ||
49 | |||
50 | #include <asm/uaccess.h> | 44 | #include <asm/uaccess.h> |
51 | 45 | ||
52 | #include "musb_core.h" | 46 | #include "musb_core.h" |
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index e81820370d6f..d51043acfe1a 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
@@ -634,6 +634,7 @@ static void rxstate(struct musb *musb, struct musb_request *req) | |||
634 | u16 len; | 634 | u16 len; |
635 | u16 csr = musb_readw(epio, MUSB_RXCSR); | 635 | u16 csr = musb_readw(epio, MUSB_RXCSR); |
636 | struct musb_hw_ep *hw_ep = &musb->endpoints[epnum]; | 636 | struct musb_hw_ep *hw_ep = &musb->endpoints[epnum]; |
637 | u8 use_mode_1; | ||
637 | 638 | ||
638 | if (hw_ep->is_shared_fifo) | 639 | if (hw_ep->is_shared_fifo) |
639 | musb_ep = &hw_ep->ep_in; | 640 | musb_ep = &hw_ep->ep_in; |
@@ -683,6 +684,18 @@ static void rxstate(struct musb *musb, struct musb_request *req) | |||
683 | 684 | ||
684 | if (csr & MUSB_RXCSR_RXPKTRDY) { | 685 | if (csr & MUSB_RXCSR_RXPKTRDY) { |
685 | len = musb_readw(epio, MUSB_RXCOUNT); | 686 | len = musb_readw(epio, MUSB_RXCOUNT); |
687 | |||
688 | /* | ||
689 | * Enable Mode 1 on RX transfers only when short_not_ok flag | ||
690 | * is set. Currently short_not_ok flag is set only from | ||
691 | * file_storage and f_mass_storage drivers | ||
692 | */ | ||
693 | |||
694 | if (request->short_not_ok && len == musb_ep->packet_sz) | ||
695 | use_mode_1 = 1; | ||
696 | else | ||
697 | use_mode_1 = 0; | ||
698 | |||
686 | if (request->actual < request->length) { | 699 | if (request->actual < request->length) { |
687 | #ifdef CONFIG_USB_INVENTRA_DMA | 700 | #ifdef CONFIG_USB_INVENTRA_DMA |
688 | if (is_buffer_mapped(req)) { | 701 | if (is_buffer_mapped(req)) { |
@@ -704,7 +717,7 @@ static void rxstate(struct musb *musb, struct musb_request *req) | |||
704 | * most these gadgets, end of is signified either by a short packet, | 717 | * most these gadgets, end of is signified either by a short packet, |
705 | * or filling the last byte of the buffer. (Sending extra data in | 718 | * or filling the last byte of the buffer. (Sending extra data in |
706 | * that last pckate should trigger an overflow fault.) But in mode 1, | 719 | * that last pckate should trigger an overflow fault.) But in mode 1, |
707 | * we don't get DMA completion interrrupt for short packets. | 720 | * we don't get DMA completion interrupt for short packets. |
708 | * | 721 | * |
709 | * Theoretically, we could enable DMAReq irq (MUSB_RXCSR_DMAMODE = 1), | 722 | * Theoretically, we could enable DMAReq irq (MUSB_RXCSR_DMAMODE = 1), |
710 | * to get endpoint interrupt on every DMA req, but that didn't seem | 723 | * to get endpoint interrupt on every DMA req, but that didn't seem |
@@ -714,37 +727,41 @@ static void rxstate(struct musb *musb, struct musb_request *req) | |||
714 | * then becomes usable as a runtime "use mode 1" hint... | 727 | * then becomes usable as a runtime "use mode 1" hint... |
715 | */ | 728 | */ |
716 | 729 | ||
717 | csr |= MUSB_RXCSR_DMAENAB; | 730 | /* Experimental: Mode1 works with mass storage use cases */ |
718 | #ifdef USE_MODE1 | 731 | if (use_mode_1) { |
719 | csr |= MUSB_RXCSR_AUTOCLEAR; | ||
720 | /* csr |= MUSB_RXCSR_DMAMODE; */ | ||
721 | |||
722 | /* this special sequence (enabling and then | ||
723 | * disabling MUSB_RXCSR_DMAMODE) is required | ||
724 | * to get DMAReq to activate | ||
725 | */ | ||
726 | musb_writew(epio, MUSB_RXCSR, | ||
727 | csr | MUSB_RXCSR_DMAMODE); | ||
728 | #else | ||
729 | if (!musb_ep->hb_mult && | ||
730 | musb_ep->hw_ep->rx_double_buffered) | ||
731 | csr |= MUSB_RXCSR_AUTOCLEAR; | 732 | csr |= MUSB_RXCSR_AUTOCLEAR; |
732 | #endif | 733 | musb_writew(epio, MUSB_RXCSR, csr); |
733 | musb_writew(epio, MUSB_RXCSR, csr); | 734 | csr |= MUSB_RXCSR_DMAENAB; |
735 | musb_writew(epio, MUSB_RXCSR, csr); | ||
736 | |||
737 | /* | ||
738 | * this special sequence (enabling and then | ||
739 | * disabling MUSB_RXCSR_DMAMODE) is required | ||
740 | * to get DMAReq to activate | ||
741 | */ | ||
742 | musb_writew(epio, MUSB_RXCSR, | ||
743 | csr | MUSB_RXCSR_DMAMODE); | ||
744 | musb_writew(epio, MUSB_RXCSR, csr); | ||
745 | |||
746 | } else { | ||
747 | if (!musb_ep->hb_mult && | ||
748 | musb_ep->hw_ep->rx_double_buffered) | ||
749 | csr |= MUSB_RXCSR_AUTOCLEAR; | ||
750 | csr |= MUSB_RXCSR_DMAENAB; | ||
751 | musb_writew(epio, MUSB_RXCSR, csr); | ||
752 | } | ||
734 | 753 | ||
735 | if (request->actual < request->length) { | 754 | if (request->actual < request->length) { |
736 | int transfer_size = 0; | 755 | int transfer_size = 0; |
737 | #ifdef USE_MODE1 | 756 | if (use_mode_1) { |
738 | transfer_size = min(request->length - request->actual, | 757 | transfer_size = min(request->length - request->actual, |
739 | channel->max_len); | 758 | channel->max_len); |
740 | #else | ||
741 | transfer_size = min(request->length - request->actual, | ||
742 | (unsigned)len); | ||
743 | #endif | ||
744 | if (transfer_size <= musb_ep->packet_sz) | ||
745 | musb_ep->dma->desired_mode = 0; | ||
746 | else | ||
747 | musb_ep->dma->desired_mode = 1; | 759 | musb_ep->dma->desired_mode = 1; |
760 | } else { | ||
761 | transfer_size = min(request->length - request->actual, | ||
762 | (unsigned)len); | ||
763 | musb_ep->dma->desired_mode = 0; | ||
764 | } | ||
748 | 765 | ||
749 | use_dma = c->channel_program( | 766 | use_dma = c->channel_program( |
750 | channel, | 767 | channel, |
@@ -1020,7 +1037,7 @@ static int musb_gadget_enable(struct usb_ep *ep, | |||
1020 | goto fail; | 1037 | goto fail; |
1021 | 1038 | ||
1022 | /* REVISIT this rules out high bandwidth periodic transfers */ | 1039 | /* REVISIT this rules out high bandwidth periodic transfers */ |
1023 | tmp = le16_to_cpu(desc->wMaxPacketSize); | 1040 | tmp = usb_endpoint_maxp(desc); |
1024 | if (tmp & ~0x07ff) { | 1041 | if (tmp & ~0x07ff) { |
1025 | int ok; | 1042 | int ok; |
1026 | 1043 | ||
@@ -1982,10 +1999,6 @@ static void stop_activity(struct musb *musb, struct usb_gadget_driver *driver) | |||
1982 | nuke(&hw_ep->ep_out, -ESHUTDOWN); | 1999 | nuke(&hw_ep->ep_out, -ESHUTDOWN); |
1983 | } | 2000 | } |
1984 | } | 2001 | } |
1985 | |||
1986 | spin_unlock(&musb->lock); | ||
1987 | driver->disconnect(&musb->g); | ||
1988 | spin_lock(&musb->lock); | ||
1989 | } | 2002 | } |
1990 | } | 2003 | } |
1991 | 2004 | ||
diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c index 9378b359c1f0..6a0d0467ec74 100644 --- a/drivers/usb/musb/musb_gadget_ep0.c +++ b/drivers/usb/musb/musb_gadget_ep0.c | |||
@@ -679,6 +679,14 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb) | |||
679 | musb_readb(mbase, MUSB_FADDR), | 679 | musb_readb(mbase, MUSB_FADDR), |
680 | decode_ep0stage(musb->ep0_state)); | 680 | decode_ep0stage(musb->ep0_state)); |
681 | 681 | ||
682 | if (csr & MUSB_CSR0_P_DATAEND) { | ||
683 | /* | ||
684 | * If DATAEND is set we should not call the callback, | ||
685 | * hence the status stage is not complete. | ||
686 | */ | ||
687 | return IRQ_HANDLED; | ||
688 | } | ||
689 | |||
682 | /* I sent a stall.. need to acknowledge it now.. */ | 690 | /* I sent a stall.. need to acknowledge it now.. */ |
683 | if (csr & MUSB_CSR0_P_SENTSTALL) { | 691 | if (csr & MUSB_CSR0_P_SENTSTALL) { |
684 | musb_writew(regs, MUSB_CSR0, | 692 | musb_writew(regs, MUSB_CSR0, |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 8b2473fa0f47..60ddba8066ea 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
@@ -1932,7 +1932,7 @@ static int musb_urb_enqueue( | |||
1932 | INIT_LIST_HEAD(&qh->ring); | 1932 | INIT_LIST_HEAD(&qh->ring); |
1933 | qh->is_ready = 1; | 1933 | qh->is_ready = 1; |
1934 | 1934 | ||
1935 | qh->maxpacket = le16_to_cpu(epd->wMaxPacketSize); | 1935 | qh->maxpacket = usb_endpoint_maxp(epd); |
1936 | qh->type = usb_endpoint_type(epd); | 1936 | qh->type = usb_endpoint_type(epd); |
1937 | 1937 | ||
1938 | /* Bits 11 & 12 of wMaxPacketSize encode high bandwidth multiplier. | 1938 | /* Bits 11 & 12 of wMaxPacketSize encode high bandwidth multiplier. |
diff --git a/drivers/usb/musb/musbhsdma.c b/drivers/usb/musb/musbhsdma.c index f70c5a577736..57a608584e16 100644 --- a/drivers/usb/musb/musbhsdma.c +++ b/drivers/usb/musb/musbhsdma.c | |||
@@ -408,7 +408,7 @@ dma_controller_create(struct musb *musb, void __iomem *base) | |||
408 | controller->controller.channel_program = dma_channel_program; | 408 | controller->controller.channel_program = dma_channel_program; |
409 | controller->controller.channel_abort = dma_channel_abort; | 409 | controller->controller.channel_abort = dma_channel_abort; |
410 | 410 | ||
411 | if (request_irq(irq, dma_controller_irq, IRQF_DISABLED, | 411 | if (request_irq(irq, dma_controller_irq, 0, |
412 | dev_name(musb->controller), &controller->controller)) { | 412 | dev_name(musb->controller), &controller->controller)) { |
413 | dev_err(dev, "request_irq %d failed!\n", irq); | 413 | dev_err(dev, "request_irq %d failed!\n", irq); |
414 | dma_controller_destroy(&controller->controller); | 414 | dma_controller_destroy(&controller->controller); |