diff options
26 files changed, 211 insertions, 218 deletions
diff --git a/Documentation/devicetree/bindings/usb/dwc2.txt b/Documentation/devicetree/bindings/usb/dwc2.txt index e64d903bcbe8..46da5f184460 100644 --- a/Documentation/devicetree/bindings/usb/dwc2.txt +++ b/Documentation/devicetree/bindings/usb/dwc2.txt | |||
| @@ -19,7 +19,7 @@ Required properties: | |||
| 19 | configured in FS mode; | 19 | configured in FS mode; |
| 20 | - "st,stm32f4x9-hsotg": The DWC2 USB HS controller instance in STM32F4x9 SoCs | 20 | - "st,stm32f4x9-hsotg": The DWC2 USB HS controller instance in STM32F4x9 SoCs |
| 21 | configured in HS mode; | 21 | configured in HS mode; |
| 22 | - "st,stm32f7xx-hsotg": The DWC2 USB HS controller instance in STM32F7xx SoCs | 22 | - "st,stm32f7-hsotg": The DWC2 USB HS controller instance in STM32F7 SoCs |
| 23 | configured in HS mode; | 23 | configured in HS mode; |
| 24 | - reg : Should contain 1 register range (address and length) | 24 | - reg : Should contain 1 register range (address and length) |
| 25 | - interrupts : Should contain 1 interrupt | 25 | - interrupts : Should contain 1 interrupt |
diff --git a/Documentation/devicetree/bindings/usb/renesas_usb3.txt b/Documentation/devicetree/bindings/usb/renesas_usb3.txt index 87a45e2f9b7f..2c071bb5801e 100644 --- a/Documentation/devicetree/bindings/usb/renesas_usb3.txt +++ b/Documentation/devicetree/bindings/usb/renesas_usb3.txt | |||
| @@ -4,6 +4,7 @@ Required properties: | |||
| 4 | - compatible: Must contain one of the following: | 4 | - compatible: Must contain one of the following: |
| 5 | - "renesas,r8a7795-usb3-peri" | 5 | - "renesas,r8a7795-usb3-peri" |
| 6 | - "renesas,r8a7796-usb3-peri" | 6 | - "renesas,r8a7796-usb3-peri" |
| 7 | - "renesas,r8a77965-usb3-peri" | ||
| 7 | - "renesas,rcar-gen3-usb3-peri" for a generic R-Car Gen3 compatible | 8 | - "renesas,rcar-gen3-usb3-peri" for a generic R-Car Gen3 compatible |
| 8 | device | 9 | device |
| 9 | 10 | ||
diff --git a/Documentation/devicetree/bindings/usb/renesas_usbhs.txt b/Documentation/devicetree/bindings/usb/renesas_usbhs.txt index d060172f1529..43960faf5a88 100644 --- a/Documentation/devicetree/bindings/usb/renesas_usbhs.txt +++ b/Documentation/devicetree/bindings/usb/renesas_usbhs.txt | |||
| @@ -12,6 +12,7 @@ Required properties: | |||
| 12 | - "renesas,usbhs-r8a7794" for r8a7794 (R-Car E2) compatible device | 12 | - "renesas,usbhs-r8a7794" for r8a7794 (R-Car E2) compatible device |
| 13 | - "renesas,usbhs-r8a7795" for r8a7795 (R-Car H3) compatible device | 13 | - "renesas,usbhs-r8a7795" for r8a7795 (R-Car H3) compatible device |
| 14 | - "renesas,usbhs-r8a7796" for r8a7796 (R-Car M3-W) compatible device | 14 | - "renesas,usbhs-r8a7796" for r8a7796 (R-Car M3-W) compatible device |
| 15 | - "renesas,usbhs-r8a77965" for r8a77965 (R-Car M3-N) compatible device | ||
| 15 | - "renesas,usbhs-r8a77995" for r8a77995 (R-Car D3) compatible device | 16 | - "renesas,usbhs-r8a77995" for r8a77995 (R-Car D3) compatible device |
| 16 | - "renesas,usbhs-r7s72100" for r7s72100 (RZ/A1) compatible device | 17 | - "renesas,usbhs-r7s72100" for r7s72100 (RZ/A1) compatible device |
| 17 | - "renesas,rcar-gen2-usbhs" for R-Car Gen2 or RZ/G1 compatible devices | 18 | - "renesas,rcar-gen2-usbhs" for R-Car Gen2 or RZ/G1 compatible devices |
diff --git a/Documentation/devicetree/bindings/usb/usb-xhci.txt b/Documentation/devicetree/bindings/usb/usb-xhci.txt index e2ea59bbca93..1651483a7048 100644 --- a/Documentation/devicetree/bindings/usb/usb-xhci.txt +++ b/Documentation/devicetree/bindings/usb/usb-xhci.txt | |||
| @@ -13,6 +13,7 @@ Required properties: | |||
| 13 | - "renesas,xhci-r8a7793" for r8a7793 SoC | 13 | - "renesas,xhci-r8a7793" for r8a7793 SoC |
| 14 | - "renesas,xhci-r8a7795" for r8a7795 SoC | 14 | - "renesas,xhci-r8a7795" for r8a7795 SoC |
| 15 | - "renesas,xhci-r8a7796" for r8a7796 SoC | 15 | - "renesas,xhci-r8a7796" for r8a7796 SoC |
| 16 | - "renesas,xhci-r8a77965" for r8a77965 SoC | ||
| 16 | - "renesas,rcar-gen2-xhci" for a generic R-Car Gen2 or RZ/G1 compatible | 17 | - "renesas,rcar-gen2-xhci" for a generic R-Car Gen2 or RZ/G1 compatible |
| 17 | device | 18 | device |
| 18 | - "renesas,rcar-gen3-xhci" for a generic R-Car Gen3 compatible device | 19 | - "renesas,rcar-gen3-xhci" for a generic R-Car Gen3 compatible device |
diff --git a/drivers/phy/qualcomm/phy-qcom-ufs.c b/drivers/phy/qualcomm/phy-qcom-ufs.c index c5ff4525edef..c5493ea51282 100644 --- a/drivers/phy/qualcomm/phy-qcom-ufs.c +++ b/drivers/phy/qualcomm/phy-qcom-ufs.c | |||
| @@ -675,3 +675,8 @@ int ufs_qcom_phy_power_off(struct phy *generic_phy) | |||
| 675 | return 0; | 675 | return 0; |
| 676 | } | 676 | } |
| 677 | EXPORT_SYMBOL_GPL(ufs_qcom_phy_power_off); | 677 | EXPORT_SYMBOL_GPL(ufs_qcom_phy_power_off); |
| 678 | |||
| 679 | MODULE_AUTHOR("Yaniv Gardi <ygardi@codeaurora.org>"); | ||
| 680 | MODULE_AUTHOR("Vivek Gautam <vivek.gautam@codeaurora.org>"); | ||
| 681 | MODULE_DESCRIPTION("Universal Flash Storage (UFS) QCOM PHY"); | ||
| 682 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index c64cf6c4a83d..0c11d40a12bc 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
| @@ -151,6 +151,10 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, | |||
| 151 | 151 | ||
| 152 | ret = usb_internal_control_msg(dev, pipe, dr, data, size, timeout); | 152 | ret = usb_internal_control_msg(dev, pipe, dr, data, size, timeout); |
| 153 | 153 | ||
| 154 | /* Linger a bit, prior to the next control message. */ | ||
| 155 | if (dev->quirks & USB_QUIRK_DELAY_CTRL_MSG) | ||
| 156 | msleep(200); | ||
| 157 | |||
| 154 | kfree(dr); | 158 | kfree(dr); |
| 155 | 159 | ||
| 156 | return ret; | 160 | return ret; |
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index f4a548471f0f..54b019e267c5 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c | |||
| @@ -230,7 +230,8 @@ static const struct usb_device_id usb_quirk_list[] = { | |||
| 230 | { USB_DEVICE(0x1b1c, 0x1b13), .driver_info = USB_QUIRK_DELAY_INIT }, | 230 | { USB_DEVICE(0x1b1c, 0x1b13), .driver_info = USB_QUIRK_DELAY_INIT }, |
| 231 | 231 | ||
| 232 | /* Corsair Strafe RGB */ | 232 | /* Corsair Strafe RGB */ |
| 233 | { USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT }, | 233 | { USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT | |
| 234 | USB_QUIRK_DELAY_CTRL_MSG }, | ||
| 234 | 235 | ||
| 235 | /* Corsair K70 LUX */ | 236 | /* Corsair K70 LUX */ |
| 236 | { USB_DEVICE(0x1b1c, 0x1b36), .driver_info = USB_QUIRK_DELAY_INIT }, | 237 | { USB_DEVICE(0x1b1c, 0x1b36), .driver_info = USB_QUIRK_DELAY_INIT }, |
diff --git a/drivers/usb/dwc2/params.c b/drivers/usb/dwc2/params.c index 03fd20f0b496..c4a47496d2fb 100644 --- a/drivers/usb/dwc2/params.c +++ b/drivers/usb/dwc2/params.c | |||
| @@ -137,7 +137,7 @@ static void dwc2_set_stm32f4x9_fsotg_params(struct dwc2_hsotg *hsotg) | |||
| 137 | p->activate_stm_fs_transceiver = true; | 137 | p->activate_stm_fs_transceiver = true; |
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | static void dwc2_set_stm32f7xx_hsotg_params(struct dwc2_hsotg *hsotg) | 140 | static void dwc2_set_stm32f7_hsotg_params(struct dwc2_hsotg *hsotg) |
| 141 | { | 141 | { |
| 142 | struct dwc2_core_params *p = &hsotg->params; | 142 | struct dwc2_core_params *p = &hsotg->params; |
| 143 | 143 | ||
| @@ -164,8 +164,8 @@ const struct of_device_id dwc2_of_match_table[] = { | |||
| 164 | { .compatible = "st,stm32f4x9-fsotg", | 164 | { .compatible = "st,stm32f4x9-fsotg", |
| 165 | .data = dwc2_set_stm32f4x9_fsotg_params }, | 165 | .data = dwc2_set_stm32f4x9_fsotg_params }, |
| 166 | { .compatible = "st,stm32f4x9-hsotg" }, | 166 | { .compatible = "st,stm32f4x9-hsotg" }, |
| 167 | { .compatible = "st,stm32f7xx-hsotg", | 167 | { .compatible = "st,stm32f7-hsotg", |
| 168 | .data = dwc2_set_stm32f7xx_hsotg_params }, | 168 | .data = dwc2_set_stm32f7_hsotg_params }, |
| 169 | {}, | 169 | {}, |
| 170 | }; | 170 | }; |
| 171 | MODULE_DEVICE_TABLE(of, dwc2_of_match_table); | 171 | MODULE_DEVICE_TABLE(of, dwc2_of_match_table); |
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index f1d838a4acd6..e94bf91cc58a 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
| @@ -175,7 +175,7 @@ void dwc3_set_mode(struct dwc3 *dwc, u32 mode) | |||
| 175 | dwc->desired_dr_role = mode; | 175 | dwc->desired_dr_role = mode; |
| 176 | spin_unlock_irqrestore(&dwc->lock, flags); | 176 | spin_unlock_irqrestore(&dwc->lock, flags); |
| 177 | 177 | ||
| 178 | queue_work(system_power_efficient_wq, &dwc->drd_work); | 178 | queue_work(system_freezable_wq, &dwc->drd_work); |
| 179 | } | 179 | } |
| 180 | 180 | ||
| 181 | u32 dwc3_core_fifo_space(struct dwc3_ep *dep, u8 type) | 181 | u32 dwc3_core_fifo_space(struct dwc3_ep *dep, u8 type) |
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index c2592d883f67..d2428a9e8900 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c | |||
| @@ -1538,7 +1538,6 @@ ffs_fs_kill_sb(struct super_block *sb) | |||
| 1538 | if (sb->s_fs_info) { | 1538 | if (sb->s_fs_info) { |
| 1539 | ffs_release_dev(sb->s_fs_info); | 1539 | ffs_release_dev(sb->s_fs_info); |
| 1540 | ffs_data_closed(sb->s_fs_info); | 1540 | ffs_data_closed(sb->s_fs_info); |
| 1541 | ffs_data_put(sb->s_fs_info); | ||
| 1542 | } | 1541 | } |
| 1543 | } | 1542 | } |
| 1544 | 1543 | ||
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 84f88fa411cd..d088c340e4d0 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
| @@ -447,7 +447,8 @@ static int ohci_init (struct ohci_hcd *ohci) | |||
| 447 | struct usb_hcd *hcd = ohci_to_hcd(ohci); | 447 | struct usb_hcd *hcd = ohci_to_hcd(ohci); |
| 448 | 448 | ||
| 449 | /* Accept arbitrarily long scatter-gather lists */ | 449 | /* Accept arbitrarily long scatter-gather lists */ |
| 450 | hcd->self.sg_tablesize = ~0; | 450 | if (!(hcd->driver->flags & HCD_LOCAL_MEM)) |
| 451 | hcd->self.sg_tablesize = ~0; | ||
| 451 | 452 | ||
| 452 | if (distrust_firmware) | 453 | if (distrust_firmware) |
| 453 | ohci->flags |= OHCI_QUIRK_HUB_POWER; | 454 | ohci->flags |= OHCI_QUIRK_HUB_POWER; |
diff --git a/drivers/usb/host/xhci-dbgcap.c b/drivers/usb/host/xhci-dbgcap.c index a1ab8acf39ba..c359bae7b754 100644 --- a/drivers/usb/host/xhci-dbgcap.c +++ b/drivers/usb/host/xhci-dbgcap.c | |||
| @@ -328,13 +328,14 @@ dbc_ep_do_queue(struct dbc_ep *dep, struct dbc_request *req) | |||
| 328 | int dbc_ep_queue(struct dbc_ep *dep, struct dbc_request *req, | 328 | int dbc_ep_queue(struct dbc_ep *dep, struct dbc_request *req, |
| 329 | gfp_t gfp_flags) | 329 | gfp_t gfp_flags) |
| 330 | { | 330 | { |
| 331 | unsigned long flags; | ||
| 331 | struct xhci_dbc *dbc = dep->dbc; | 332 | struct xhci_dbc *dbc = dep->dbc; |
| 332 | int ret = -ESHUTDOWN; | 333 | int ret = -ESHUTDOWN; |
| 333 | 334 | ||
| 334 | spin_lock(&dbc->lock); | 335 | spin_lock_irqsave(&dbc->lock, flags); |
| 335 | if (dbc->state == DS_CONFIGURED) | 336 | if (dbc->state == DS_CONFIGURED) |
| 336 | ret = dbc_ep_do_queue(dep, req); | 337 | ret = dbc_ep_do_queue(dep, req); |
| 337 | spin_unlock(&dbc->lock); | 338 | spin_unlock_irqrestore(&dbc->lock, flags); |
| 338 | 339 | ||
| 339 | mod_delayed_work(system_wq, &dbc->event_work, 0); | 340 | mod_delayed_work(system_wq, &dbc->event_work, 0); |
| 340 | 341 | ||
| @@ -521,15 +522,16 @@ static void xhci_do_dbc_stop(struct xhci_hcd *xhci) | |||
| 521 | static int xhci_dbc_start(struct xhci_hcd *xhci) | 522 | static int xhci_dbc_start(struct xhci_hcd *xhci) |
| 522 | { | 523 | { |
| 523 | int ret; | 524 | int ret; |
| 525 | unsigned long flags; | ||
| 524 | struct xhci_dbc *dbc = xhci->dbc; | 526 | struct xhci_dbc *dbc = xhci->dbc; |
| 525 | 527 | ||
| 526 | WARN_ON(!dbc); | 528 | WARN_ON(!dbc); |
| 527 | 529 | ||
| 528 | pm_runtime_get_sync(xhci_to_hcd(xhci)->self.controller); | 530 | pm_runtime_get_sync(xhci_to_hcd(xhci)->self.controller); |
| 529 | 531 | ||
| 530 | spin_lock(&dbc->lock); | 532 | spin_lock_irqsave(&dbc->lock, flags); |
| 531 | ret = xhci_do_dbc_start(xhci); | 533 | ret = xhci_do_dbc_start(xhci); |
| 532 | spin_unlock(&dbc->lock); | 534 | spin_unlock_irqrestore(&dbc->lock, flags); |
| 533 | 535 | ||
| 534 | if (ret) { | 536 | if (ret) { |
| 535 | pm_runtime_put(xhci_to_hcd(xhci)->self.controller); | 537 | pm_runtime_put(xhci_to_hcd(xhci)->self.controller); |
| @@ -541,6 +543,7 @@ static int xhci_dbc_start(struct xhci_hcd *xhci) | |||
| 541 | 543 | ||
| 542 | static void xhci_dbc_stop(struct xhci_hcd *xhci) | 544 | static void xhci_dbc_stop(struct xhci_hcd *xhci) |
| 543 | { | 545 | { |
| 546 | unsigned long flags; | ||
| 544 | struct xhci_dbc *dbc = xhci->dbc; | 547 | struct xhci_dbc *dbc = xhci->dbc; |
| 545 | struct dbc_port *port = &dbc->port; | 548 | struct dbc_port *port = &dbc->port; |
| 546 | 549 | ||
| @@ -551,9 +554,9 @@ static void xhci_dbc_stop(struct xhci_hcd *xhci) | |||
| 551 | if (port->registered) | 554 | if (port->registered) |
| 552 | xhci_dbc_tty_unregister_device(xhci); | 555 | xhci_dbc_tty_unregister_device(xhci); |
| 553 | 556 | ||
| 554 | spin_lock(&dbc->lock); | 557 | spin_lock_irqsave(&dbc->lock, flags); |
| 555 | xhci_do_dbc_stop(xhci); | 558 | xhci_do_dbc_stop(xhci); |
| 556 | spin_unlock(&dbc->lock); | 559 | spin_unlock_irqrestore(&dbc->lock, flags); |
| 557 | 560 | ||
| 558 | pm_runtime_put_sync(xhci_to_hcd(xhci)->self.controller); | 561 | pm_runtime_put_sync(xhci_to_hcd(xhci)->self.controller); |
| 559 | } | 562 | } |
| @@ -779,14 +782,15 @@ static void xhci_dbc_handle_events(struct work_struct *work) | |||
| 779 | int ret; | 782 | int ret; |
| 780 | enum evtreturn evtr; | 783 | enum evtreturn evtr; |
| 781 | struct xhci_dbc *dbc; | 784 | struct xhci_dbc *dbc; |
| 785 | unsigned long flags; | ||
| 782 | struct xhci_hcd *xhci; | 786 | struct xhci_hcd *xhci; |
| 783 | 787 | ||
| 784 | dbc = container_of(to_delayed_work(work), struct xhci_dbc, event_work); | 788 | dbc = container_of(to_delayed_work(work), struct xhci_dbc, event_work); |
| 785 | xhci = dbc->xhci; | 789 | xhci = dbc->xhci; |
| 786 | 790 | ||
| 787 | spin_lock(&dbc->lock); | 791 | spin_lock_irqsave(&dbc->lock, flags); |
| 788 | evtr = xhci_dbc_do_handle_events(dbc); | 792 | evtr = xhci_dbc_do_handle_events(dbc); |
| 789 | spin_unlock(&dbc->lock); | 793 | spin_unlock_irqrestore(&dbc->lock, flags); |
| 790 | 794 | ||
| 791 | switch (evtr) { | 795 | switch (evtr) { |
| 792 | case EVT_GSER: | 796 | case EVT_GSER: |
diff --git a/drivers/usb/host/xhci-dbgtty.c b/drivers/usb/host/xhci-dbgtty.c index 8d47b6fbf973..75f0b92694ba 100644 --- a/drivers/usb/host/xhci-dbgtty.c +++ b/drivers/usb/host/xhci-dbgtty.c | |||
| @@ -92,21 +92,23 @@ static void dbc_start_rx(struct dbc_port *port) | |||
| 92 | static void | 92 | static void |
| 93 | dbc_read_complete(struct xhci_hcd *xhci, struct dbc_request *req) | 93 | dbc_read_complete(struct xhci_hcd *xhci, struct dbc_request *req) |
| 94 | { | 94 | { |
| 95 | unsigned long flags; | ||
| 95 | struct xhci_dbc *dbc = xhci->dbc; | 96 | struct xhci_dbc *dbc = xhci->dbc; |
| 96 | struct dbc_port *port = &dbc->port; | 97 | struct dbc_port *port = &dbc->port; |
| 97 | 98 | ||
| 98 | spin_lock(&port->port_lock); | 99 | spin_lock_irqsave(&port->port_lock, flags); |
| 99 | list_add_tail(&req->list_pool, &port->read_queue); | 100 | list_add_tail(&req->list_pool, &port->read_queue); |
| 100 | tasklet_schedule(&port->push); | 101 | tasklet_schedule(&port->push); |
| 101 | spin_unlock(&port->port_lock); | 102 | spin_unlock_irqrestore(&port->port_lock, flags); |
| 102 | } | 103 | } |
| 103 | 104 | ||
| 104 | static void dbc_write_complete(struct xhci_hcd *xhci, struct dbc_request *req) | 105 | static void dbc_write_complete(struct xhci_hcd *xhci, struct dbc_request *req) |
| 105 | { | 106 | { |
| 107 | unsigned long flags; | ||
| 106 | struct xhci_dbc *dbc = xhci->dbc; | 108 | struct xhci_dbc *dbc = xhci->dbc; |
| 107 | struct dbc_port *port = &dbc->port; | 109 | struct dbc_port *port = &dbc->port; |
| 108 | 110 | ||
| 109 | spin_lock(&port->port_lock); | 111 | spin_lock_irqsave(&port->port_lock, flags); |
| 110 | list_add(&req->list_pool, &port->write_pool); | 112 | list_add(&req->list_pool, &port->write_pool); |
| 111 | switch (req->status) { | 113 | switch (req->status) { |
| 112 | case 0: | 114 | case 0: |
| @@ -119,7 +121,7 @@ static void dbc_write_complete(struct xhci_hcd *xhci, struct dbc_request *req) | |||
| 119 | req->status); | 121 | req->status); |
| 120 | break; | 122 | break; |
| 121 | } | 123 | } |
| 122 | spin_unlock(&port->port_lock); | 124 | spin_unlock_irqrestore(&port->port_lock, flags); |
| 123 | } | 125 | } |
| 124 | 126 | ||
| 125 | static void xhci_dbc_free_req(struct dbc_ep *dep, struct dbc_request *req) | 127 | static void xhci_dbc_free_req(struct dbc_ep *dep, struct dbc_request *req) |
| @@ -327,12 +329,13 @@ static void dbc_rx_push(unsigned long _port) | |||
| 327 | { | 329 | { |
| 328 | struct dbc_request *req; | 330 | struct dbc_request *req; |
| 329 | struct tty_struct *tty; | 331 | struct tty_struct *tty; |
| 332 | unsigned long flags; | ||
| 330 | bool do_push = false; | 333 | bool do_push = false; |
| 331 | bool disconnect = false; | 334 | bool disconnect = false; |
| 332 | struct dbc_port *port = (void *)_port; | 335 | struct dbc_port *port = (void *)_port; |
| 333 | struct list_head *queue = &port->read_queue; | 336 | struct list_head *queue = &port->read_queue; |
| 334 | 337 | ||
| 335 | spin_lock_irq(&port->port_lock); | 338 | spin_lock_irqsave(&port->port_lock, flags); |
| 336 | tty = port->port.tty; | 339 | tty = port->port.tty; |
| 337 | while (!list_empty(queue)) { | 340 | while (!list_empty(queue)) { |
| 338 | req = list_first_entry(queue, struct dbc_request, list_pool); | 341 | req = list_first_entry(queue, struct dbc_request, list_pool); |
| @@ -392,16 +395,17 @@ static void dbc_rx_push(unsigned long _port) | |||
| 392 | if (!disconnect) | 395 | if (!disconnect) |
| 393 | dbc_start_rx(port); | 396 | dbc_start_rx(port); |
| 394 | 397 | ||
| 395 | spin_unlock_irq(&port->port_lock); | 398 | spin_unlock_irqrestore(&port->port_lock, flags); |
| 396 | } | 399 | } |
| 397 | 400 | ||
| 398 | static int dbc_port_activate(struct tty_port *_port, struct tty_struct *tty) | 401 | static int dbc_port_activate(struct tty_port *_port, struct tty_struct *tty) |
| 399 | { | 402 | { |
| 403 | unsigned long flags; | ||
| 400 | struct dbc_port *port = container_of(_port, struct dbc_port, port); | 404 | struct dbc_port *port = container_of(_port, struct dbc_port, port); |
| 401 | 405 | ||
| 402 | spin_lock_irq(&port->port_lock); | 406 | spin_lock_irqsave(&port->port_lock, flags); |
| 403 | dbc_start_rx(port); | 407 | dbc_start_rx(port); |
| 404 | spin_unlock_irq(&port->port_lock); | 408 | spin_unlock_irqrestore(&port->port_lock, flags); |
| 405 | 409 | ||
| 406 | return 0; | 410 | return 0; |
| 407 | } | 411 | } |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 5262fa571a5d..d9f831b67e57 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
| @@ -126,6 +126,9 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
| 126 | if (pdev->vendor == PCI_VENDOR_ID_AMD && usb_amd_find_chipset_info()) | 126 | if (pdev->vendor == PCI_VENDOR_ID_AMD && usb_amd_find_chipset_info()) |
| 127 | xhci->quirks |= XHCI_AMD_PLL_FIX; | 127 | xhci->quirks |= XHCI_AMD_PLL_FIX; |
| 128 | 128 | ||
| 129 | if (pdev->vendor == PCI_VENDOR_ID_AMD && pdev->device == 0x43bb) | ||
| 130 | xhci->quirks |= XHCI_SUSPEND_DELAY; | ||
| 131 | |||
| 129 | if (pdev->vendor == PCI_VENDOR_ID_AMD) | 132 | if (pdev->vendor == PCI_VENDOR_ID_AMD) |
| 130 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; | 133 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; |
| 131 | 134 | ||
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 6f038306c14d..6652e2d5bd2e 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c | |||
| @@ -360,7 +360,6 @@ static int __maybe_unused xhci_plat_suspend(struct device *dev) | |||
| 360 | { | 360 | { |
| 361 | struct usb_hcd *hcd = dev_get_drvdata(dev); | 361 | struct usb_hcd *hcd = dev_get_drvdata(dev); |
| 362 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 362 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
| 363 | int ret; | ||
| 364 | 363 | ||
| 365 | /* | 364 | /* |
| 366 | * xhci_suspend() needs `do_wakeup` to know whether host is allowed | 365 | * xhci_suspend() needs `do_wakeup` to know whether host is allowed |
| @@ -370,12 +369,7 @@ static int __maybe_unused xhci_plat_suspend(struct device *dev) | |||
| 370 | * reconsider this when xhci_plat_suspend enlarges its scope, e.g., | 369 | * reconsider this when xhci_plat_suspend enlarges its scope, e.g., |
| 371 | * also applies to runtime suspend. | 370 | * also applies to runtime suspend. |
| 372 | */ | 371 | */ |
| 373 | ret = xhci_suspend(xhci, device_may_wakeup(dev)); | 372 | return xhci_suspend(xhci, device_may_wakeup(dev)); |
| 374 | |||
| 375 | if (!device_may_wakeup(dev) && !IS_ERR(xhci->clk)) | ||
| 376 | clk_disable_unprepare(xhci->clk); | ||
| 377 | |||
| 378 | return ret; | ||
| 379 | } | 373 | } |
| 380 | 374 | ||
| 381 | static int __maybe_unused xhci_plat_resume(struct device *dev) | 375 | static int __maybe_unused xhci_plat_resume(struct device *dev) |
| @@ -384,9 +378,6 @@ static int __maybe_unused xhci_plat_resume(struct device *dev) | |||
| 384 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 378 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
| 385 | int ret; | 379 | int ret; |
| 386 | 380 | ||
| 387 | if (!device_may_wakeup(dev) && !IS_ERR(xhci->clk)) | ||
| 388 | clk_prepare_enable(xhci->clk); | ||
| 389 | |||
| 390 | ret = xhci_priv_resume_quirk(hcd); | 381 | ret = xhci_priv_resume_quirk(hcd); |
| 391 | if (ret) | 382 | if (ret) |
| 392 | return ret; | 383 | return ret; |
diff --git a/drivers/usb/host/xhci-rcar.c b/drivers/usb/host/xhci-rcar.c index f0b559660007..f33ffc2bc4ed 100644 --- a/drivers/usb/host/xhci-rcar.c +++ b/drivers/usb/host/xhci-rcar.c | |||
| @@ -83,6 +83,10 @@ static const struct soc_device_attribute rcar_quirks_match[] = { | |||
| 83 | .soc_id = "r8a7796", | 83 | .soc_id = "r8a7796", |
| 84 | .data = (void *)RCAR_XHCI_FIRMWARE_V3, | 84 | .data = (void *)RCAR_XHCI_FIRMWARE_V3, |
| 85 | }, | 85 | }, |
| 86 | { | ||
| 87 | .soc_id = "r8a77965", | ||
| 88 | .data = (void *)RCAR_XHCI_FIRMWARE_V3, | ||
| 89 | }, | ||
| 86 | { /* sentinel */ }, | 90 | { /* sentinel */ }, |
| 87 | }; | 91 | }; |
| 88 | 92 | ||
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 25d4b748a56f..5d37700ae4b0 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
| @@ -877,6 +877,9 @@ int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup) | |||
| 877 | clear_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags); | 877 | clear_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags); |
| 878 | del_timer_sync(&xhci->shared_hcd->rh_timer); | 878 | del_timer_sync(&xhci->shared_hcd->rh_timer); |
| 879 | 879 | ||
| 880 | if (xhci->quirks & XHCI_SUSPEND_DELAY) | ||
| 881 | usleep_range(1000, 1500); | ||
| 882 | |||
| 880 | spin_lock_irq(&xhci->lock); | 883 | spin_lock_irq(&xhci->lock); |
| 881 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | 884 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); |
| 882 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &xhci->shared_hcd->flags); | 885 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &xhci->shared_hcd->flags); |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index e4d7d3d06a75..866e141d4972 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
| @@ -718,11 +718,12 @@ struct xhci_ep_ctx { | |||
| 718 | /* bits 10:14 are Max Primary Streams */ | 718 | /* bits 10:14 are Max Primary Streams */ |
| 719 | /* bit 15 is Linear Stream Array */ | 719 | /* bit 15 is Linear Stream Array */ |
| 720 | /* Interval - period between requests to an endpoint - 125u increments. */ | 720 | /* Interval - period between requests to an endpoint - 125u increments. */ |
| 721 | #define EP_INTERVAL(p) (((p) & 0xff) << 16) | 721 | #define EP_INTERVAL(p) (((p) & 0xff) << 16) |
| 722 | #define EP_INTERVAL_TO_UFRAMES(p) (1 << (((p) >> 16) & 0xff)) | 722 | #define EP_INTERVAL_TO_UFRAMES(p) (1 << (((p) >> 16) & 0xff)) |
| 723 | #define CTX_TO_EP_INTERVAL(p) (((p) >> 16) & 0xff) | 723 | #define CTX_TO_EP_INTERVAL(p) (((p) >> 16) & 0xff) |
| 724 | #define EP_MAXPSTREAMS_MASK (0x1f << 10) | 724 | #define EP_MAXPSTREAMS_MASK (0x1f << 10) |
| 725 | #define EP_MAXPSTREAMS(p) (((p) << 10) & EP_MAXPSTREAMS_MASK) | 725 | #define EP_MAXPSTREAMS(p) (((p) << 10) & EP_MAXPSTREAMS_MASK) |
| 726 | #define CTX_TO_EP_MAXPSTREAMS(p) (((p) & EP_MAXPSTREAMS_MASK) >> 10) | ||
| 726 | /* Endpoint is set up with a Linear Stream Array (vs. Secondary Stream Array) */ | 727 | /* Endpoint is set up with a Linear Stream Array (vs. Secondary Stream Array) */ |
| 727 | #define EP_HAS_LSA (1 << 15) | 728 | #define EP_HAS_LSA (1 << 15) |
| 728 | /* hosts with LEC=1 use bits 31:24 as ESIT high bits. */ | 729 | /* hosts with LEC=1 use bits 31:24 as ESIT high bits. */ |
| @@ -1825,6 +1826,7 @@ struct xhci_hcd { | |||
| 1825 | #define XHCI_U2_DISABLE_WAKE (1 << 27) | 1826 | #define XHCI_U2_DISABLE_WAKE (1 << 27) |
| 1826 | #define XHCI_ASMEDIA_MODIFY_FLOWCONTROL (1 << 28) | 1827 | #define XHCI_ASMEDIA_MODIFY_FLOWCONTROL (1 << 28) |
| 1827 | #define XHCI_HW_LPM_DISABLE (1 << 29) | 1828 | #define XHCI_HW_LPM_DISABLE (1 << 29) |
| 1829 | #define XHCI_SUSPEND_DELAY (1 << 30) | ||
| 1828 | 1830 | ||
| 1829 | unsigned int num_active_eps; | 1831 | unsigned int num_active_eps; |
| 1830 | unsigned int limit_active_eps; | 1832 | unsigned int limit_active_eps; |
| @@ -2549,21 +2551,22 @@ static inline const char *xhci_decode_ep_context(u32 info, u32 info2, u64 deq, | |||
| 2549 | u8 burst; | 2551 | u8 burst; |
| 2550 | u8 cerr; | 2552 | u8 cerr; |
| 2551 | u8 mult; | 2553 | u8 mult; |
| 2552 | u8 lsa; | 2554 | |
| 2553 | u8 hid; | 2555 | bool lsa; |
| 2556 | bool hid; | ||
| 2554 | 2557 | ||
| 2555 | esit = CTX_TO_MAX_ESIT_PAYLOAD_HI(info) << 16 | | 2558 | esit = CTX_TO_MAX_ESIT_PAYLOAD_HI(info) << 16 | |
| 2556 | CTX_TO_MAX_ESIT_PAYLOAD(tx_info); | 2559 | CTX_TO_MAX_ESIT_PAYLOAD(tx_info); |
| 2557 | 2560 | ||
| 2558 | ep_state = info & EP_STATE_MASK; | 2561 | ep_state = info & EP_STATE_MASK; |
| 2559 | max_pstr = info & EP_MAXPSTREAMS_MASK; | 2562 | max_pstr = CTX_TO_EP_MAXPSTREAMS(info); |
| 2560 | interval = CTX_TO_EP_INTERVAL(info); | 2563 | interval = CTX_TO_EP_INTERVAL(info); |
| 2561 | mult = CTX_TO_EP_MULT(info) + 1; | 2564 | mult = CTX_TO_EP_MULT(info) + 1; |
| 2562 | lsa = info & EP_HAS_LSA; | 2565 | lsa = !!(info & EP_HAS_LSA); |
| 2563 | 2566 | ||
| 2564 | cerr = (info2 & (3 << 1)) >> 1; | 2567 | cerr = (info2 & (3 << 1)) >> 1; |
| 2565 | ep_type = CTX_TO_EP_TYPE(info2); | 2568 | ep_type = CTX_TO_EP_TYPE(info2); |
| 2566 | hid = info2 & (1 << 7); | 2569 | hid = !!(info2 & (1 << 7)); |
| 2567 | burst = CTX_TO_MAX_BURST(info2); | 2570 | burst = CTX_TO_MAX_BURST(info2); |
| 2568 | maxp = MAX_PACKET_DECODED(info2); | 2571 | maxp = MAX_PACKET_DECODED(info2); |
| 2569 | 2572 | ||
diff --git a/drivers/usb/mon/mon_text.c b/drivers/usb/mon/mon_text.c index f5e1bb5e5217..984f7e12a6a5 100644 --- a/drivers/usb/mon/mon_text.c +++ b/drivers/usb/mon/mon_text.c | |||
| @@ -85,6 +85,8 @@ struct mon_reader_text { | |||
| 85 | 85 | ||
| 86 | wait_queue_head_t wait; | 86 | wait_queue_head_t wait; |
| 87 | int printf_size; | 87 | int printf_size; |
| 88 | size_t printf_offset; | ||
| 89 | size_t printf_togo; | ||
| 88 | char *printf_buf; | 90 | char *printf_buf; |
| 89 | struct mutex printf_lock; | 91 | struct mutex printf_lock; |
| 90 | 92 | ||
| @@ -376,75 +378,103 @@ err_alloc: | |||
| 376 | return rc; | 378 | return rc; |
| 377 | } | 379 | } |
| 378 | 380 | ||
| 379 | /* | 381 | static ssize_t mon_text_copy_to_user(struct mon_reader_text *rp, |
| 380 | * For simplicity, we read one record in one system call and throw out | 382 | char __user * const buf, const size_t nbytes) |
| 381 | * what does not fit. This means that the following does not work: | 383 | { |
| 382 | * dd if=/dbg/usbmon/0t bs=10 | 384 | const size_t togo = min(nbytes, rp->printf_togo); |
| 383 | * Also, we do not allow seeks and do not bother advancing the offset. | 385 | |
| 384 | */ | 386 | if (copy_to_user(buf, &rp->printf_buf[rp->printf_offset], togo)) |
| 387 | return -EFAULT; | ||
| 388 | rp->printf_togo -= togo; | ||
| 389 | rp->printf_offset += togo; | ||
| 390 | return togo; | ||
| 391 | } | ||
| 392 | |||
| 393 | /* ppos is not advanced since the llseek operation is not permitted. */ | ||
| 385 | static ssize_t mon_text_read_t(struct file *file, char __user *buf, | 394 | static ssize_t mon_text_read_t(struct file *file, char __user *buf, |
| 386 | size_t nbytes, loff_t *ppos) | 395 | size_t nbytes, loff_t *ppos) |
| 387 | { | 396 | { |
| 388 | struct mon_reader_text *rp = file->private_data; | 397 | struct mon_reader_text *rp = file->private_data; |
| 389 | struct mon_event_text *ep; | 398 | struct mon_event_text *ep; |
| 390 | struct mon_text_ptr ptr; | 399 | struct mon_text_ptr ptr; |
| 400 | ssize_t ret; | ||
| 391 | 401 | ||
| 392 | ep = mon_text_read_wait(rp, file); | ||
| 393 | if (IS_ERR(ep)) | ||
| 394 | return PTR_ERR(ep); | ||
| 395 | mutex_lock(&rp->printf_lock); | 402 | mutex_lock(&rp->printf_lock); |
| 396 | ptr.cnt = 0; | 403 | |
| 397 | ptr.pbuf = rp->printf_buf; | 404 | if (rp->printf_togo == 0) { |
| 398 | ptr.limit = rp->printf_size; | 405 | |
| 399 | 406 | ep = mon_text_read_wait(rp, file); | |
| 400 | mon_text_read_head_t(rp, &ptr, ep); | 407 | if (IS_ERR(ep)) { |
| 401 | mon_text_read_statset(rp, &ptr, ep); | 408 | mutex_unlock(&rp->printf_lock); |
| 402 | ptr.cnt += snprintf(ptr.pbuf + ptr.cnt, ptr.limit - ptr.cnt, | 409 | return PTR_ERR(ep); |
| 403 | " %d", ep->length); | 410 | } |
| 404 | mon_text_read_data(rp, &ptr, ep); | 411 | ptr.cnt = 0; |
| 405 | 412 | ptr.pbuf = rp->printf_buf; | |
| 406 | if (copy_to_user(buf, rp->printf_buf, ptr.cnt)) | 413 | ptr.limit = rp->printf_size; |
| 407 | ptr.cnt = -EFAULT; | 414 | |
| 415 | mon_text_read_head_t(rp, &ptr, ep); | ||
| 416 | mon_text_read_statset(rp, &ptr, ep); | ||
| 417 | ptr.cnt += snprintf(ptr.pbuf + ptr.cnt, ptr.limit - ptr.cnt, | ||
| 418 | " %d", ep->length); | ||
| 419 | mon_text_read_data(rp, &ptr, ep); | ||
| 420 | |||
| 421 | rp->printf_togo = ptr.cnt; | ||
| 422 | rp->printf_offset = 0; | ||
| 423 | |||
| 424 | kmem_cache_free(rp->e_slab, ep); | ||
| 425 | } | ||
| 426 | |||
| 427 | ret = mon_text_copy_to_user(rp, buf, nbytes); | ||
| 408 | mutex_unlock(&rp->printf_lock); | 428 | mutex_unlock(&rp->printf_lock); |
| 409 | kmem_cache_free(rp->e_slab, ep); | 429 | return ret; |
| 410 | return ptr.cnt; | ||
| 411 | } | 430 | } |
| 412 | 431 | ||
| 432 | /* ppos is not advanced since the llseek operation is not permitted. */ | ||
| 413 | static ssize_t mon_text_read_u(struct file *file, char __user *buf, | 433 | static ssize_t mon_text_read_u(struct file *file, char __user *buf, |
| 414 | size_t nbytes, loff_t *ppos) | 434 | size_t nbytes, loff_t *ppos) |
| 415 | { | 435 | { |
| 416 | struct mon_reader_text *rp = file->private_data; | 436 | struct mon_reader_text *rp = file->private_data; |
| 417 | struct mon_event_text *ep; | 437 | struct mon_event_text *ep; |
| 418 | struct mon_text_ptr ptr; | 438 | struct mon_text_ptr ptr; |
| 439 | ssize_t ret; | ||
| 419 | 440 | ||
| 420 | ep = mon_text_read_wait(rp, file); | ||
| 421 | if (IS_ERR(ep)) | ||
| 422 | return PTR_ERR(ep); | ||
| 423 | mutex_lock(&rp->printf_lock); | 441 | mutex_lock(&rp->printf_lock); |
| 424 | ptr.cnt = 0; | ||
| 425 | ptr.pbuf = rp->printf_buf; | ||
| 426 | ptr.limit = rp->printf_size; | ||
| 427 | 442 | ||
| 428 | mon_text_read_head_u(rp, &ptr, ep); | 443 | if (rp->printf_togo == 0) { |
| 429 | if (ep->type == 'E') { | 444 | |
| 430 | mon_text_read_statset(rp, &ptr, ep); | 445 | ep = mon_text_read_wait(rp, file); |
| 431 | } else if (ep->xfertype == USB_ENDPOINT_XFER_ISOC) { | 446 | if (IS_ERR(ep)) { |
| 432 | mon_text_read_isostat(rp, &ptr, ep); | 447 | mutex_unlock(&rp->printf_lock); |
| 433 | mon_text_read_isodesc(rp, &ptr, ep); | 448 | return PTR_ERR(ep); |
| 434 | } else if (ep->xfertype == USB_ENDPOINT_XFER_INT) { | 449 | } |
| 435 | mon_text_read_intstat(rp, &ptr, ep); | 450 | ptr.cnt = 0; |
| 436 | } else { | 451 | ptr.pbuf = rp->printf_buf; |
| 437 | mon_text_read_statset(rp, &ptr, ep); | 452 | ptr.limit = rp->printf_size; |
| 453 | |||
| 454 | mon_text_read_head_u(rp, &ptr, ep); | ||
| 455 | if (ep->type == 'E') { | ||
| 456 | mon_text_read_statset(rp, &ptr, ep); | ||
| 457 | } else if (ep->xfertype == USB_ENDPOINT_XFER_ISOC) { | ||
| 458 | mon_text_read_isostat(rp, &ptr, ep); | ||
| 459 | mon_text_read_isodesc(rp, &ptr, ep); | ||
| 460 | } else if (ep->xfertype == USB_ENDPOINT_XFER_INT) { | ||
| 461 | mon_text_read_intstat(rp, &ptr, ep); | ||
| 462 | } else { | ||
| 463 | mon_text_read_statset(rp, &ptr, ep); | ||
| 464 | } | ||
| 465 | ptr.cnt += snprintf(ptr.pbuf + ptr.cnt, ptr.limit - ptr.cnt, | ||
| 466 | " %d", ep->length); | ||
| 467 | mon_text_read_data(rp, &ptr, ep); | ||
| 468 | |||
| 469 | rp->printf_togo = ptr.cnt; | ||
| 470 | rp->printf_offset = 0; | ||
| 471 | |||
| 472 | kmem_cache_free(rp->e_slab, ep); | ||
| 438 | } | 473 | } |
| 439 | ptr.cnt += snprintf(ptr.pbuf + ptr.cnt, ptr.limit - ptr.cnt, | ||
| 440 | " %d", ep->length); | ||
| 441 | mon_text_read_data(rp, &ptr, ep); | ||
| 442 | 474 | ||
| 443 | if (copy_to_user(buf, rp->printf_buf, ptr.cnt)) | 475 | ret = mon_text_copy_to_user(rp, buf, nbytes); |
| 444 | ptr.cnt = -EFAULT; | ||
| 445 | mutex_unlock(&rp->printf_lock); | 476 | mutex_unlock(&rp->printf_lock); |
| 446 | kmem_cache_free(rp->e_slab, ep); | 477 | return ret; |
| 447 | return ptr.cnt; | ||
| 448 | } | 478 | } |
| 449 | 479 | ||
| 450 | static struct mon_event_text *mon_text_read_wait(struct mon_reader_text *rp, | 480 | static struct mon_event_text *mon_text_read_wait(struct mon_reader_text *rp, |
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index eef4ad578b31..4d723077be2b 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
| @@ -1756,6 +1756,7 @@ vbus_show(struct device *dev, struct device_attribute *attr, char *buf) | |||
| 1756 | int vbus; | 1756 | int vbus; |
| 1757 | u8 devctl; | 1757 | u8 devctl; |
| 1758 | 1758 | ||
| 1759 | pm_runtime_get_sync(dev); | ||
| 1759 | spin_lock_irqsave(&musb->lock, flags); | 1760 | spin_lock_irqsave(&musb->lock, flags); |
| 1760 | val = musb->a_wait_bcon; | 1761 | val = musb->a_wait_bcon; |
| 1761 | vbus = musb_platform_get_vbus_status(musb); | 1762 | vbus = musb_platform_get_vbus_status(musb); |
| @@ -1769,6 +1770,7 @@ vbus_show(struct device *dev, struct device_attribute *attr, char *buf) | |||
| 1769 | vbus = 0; | 1770 | vbus = 0; |
| 1770 | } | 1771 | } |
| 1771 | spin_unlock_irqrestore(&musb->lock, flags); | 1772 | spin_unlock_irqrestore(&musb->lock, flags); |
| 1773 | pm_runtime_put_sync(dev); | ||
| 1772 | 1774 | ||
| 1773 | return sprintf(buf, "Vbus %s, timeout %lu msec\n", | 1775 | return sprintf(buf, "Vbus %s, timeout %lu msec\n", |
| 1774 | vbus ? "on" : "off", val); | 1776 | vbus ? "on" : "off", val); |
| @@ -2471,11 +2473,11 @@ static int musb_remove(struct platform_device *pdev) | |||
| 2471 | musb_disable_interrupts(musb); | 2473 | musb_disable_interrupts(musb); |
| 2472 | musb_writeb(musb->mregs, MUSB_DEVCTL, 0); | 2474 | musb_writeb(musb->mregs, MUSB_DEVCTL, 0); |
| 2473 | spin_unlock_irqrestore(&musb->lock, flags); | 2475 | spin_unlock_irqrestore(&musb->lock, flags); |
| 2476 | musb_platform_exit(musb); | ||
| 2474 | 2477 | ||
| 2475 | pm_runtime_dont_use_autosuspend(musb->controller); | 2478 | pm_runtime_dont_use_autosuspend(musb->controller); |
| 2476 | pm_runtime_put_sync(musb->controller); | 2479 | pm_runtime_put_sync(musb->controller); |
| 2477 | pm_runtime_disable(musb->controller); | 2480 | pm_runtime_disable(musb->controller); |
| 2478 | musb_platform_exit(musb); | ||
| 2479 | musb_phy_callback = NULL; | 2481 | musb_phy_callback = NULL; |
| 2480 | if (musb->dma_controller) | 2482 | if (musb->dma_controller) |
| 2481 | musb_dma_controller_destroy(musb->dma_controller); | 2483 | musb_dma_controller_destroy(musb->dma_controller); |
diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c index 3b1b9695177a..6034c39b67d1 100644 --- a/drivers/usb/storage/uas.c +++ b/drivers/usb/storage/uas.c | |||
| @@ -1076,7 +1076,7 @@ static int uas_post_reset(struct usb_interface *intf) | |||
| 1076 | return 0; | 1076 | return 0; |
| 1077 | 1077 | ||
| 1078 | err = uas_configure_endpoints(devinfo); | 1078 | err = uas_configure_endpoints(devinfo); |
| 1079 | if (err && err != ENODEV) | 1079 | if (err && err != -ENODEV) |
| 1080 | shost_printk(KERN_ERR, shost, | 1080 | shost_printk(KERN_ERR, shost, |
| 1081 | "%s: alloc streams error %d after reset", | 1081 | "%s: alloc streams error %d after reset", |
| 1082 | __func__, err); | 1082 | __func__, err); |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 264af199aec8..747d3a9596d9 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -2118,6 +2118,13 @@ UNUSUAL_DEV( 0x152d, 0x2566, 0x0114, 0x0114, | |||
| 2118 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 2118 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
| 2119 | US_FL_BROKEN_FUA ), | 2119 | US_FL_BROKEN_FUA ), |
| 2120 | 2120 | ||
| 2121 | /* Reported by Teijo Kinnunen <teijo.kinnunen@code-q.fi> */ | ||
| 2122 | UNUSUAL_DEV( 0x152d, 0x2567, 0x0117, 0x0117, | ||
| 2123 | "JMicron", | ||
| 2124 | "USB to ATA/ATAPI Bridge", | ||
| 2125 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
| 2126 | US_FL_BROKEN_FUA ), | ||
| 2127 | |||
| 2121 | /* Reported-by George Cherian <george.cherian@cavium.com> */ | 2128 | /* Reported-by George Cherian <george.cherian@cavium.com> */ |
| 2122 | UNUSUAL_DEV(0x152d, 0x9561, 0x0000, 0x9999, | 2129 | UNUSUAL_DEV(0x152d, 0x9561, 0x0000, 0x9999, |
| 2123 | "JMicron", | 2130 | "JMicron", |
diff --git a/drivers/usb/typec/fusb302/fusb302.c b/drivers/usb/typec/fusb302/fusb302.c index 9ce4756adad6..dcd8ef085b30 100644 --- a/drivers/usb/typec/fusb302/fusb302.c +++ b/drivers/usb/typec/fusb302/fusb302.c | |||
| @@ -1857,7 +1857,8 @@ static int fusb302_probe(struct i2c_client *client, | |||
| 1857 | chip->tcpm_port = tcpm_register_port(&client->dev, &chip->tcpc_dev); | 1857 | chip->tcpm_port = tcpm_register_port(&client->dev, &chip->tcpc_dev); |
| 1858 | if (IS_ERR(chip->tcpm_port)) { | 1858 | if (IS_ERR(chip->tcpm_port)) { |
| 1859 | ret = PTR_ERR(chip->tcpm_port); | 1859 | ret = PTR_ERR(chip->tcpm_port); |
| 1860 | dev_err(dev, "cannot register tcpm port, ret=%d", ret); | 1860 | if (ret != -EPROBE_DEFER) |
| 1861 | dev_err(dev, "cannot register tcpm port, ret=%d", ret); | ||
| 1861 | goto destroy_workqueue; | 1862 | goto destroy_workqueue; |
| 1862 | } | 1863 | } |
| 1863 | 1864 | ||
diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c index f4d563ee7690..8b637a4b474b 100644 --- a/drivers/usb/typec/tcpm.c +++ b/drivers/usb/typec/tcpm.c | |||
| @@ -252,9 +252,6 @@ struct tcpm_port { | |||
| 252 | unsigned int nr_src_pdo; | 252 | unsigned int nr_src_pdo; |
| 253 | u32 snk_pdo[PDO_MAX_OBJECTS]; | 253 | u32 snk_pdo[PDO_MAX_OBJECTS]; |
| 254 | unsigned int nr_snk_pdo; | 254 | unsigned int nr_snk_pdo; |
| 255 | unsigned int nr_fixed; /* number of fixed sink PDOs */ | ||
| 256 | unsigned int nr_var; /* number of variable sink PDOs */ | ||
| 257 | unsigned int nr_batt; /* number of battery sink PDOs */ | ||
| 258 | u32 snk_vdo[VDO_MAX_OBJECTS]; | 255 | u32 snk_vdo[VDO_MAX_OBJECTS]; |
| 259 | unsigned int nr_snk_vdo; | 256 | unsigned int nr_snk_vdo; |
| 260 | 257 | ||
| @@ -1770,90 +1767,39 @@ static int tcpm_pd_check_request(struct tcpm_port *port) | |||
| 1770 | return 0; | 1767 | return 0; |
| 1771 | } | 1768 | } |
| 1772 | 1769 | ||
| 1773 | #define min_power(x, y) min(pdo_max_power(x), pdo_max_power(y)) | 1770 | static int tcpm_pd_select_pdo(struct tcpm_port *port) |
| 1774 | #define min_current(x, y) min(pdo_max_current(x), pdo_max_current(y)) | ||
| 1775 | |||
| 1776 | static int tcpm_pd_select_pdo(struct tcpm_port *port, int *sink_pdo, | ||
| 1777 | int *src_pdo) | ||
| 1778 | { | 1771 | { |
| 1779 | unsigned int i, j, max_mw = 0, max_mv = 0, mw = 0, mv = 0, ma = 0; | 1772 | unsigned int i, max_mw = 0, max_mv = 0; |
| 1780 | int ret = -EINVAL; | 1773 | int ret = -EINVAL; |
| 1781 | 1774 | ||
| 1782 | /* | 1775 | /* |
| 1783 | * Select the source PDO providing the most power which has a | 1776 | * Select the source PDO providing the most power while staying within |
| 1784 | * matchig sink cap. | 1777 | * the board's voltage limits. Prefer PDO providing exp |
| 1785 | */ | 1778 | */ |
| 1786 | for (i = 0; i < port->nr_source_caps; i++) { | 1779 | for (i = 0; i < port->nr_source_caps; i++) { |
| 1787 | u32 pdo = port->source_caps[i]; | 1780 | u32 pdo = port->source_caps[i]; |
| 1788 | enum pd_pdo_type type = pdo_type(pdo); | 1781 | enum pd_pdo_type type = pdo_type(pdo); |
| 1782 | unsigned int mv, ma, mw; | ||
| 1789 | 1783 | ||
| 1790 | if (type == PDO_TYPE_FIXED) { | 1784 | if (type == PDO_TYPE_FIXED) |
| 1791 | for (j = 0; j < port->nr_fixed; j++) { | 1785 | mv = pdo_fixed_voltage(pdo); |
| 1792 | if (pdo_fixed_voltage(pdo) == | 1786 | else |
| 1793 | pdo_fixed_voltage(port->snk_pdo[j])) { | 1787 | mv = pdo_min_voltage(pdo); |
| 1794 | ma = min_current(pdo, port->snk_pdo[j]); | 1788 | |
| 1795 | mv = pdo_fixed_voltage(pdo); | 1789 | if (type == PDO_TYPE_BATT) { |
| 1796 | mw = ma * mv / 1000; | 1790 | mw = pdo_max_power(pdo); |
| 1797 | if (mw > max_mw || | 1791 | } else { |
| 1798 | (mw == max_mw && mv > max_mv)) { | 1792 | ma = min(pdo_max_current(pdo), |
| 1799 | ret = 0; | 1793 | port->max_snk_ma); |
| 1800 | *src_pdo = i; | 1794 | mw = ma * mv / 1000; |
| 1801 | *sink_pdo = j; | 1795 | } |
| 1802 | max_mw = mw; | 1796 | |
| 1803 | max_mv = mv; | 1797 | /* Perfer higher voltages if available */ |
| 1804 | } | 1798 | if ((mw > max_mw || (mw == max_mw && mv > max_mv)) && |
| 1805 | /* There could only be one fixed pdo | 1799 | mv <= port->max_snk_mv) { |
| 1806 | * at a specific voltage level. | 1800 | ret = i; |
| 1807 | * So breaking here. | 1801 | max_mw = mw; |
| 1808 | */ | 1802 | max_mv = mv; |
| 1809 | break; | ||
| 1810 | } | ||
| 1811 | } | ||
| 1812 | } else if (type == PDO_TYPE_BATT) { | ||
| 1813 | for (j = port->nr_fixed; | ||
| 1814 | j < port->nr_fixed + | ||
| 1815 | port->nr_batt; | ||
| 1816 | j++) { | ||
| 1817 | if (pdo_min_voltage(pdo) >= | ||
| 1818 | pdo_min_voltage(port->snk_pdo[j]) && | ||
| 1819 | pdo_max_voltage(pdo) <= | ||
| 1820 | pdo_max_voltage(port->snk_pdo[j])) { | ||
| 1821 | mw = min_power(pdo, port->snk_pdo[j]); | ||
| 1822 | mv = pdo_min_voltage(pdo); | ||
| 1823 | if (mw > max_mw || | ||
| 1824 | (mw == max_mw && mv > max_mv)) { | ||
| 1825 | ret = 0; | ||
| 1826 | *src_pdo = i; | ||
| 1827 | *sink_pdo = j; | ||
| 1828 | max_mw = mw; | ||
| 1829 | max_mv = mv; | ||
| 1830 | } | ||
| 1831 | } | ||
| 1832 | } | ||
| 1833 | } else if (type == PDO_TYPE_VAR) { | ||
| 1834 | for (j = port->nr_fixed + | ||
| 1835 | port->nr_batt; | ||
| 1836 | j < port->nr_fixed + | ||
| 1837 | port->nr_batt + | ||
| 1838 | port->nr_var; | ||
| 1839 | j++) { | ||
| 1840 | if (pdo_min_voltage(pdo) >= | ||
| 1841 | pdo_min_voltage(port->snk_pdo[j]) && | ||
| 1842 | pdo_max_voltage(pdo) <= | ||
| 1843 | pdo_max_voltage(port->snk_pdo[j])) { | ||
| 1844 | ma = min_current(pdo, port->snk_pdo[j]); | ||
| 1845 | mv = pdo_min_voltage(pdo); | ||
| 1846 | mw = ma * mv / 1000; | ||
| 1847 | if (mw > max_mw || | ||
| 1848 | (mw == max_mw && mv > max_mv)) { | ||
| 1849 | ret = 0; | ||
| 1850 | *src_pdo = i; | ||
| 1851 | *sink_pdo = j; | ||
| 1852 | max_mw = mw; | ||
| 1853 | max_mv = mv; | ||
| 1854 | } | ||
| 1855 | } | ||
| 1856 | } | ||
| 1857 | } | 1803 | } |
| 1858 | } | 1804 | } |
| 1859 | 1805 | ||
| @@ -1865,14 +1811,13 @@ static int tcpm_pd_build_request(struct tcpm_port *port, u32 *rdo) | |||
| 1865 | unsigned int mv, ma, mw, flags; | 1811 | unsigned int mv, ma, mw, flags; |
| 1866 | unsigned int max_ma, max_mw; | 1812 | unsigned int max_ma, max_mw; |
| 1867 | enum pd_pdo_type type; | 1813 | enum pd_pdo_type type; |
| 1868 | int src_pdo_index, snk_pdo_index; | 1814 | int index; |
| 1869 | u32 pdo, matching_snk_pdo; | 1815 | u32 pdo; |
| 1870 | 1816 | ||
| 1871 | if (tcpm_pd_select_pdo(port, &snk_pdo_index, &src_pdo_index) < 0) | 1817 | index = tcpm_pd_select_pdo(port); |
| 1818 | if (index < 0) | ||
| 1872 | return -EINVAL; | 1819 | return -EINVAL; |
| 1873 | 1820 | pdo = port->source_caps[index]; | |
| 1874 | pdo = port->source_caps[src_pdo_index]; | ||
| 1875 | matching_snk_pdo = port->snk_pdo[snk_pdo_index]; | ||
| 1876 | type = pdo_type(pdo); | 1821 | type = pdo_type(pdo); |
| 1877 | 1822 | ||
| 1878 | if (type == PDO_TYPE_FIXED) | 1823 | if (type == PDO_TYPE_FIXED) |
| @@ -1880,28 +1825,26 @@ static int tcpm_pd_build_request(struct tcpm_port *port, u32 *rdo) | |||
| 1880 | else | 1825 | else |
| 1881 | mv = pdo_min_voltage(pdo); | 1826 | mv = pdo_min_voltage(pdo); |
| 1882 | 1827 | ||
| 1883 | /* Select maximum available current within the sink pdo's limit */ | 1828 | /* Select maximum available current within the board's power limit */ |
| 1884 | if (type == PDO_TYPE_BATT) { | 1829 | if (type == PDO_TYPE_BATT) { |
| 1885 | mw = min_power(pdo, matching_snk_pdo); | 1830 | mw = pdo_max_power(pdo); |
| 1886 | ma = 1000 * mw / mv; | 1831 | ma = 1000 * min(mw, port->max_snk_mw) / mv; |
| 1887 | } else { | 1832 | } else { |
| 1888 | ma = min_current(pdo, matching_snk_pdo); | 1833 | ma = min(pdo_max_current(pdo), |
| 1889 | mw = ma * mv / 1000; | 1834 | 1000 * port->max_snk_mw / mv); |
| 1890 | } | 1835 | } |
| 1836 | ma = min(ma, port->max_snk_ma); | ||
| 1891 | 1837 | ||
| 1892 | flags = RDO_USB_COMM | RDO_NO_SUSPEND; | 1838 | flags = RDO_USB_COMM | RDO_NO_SUSPEND; |
| 1893 | 1839 | ||
| 1894 | /* Set mismatch bit if offered power is less than operating power */ | 1840 | /* Set mismatch bit if offered power is less than operating power */ |
| 1841 | mw = ma * mv / 1000; | ||
| 1895 | max_ma = ma; | 1842 | max_ma = ma; |
| 1896 | max_mw = mw; | 1843 | max_mw = mw; |
| 1897 | if (mw < port->operating_snk_mw) { | 1844 | if (mw < port->operating_snk_mw) { |
| 1898 | flags |= RDO_CAP_MISMATCH; | 1845 | flags |= RDO_CAP_MISMATCH; |
| 1899 | if (type == PDO_TYPE_BATT && | 1846 | max_mw = port->operating_snk_mw; |
| 1900 | (pdo_max_power(matching_snk_pdo) > pdo_max_power(pdo))) | 1847 | max_ma = max_mw * 1000 / mv; |
| 1901 | max_mw = pdo_max_power(matching_snk_pdo); | ||
| 1902 | else if (pdo_max_current(matching_snk_pdo) > | ||
| 1903 | pdo_max_current(pdo)) | ||
| 1904 | max_ma = pdo_max_current(matching_snk_pdo); | ||
| 1905 | } | 1848 | } |
| 1906 | 1849 | ||
| 1907 | tcpm_log(port, "cc=%d cc1=%d cc2=%d vbus=%d vconn=%s polarity=%d", | 1850 | tcpm_log(port, "cc=%d cc1=%d cc2=%d vbus=%d vconn=%s polarity=%d", |
| @@ -1910,16 +1853,16 @@ static int tcpm_pd_build_request(struct tcpm_port *port, u32 *rdo) | |||
| 1910 | port->polarity); | 1853 | port->polarity); |
| 1911 | 1854 | ||
| 1912 | if (type == PDO_TYPE_BATT) { | 1855 | if (type == PDO_TYPE_BATT) { |
| 1913 | *rdo = RDO_BATT(src_pdo_index + 1, mw, max_mw, flags); | 1856 | *rdo = RDO_BATT(index + 1, mw, max_mw, flags); |
| 1914 | 1857 | ||
| 1915 | tcpm_log(port, "Requesting PDO %d: %u mV, %u mW%s", | 1858 | tcpm_log(port, "Requesting PDO %d: %u mV, %u mW%s", |
| 1916 | src_pdo_index, mv, mw, | 1859 | index, mv, mw, |
| 1917 | flags & RDO_CAP_MISMATCH ? " [mismatch]" : ""); | 1860 | flags & RDO_CAP_MISMATCH ? " [mismatch]" : ""); |
| 1918 | } else { | 1861 | } else { |
| 1919 | *rdo = RDO_FIXED(src_pdo_index + 1, ma, max_ma, flags); | 1862 | *rdo = RDO_FIXED(index + 1, ma, max_ma, flags); |
| 1920 | 1863 | ||
| 1921 | tcpm_log(port, "Requesting PDO %d: %u mV, %u mA%s", | 1864 | tcpm_log(port, "Requesting PDO %d: %u mV, %u mA%s", |
| 1922 | src_pdo_index, mv, ma, | 1865 | index, mv, ma, |
| 1923 | flags & RDO_CAP_MISMATCH ? " [mismatch]" : ""); | 1866 | flags & RDO_CAP_MISMATCH ? " [mismatch]" : ""); |
| 1924 | } | 1867 | } |
| 1925 | 1868 | ||
| @@ -3650,19 +3593,6 @@ int tcpm_update_sink_capabilities(struct tcpm_port *port, const u32 *pdo, | |||
| 3650 | } | 3593 | } |
| 3651 | EXPORT_SYMBOL_GPL(tcpm_update_sink_capabilities); | 3594 | EXPORT_SYMBOL_GPL(tcpm_update_sink_capabilities); |
| 3652 | 3595 | ||
| 3653 | static int nr_type_pdos(const u32 *pdo, unsigned int nr_pdo, | ||
| 3654 | enum pd_pdo_type type) | ||
| 3655 | { | ||
| 3656 | int count = 0; | ||
| 3657 | int i; | ||
| 3658 | |||
| 3659 | for (i = 0; i < nr_pdo; i++) { | ||
| 3660 | if (pdo_type(pdo[i]) == type) | ||
| 3661 | count++; | ||
| 3662 | } | ||
| 3663 | return count; | ||
| 3664 | } | ||
| 3665 | |||
| 3666 | struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc) | 3596 | struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc) |
| 3667 | { | 3597 | { |
| 3668 | struct tcpm_port *port; | 3598 | struct tcpm_port *port; |
| @@ -3708,15 +3638,6 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc) | |||
| 3708 | tcpc->config->nr_src_pdo); | 3638 | tcpc->config->nr_src_pdo); |
| 3709 | port->nr_snk_pdo = tcpm_copy_pdos(port->snk_pdo, tcpc->config->snk_pdo, | 3639 | port->nr_snk_pdo = tcpm_copy_pdos(port->snk_pdo, tcpc->config->snk_pdo, |
| 3710 | tcpc->config->nr_snk_pdo); | 3640 | tcpc->config->nr_snk_pdo); |
| 3711 | port->nr_fixed = nr_type_pdos(port->snk_pdo, | ||
| 3712 | port->nr_snk_pdo, | ||
| 3713 | PDO_TYPE_FIXED); | ||
| 3714 | port->nr_var = nr_type_pdos(port->snk_pdo, | ||
| 3715 | port->nr_snk_pdo, | ||
| 3716 | PDO_TYPE_VAR); | ||
| 3717 | port->nr_batt = nr_type_pdos(port->snk_pdo, | ||
| 3718 | port->nr_snk_pdo, | ||
| 3719 | PDO_TYPE_BATT); | ||
| 3720 | port->nr_snk_vdo = tcpm_copy_vdos(port->snk_vdo, tcpc->config->snk_vdo, | 3641 | port->nr_snk_vdo = tcpm_copy_vdos(port->snk_vdo, tcpc->config->snk_vdo, |
| 3721 | tcpc->config->nr_snk_vdo); | 3642 | tcpc->config->nr_snk_vdo); |
| 3722 | 3643 | ||
diff --git a/drivers/usb/usbip/vudc_sysfs.c b/drivers/usb/usbip/vudc_sysfs.c index d86f72bbbb91..6dcd3ff655c3 100644 --- a/drivers/usb/usbip/vudc_sysfs.c +++ b/drivers/usb/usbip/vudc_sysfs.c | |||
| @@ -105,10 +105,14 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a | |||
| 105 | if (rv != 0) | 105 | if (rv != 0) |
| 106 | return -EINVAL; | 106 | return -EINVAL; |
| 107 | 107 | ||
| 108 | if (!udc) { | ||
| 109 | dev_err(dev, "no device"); | ||
| 110 | return -ENODEV; | ||
| 111 | } | ||
| 108 | spin_lock_irqsave(&udc->lock, flags); | 112 | spin_lock_irqsave(&udc->lock, flags); |
| 109 | /* Don't export what we don't have */ | 113 | /* Don't export what we don't have */ |
| 110 | if (!udc || !udc->driver || !udc->pullup) { | 114 | if (!udc->driver || !udc->pullup) { |
| 111 | dev_err(dev, "no device or gadget not bound"); | 115 | dev_err(dev, "gadget not bound"); |
| 112 | ret = -ENODEV; | 116 | ret = -ENODEV; |
| 113 | goto unlock; | 117 | goto unlock; |
| 114 | } | 118 | } |
diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h index f1fcec2fd5f8..b7a99ce56bc9 100644 --- a/include/linux/usb/quirks.h +++ b/include/linux/usb/quirks.h | |||
| @@ -63,4 +63,7 @@ | |||
| 63 | */ | 63 | */ |
| 64 | #define USB_QUIRK_DISCONNECT_SUSPEND BIT(12) | 64 | #define USB_QUIRK_DISCONNECT_SUSPEND BIT(12) |
| 65 | 65 | ||
| 66 | /* Device needs a pause after every control message. */ | ||
| 67 | #define USB_QUIRK_DELAY_CTRL_MSG BIT(13) | ||
| 68 | |||
| 66 | #endif /* __LINUX_USB_QUIRKS_H */ | 69 | #endif /* __LINUX_USB_QUIRKS_H */ |
