aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/musb
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/musb')
-rw-r--r--drivers/usb/musb/Kconfig7
-rw-r--r--drivers/usb/musb/blackfin.c2
-rw-r--r--drivers/usb/musb/musb_core.c7
-rw-r--r--drivers/usb/musb/musb_cppi41.c24
-rw-r--r--drivers/usb/musb/musb_debugfs.c2
-rw-r--r--drivers/usb/musb/musb_gadget.c4
-rw-r--r--drivers/usb/musb/musb_gadget_ep0.c2
-rw-r--r--drivers/usb/musb/musb_virthub.c4
8 files changed, 33 insertions, 19 deletions
diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig
index b005010240e5..14e1628483d9 100644
--- a/drivers/usb/musb/Kconfig
+++ b/drivers/usb/musb/Kconfig
@@ -63,11 +63,13 @@ comment "Platform Glue Layer"
63config USB_MUSB_DAVINCI 63config USB_MUSB_DAVINCI
64 tristate "DaVinci" 64 tristate "DaVinci"
65 depends on ARCH_DAVINCI_DMx 65 depends on ARCH_DAVINCI_DMx
66 depends on NOP_USB_XCEIV
66 depends on BROKEN 67 depends on BROKEN
67 68
68config USB_MUSB_DA8XX 69config USB_MUSB_DA8XX
69 tristate "DA8xx/OMAP-L1x" 70 tristate "DA8xx/OMAP-L1x"
70 depends on ARCH_DAVINCI_DA8XX 71 depends on ARCH_DAVINCI_DA8XX
72 depends on NOP_USB_XCEIV
71 depends on BROKEN 73 depends on BROKEN
72 74
73config USB_MUSB_TUSB6010 75config USB_MUSB_TUSB6010
@@ -77,12 +79,13 @@ config USB_MUSB_TUSB6010
77 79
78config USB_MUSB_OMAP2PLUS 80config USB_MUSB_OMAP2PLUS
79 tristate "OMAP2430 and onwards" 81 tristate "OMAP2430 and onwards"
80 depends on ARCH_OMAP2PLUS && USB 82 depends on ARCH_OMAP2PLUS && USB && OMAP_CONTROL_PHY
81 select GENERIC_PHY 83 select GENERIC_PHY
82 84
83config USB_MUSB_AM35X 85config USB_MUSB_AM35X
84 tristate "AM35x" 86 tristate "AM35x"
85 depends on ARCH_OMAP 87 depends on ARCH_OMAP
88 depends on NOP_USB_XCEIV
86 89
87config USB_MUSB_DSPS 90config USB_MUSB_DSPS
88 tristate "TI DSPS platforms" 91 tristate "TI DSPS platforms"
@@ -93,6 +96,7 @@ config USB_MUSB_DSPS
93config USB_MUSB_BLACKFIN 96config USB_MUSB_BLACKFIN
94 tristate "Blackfin" 97 tristate "Blackfin"
95 depends on (BF54x && !BF544) || (BF52x && ! BF522 && !BF523) 98 depends on (BF54x && !BF544) || (BF52x && ! BF522 && !BF523)
99 depends on NOP_USB_XCEIV
96 100
97config USB_MUSB_UX500 101config USB_MUSB_UX500
98 tristate "Ux500 platforms" 102 tristate "Ux500 platforms"
@@ -100,6 +104,7 @@ config USB_MUSB_UX500
100 104
101config USB_MUSB_JZ4740 105config USB_MUSB_JZ4740
102 tristate "JZ4740" 106 tristate "JZ4740"
107 depends on NOP_USB_XCEIV
103 depends on MACH_JZ4740 || COMPILE_TEST 108 depends on MACH_JZ4740 || COMPILE_TEST
104 depends on USB_MUSB_GADGET 109 depends on USB_MUSB_GADGET
105 depends on USB_OTG_BLACKLIST_HUB 110 depends on USB_OTG_BLACKLIST_HUB
diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c
index 178250145613..6123b748d262 100644
--- a/drivers/usb/musb/blackfin.c
+++ b/drivers/usb/musb/blackfin.c
@@ -608,7 +608,7 @@ static SIMPLE_DEV_PM_OPS(bfin_pm_ops, bfin_suspend, bfin_resume);
608 608
609static struct platform_driver bfin_driver = { 609static struct platform_driver bfin_driver = {
610 .probe = bfin_probe, 610 .probe = bfin_probe,
611 .remove = __exit_p(bfin_remove), 611 .remove = bfin_remove,
612 .driver = { 612 .driver = {
613 .name = "musb-blackfin", 613 .name = "musb-blackfin",
614 .pm = &bfin_pm_ops, 614 .pm = &bfin_pm_ops,
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index 34cce3e38c49..e6f4cbfeed97 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -567,6 +567,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
567 567
568 musb->xceiv->otg->state = OTG_STATE_A_HOST; 568 musb->xceiv->otg->state = OTG_STATE_A_HOST;
569 musb->is_active = 1; 569 musb->is_active = 1;
570 musb_host_resume_root_hub(musb);
570 break; 571 break;
571 case OTG_STATE_B_WAIT_ACON: 572 case OTG_STATE_B_WAIT_ACON:
572 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; 573 musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
@@ -2500,6 +2501,12 @@ static int musb_runtime_resume(struct device *dev)
2500 musb_restore_context(musb); 2501 musb_restore_context(musb);
2501 first = 0; 2502 first = 0;
2502 2503
2504 if (musb->need_finish_resume) {
2505 musb->need_finish_resume = 0;
2506 schedule_delayed_work(&musb->finish_resume_work,
2507 msecs_to_jiffies(20));
2508 }
2509
2503 return 0; 2510 return 0;
2504} 2511}
2505 2512
diff --git a/drivers/usb/musb/musb_cppi41.c b/drivers/usb/musb/musb_cppi41.c
index c39a16ad7832..be84562d021b 100644
--- a/drivers/usb/musb/musb_cppi41.c
+++ b/drivers/usb/musb/musb_cppi41.c
@@ -9,9 +9,9 @@
9 9
10#define RNDIS_REG(x) (0x80 + ((x - 1) * 4)) 10#define RNDIS_REG(x) (0x80 + ((x - 1) * 4))
11 11
12#define EP_MODE_AUTOREG_NONE 0 12#define EP_MODE_AUTOREQ_NONE 0
13#define EP_MODE_AUTOREG_ALL_NEOP 1 13#define EP_MODE_AUTOREQ_ALL_NEOP 1
14#define EP_MODE_AUTOREG_ALWAYS 3 14#define EP_MODE_AUTOREQ_ALWAYS 3
15 15
16#define EP_MODE_DMA_TRANSPARENT 0 16#define EP_MODE_DMA_TRANSPARENT 0
17#define EP_MODE_DMA_RNDIS 1 17#define EP_MODE_DMA_RNDIS 1
@@ -404,19 +404,19 @@ static bool cppi41_configure_channel(struct dma_channel *channel,
404 404
405 /* auto req */ 405 /* auto req */
406 cppi41_set_autoreq_mode(cppi41_channel, 406 cppi41_set_autoreq_mode(cppi41_channel,
407 EP_MODE_AUTOREG_ALL_NEOP); 407 EP_MODE_AUTOREQ_ALL_NEOP);
408 } else { 408 } else {
409 musb_writel(musb->ctrl_base, 409 musb_writel(musb->ctrl_base,
410 RNDIS_REG(cppi41_channel->port_num), 0); 410 RNDIS_REG(cppi41_channel->port_num), 0);
411 cppi41_set_dma_mode(cppi41_channel, 411 cppi41_set_dma_mode(cppi41_channel,
412 EP_MODE_DMA_TRANSPARENT); 412 EP_MODE_DMA_TRANSPARENT);
413 cppi41_set_autoreq_mode(cppi41_channel, 413 cppi41_set_autoreq_mode(cppi41_channel,
414 EP_MODE_AUTOREG_NONE); 414 EP_MODE_AUTOREQ_NONE);
415 } 415 }
416 } else { 416 } else {
417 /* fallback mode */ 417 /* fallback mode */
418 cppi41_set_dma_mode(cppi41_channel, EP_MODE_DMA_TRANSPARENT); 418 cppi41_set_dma_mode(cppi41_channel, EP_MODE_DMA_TRANSPARENT);
419 cppi41_set_autoreq_mode(cppi41_channel, EP_MODE_AUTOREG_NONE); 419 cppi41_set_autoreq_mode(cppi41_channel, EP_MODE_AUTOREQ_NONE);
420 len = min_t(u32, packet_sz, len); 420 len = min_t(u32, packet_sz, len);
421 } 421 }
422 cppi41_channel->prog_len = len; 422 cppi41_channel->prog_len = len;
@@ -549,10 +549,15 @@ static int cppi41_dma_channel_abort(struct dma_channel *channel)
549 csr &= ~MUSB_TXCSR_DMAENAB; 549 csr &= ~MUSB_TXCSR_DMAENAB;
550 musb_writew(epio, MUSB_TXCSR, csr); 550 musb_writew(epio, MUSB_TXCSR, csr);
551 } else { 551 } else {
552 cppi41_set_autoreq_mode(cppi41_channel, EP_MODE_AUTOREQ_NONE);
553
552 csr = musb_readw(epio, MUSB_RXCSR); 554 csr = musb_readw(epio, MUSB_RXCSR);
553 csr &= ~(MUSB_RXCSR_H_REQPKT | MUSB_RXCSR_DMAENAB); 555 csr &= ~(MUSB_RXCSR_H_REQPKT | MUSB_RXCSR_DMAENAB);
554 musb_writew(epio, MUSB_RXCSR, csr); 556 musb_writew(epio, MUSB_RXCSR, csr);
555 557
558 /* wait to drain cppi dma pipe line */
559 udelay(50);
560
556 csr = musb_readw(epio, MUSB_RXCSR); 561 csr = musb_readw(epio, MUSB_RXCSR);
557 if (csr & MUSB_RXCSR_RXPKTRDY) { 562 if (csr & MUSB_RXCSR_RXPKTRDY) {
558 csr |= MUSB_RXCSR_FLUSHFIFO; 563 csr |= MUSB_RXCSR_FLUSHFIFO;
@@ -566,13 +571,14 @@ static int cppi41_dma_channel_abort(struct dma_channel *channel)
566 tdbit <<= 16; 571 tdbit <<= 16;
567 572
568 do { 573 do {
569 musb_writel(musb->ctrl_base, USB_TDOWN, tdbit); 574 if (is_tx)
575 musb_writel(musb->ctrl_base, USB_TDOWN, tdbit);
570 ret = dmaengine_terminate_all(cppi41_channel->dc); 576 ret = dmaengine_terminate_all(cppi41_channel->dc);
571 } while (ret == -EAGAIN); 577 } while (ret == -EAGAIN);
572 578
573 musb_writel(musb->ctrl_base, USB_TDOWN, tdbit);
574
575 if (is_tx) { 579 if (is_tx) {
580 musb_writel(musb->ctrl_base, USB_TDOWN, tdbit);
581
576 csr = musb_readw(epio, MUSB_TXCSR); 582 csr = musb_readw(epio, MUSB_TXCSR);
577 if (csr & MUSB_TXCSR_TXPKTRDY) { 583 if (csr & MUSB_TXCSR_TXPKTRDY) {
578 csr |= MUSB_TXCSR_FLUSHFIFO; 584 csr |= MUSB_TXCSR_FLUSHFIFO;
diff --git a/drivers/usb/musb/musb_debugfs.c b/drivers/usb/musb/musb_debugfs.c
index 48131aa8472c..78a283e9ce40 100644
--- a/drivers/usb/musb/musb_debugfs.c
+++ b/drivers/usb/musb/musb_debugfs.c
@@ -196,7 +196,7 @@ static ssize_t musb_test_mode_write(struct file *file,
196 196
197 memset(buf, 0x00, sizeof(buf)); 197 memset(buf, 0x00, sizeof(buf));
198 198
199 if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) 199 if (copy_from_user(buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
200 return -EFAULT; 200 return -EFAULT;
201 201
202 if (strstarts(buf, "force host")) 202 if (strstarts(buf, "force host"))
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index 49b04cb6f5ca..b2d9040c7685 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -1612,9 +1612,7 @@ done:
1612static int 1612static int
1613musb_gadget_set_self_powered(struct usb_gadget *gadget, int is_selfpowered) 1613musb_gadget_set_self_powered(struct usb_gadget *gadget, int is_selfpowered)
1614{ 1614{
1615 struct musb *musb = gadget_to_musb(gadget); 1615 gadget->is_selfpowered = !!is_selfpowered;
1616
1617 musb->is_self_powered = !!is_selfpowered;
1618 return 0; 1616 return 0;
1619} 1617}
1620 1618
diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c
index 2af45a0c8930..10d30afe4a3c 100644
--- a/drivers/usb/musb/musb_gadget_ep0.c
+++ b/drivers/usb/musb/musb_gadget_ep0.c
@@ -85,7 +85,7 @@ static int service_tx_status_request(
85 85
86 switch (recip) { 86 switch (recip) {
87 case USB_RECIP_DEVICE: 87 case USB_RECIP_DEVICE:
88 result[0] = musb->is_self_powered << USB_DEVICE_SELF_POWERED; 88 result[0] = musb->g.is_selfpowered << USB_DEVICE_SELF_POWERED;
89 result[0] |= musb->may_wakeup << USB_DEVICE_REMOTE_WAKEUP; 89 result[0] |= musb->may_wakeup << USB_DEVICE_REMOTE_WAKEUP;
90 if (musb->g.is_otg) { 90 if (musb->g.is_otg) {
91 result[0] |= musb->g.b_hnp_enable 91 result[0] |= musb->g.b_hnp_enable
diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c
index b79e5be7aa97..294e159f4afe 100644
--- a/drivers/usb/musb/musb_virthub.c
+++ b/drivers/usb/musb/musb_virthub.c
@@ -72,7 +72,6 @@ void musb_host_finish_resume(struct work_struct *work)
72 musb->xceiv->otg->state = OTG_STATE_A_HOST; 72 musb->xceiv->otg->state = OTG_STATE_A_HOST;
73 73
74 spin_unlock_irqrestore(&musb->lock, flags); 74 spin_unlock_irqrestore(&musb->lock, flags);
75 musb_host_resume_root_hub(musb);
76} 75}
77 76
78void musb_port_suspend(struct musb *musb, bool do_suspend) 77void musb_port_suspend(struct musb *musb, bool do_suspend)
@@ -349,8 +348,7 @@ int musb_hub_control(
349 desc->bDescriptorType = 0x29; 348 desc->bDescriptorType = 0x29;
350 desc->bNbrPorts = 1; 349 desc->bNbrPorts = 1;
351 desc->wHubCharacteristics = cpu_to_le16( 350 desc->wHubCharacteristics = cpu_to_le16(
352 HUB_CHAR_INDV_PORT_LPSM /* per-port power switching */ 351 HUB_CHAR_INDV_PORT_LPSM /* per-port power switching */
353
354 | HUB_CHAR_NO_OCPM /* no overcurrent reporting */ 352 | HUB_CHAR_NO_OCPM /* no overcurrent reporting */
355 ); 353 );
356 desc->bPwrOn2PwrGood = 5; /* msec/2 */ 354 desc->bPwrOn2PwrGood = 5; /* msec/2 */