diff options
Diffstat (limited to 'drivers/usb/musb')
-rw-r--r-- | drivers/usb/musb/Kconfig | 7 | ||||
-rw-r--r-- | drivers/usb/musb/blackfin.c | 2 | ||||
-rw-r--r-- | drivers/usb/musb/musb_core.c | 7 | ||||
-rw-r--r-- | drivers/usb/musb/musb_cppi41.c | 24 | ||||
-rw-r--r-- | drivers/usb/musb/musb_debugfs.c | 2 | ||||
-rw-r--r-- | drivers/usb/musb/musb_gadget.c | 4 | ||||
-rw-r--r-- | drivers/usb/musb/musb_gadget_ep0.c | 2 | ||||
-rw-r--r-- | drivers/usb/musb/musb_virthub.c | 4 |
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" | |||
63 | config USB_MUSB_DAVINCI | 63 | config 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 | ||
68 | config USB_MUSB_DA8XX | 69 | config 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 | ||
73 | config USB_MUSB_TUSB6010 | 75 | config USB_MUSB_TUSB6010 |
@@ -77,12 +79,13 @@ config USB_MUSB_TUSB6010 | |||
77 | 79 | ||
78 | config USB_MUSB_OMAP2PLUS | 80 | config 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 | ||
83 | config USB_MUSB_AM35X | 85 | config 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 | ||
87 | config USB_MUSB_DSPS | 90 | config USB_MUSB_DSPS |
88 | tristate "TI DSPS platforms" | 91 | tristate "TI DSPS platforms" |
@@ -93,6 +96,7 @@ config USB_MUSB_DSPS | |||
93 | config USB_MUSB_BLACKFIN | 96 | config 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 | ||
97 | config USB_MUSB_UX500 | 101 | config USB_MUSB_UX500 |
98 | tristate "Ux500 platforms" | 102 | tristate "Ux500 platforms" |
@@ -100,6 +104,7 @@ config USB_MUSB_UX500 | |||
100 | 104 | ||
101 | config USB_MUSB_JZ4740 | 105 | config 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 | ||
609 | static struct platform_driver bfin_driver = { | 609 | static 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: | |||
1612 | static int | 1612 | static int |
1613 | musb_gadget_set_self_powered(struct usb_gadget *gadget, int is_selfpowered) | 1613 | musb_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 | ||
78 | void musb_port_suspend(struct musb *musb, bool do_suspend) | 77 | void 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 */ |