diff options
Diffstat (limited to 'drivers/usb')
| -rw-r--r-- | drivers/usb/chipidea/udc.c | 4 | ||||
| -rw-r--r-- | drivers/usb/gadget/bcm63xx_udc.c | 58 | ||||
| -rw-r--r-- | drivers/usb/gadget/f_fs.c | 7 | ||||
| -rw-r--r-- | drivers/usb/gadget/printer.c | 2 | ||||
| -rw-r--r-- | drivers/usb/gadget/s3c2410_udc.c | 2 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-hcd.c | 13 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-hub.c | 26 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_core.c | 15 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_host.c | 3 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_virthub.c | 26 | ||||
| -rw-r--r-- | drivers/usb/musb/omap2430.c | 2 | ||||
| -rw-r--r-- | drivers/usb/phy/phy-msm-usb.c | 57 | ||||
| -rw-r--r-- | drivers/usb/serial/ftdi_sio.c | 2 | ||||
| -rw-r--r-- | drivers/usb/serial/ftdi_sio_ids.h | 6 | ||||
| -rw-r--r-- | drivers/usb/serial/option.c | 3 |
15 files changed, 145 insertions, 81 deletions
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index 80de2f88ed2c..4ab2cb62dfce 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c | |||
| @@ -105,7 +105,7 @@ static int hw_ep_flush(struct ci_hdrc *ci, int num, int dir) | |||
| 105 | 105 | ||
| 106 | do { | 106 | do { |
| 107 | /* flush any pending transfer */ | 107 | /* flush any pending transfer */ |
| 108 | hw_write(ci, OP_ENDPTFLUSH, BIT(n), BIT(n)); | 108 | hw_write(ci, OP_ENDPTFLUSH, ~0, BIT(n)); |
| 109 | while (hw_read(ci, OP_ENDPTFLUSH, BIT(n))) | 109 | while (hw_read(ci, OP_ENDPTFLUSH, BIT(n))) |
| 110 | cpu_relax(); | 110 | cpu_relax(); |
| 111 | } while (hw_read(ci, OP_ENDPTSTAT, BIT(n))); | 111 | } while (hw_read(ci, OP_ENDPTSTAT, BIT(n))); |
| @@ -205,7 +205,7 @@ static int hw_ep_prime(struct ci_hdrc *ci, int num, int dir, int is_ctrl) | |||
| 205 | if (is_ctrl && dir == RX && hw_read(ci, OP_ENDPTSETUPSTAT, BIT(num))) | 205 | if (is_ctrl && dir == RX && hw_read(ci, OP_ENDPTSETUPSTAT, BIT(num))) |
| 206 | return -EAGAIN; | 206 | return -EAGAIN; |
| 207 | 207 | ||
| 208 | hw_write(ci, OP_ENDPTPRIME, BIT(n), BIT(n)); | 208 | hw_write(ci, OP_ENDPTPRIME, ~0, BIT(n)); |
| 209 | 209 | ||
| 210 | while (hw_read(ci, OP_ENDPTPRIME, BIT(n))) | 210 | while (hw_read(ci, OP_ENDPTPRIME, BIT(n))) |
| 211 | cpu_relax(); | 211 | cpu_relax(); |
diff --git a/drivers/usb/gadget/bcm63xx_udc.c b/drivers/usb/gadget/bcm63xx_udc.c index 888fbb43b338..e969eb809a85 100644 --- a/drivers/usb/gadget/bcm63xx_udc.c +++ b/drivers/usb/gadget/bcm63xx_udc.c | |||
| @@ -360,24 +360,30 @@ static inline void usb_dma_writel(struct bcm63xx_udc *udc, u32 val, u32 off) | |||
| 360 | bcm_writel(val, udc->iudma_regs + off); | 360 | bcm_writel(val, udc->iudma_regs + off); |
| 361 | } | 361 | } |
| 362 | 362 | ||
| 363 | static inline u32 usb_dmac_readl(struct bcm63xx_udc *udc, u32 off) | 363 | static inline u32 usb_dmac_readl(struct bcm63xx_udc *udc, u32 off, int chan) |
| 364 | { | 364 | { |
| 365 | return bcm_readl(udc->iudma_regs + IUDMA_DMAC_OFFSET + off); | 365 | return bcm_readl(udc->iudma_regs + IUDMA_DMAC_OFFSET + off + |
| 366 | (ENETDMA_CHAN_WIDTH * chan)); | ||
| 366 | } | 367 | } |
| 367 | 368 | ||
| 368 | static inline void usb_dmac_writel(struct bcm63xx_udc *udc, u32 val, u32 off) | 369 | static inline void usb_dmac_writel(struct bcm63xx_udc *udc, u32 val, u32 off, |
| 370 | int chan) | ||
| 369 | { | 371 | { |
| 370 | bcm_writel(val, udc->iudma_regs + IUDMA_DMAC_OFFSET + off); | 372 | bcm_writel(val, udc->iudma_regs + IUDMA_DMAC_OFFSET + off + |
| 373 | (ENETDMA_CHAN_WIDTH * chan)); | ||
| 371 | } | 374 | } |
| 372 | 375 | ||
| 373 | static inline u32 usb_dmas_readl(struct bcm63xx_udc *udc, u32 off) | 376 | static inline u32 usb_dmas_readl(struct bcm63xx_udc *udc, u32 off, int chan) |
| 374 | { | 377 | { |
| 375 | return bcm_readl(udc->iudma_regs + IUDMA_DMAS_OFFSET + off); | 378 | return bcm_readl(udc->iudma_regs + IUDMA_DMAS_OFFSET + off + |
| 379 | (ENETDMA_CHAN_WIDTH * chan)); | ||
| 376 | } | 380 | } |
| 377 | 381 | ||
| 378 | static inline void usb_dmas_writel(struct bcm63xx_udc *udc, u32 val, u32 off) | 382 | static inline void usb_dmas_writel(struct bcm63xx_udc *udc, u32 val, u32 off, |
| 383 | int chan) | ||
| 379 | { | 384 | { |
| 380 | bcm_writel(val, udc->iudma_regs + IUDMA_DMAS_OFFSET + off); | 385 | bcm_writel(val, udc->iudma_regs + IUDMA_DMAS_OFFSET + off + |
| 386 | (ENETDMA_CHAN_WIDTH * chan)); | ||
| 381 | } | 387 | } |
| 382 | 388 | ||
| 383 | static inline void set_clocks(struct bcm63xx_udc *udc, bool is_enabled) | 389 | static inline void set_clocks(struct bcm63xx_udc *udc, bool is_enabled) |
| @@ -638,7 +644,7 @@ static void iudma_write(struct bcm63xx_udc *udc, struct iudma_ch *iudma, | |||
| 638 | } while (!last_bd); | 644 | } while (!last_bd); |
| 639 | 645 | ||
| 640 | usb_dmac_writel(udc, ENETDMAC_CHANCFG_EN_MASK, | 646 | usb_dmac_writel(udc, ENETDMAC_CHANCFG_EN_MASK, |
| 641 | ENETDMAC_CHANCFG_REG(iudma->ch_idx)); | 647 | ENETDMAC_CHANCFG_REG, iudma->ch_idx); |
| 642 | } | 648 | } |
| 643 | 649 | ||
| 644 | /** | 650 | /** |
| @@ -694,9 +700,9 @@ static void iudma_reset_channel(struct bcm63xx_udc *udc, struct iudma_ch *iudma) | |||
| 694 | bcm63xx_fifo_reset_ep(udc, max(0, iudma->ep_num)); | 700 | bcm63xx_fifo_reset_ep(udc, max(0, iudma->ep_num)); |
| 695 | 701 | ||
| 696 | /* stop DMA, then wait for the hardware to wrap up */ | 702 | /* stop DMA, then wait for the hardware to wrap up */ |
| 697 | usb_dmac_writel(udc, 0, ENETDMAC_CHANCFG_REG(ch_idx)); | 703 | usb_dmac_writel(udc, 0, ENETDMAC_CHANCFG_REG, ch_idx); |
| 698 | 704 | ||
| 699 | while (usb_dmac_readl(udc, ENETDMAC_CHANCFG_REG(ch_idx)) & | 705 | while (usb_dmac_readl(udc, ENETDMAC_CHANCFG_REG, ch_idx) & |
| 700 | ENETDMAC_CHANCFG_EN_MASK) { | 706 | ENETDMAC_CHANCFG_EN_MASK) { |
| 701 | udelay(1); | 707 | udelay(1); |
| 702 | 708 | ||
| @@ -713,10 +719,10 @@ static void iudma_reset_channel(struct bcm63xx_udc *udc, struct iudma_ch *iudma) | |||
| 713 | dev_warn(udc->dev, "forcibly halting IUDMA channel %d\n", | 719 | dev_warn(udc->dev, "forcibly halting IUDMA channel %d\n", |
| 714 | ch_idx); | 720 | ch_idx); |
| 715 | usb_dmac_writel(udc, ENETDMAC_CHANCFG_BUFHALT_MASK, | 721 | usb_dmac_writel(udc, ENETDMAC_CHANCFG_BUFHALT_MASK, |
| 716 | ENETDMAC_CHANCFG_REG(ch_idx)); | 722 | ENETDMAC_CHANCFG_REG, ch_idx); |
| 717 | } | 723 | } |
| 718 | } | 724 | } |
| 719 | usb_dmac_writel(udc, ~0, ENETDMAC_IR_REG(ch_idx)); | 725 | usb_dmac_writel(udc, ~0, ENETDMAC_IR_REG, ch_idx); |
| 720 | 726 | ||
| 721 | /* don't leave "live" HW-owned entries for the next guy to step on */ | 727 | /* don't leave "live" HW-owned entries for the next guy to step on */ |
| 722 | for (d = iudma->bd_ring; d <= iudma->end_bd; d++) | 728 | for (d = iudma->bd_ring; d <= iudma->end_bd; d++) |
| @@ -728,11 +734,11 @@ static void iudma_reset_channel(struct bcm63xx_udc *udc, struct iudma_ch *iudma) | |||
| 728 | 734 | ||
| 729 | /* set up IRQs, UBUS burst size, and BD base for this channel */ | 735 | /* set up IRQs, UBUS burst size, and BD base for this channel */ |
| 730 | usb_dmac_writel(udc, ENETDMAC_IR_BUFDONE_MASK, | 736 | usb_dmac_writel(udc, ENETDMAC_IR_BUFDONE_MASK, |
| 731 | ENETDMAC_IRMASK_REG(ch_idx)); | 737 | ENETDMAC_IRMASK_REG, ch_idx); |
| 732 | usb_dmac_writel(udc, 8, ENETDMAC_MAXBURST_REG(ch_idx)); | 738 | usb_dmac_writel(udc, 8, ENETDMAC_MAXBURST_REG, ch_idx); |
| 733 | 739 | ||
| 734 | usb_dmas_writel(udc, iudma->bd_ring_dma, ENETDMAS_RSTART_REG(ch_idx)); | 740 | usb_dmas_writel(udc, iudma->bd_ring_dma, ENETDMAS_RSTART_REG, ch_idx); |
| 735 | usb_dmas_writel(udc, 0, ENETDMAS_SRAM2_REG(ch_idx)); | 741 | usb_dmas_writel(udc, 0, ENETDMAS_SRAM2_REG, ch_idx); |
| 736 | } | 742 | } |
| 737 | 743 | ||
| 738 | /** | 744 | /** |
| @@ -2035,7 +2041,7 @@ static irqreturn_t bcm63xx_udc_data_isr(int irq, void *dev_id) | |||
| 2035 | spin_lock(&udc->lock); | 2041 | spin_lock(&udc->lock); |
| 2036 | 2042 | ||
| 2037 | usb_dmac_writel(udc, ENETDMAC_IR_BUFDONE_MASK, | 2043 | usb_dmac_writel(udc, ENETDMAC_IR_BUFDONE_MASK, |
| 2038 | ENETDMAC_IR_REG(iudma->ch_idx)); | 2044 | ENETDMAC_IR_REG, iudma->ch_idx); |
| 2039 | bep = iudma->bep; | 2045 | bep = iudma->bep; |
| 2040 | rc = iudma_read(udc, iudma); | 2046 | rc = iudma_read(udc, iudma); |
| 2041 | 2047 | ||
| @@ -2175,18 +2181,18 @@ static int bcm63xx_iudma_dbg_show(struct seq_file *s, void *p) | |||
| 2175 | seq_printf(s, " [ep%d]:\n", | 2181 | seq_printf(s, " [ep%d]:\n", |
| 2176 | max_t(int, iudma_defaults[ch_idx].ep_num, 0)); | 2182 | max_t(int, iudma_defaults[ch_idx].ep_num, 0)); |
| 2177 | seq_printf(s, " cfg: %08x; irqstat: %08x; irqmask: %08x; maxburst: %08x\n", | 2183 | seq_printf(s, " cfg: %08x; irqstat: %08x; irqmask: %08x; maxburst: %08x\n", |
| 2178 | usb_dmac_readl(udc, ENETDMAC_CHANCFG_REG(ch_idx)), | 2184 | usb_dmac_readl(udc, ENETDMAC_CHANCFG_REG, ch_idx), |
| 2179 | usb_dmac_readl(udc, ENETDMAC_IR_REG(ch_idx)), | 2185 | usb_dmac_readl(udc, ENETDMAC_IR_REG, ch_idx), |
| 2180 | usb_dmac_readl(udc, ENETDMAC_IRMASK_REG(ch_idx)), | 2186 | usb_dmac_readl(udc, ENETDMAC_IRMASK_REG, ch_idx), |
| 2181 | usb_dmac_readl(udc, ENETDMAC_MAXBURST_REG(ch_idx))); | 2187 | usb_dmac_readl(udc, ENETDMAC_MAXBURST_REG, ch_idx)); |
| 2182 | 2188 | ||
| 2183 | sram2 = usb_dmas_readl(udc, ENETDMAS_SRAM2_REG(ch_idx)); | 2189 | sram2 = usb_dmas_readl(udc, ENETDMAS_SRAM2_REG, ch_idx); |
| 2184 | sram3 = usb_dmas_readl(udc, ENETDMAS_SRAM3_REG(ch_idx)); | 2190 | sram3 = usb_dmas_readl(udc, ENETDMAS_SRAM3_REG, ch_idx); |
| 2185 | seq_printf(s, " base: %08x; index: %04x_%04x; desc: %04x_%04x %08x\n", | 2191 | seq_printf(s, " base: %08x; index: %04x_%04x; desc: %04x_%04x %08x\n", |
| 2186 | usb_dmas_readl(udc, ENETDMAS_RSTART_REG(ch_idx)), | 2192 | usb_dmas_readl(udc, ENETDMAS_RSTART_REG, ch_idx), |
| 2187 | sram2 >> 16, sram2 & 0xffff, | 2193 | sram2 >> 16, sram2 & 0xffff, |
| 2188 | sram3 >> 16, sram3 & 0xffff, | 2194 | sram3 >> 16, sram3 & 0xffff, |
| 2189 | usb_dmas_readl(udc, ENETDMAS_SRAM4_REG(ch_idx))); | 2195 | usb_dmas_readl(udc, ENETDMAS_SRAM4_REG, ch_idx)); |
| 2190 | seq_printf(s, " desc: %d/%d used", iudma->n_bds_used, | 2196 | seq_printf(s, " desc: %d/%d used", iudma->n_bds_used, |
| 2191 | iudma->n_bds); | 2197 | iudma->n_bds); |
| 2192 | 2198 | ||
diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c index 306a2b52125c..2b4334394076 100644 --- a/drivers/usb/gadget/f_fs.c +++ b/drivers/usb/gadget/f_fs.c | |||
| @@ -585,7 +585,6 @@ static ssize_t ffs_epfile_io(struct file *file, | |||
| 585 | char __user *buf, size_t len, int read) | 585 | char __user *buf, size_t len, int read) |
| 586 | { | 586 | { |
| 587 | struct ffs_epfile *epfile = file->private_data; | 587 | struct ffs_epfile *epfile = file->private_data; |
| 588 | struct usb_gadget *gadget = epfile->ffs->gadget; | ||
| 589 | struct ffs_ep *ep; | 588 | struct ffs_ep *ep; |
| 590 | char *data = NULL; | 589 | char *data = NULL; |
| 591 | ssize_t ret, data_len; | 590 | ssize_t ret, data_len; |
| @@ -622,6 +621,12 @@ static ssize_t ffs_epfile_io(struct file *file, | |||
| 622 | /* Allocate & copy */ | 621 | /* Allocate & copy */ |
| 623 | if (!halt) { | 622 | if (!halt) { |
| 624 | /* | 623 | /* |
| 624 | * if we _do_ wait above, the epfile->ffs->gadget might be NULL | ||
| 625 | * before the waiting completes, so do not assign to 'gadget' earlier | ||
| 626 | */ | ||
| 627 | struct usb_gadget *gadget = epfile->ffs->gadget; | ||
| 628 | |||
| 629 | /* | ||
| 625 | * Controller may require buffer size to be aligned to | 630 | * Controller may require buffer size to be aligned to |
| 626 | * maxpacketsize of an out endpoint. | 631 | * maxpacketsize of an out endpoint. |
| 627 | */ | 632 | */ |
diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c index bf7a56b6d48a..69b76efd11e9 100644 --- a/drivers/usb/gadget/printer.c +++ b/drivers/usb/gadget/printer.c | |||
| @@ -1157,7 +1157,7 @@ static int __init printer_bind_config(struct usb_configuration *c) | |||
| 1157 | 1157 | ||
| 1158 | usb_gadget_set_selfpowered(gadget); | 1158 | usb_gadget_set_selfpowered(gadget); |
| 1159 | 1159 | ||
| 1160 | if (gadget->is_otg) { | 1160 | if (gadget_is_otg(gadget)) { |
| 1161 | otg_descriptor.bmAttributes |= USB_OTG_HNP; | 1161 | otg_descriptor.bmAttributes |= USB_OTG_HNP; |
| 1162 | printer_cfg_driver.descriptors = otg_desc; | 1162 | printer_cfg_driver.descriptors = otg_desc; |
| 1163 | printer_cfg_driver.bmAttributes |= USB_CONFIG_ATT_WAKEUP; | 1163 | printer_cfg_driver.bmAttributes |= USB_CONFIG_ATT_WAKEUP; |
diff --git a/drivers/usb/gadget/s3c2410_udc.c b/drivers/usb/gadget/s3c2410_udc.c index f04b2c3154de..dd9678f85c58 100644 --- a/drivers/usb/gadget/s3c2410_udc.c +++ b/drivers/usb/gadget/s3c2410_udc.c | |||
| @@ -1629,7 +1629,7 @@ static void s3c2410_udc_reinit(struct s3c2410_udc *dev) | |||
| 1629 | ep->ep.desc = NULL; | 1629 | ep->ep.desc = NULL; |
| 1630 | ep->halted = 0; | 1630 | ep->halted = 0; |
| 1631 | INIT_LIST_HEAD(&ep->queue); | 1631 | INIT_LIST_HEAD(&ep->queue); |
| 1632 | usb_ep_set_maxpacket_limit(&ep->ep, &ep->ep.maxpacket); | 1632 | usb_ep_set_maxpacket_limit(&ep->ep, ep->ep.maxpacket); |
| 1633 | } | 1633 | } |
| 1634 | } | 1634 | } |
| 1635 | 1635 | ||
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 471142725ffe..81cda09b47e3 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
| @@ -685,8 +685,15 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
| 685 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 685 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
| 686 | u32 status, masked_status, pcd_status = 0, cmd; | 686 | u32 status, masked_status, pcd_status = 0, cmd; |
| 687 | int bh; | 687 | int bh; |
| 688 | unsigned long flags; | ||
| 688 | 689 | ||
| 689 | spin_lock (&ehci->lock); | 690 | /* |
| 691 | * For threadirqs option we use spin_lock_irqsave() variant to prevent | ||
| 692 | * deadlock with ehci hrtimer callback, because hrtimer callbacks run | ||
| 693 | * in interrupt context even when threadirqs is specified. We can go | ||
| 694 | * back to spin_lock() variant when hrtimer callbacks become threaded. | ||
| 695 | */ | ||
| 696 | spin_lock_irqsave(&ehci->lock, flags); | ||
| 690 | 697 | ||
| 691 | status = ehci_readl(ehci, &ehci->regs->status); | 698 | status = ehci_readl(ehci, &ehci->regs->status); |
| 692 | 699 | ||
| @@ -704,7 +711,7 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
| 704 | 711 | ||
| 705 | /* Shared IRQ? */ | 712 | /* Shared IRQ? */ |
| 706 | if (!masked_status || unlikely(ehci->rh_state == EHCI_RH_HALTED)) { | 713 | if (!masked_status || unlikely(ehci->rh_state == EHCI_RH_HALTED)) { |
| 707 | spin_unlock(&ehci->lock); | 714 | spin_unlock_irqrestore(&ehci->lock, flags); |
| 708 | return IRQ_NONE; | 715 | return IRQ_NONE; |
| 709 | } | 716 | } |
| 710 | 717 | ||
| @@ -815,7 +822,7 @@ dead: | |||
| 815 | 822 | ||
| 816 | if (bh) | 823 | if (bh) |
| 817 | ehci_work (ehci); | 824 | ehci_work (ehci); |
| 818 | spin_unlock (&ehci->lock); | 825 | spin_unlock_irqrestore(&ehci->lock, flags); |
| 819 | if (pcd_status) | 826 | if (pcd_status) |
| 820 | usb_hcd_poll_rh_status(hcd); | 827 | usb_hcd_poll_rh_status(hcd); |
| 821 | return IRQ_HANDLED; | 828 | return IRQ_HANDLED; |
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 47b858fc50b2..7ae0c4d51741 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
| @@ -238,6 +238,7 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
| 238 | int port; | 238 | int port; |
| 239 | int mask; | 239 | int mask; |
| 240 | int changed; | 240 | int changed; |
| 241 | bool fs_idle_delay; | ||
| 241 | 242 | ||
| 242 | ehci_dbg(ehci, "suspend root hub\n"); | 243 | ehci_dbg(ehci, "suspend root hub\n"); |
| 243 | 244 | ||
| @@ -272,6 +273,7 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
| 272 | ehci->bus_suspended = 0; | 273 | ehci->bus_suspended = 0; |
| 273 | ehci->owned_ports = 0; | 274 | ehci->owned_ports = 0; |
| 274 | changed = 0; | 275 | changed = 0; |
| 276 | fs_idle_delay = false; | ||
| 275 | port = HCS_N_PORTS(ehci->hcs_params); | 277 | port = HCS_N_PORTS(ehci->hcs_params); |
| 276 | while (port--) { | 278 | while (port--) { |
| 277 | u32 __iomem *reg = &ehci->regs->port_status [port]; | 279 | u32 __iomem *reg = &ehci->regs->port_status [port]; |
| @@ -300,16 +302,32 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
| 300 | } | 302 | } |
| 301 | 303 | ||
| 302 | if (t1 != t2) { | 304 | if (t1 != t2) { |
| 305 | /* | ||
| 306 | * On some controllers, Wake-On-Disconnect will | ||
| 307 | * generate false wakeup signals until the bus | ||
| 308 | * switches over to full-speed idle. For their | ||
| 309 | * sake, add a delay if we need one. | ||
| 310 | */ | ||
| 311 | if ((t2 & PORT_WKDISC_E) && | ||
| 312 | ehci_port_speed(ehci, t2) == | ||
| 313 | USB_PORT_STAT_HIGH_SPEED) | ||
| 314 | fs_idle_delay = true; | ||
| 303 | ehci_writel(ehci, t2, reg); | 315 | ehci_writel(ehci, t2, reg); |
| 304 | changed = 1; | 316 | changed = 1; |
| 305 | } | 317 | } |
| 306 | } | 318 | } |
| 319 | spin_unlock_irq(&ehci->lock); | ||
| 320 | |||
| 321 | if ((changed && ehci->has_tdi_phy_lpm) || fs_idle_delay) { | ||
| 322 | /* | ||
| 323 | * Wait for HCD to enter low-power mode or for the bus | ||
| 324 | * to switch to full-speed idle. | ||
| 325 | */ | ||
| 326 | usleep_range(5000, 5500); | ||
| 327 | } | ||
| 307 | 328 | ||
| 308 | if (changed && ehci->has_tdi_phy_lpm) { | 329 | if (changed && ehci->has_tdi_phy_lpm) { |
| 309 | spin_unlock_irq(&ehci->lock); | ||
| 310 | msleep(5); /* 5 ms for HCD to enter low-power mode */ | ||
| 311 | spin_lock_irq(&ehci->lock); | 330 | spin_lock_irq(&ehci->lock); |
| 312 | |||
| 313 | port = HCS_N_PORTS(ehci->hcs_params); | 331 | port = HCS_N_PORTS(ehci->hcs_params); |
| 314 | while (port--) { | 332 | while (port--) { |
| 315 | u32 __iomem *hostpc_reg = &ehci->regs->hostpc[port]; | 333 | u32 __iomem *hostpc_reg = &ehci->regs->hostpc[port]; |
| @@ -322,8 +340,8 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
| 322 | port, (t3 & HOSTPC_PHCD) ? | 340 | port, (t3 & HOSTPC_PHCD) ? |
| 323 | "succeeded" : "failed"); | 341 | "succeeded" : "failed"); |
| 324 | } | 342 | } |
| 343 | spin_unlock_irq(&ehci->lock); | ||
| 325 | } | 344 | } |
| 326 | spin_unlock_irq(&ehci->lock); | ||
| 327 | 345 | ||
| 328 | /* Apparently some devices need a >= 1-uframe delay here */ | 346 | /* Apparently some devices need a >= 1-uframe delay here */ |
| 329 | if (ehci->bus_suspended) | 347 | if (ehci->bus_suspended) |
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index fc192ad9cc6a..239ad0b1ceb6 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
| @@ -477,8 +477,11 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
| 477 | musb->port1_status |= | 477 | musb->port1_status |= |
| 478 | (USB_PORT_STAT_C_SUSPEND << 16) | 478 | (USB_PORT_STAT_C_SUSPEND << 16) |
| 479 | | MUSB_PORT_STAT_RESUME; | 479 | | MUSB_PORT_STAT_RESUME; |
| 480 | musb->rh_timer = jiffies | ||
| 481 | + msecs_to_jiffies(20); | ||
| 480 | schedule_delayed_work( | 482 | schedule_delayed_work( |
| 481 | &musb->finish_resume_work, 20); | 483 | &musb->finish_resume_work, |
| 484 | msecs_to_jiffies(20)); | ||
| 482 | 485 | ||
| 483 | musb->xceiv->state = OTG_STATE_A_HOST; | 486 | musb->xceiv->state = OTG_STATE_A_HOST; |
| 484 | musb->is_active = 1; | 487 | musb->is_active = 1; |
| @@ -2157,11 +2160,19 @@ static void musb_restore_context(struct musb *musb) | |||
| 2157 | void __iomem *musb_base = musb->mregs; | 2160 | void __iomem *musb_base = musb->mregs; |
| 2158 | void __iomem *ep_target_regs; | 2161 | void __iomem *ep_target_regs; |
| 2159 | void __iomem *epio; | 2162 | void __iomem *epio; |
| 2163 | u8 power; | ||
| 2160 | 2164 | ||
| 2161 | musb_writew(musb_base, MUSB_FRAME, musb->context.frame); | 2165 | musb_writew(musb_base, MUSB_FRAME, musb->context.frame); |
| 2162 | musb_writeb(musb_base, MUSB_TESTMODE, musb->context.testmode); | 2166 | musb_writeb(musb_base, MUSB_TESTMODE, musb->context.testmode); |
| 2163 | musb_write_ulpi_buscontrol(musb->mregs, musb->context.busctl); | 2167 | musb_write_ulpi_buscontrol(musb->mregs, musb->context.busctl); |
| 2164 | musb_writeb(musb_base, MUSB_POWER, musb->context.power); | 2168 | |
| 2169 | /* Don't affect SUSPENDM/RESUME bits in POWER reg */ | ||
| 2170 | power = musb_readb(musb_base, MUSB_POWER); | ||
| 2171 | power &= MUSB_POWER_SUSPENDM | MUSB_POWER_RESUME; | ||
| 2172 | musb->context.power &= ~(MUSB_POWER_SUSPENDM | MUSB_POWER_RESUME); | ||
| 2173 | power |= musb->context.power; | ||
| 2174 | musb_writeb(musb_base, MUSB_POWER, power); | ||
| 2175 | |||
| 2165 | musb_writew(musb_base, MUSB_INTRTXE, musb->intrtxe); | 2176 | musb_writew(musb_base, MUSB_INTRTXE, musb->intrtxe); |
| 2166 | musb_writew(musb_base, MUSB_INTRRXE, musb->intrrxe); | 2177 | musb_writew(musb_base, MUSB_INTRRXE, musb->intrrxe); |
| 2167 | musb_writeb(musb_base, MUSB_INTRUSBE, musb->context.intrusbe); | 2178 | musb_writeb(musb_base, MUSB_INTRUSBE, musb->context.intrusbe); |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index ed455724017b..abb38c3833ef 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
| @@ -1183,6 +1183,9 @@ irqreturn_t musb_h_ep0_irq(struct musb *musb) | |||
| 1183 | csr = MUSB_CSR0_H_STATUSPKT | 1183 | csr = MUSB_CSR0_H_STATUSPKT |
| 1184 | | MUSB_CSR0_TXPKTRDY; | 1184 | | MUSB_CSR0_TXPKTRDY; |
| 1185 | 1185 | ||
| 1186 | /* disable ping token in status phase */ | ||
| 1187 | csr |= MUSB_CSR0_H_DIS_PING; | ||
| 1188 | |||
| 1186 | /* flag status stage */ | 1189 | /* flag status stage */ |
| 1187 | musb->ep0_stage = MUSB_EP0_STATUS; | 1190 | musb->ep0_stage = MUSB_EP0_STATUS; |
| 1188 | 1191 | ||
diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c index eb634433ef09..e2d2d8c9891b 100644 --- a/drivers/usb/musb/musb_virthub.c +++ b/drivers/usb/musb/musb_virthub.c | |||
| @@ -135,7 +135,8 @@ void musb_port_suspend(struct musb *musb, bool do_suspend) | |||
| 135 | 135 | ||
| 136 | /* later, GetPortStatus will stop RESUME signaling */ | 136 | /* later, GetPortStatus will stop RESUME signaling */ |
| 137 | musb->port1_status |= MUSB_PORT_STAT_RESUME; | 137 | musb->port1_status |= MUSB_PORT_STAT_RESUME; |
| 138 | schedule_delayed_work(&musb->finish_resume_work, 20); | 138 | schedule_delayed_work(&musb->finish_resume_work, |
| 139 | msecs_to_jiffies(20)); | ||
| 139 | } | 140 | } |
| 140 | } | 141 | } |
| 141 | 142 | ||
| @@ -158,7 +159,6 @@ void musb_port_reset(struct musb *musb, bool do_reset) | |||
| 158 | */ | 159 | */ |
| 159 | power = musb_readb(mbase, MUSB_POWER); | 160 | power = musb_readb(mbase, MUSB_POWER); |
| 160 | if (do_reset) { | 161 | if (do_reset) { |
| 161 | |||
| 162 | /* | 162 | /* |
| 163 | * If RESUME is set, we must make sure it stays minimum 20 ms. | 163 | * If RESUME is set, we must make sure it stays minimum 20 ms. |
| 164 | * Then we must clear RESUME and wait a bit to let musb start | 164 | * Then we must clear RESUME and wait a bit to let musb start |
| @@ -167,11 +167,22 @@ void musb_port_reset(struct musb *musb, bool do_reset) | |||
| 167 | * detected". | 167 | * detected". |
| 168 | */ | 168 | */ |
| 169 | if (power & MUSB_POWER_RESUME) { | 169 | if (power & MUSB_POWER_RESUME) { |
| 170 | while (time_before(jiffies, musb->rh_timer)) | 170 | long remain = (unsigned long) musb->rh_timer - jiffies; |
| 171 | msleep(1); | 171 | |
| 172 | if (musb->rh_timer > 0 && remain > 0) { | ||
| 173 | /* take into account the minimum delay after resume */ | ||
| 174 | schedule_delayed_work( | ||
| 175 | &musb->deassert_reset_work, remain); | ||
| 176 | return; | ||
| 177 | } | ||
| 178 | |||
| 172 | musb_writeb(mbase, MUSB_POWER, | 179 | musb_writeb(mbase, MUSB_POWER, |
| 173 | power & ~MUSB_POWER_RESUME); | 180 | power & ~MUSB_POWER_RESUME); |
| 174 | msleep(1); | 181 | |
| 182 | /* Give the core 1 ms to clear MUSB_POWER_RESUME */ | ||
| 183 | schedule_delayed_work(&musb->deassert_reset_work, | ||
| 184 | msecs_to_jiffies(1)); | ||
| 185 | return; | ||
| 175 | } | 186 | } |
| 176 | 187 | ||
| 177 | power &= 0xf0; | 188 | power &= 0xf0; |
| @@ -180,7 +191,8 @@ void musb_port_reset(struct musb *musb, bool do_reset) | |||
| 180 | 191 | ||
| 181 | musb->port1_status |= USB_PORT_STAT_RESET; | 192 | musb->port1_status |= USB_PORT_STAT_RESET; |
| 182 | musb->port1_status &= ~USB_PORT_STAT_ENABLE; | 193 | musb->port1_status &= ~USB_PORT_STAT_ENABLE; |
| 183 | schedule_delayed_work(&musb->deassert_reset_work, 50); | 194 | schedule_delayed_work(&musb->deassert_reset_work, |
| 195 | msecs_to_jiffies(50)); | ||
| 184 | } else { | 196 | } else { |
| 185 | dev_dbg(musb->controller, "root port reset stopped\n"); | 197 | dev_dbg(musb->controller, "root port reset stopped\n"); |
| 186 | musb_writeb(mbase, MUSB_POWER, | 198 | musb_writeb(mbase, MUSB_POWER, |
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c index 2a408cdaf7b2..8aa59a2c5eb2 100644 --- a/drivers/usb/musb/omap2430.c +++ b/drivers/usb/musb/omap2430.c | |||
| @@ -659,7 +659,6 @@ static int omap2430_runtime_suspend(struct device *dev) | |||
| 659 | OTG_INTERFSEL); | 659 | OTG_INTERFSEL); |
| 660 | 660 | ||
| 661 | omap2430_low_level_exit(musb); | 661 | omap2430_low_level_exit(musb); |
| 662 | phy_power_off(musb->phy); | ||
| 663 | } | 662 | } |
| 664 | 663 | ||
| 665 | return 0; | 664 | return 0; |
| @@ -674,7 +673,6 @@ static int omap2430_runtime_resume(struct device *dev) | |||
| 674 | omap2430_low_level_init(musb); | 673 | omap2430_low_level_init(musb); |
| 675 | musb_writel(musb->mregs, OTG_INTERFSEL, | 674 | musb_writel(musb->mregs, OTG_INTERFSEL, |
| 676 | musb->context.otg_interfsel); | 675 | musb->context.otg_interfsel); |
| 677 | phy_power_on(musb->phy); | ||
| 678 | } | 676 | } |
| 679 | 677 | ||
| 680 | return 0; | 678 | return 0; |
diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c index 8546c8dccd51..d204f745ed05 100644 --- a/drivers/usb/phy/phy-msm-usb.c +++ b/drivers/usb/phy/phy-msm-usb.c | |||
| @@ -159,32 +159,6 @@ put_3p3: | |||
| 159 | return rc; | 159 | return rc; |
| 160 | } | 160 | } |
| 161 | 161 | ||
| 162 | #ifdef CONFIG_PM_SLEEP | ||
| 163 | #define USB_PHY_SUSP_DIG_VOL 500000 | ||
| 164 | static int msm_hsusb_config_vddcx(int high) | ||
| 165 | { | ||
| 166 | int max_vol = USB_PHY_VDD_DIG_VOL_MAX; | ||
| 167 | int min_vol; | ||
| 168 | int ret; | ||
| 169 | |||
| 170 | if (high) | ||
| 171 | min_vol = USB_PHY_VDD_DIG_VOL_MIN; | ||
| 172 | else | ||
| 173 | min_vol = USB_PHY_SUSP_DIG_VOL; | ||
| 174 | |||
| 175 | ret = regulator_set_voltage(hsusb_vddcx, min_vol, max_vol); | ||
| 176 | if (ret) { | ||
| 177 | pr_err("%s: unable to set the voltage for regulator " | ||
| 178 | "HSUSB_VDDCX\n", __func__); | ||
| 179 | return ret; | ||
| 180 | } | ||
| 181 | |||
| 182 | pr_debug("%s: min_vol:%d max_vol:%d\n", __func__, min_vol, max_vol); | ||
| 183 | |||
| 184 | return ret; | ||
| 185 | } | ||
| 186 | #endif | ||
| 187 | |||
| 188 | static int msm_hsusb_ldo_set_mode(int on) | 162 | static int msm_hsusb_ldo_set_mode(int on) |
| 189 | { | 163 | { |
| 190 | int ret = 0; | 164 | int ret = 0; |
| @@ -440,7 +414,32 @@ static int msm_otg_reset(struct usb_phy *phy) | |||
| 440 | #define PHY_SUSPEND_TIMEOUT_USEC (500 * 1000) | 414 | #define PHY_SUSPEND_TIMEOUT_USEC (500 * 1000) |
| 441 | #define PHY_RESUME_TIMEOUT_USEC (100 * 1000) | 415 | #define PHY_RESUME_TIMEOUT_USEC (100 * 1000) |
| 442 | 416 | ||
| 443 | #ifdef CONFIG_PM_SLEEP | 417 | #ifdef CONFIG_PM |
| 418 | |||
| 419 | #define USB_PHY_SUSP_DIG_VOL 500000 | ||
| 420 | static int msm_hsusb_config_vddcx(int high) | ||
| 421 | { | ||
| 422 | int max_vol = USB_PHY_VDD_DIG_VOL_MAX; | ||
| 423 | int min_vol; | ||
| 424 | int ret; | ||
| 425 | |||
| 426 | if (high) | ||
| 427 | min_vol = USB_PHY_VDD_DIG_VOL_MIN; | ||
| 428 | else | ||
| 429 | min_vol = USB_PHY_SUSP_DIG_VOL; | ||
| 430 | |||
| 431 | ret = regulator_set_voltage(hsusb_vddcx, min_vol, max_vol); | ||
| 432 | if (ret) { | ||
| 433 | pr_err("%s: unable to set the voltage for regulator " | ||
| 434 | "HSUSB_VDDCX\n", __func__); | ||
| 435 | return ret; | ||
| 436 | } | ||
| 437 | |||
| 438 | pr_debug("%s: min_vol:%d max_vol:%d\n", __func__, min_vol, max_vol); | ||
| 439 | |||
| 440 | return ret; | ||
| 441 | } | ||
| 442 | |||
| 444 | static int msm_otg_suspend(struct msm_otg *motg) | 443 | static int msm_otg_suspend(struct msm_otg *motg) |
| 445 | { | 444 | { |
| 446 | struct usb_phy *phy = &motg->phy; | 445 | struct usb_phy *phy = &motg->phy; |
| @@ -1733,22 +1732,18 @@ static int msm_otg_pm_resume(struct device *dev) | |||
| 1733 | } | 1732 | } |
| 1734 | #endif | 1733 | #endif |
| 1735 | 1734 | ||
| 1736 | #ifdef CONFIG_PM | ||
| 1737 | static const struct dev_pm_ops msm_otg_dev_pm_ops = { | 1735 | static const struct dev_pm_ops msm_otg_dev_pm_ops = { |
| 1738 | SET_SYSTEM_SLEEP_PM_OPS(msm_otg_pm_suspend, msm_otg_pm_resume) | 1736 | SET_SYSTEM_SLEEP_PM_OPS(msm_otg_pm_suspend, msm_otg_pm_resume) |
| 1739 | SET_RUNTIME_PM_OPS(msm_otg_runtime_suspend, msm_otg_runtime_resume, | 1737 | SET_RUNTIME_PM_OPS(msm_otg_runtime_suspend, msm_otg_runtime_resume, |
| 1740 | msm_otg_runtime_idle) | 1738 | msm_otg_runtime_idle) |
| 1741 | }; | 1739 | }; |
| 1742 | #endif | ||
| 1743 | 1740 | ||
| 1744 | static struct platform_driver msm_otg_driver = { | 1741 | static struct platform_driver msm_otg_driver = { |
| 1745 | .remove = msm_otg_remove, | 1742 | .remove = msm_otg_remove, |
| 1746 | .driver = { | 1743 | .driver = { |
| 1747 | .name = DRIVER_NAME, | 1744 | .name = DRIVER_NAME, |
| 1748 | .owner = THIS_MODULE, | 1745 | .owner = THIS_MODULE, |
| 1749 | #ifdef CONFIG_PM | ||
| 1750 | .pm = &msm_otg_dev_pm_ops, | 1746 | .pm = &msm_otg_dev_pm_ops, |
| 1751 | #endif | ||
| 1752 | }, | 1747 | }, |
| 1753 | }; | 1748 | }; |
| 1754 | 1749 | ||
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index ee1f00f03c43..44ab12986805 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -907,6 +907,8 @@ static const struct usb_device_id id_table_combined[] = { | |||
| 907 | /* Crucible Devices */ | 907 | /* Crucible Devices */ |
| 908 | { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) }, | 908 | { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) }, |
| 909 | { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) }, | 909 | { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) }, |
| 910 | /* Cressi Devices */ | ||
| 911 | { USB_DEVICE(FTDI_VID, FTDI_CRESSI_PID) }, | ||
| 910 | { } /* Terminating entry */ | 912 | { } /* Terminating entry */ |
| 911 | }; | 913 | }; |
| 912 | 914 | ||
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 1e2d369df86e..e599fbfcde5f 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
| @@ -1320,3 +1320,9 @@ | |||
| 1320 | * Manufacturer: Smart GSM Team | 1320 | * Manufacturer: Smart GSM Team |
| 1321 | */ | 1321 | */ |
| 1322 | #define FTDI_Z3X_PID 0x0011 | 1322 | #define FTDI_Z3X_PID 0x0011 |
| 1323 | |||
| 1324 | /* | ||
| 1325 | * Product: Cressi PC Interface | ||
| 1326 | * Manufacturer: Cressi | ||
| 1327 | */ | ||
| 1328 | #define FTDI_CRESSI_PID 0x87d0 | ||
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 216d20affba8..68fc9fe65936 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -1526,7 +1526,8 @@ static const struct usb_device_id option_ids[] = { | |||
| 1526 | /* Cinterion */ | 1526 | /* Cinterion */ |
| 1527 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_E) }, | 1527 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_E) }, |
| 1528 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_P) }, | 1528 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_P) }, |
| 1529 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PH8) }, | 1529 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PH8), |
| 1530 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
| 1530 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AHXX) }, | 1531 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AHXX) }, |
| 1531 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PLXX), | 1532 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PLXX), |
| 1532 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 1533 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
