diff options
28 files changed, 373 insertions, 66 deletions
diff --git a/Documentation/usb/gadget_configfs.txt b/Documentation/usb/gadget_configfs.txt index 635e57493709..b8cb38a98c19 100644 --- a/Documentation/usb/gadget_configfs.txt +++ b/Documentation/usb/gadget_configfs.txt | |||
| @@ -226,7 +226,7 @@ $ rm configs/<config name>.<number>/<function> | |||
| 226 | where <config name>.<number> specify the configuration and <function> is | 226 | where <config name>.<number> specify the configuration and <function> is |
| 227 | a symlink to a function being removed from the configuration, e.g.: | 227 | a symlink to a function being removed from the configuration, e.g.: |
| 228 | 228 | ||
| 229 | $ rm configfs/c.1/ncm.usb0 | 229 | $ rm configs/c.1/ncm.usb0 |
| 230 | 230 | ||
| 231 | ... | 231 | ... |
| 232 | ... | 232 | ... |
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 7ca41bf023c9..8df9abfa947b 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
| @@ -45,6 +45,8 @@ | |||
| 45 | #include <linux/uaccess.h> | 45 | #include <linux/uaccess.h> |
| 46 | #include <linux/io-64-nonatomic-lo-hi.h> | 46 | #include <linux/io-64-nonatomic-lo-hi.h> |
| 47 | 47 | ||
| 48 | #include "acpica/accommon.h" | ||
| 49 | #include "acpica/acnamesp.h" | ||
| 48 | #include "internal.h" | 50 | #include "internal.h" |
| 49 | 51 | ||
| 50 | #define _COMPONENT ACPI_OS_SERVICES | 52 | #define _COMPONENT ACPI_OS_SERVICES |
| @@ -1490,6 +1492,76 @@ int acpi_check_region(resource_size_t start, resource_size_t n, | |||
| 1490 | } | 1492 | } |
| 1491 | EXPORT_SYMBOL(acpi_check_region); | 1493 | EXPORT_SYMBOL(acpi_check_region); |
| 1492 | 1494 | ||
| 1495 | static acpi_status acpi_deactivate_mem_region(acpi_handle handle, u32 level, | ||
| 1496 | void *_res, void **return_value) | ||
| 1497 | { | ||
| 1498 | struct acpi_mem_space_context **mem_ctx; | ||
| 1499 | union acpi_operand_object *handler_obj; | ||
| 1500 | union acpi_operand_object *region_obj2; | ||
| 1501 | union acpi_operand_object *region_obj; | ||
| 1502 | struct resource *res = _res; | ||
| 1503 | acpi_status status; | ||
| 1504 | |||
| 1505 | region_obj = acpi_ns_get_attached_object(handle); | ||
| 1506 | if (!region_obj) | ||
| 1507 | return AE_OK; | ||
| 1508 | |||
| 1509 | handler_obj = region_obj->region.handler; | ||
| 1510 | if (!handler_obj) | ||
| 1511 | return AE_OK; | ||
| 1512 | |||
| 1513 | if (region_obj->region.space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY) | ||
| 1514 | return AE_OK; | ||
| 1515 | |||
| 1516 | if (!(region_obj->region.flags & AOPOBJ_SETUP_COMPLETE)) | ||
| 1517 | return AE_OK; | ||
| 1518 | |||
| 1519 | region_obj2 = acpi_ns_get_secondary_object(region_obj); | ||
| 1520 | if (!region_obj2) | ||
| 1521 | return AE_OK; | ||
| 1522 | |||
| 1523 | mem_ctx = (void *)®ion_obj2->extra.region_context; | ||
| 1524 | |||
| 1525 | if (!(mem_ctx[0]->address >= res->start && | ||
| 1526 | mem_ctx[0]->address < res->end)) | ||
| 1527 | return AE_OK; | ||
| 1528 | |||
| 1529 | status = handler_obj->address_space.setup(region_obj, | ||
| 1530 | ACPI_REGION_DEACTIVATE, | ||
| 1531 | NULL, (void **)mem_ctx); | ||
| 1532 | if (ACPI_SUCCESS(status)) | ||
| 1533 | region_obj->region.flags &= ~(AOPOBJ_SETUP_COMPLETE); | ||
| 1534 | |||
| 1535 | return status; | ||
| 1536 | } | ||
| 1537 | |||
| 1538 | /** | ||
| 1539 | * acpi_release_memory - Release any mappings done to a memory region | ||
| 1540 | * @handle: Handle to namespace node | ||
| 1541 | * @res: Memory resource | ||
| 1542 | * @level: A level that terminates the search | ||
| 1543 | * | ||
| 1544 | * Walks through @handle and unmaps all SystemMemory Operation Regions that | ||
| 1545 | * overlap with @res and that have already been activated (mapped). | ||
| 1546 | * | ||
| 1547 | * This is a helper that allows drivers to place special requirements on memory | ||
| 1548 | * region that may overlap with operation regions, primarily allowing them to | ||
| 1549 | * safely map the region as non-cached memory. | ||
| 1550 | * | ||
| 1551 | * The unmapped Operation Regions will be automatically remapped next time they | ||
| 1552 | * are called, so the drivers do not need to do anything else. | ||
| 1553 | */ | ||
| 1554 | acpi_status acpi_release_memory(acpi_handle handle, struct resource *res, | ||
| 1555 | u32 level) | ||
| 1556 | { | ||
| 1557 | if (!(res->flags & IORESOURCE_MEM)) | ||
| 1558 | return AE_TYPE; | ||
| 1559 | |||
| 1560 | return acpi_walk_namespace(ACPI_TYPE_REGION, handle, level, | ||
| 1561 | acpi_deactivate_mem_region, NULL, res, NULL); | ||
| 1562 | } | ||
| 1563 | EXPORT_SYMBOL_GPL(acpi_release_memory); | ||
| 1564 | |||
| 1493 | /* | 1565 | /* |
| 1494 | * Let drivers know whether the resource checks are effective | 1566 | * Let drivers know whether the resource checks are effective |
| 1495 | */ | 1567 | */ |
diff --git a/drivers/nfc/pn533/usb.c b/drivers/nfc/pn533/usb.c index d5553c47014f..5d823e965883 100644 --- a/drivers/nfc/pn533/usb.c +++ b/drivers/nfc/pn533/usb.c | |||
| @@ -74,7 +74,7 @@ static void pn533_recv_response(struct urb *urb) | |||
| 74 | struct sk_buff *skb = NULL; | 74 | struct sk_buff *skb = NULL; |
| 75 | 75 | ||
| 76 | if (!urb->status) { | 76 | if (!urb->status) { |
| 77 | skb = alloc_skb(urb->actual_length, GFP_KERNEL); | 77 | skb = alloc_skb(urb->actual_length, GFP_ATOMIC); |
| 78 | if (!skb) { | 78 | if (!skb) { |
| 79 | nfc_err(&phy->udev->dev, "failed to alloc memory\n"); | 79 | nfc_err(&phy->udev->dev, "failed to alloc memory\n"); |
| 80 | } else { | 80 | } else { |
| @@ -186,7 +186,7 @@ static int pn533_usb_send_frame(struct pn533 *dev, | |||
| 186 | 186 | ||
| 187 | if (dev->protocol_type == PN533_PROTO_REQ_RESP) { | 187 | if (dev->protocol_type == PN533_PROTO_REQ_RESP) { |
| 188 | /* request for response for sent packet directly */ | 188 | /* request for response for sent packet directly */ |
| 189 | rc = pn533_submit_urb_for_response(phy, GFP_ATOMIC); | 189 | rc = pn533_submit_urb_for_response(phy, GFP_KERNEL); |
| 190 | if (rc) | 190 | if (rc) |
| 191 | goto error; | 191 | goto error; |
| 192 | } else if (dev->protocol_type == PN533_PROTO_REQ_ACK_RESP) { | 192 | } else if (dev->protocol_type == PN533_PROTO_REQ_ACK_RESP) { |
diff --git a/drivers/staging/typec/Kconfig b/drivers/staging/typec/Kconfig index 3aa981fbc8f5..e45ed08a5166 100644 --- a/drivers/staging/typec/Kconfig +++ b/drivers/staging/typec/Kconfig | |||
| @@ -11,6 +11,7 @@ config TYPEC_TCPCI | |||
| 11 | 11 | ||
| 12 | config TYPEC_RT1711H | 12 | config TYPEC_RT1711H |
| 13 | tristate "Richtek RT1711H Type-C chip driver" | 13 | tristate "Richtek RT1711H Type-C chip driver" |
| 14 | depends on I2C | ||
| 14 | select TYPEC_TCPCI | 15 | select TYPEC_TCPCI |
| 15 | help | 16 | help |
| 16 | Richtek RT1711H Type-C chip driver that works with | 17 | Richtek RT1711H Type-C chip driver that works with |
diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c index af45aa3222b5..4638d9b066be 100644 --- a/drivers/usb/chipidea/host.c +++ b/drivers/usb/chipidea/host.c | |||
| @@ -124,8 +124,11 @@ static int host_start(struct ci_hdrc *ci) | |||
| 124 | 124 | ||
| 125 | hcd->power_budget = ci->platdata->power_budget; | 125 | hcd->power_budget = ci->platdata->power_budget; |
| 126 | hcd->tpl_support = ci->platdata->tpl_support; | 126 | hcd->tpl_support = ci->platdata->tpl_support; |
| 127 | if (ci->phy || ci->usb_phy) | 127 | if (ci->phy || ci->usb_phy) { |
| 128 | hcd->skip_phy_initialization = 1; | 128 | hcd->skip_phy_initialization = 1; |
| 129 | if (ci->usb_phy) | ||
| 130 | hcd->usb_phy = ci->usb_phy; | ||
| 131 | } | ||
| 129 | 132 | ||
| 130 | ehci = hcd_to_ehci(hcd); | 133 | ehci = hcd_to_ehci(hcd); |
| 131 | ehci->caps = ci->hw_bank.cap; | 134 | ehci->caps = ci->hw_bank.cap; |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 7b366a6c0b49..998b32d0167e 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
| @@ -1758,6 +1758,9 @@ static const struct usb_device_id acm_ids[] = { | |||
| 1758 | { USB_DEVICE(0x11ca, 0x0201), /* VeriFone Mx870 Gadget Serial */ | 1758 | { USB_DEVICE(0x11ca, 0x0201), /* VeriFone Mx870 Gadget Serial */ |
| 1759 | .driver_info = SINGLE_RX_URB, | 1759 | .driver_info = SINGLE_RX_URB, |
| 1760 | }, | 1760 | }, |
| 1761 | { USB_DEVICE(0x1965, 0x0018), /* Uniden UBC125XLT */ | ||
| 1762 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ | ||
| 1763 | }, | ||
| 1761 | { USB_DEVICE(0x22b8, 0x7000), /* Motorola Q Phone */ | 1764 | { USB_DEVICE(0x22b8, 0x7000), /* Motorola Q Phone */ |
| 1762 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ | 1765 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ |
| 1763 | }, | 1766 | }, |
diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h index 4a56ac772a3c..71b3b08ad516 100644 --- a/drivers/usb/dwc2/core.h +++ b/drivers/usb/dwc2/core.h | |||
| @@ -1004,6 +1004,7 @@ struct dwc2_hregs_backup { | |||
| 1004 | * @frame_list_sz: Frame list size | 1004 | * @frame_list_sz: Frame list size |
| 1005 | * @desc_gen_cache: Kmem cache for generic descriptors | 1005 | * @desc_gen_cache: Kmem cache for generic descriptors |
| 1006 | * @desc_hsisoc_cache: Kmem cache for hs isochronous descriptors | 1006 | * @desc_hsisoc_cache: Kmem cache for hs isochronous descriptors |
| 1007 | * @unaligned_cache: Kmem cache for DMA mode to handle non-aligned buf | ||
| 1007 | * | 1008 | * |
| 1008 | * These are for peripheral mode: | 1009 | * These are for peripheral mode: |
| 1009 | * | 1010 | * |
| @@ -1177,6 +1178,8 @@ struct dwc2_hsotg { | |||
| 1177 | u32 frame_list_sz; | 1178 | u32 frame_list_sz; |
| 1178 | struct kmem_cache *desc_gen_cache; | 1179 | struct kmem_cache *desc_gen_cache; |
| 1179 | struct kmem_cache *desc_hsisoc_cache; | 1180 | struct kmem_cache *desc_hsisoc_cache; |
| 1181 | struct kmem_cache *unaligned_cache; | ||
| 1182 | #define DWC2_KMEM_UNALIGNED_BUF_SIZE 1024 | ||
| 1180 | 1183 | ||
| 1181 | #endif /* CONFIG_USB_DWC2_HOST || CONFIG_USB_DWC2_DUAL_ROLE */ | 1184 | #endif /* CONFIG_USB_DWC2_HOST || CONFIG_USB_DWC2_DUAL_ROLE */ |
| 1182 | 1185 | ||
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index f0d9ccf1d665..a0f82cca2d9a 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c | |||
| @@ -812,6 +812,7 @@ static int dwc2_gadget_fill_isoc_desc(struct dwc2_hsotg_ep *hs_ep, | |||
| 812 | u32 index; | 812 | u32 index; |
| 813 | u32 maxsize = 0; | 813 | u32 maxsize = 0; |
| 814 | u32 mask = 0; | 814 | u32 mask = 0; |
| 815 | u8 pid = 0; | ||
| 815 | 816 | ||
| 816 | maxsize = dwc2_gadget_get_desc_params(hs_ep, &mask); | 817 | maxsize = dwc2_gadget_get_desc_params(hs_ep, &mask); |
| 817 | 818 | ||
| @@ -840,7 +841,11 @@ static int dwc2_gadget_fill_isoc_desc(struct dwc2_hsotg_ep *hs_ep, | |||
| 840 | ((len << DEV_DMA_NBYTES_SHIFT) & mask)); | 841 | ((len << DEV_DMA_NBYTES_SHIFT) & mask)); |
| 841 | 842 | ||
| 842 | if (hs_ep->dir_in) { | 843 | if (hs_ep->dir_in) { |
| 843 | desc->status |= ((hs_ep->mc << DEV_DMA_ISOC_PID_SHIFT) & | 844 | if (len) |
| 845 | pid = DIV_ROUND_UP(len, hs_ep->ep.maxpacket); | ||
| 846 | else | ||
| 847 | pid = 1; | ||
| 848 | desc->status |= ((pid << DEV_DMA_ISOC_PID_SHIFT) & | ||
| 844 | DEV_DMA_ISOC_PID_MASK) | | 849 | DEV_DMA_ISOC_PID_MASK) | |
| 845 | ((len % hs_ep->ep.maxpacket) ? | 850 | ((len % hs_ep->ep.maxpacket) ? |
| 846 | DEV_DMA_SHORT : 0) | | 851 | DEV_DMA_SHORT : 0) | |
| @@ -884,6 +889,7 @@ static void dwc2_gadget_start_isoc_ddma(struct dwc2_hsotg_ep *hs_ep) | |||
| 884 | struct dwc2_dma_desc *desc; | 889 | struct dwc2_dma_desc *desc; |
| 885 | 890 | ||
| 886 | if (list_empty(&hs_ep->queue)) { | 891 | if (list_empty(&hs_ep->queue)) { |
| 892 | hs_ep->target_frame = TARGET_FRAME_INITIAL; | ||
| 887 | dev_dbg(hsotg->dev, "%s: No requests in queue\n", __func__); | 893 | dev_dbg(hsotg->dev, "%s: No requests in queue\n", __func__); |
| 888 | return; | 894 | return; |
| 889 | } | 895 | } |
| @@ -2755,8 +2761,6 @@ static void dwc2_gadget_handle_out_token_ep_disabled(struct dwc2_hsotg_ep *ep) | |||
| 2755 | */ | 2761 | */ |
| 2756 | tmp = dwc2_hsotg_read_frameno(hsotg); | 2762 | tmp = dwc2_hsotg_read_frameno(hsotg); |
| 2757 | 2763 | ||
| 2758 | dwc2_hsotg_complete_request(hsotg, ep, get_ep_head(ep), 0); | ||
| 2759 | |||
| 2760 | if (using_desc_dma(hsotg)) { | 2764 | if (using_desc_dma(hsotg)) { |
| 2761 | if (ep->target_frame == TARGET_FRAME_INITIAL) { | 2765 | if (ep->target_frame == TARGET_FRAME_INITIAL) { |
| 2762 | /* Start first ISO Out */ | 2766 | /* Start first ISO Out */ |
| @@ -2817,9 +2821,6 @@ static void dwc2_gadget_handle_nak(struct dwc2_hsotg_ep *hs_ep) | |||
| 2817 | 2821 | ||
| 2818 | tmp = dwc2_hsotg_read_frameno(hsotg); | 2822 | tmp = dwc2_hsotg_read_frameno(hsotg); |
| 2819 | if (using_desc_dma(hsotg)) { | 2823 | if (using_desc_dma(hsotg)) { |
| 2820 | dwc2_hsotg_complete_request(hsotg, hs_ep, | ||
| 2821 | get_ep_head(hs_ep), 0); | ||
| 2822 | |||
| 2823 | hs_ep->target_frame = tmp; | 2824 | hs_ep->target_frame = tmp; |
| 2824 | dwc2_gadget_incr_frame_num(hs_ep); | 2825 | dwc2_gadget_incr_frame_num(hs_ep); |
| 2825 | dwc2_gadget_start_isoc_ddma(hs_ep); | 2826 | dwc2_gadget_start_isoc_ddma(hs_ep); |
| @@ -4739,9 +4740,11 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg) | |||
| 4739 | } | 4740 | } |
| 4740 | 4741 | ||
| 4741 | ret = usb_add_gadget_udc(dev, &hsotg->gadget); | 4742 | ret = usb_add_gadget_udc(dev, &hsotg->gadget); |
| 4742 | if (ret) | 4743 | if (ret) { |
| 4744 | dwc2_hsotg_ep_free_request(&hsotg->eps_out[0]->ep, | ||
| 4745 | hsotg->ctrl_req); | ||
| 4743 | return ret; | 4746 | return ret; |
| 4744 | 4747 | } | |
| 4745 | dwc2_hsotg_dump(hsotg); | 4748 | dwc2_hsotg_dump(hsotg); |
| 4746 | 4749 | ||
| 4747 | return 0; | 4750 | return 0; |
| @@ -4755,6 +4758,7 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg) | |||
| 4755 | int dwc2_hsotg_remove(struct dwc2_hsotg *hsotg) | 4758 | int dwc2_hsotg_remove(struct dwc2_hsotg *hsotg) |
| 4756 | { | 4759 | { |
| 4757 | usb_del_gadget_udc(&hsotg->gadget); | 4760 | usb_del_gadget_udc(&hsotg->gadget); |
| 4761 | dwc2_hsotg_ep_free_request(&hsotg->eps_out[0]->ep, hsotg->ctrl_req); | ||
| 4758 | 4762 | ||
| 4759 | return 0; | 4763 | return 0; |
| 4760 | } | 4764 | } |
diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c index edaf0b6af4f0..b1104be3429c 100644 --- a/drivers/usb/dwc2/hcd.c +++ b/drivers/usb/dwc2/hcd.c | |||
| @@ -1567,11 +1567,20 @@ static void dwc2_hc_start_transfer(struct dwc2_hsotg *hsotg, | |||
| 1567 | } | 1567 | } |
| 1568 | 1568 | ||
| 1569 | if (hsotg->params.host_dma) { | 1569 | if (hsotg->params.host_dma) { |
| 1570 | dwc2_writel((u32)chan->xfer_dma, | 1570 | dma_addr_t dma_addr; |
| 1571 | hsotg->regs + HCDMA(chan->hc_num)); | 1571 | |
| 1572 | if (chan->align_buf) { | ||
| 1573 | if (dbg_hc(chan)) | ||
| 1574 | dev_vdbg(hsotg->dev, "align_buf\n"); | ||
| 1575 | dma_addr = chan->align_buf; | ||
| 1576 | } else { | ||
| 1577 | dma_addr = chan->xfer_dma; | ||
| 1578 | } | ||
| 1579 | dwc2_writel((u32)dma_addr, hsotg->regs + HCDMA(chan->hc_num)); | ||
| 1580 | |||
| 1572 | if (dbg_hc(chan)) | 1581 | if (dbg_hc(chan)) |
| 1573 | dev_vdbg(hsotg->dev, "Wrote %08lx to HCDMA(%d)\n", | 1582 | dev_vdbg(hsotg->dev, "Wrote %08lx to HCDMA(%d)\n", |
| 1574 | (unsigned long)chan->xfer_dma, chan->hc_num); | 1583 | (unsigned long)dma_addr, chan->hc_num); |
| 1575 | } | 1584 | } |
| 1576 | 1585 | ||
| 1577 | /* Start the split */ | 1586 | /* Start the split */ |
| @@ -2625,6 +2634,35 @@ static void dwc2_hc_init_xfer(struct dwc2_hsotg *hsotg, | |||
| 2625 | } | 2634 | } |
| 2626 | } | 2635 | } |
| 2627 | 2636 | ||
| 2637 | static int dwc2_alloc_split_dma_aligned_buf(struct dwc2_hsotg *hsotg, | ||
| 2638 | struct dwc2_qh *qh, | ||
| 2639 | struct dwc2_host_chan *chan) | ||
| 2640 | { | ||
| 2641 | if (!hsotg->unaligned_cache || | ||
| 2642 | chan->max_packet > DWC2_KMEM_UNALIGNED_BUF_SIZE) | ||
| 2643 | return -ENOMEM; | ||
| 2644 | |||
| 2645 | if (!qh->dw_align_buf) { | ||
| 2646 | qh->dw_align_buf = kmem_cache_alloc(hsotg->unaligned_cache, | ||
| 2647 | GFP_ATOMIC | GFP_DMA); | ||
| 2648 | if (!qh->dw_align_buf) | ||
| 2649 | return -ENOMEM; | ||
| 2650 | } | ||
| 2651 | |||
| 2652 | qh->dw_align_buf_dma = dma_map_single(hsotg->dev, qh->dw_align_buf, | ||
| 2653 | DWC2_KMEM_UNALIGNED_BUF_SIZE, | ||
| 2654 | DMA_FROM_DEVICE); | ||
| 2655 | |||
| 2656 | if (dma_mapping_error(hsotg->dev, qh->dw_align_buf_dma)) { | ||
| 2657 | dev_err(hsotg->dev, "can't map align_buf\n"); | ||
| 2658 | chan->align_buf = 0; | ||
| 2659 | return -EINVAL; | ||
| 2660 | } | ||
| 2661 | |||
| 2662 | chan->align_buf = qh->dw_align_buf_dma; | ||
| 2663 | return 0; | ||
| 2664 | } | ||
| 2665 | |||
| 2628 | #define DWC2_USB_DMA_ALIGN 4 | 2666 | #define DWC2_USB_DMA_ALIGN 4 |
| 2629 | 2667 | ||
| 2630 | struct dma_aligned_buffer { | 2668 | struct dma_aligned_buffer { |
| @@ -2802,6 +2840,32 @@ static int dwc2_assign_and_init_hc(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) | |||
| 2802 | /* Set the transfer attributes */ | 2840 | /* Set the transfer attributes */ |
| 2803 | dwc2_hc_init_xfer(hsotg, chan, qtd); | 2841 | dwc2_hc_init_xfer(hsotg, chan, qtd); |
| 2804 | 2842 | ||
| 2843 | /* For non-dword aligned buffers */ | ||
| 2844 | if (hsotg->params.host_dma && qh->do_split && | ||
| 2845 | chan->ep_is_in && (chan->xfer_dma & 0x3)) { | ||
| 2846 | dev_vdbg(hsotg->dev, "Non-aligned buffer\n"); | ||
| 2847 | if (dwc2_alloc_split_dma_aligned_buf(hsotg, qh, chan)) { | ||
| 2848 | dev_err(hsotg->dev, | ||
| 2849 | "Failed to allocate memory to handle non-aligned buffer\n"); | ||
| 2850 | /* Add channel back to free list */ | ||
| 2851 | chan->align_buf = 0; | ||
| 2852 | chan->multi_count = 0; | ||
| 2853 | list_add_tail(&chan->hc_list_entry, | ||
| 2854 | &hsotg->free_hc_list); | ||
| 2855 | qtd->in_process = 0; | ||
| 2856 | qh->channel = NULL; | ||
| 2857 | return -ENOMEM; | ||
| 2858 | } | ||
| 2859 | } else { | ||
| 2860 | /* | ||
| 2861 | * We assume that DMA is always aligned in non-split | ||
| 2862 | * case or split out case. Warn if not. | ||
| 2863 | */ | ||
| 2864 | WARN_ON_ONCE(hsotg->params.host_dma && | ||
| 2865 | (chan->xfer_dma & 0x3)); | ||
| 2866 | chan->align_buf = 0; | ||
| 2867 | } | ||
| 2868 | |||
| 2805 | if (chan->ep_type == USB_ENDPOINT_XFER_INT || | 2869 | if (chan->ep_type == USB_ENDPOINT_XFER_INT || |
| 2806 | chan->ep_type == USB_ENDPOINT_XFER_ISOC) | 2870 | chan->ep_type == USB_ENDPOINT_XFER_ISOC) |
| 2807 | /* | 2871 | /* |
| @@ -5246,6 +5310,19 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg) | |||
| 5246 | } | 5310 | } |
| 5247 | } | 5311 | } |
| 5248 | 5312 | ||
| 5313 | if (hsotg->params.host_dma) { | ||
| 5314 | /* | ||
| 5315 | * Create kmem caches to handle non-aligned buffer | ||
| 5316 | * in Buffer DMA mode. | ||
| 5317 | */ | ||
| 5318 | hsotg->unaligned_cache = kmem_cache_create("dwc2-unaligned-dma", | ||
| 5319 | DWC2_KMEM_UNALIGNED_BUF_SIZE, 4, | ||
| 5320 | SLAB_CACHE_DMA, NULL); | ||
| 5321 | if (!hsotg->unaligned_cache) | ||
| 5322 | dev_err(hsotg->dev, | ||
| 5323 | "unable to create dwc2 unaligned cache\n"); | ||
| 5324 | } | ||
| 5325 | |||
| 5249 | hsotg->otg_port = 1; | 5326 | hsotg->otg_port = 1; |
| 5250 | hsotg->frame_list = NULL; | 5327 | hsotg->frame_list = NULL; |
| 5251 | hsotg->frame_list_dma = 0; | 5328 | hsotg->frame_list_dma = 0; |
| @@ -5280,8 +5357,9 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg) | |||
| 5280 | return 0; | 5357 | return 0; |
| 5281 | 5358 | ||
| 5282 | error4: | 5359 | error4: |
| 5283 | kmem_cache_destroy(hsotg->desc_gen_cache); | 5360 | kmem_cache_destroy(hsotg->unaligned_cache); |
| 5284 | kmem_cache_destroy(hsotg->desc_hsisoc_cache); | 5361 | kmem_cache_destroy(hsotg->desc_hsisoc_cache); |
| 5362 | kmem_cache_destroy(hsotg->desc_gen_cache); | ||
| 5285 | error3: | 5363 | error3: |
| 5286 | dwc2_hcd_release(hsotg); | 5364 | dwc2_hcd_release(hsotg); |
| 5287 | error2: | 5365 | error2: |
| @@ -5322,8 +5400,9 @@ void dwc2_hcd_remove(struct dwc2_hsotg *hsotg) | |||
| 5322 | usb_remove_hcd(hcd); | 5400 | usb_remove_hcd(hcd); |
| 5323 | hsotg->priv = NULL; | 5401 | hsotg->priv = NULL; |
| 5324 | 5402 | ||
| 5325 | kmem_cache_destroy(hsotg->desc_gen_cache); | 5403 | kmem_cache_destroy(hsotg->unaligned_cache); |
| 5326 | kmem_cache_destroy(hsotg->desc_hsisoc_cache); | 5404 | kmem_cache_destroy(hsotg->desc_hsisoc_cache); |
| 5405 | kmem_cache_destroy(hsotg->desc_gen_cache); | ||
| 5327 | 5406 | ||
| 5328 | dwc2_hcd_release(hsotg); | 5407 | dwc2_hcd_release(hsotg); |
| 5329 | usb_put_hcd(hcd); | 5408 | usb_put_hcd(hcd); |
| @@ -5435,7 +5514,7 @@ int dwc2_host_enter_hibernation(struct dwc2_hsotg *hsotg) | |||
| 5435 | dwc2_writel(hprt0, hsotg->regs + HPRT0); | 5514 | dwc2_writel(hprt0, hsotg->regs + HPRT0); |
| 5436 | 5515 | ||
| 5437 | /* Wait for the HPRT0.PrtSusp register field to be set */ | 5516 | /* Wait for the HPRT0.PrtSusp register field to be set */ |
| 5438 | if (dwc2_hsotg_wait_bit_set(hsotg, HPRT0, HPRT0_SUSP, 300)) | 5517 | if (dwc2_hsotg_wait_bit_set(hsotg, HPRT0, HPRT0_SUSP, 3000)) |
| 5439 | dev_warn(hsotg->dev, "Suspend wasn't generated\n"); | 5518 | dev_warn(hsotg->dev, "Suspend wasn't generated\n"); |
| 5440 | 5519 | ||
| 5441 | /* | 5520 | /* |
| @@ -5616,6 +5695,8 @@ int dwc2_host_exit_hibernation(struct dwc2_hsotg *hsotg, int rem_wakeup, | |||
| 5616 | return ret; | 5695 | return ret; |
| 5617 | } | 5696 | } |
| 5618 | 5697 | ||
| 5698 | dwc2_hcd_rem_wakeup(hsotg); | ||
| 5699 | |||
| 5619 | hsotg->hibernated = 0; | 5700 | hsotg->hibernated = 0; |
| 5620 | hsotg->bus_suspended = 0; | 5701 | hsotg->bus_suspended = 0; |
| 5621 | hsotg->lx_state = DWC2_L0; | 5702 | hsotg->lx_state = DWC2_L0; |
diff --git a/drivers/usb/dwc2/hcd.h b/drivers/usb/dwc2/hcd.h index 7db1ee7e7a77..5502a501f516 100644 --- a/drivers/usb/dwc2/hcd.h +++ b/drivers/usb/dwc2/hcd.h | |||
| @@ -76,6 +76,8 @@ struct dwc2_qh; | |||
| 76 | * (micro)frame | 76 | * (micro)frame |
| 77 | * @xfer_buf: Pointer to current transfer buffer position | 77 | * @xfer_buf: Pointer to current transfer buffer position |
| 78 | * @xfer_dma: DMA address of xfer_buf | 78 | * @xfer_dma: DMA address of xfer_buf |
| 79 | * @align_buf: In Buffer DMA mode this will be used if xfer_buf is not | ||
| 80 | * DWORD aligned | ||
| 79 | * @xfer_len: Total number of bytes to transfer | 81 | * @xfer_len: Total number of bytes to transfer |
| 80 | * @xfer_count: Number of bytes transferred so far | 82 | * @xfer_count: Number of bytes transferred so far |
| 81 | * @start_pkt_count: Packet count at start of transfer | 83 | * @start_pkt_count: Packet count at start of transfer |
| @@ -133,6 +135,7 @@ struct dwc2_host_chan { | |||
| 133 | 135 | ||
| 134 | u8 *xfer_buf; | 136 | u8 *xfer_buf; |
| 135 | dma_addr_t xfer_dma; | 137 | dma_addr_t xfer_dma; |
| 138 | dma_addr_t align_buf; | ||
| 136 | u32 xfer_len; | 139 | u32 xfer_len; |
| 137 | u32 xfer_count; | 140 | u32 xfer_count; |
| 138 | u16 start_pkt_count; | 141 | u16 start_pkt_count; |
| @@ -302,6 +305,9 @@ struct dwc2_hs_transfer_time { | |||
| 302 | * speed. Note that this is in "schedule slice" which | 305 | * speed. Note that this is in "schedule slice" which |
| 303 | * is tightly packed. | 306 | * is tightly packed. |
| 304 | * @ntd: Actual number of transfer descriptors in a list | 307 | * @ntd: Actual number of transfer descriptors in a list |
| 308 | * @dw_align_buf: Used instead of original buffer if its physical address | ||
| 309 | * is not dword-aligned | ||
| 310 | * @dw_align_buf_dma: DMA address for dw_align_buf | ||
| 305 | * @qtd_list: List of QTDs for this QH | 311 | * @qtd_list: List of QTDs for this QH |
| 306 | * @channel: Host channel currently processing transfers for this QH | 312 | * @channel: Host channel currently processing transfers for this QH |
| 307 | * @qh_list_entry: Entry for QH in either the periodic or non-periodic | 313 | * @qh_list_entry: Entry for QH in either the periodic or non-periodic |
| @@ -350,6 +356,8 @@ struct dwc2_qh { | |||
| 350 | struct dwc2_hs_transfer_time hs_transfers[DWC2_HS_SCHEDULE_UFRAMES]; | 356 | struct dwc2_hs_transfer_time hs_transfers[DWC2_HS_SCHEDULE_UFRAMES]; |
| 351 | u32 ls_start_schedule_slice; | 357 | u32 ls_start_schedule_slice; |
| 352 | u16 ntd; | 358 | u16 ntd; |
| 359 | u8 *dw_align_buf; | ||
| 360 | dma_addr_t dw_align_buf_dma; | ||
| 353 | struct list_head qtd_list; | 361 | struct list_head qtd_list; |
| 354 | struct dwc2_host_chan *channel; | 362 | struct dwc2_host_chan *channel; |
| 355 | struct list_head qh_list_entry; | 363 | struct list_head qh_list_entry; |
diff --git a/drivers/usb/dwc2/hcd_intr.c b/drivers/usb/dwc2/hcd_intr.c index fbea5e3fb947..ed7f05cf4906 100644 --- a/drivers/usb/dwc2/hcd_intr.c +++ b/drivers/usb/dwc2/hcd_intr.c | |||
| @@ -942,14 +942,21 @@ static int dwc2_xfercomp_isoc_split_in(struct dwc2_hsotg *hsotg, | |||
| 942 | frame_desc = &qtd->urb->iso_descs[qtd->isoc_frame_index]; | 942 | frame_desc = &qtd->urb->iso_descs[qtd->isoc_frame_index]; |
| 943 | len = dwc2_get_actual_xfer_length(hsotg, chan, chnum, qtd, | 943 | len = dwc2_get_actual_xfer_length(hsotg, chan, chnum, qtd, |
| 944 | DWC2_HC_XFER_COMPLETE, NULL); | 944 | DWC2_HC_XFER_COMPLETE, NULL); |
| 945 | if (!len) { | 945 | if (!len && !qtd->isoc_split_offset) { |
| 946 | qtd->complete_split = 0; | 946 | qtd->complete_split = 0; |
| 947 | qtd->isoc_split_offset = 0; | ||
| 948 | return 0; | 947 | return 0; |
| 949 | } | 948 | } |
| 950 | 949 | ||
| 951 | frame_desc->actual_length += len; | 950 | frame_desc->actual_length += len; |
| 952 | 951 | ||
| 952 | if (chan->align_buf) { | ||
| 953 | dev_vdbg(hsotg->dev, "non-aligned buffer\n"); | ||
| 954 | dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma, | ||
| 955 | DWC2_KMEM_UNALIGNED_BUF_SIZE, DMA_FROM_DEVICE); | ||
| 956 | memcpy(qtd->urb->buf + (chan->xfer_dma - qtd->urb->dma), | ||
| 957 | chan->qh->dw_align_buf, len); | ||
| 958 | } | ||
| 959 | |||
| 953 | qtd->isoc_split_offset += len; | 960 | qtd->isoc_split_offset += len; |
| 954 | 961 | ||
| 955 | hctsiz = dwc2_readl(hsotg->regs + HCTSIZ(chnum)); | 962 | hctsiz = dwc2_readl(hsotg->regs + HCTSIZ(chnum)); |
diff --git a/drivers/usb/dwc2/hcd_queue.c b/drivers/usb/dwc2/hcd_queue.c index d7c3d6c776d8..301ced1618f8 100644 --- a/drivers/usb/dwc2/hcd_queue.c +++ b/drivers/usb/dwc2/hcd_queue.c | |||
| @@ -383,7 +383,7 @@ static unsigned long *dwc2_get_ls_map(struct dwc2_hsotg *hsotg, | |||
| 383 | /* Get the map and adjust if this is a multi_tt hub */ | 383 | /* Get the map and adjust if this is a multi_tt hub */ |
| 384 | map = qh->dwc_tt->periodic_bitmaps; | 384 | map = qh->dwc_tt->periodic_bitmaps; |
| 385 | if (qh->dwc_tt->usb_tt->multi) | 385 | if (qh->dwc_tt->usb_tt->multi) |
| 386 | map += DWC2_ELEMENTS_PER_LS_BITMAP * qh->ttport; | 386 | map += DWC2_ELEMENTS_PER_LS_BITMAP * (qh->ttport - 1); |
| 387 | 387 | ||
| 388 | return map; | 388 | return map; |
| 389 | } | 389 | } |
| @@ -1696,6 +1696,9 @@ void dwc2_hcd_qh_free(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) | |||
| 1696 | 1696 | ||
| 1697 | if (qh->desc_list) | 1697 | if (qh->desc_list) |
| 1698 | dwc2_hcd_qh_free_ddma(hsotg, qh); | 1698 | dwc2_hcd_qh_free_ddma(hsotg, qh); |
| 1699 | else if (hsotg->unaligned_cache && qh->dw_align_buf) | ||
| 1700 | kmem_cache_free(hsotg->unaligned_cache, qh->dw_align_buf); | ||
| 1701 | |||
| 1699 | kfree(qh); | 1702 | kfree(qh); |
| 1700 | } | 1703 | } |
| 1701 | 1704 | ||
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index ea91310113b9..103807587dc6 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
| @@ -1272,7 +1272,6 @@ static int dwc3_probe(struct platform_device *pdev) | |||
| 1272 | if (!dwc->clks) | 1272 | if (!dwc->clks) |
| 1273 | return -ENOMEM; | 1273 | return -ENOMEM; |
| 1274 | 1274 | ||
| 1275 | dwc->num_clks = ARRAY_SIZE(dwc3_core_clks); | ||
| 1276 | dwc->dev = dev; | 1275 | dwc->dev = dev; |
| 1277 | 1276 | ||
| 1278 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1277 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| @@ -1307,15 +1306,19 @@ static int dwc3_probe(struct platform_device *pdev) | |||
| 1307 | if (IS_ERR(dwc->reset)) | 1306 | if (IS_ERR(dwc->reset)) |
| 1308 | return PTR_ERR(dwc->reset); | 1307 | return PTR_ERR(dwc->reset); |
| 1309 | 1308 | ||
| 1310 | ret = clk_bulk_get(dev, dwc->num_clks, dwc->clks); | 1309 | if (dev->of_node) { |
| 1311 | if (ret == -EPROBE_DEFER) | 1310 | dwc->num_clks = ARRAY_SIZE(dwc3_core_clks); |
| 1312 | return ret; | 1311 | |
| 1313 | /* | 1312 | ret = clk_bulk_get(dev, dwc->num_clks, dwc->clks); |
| 1314 | * Clocks are optional, but new DT platforms should support all clocks | 1313 | if (ret == -EPROBE_DEFER) |
| 1315 | * as required by the DT-binding. | 1314 | return ret; |
| 1316 | */ | 1315 | /* |
| 1317 | if (ret) | 1316 | * Clocks are optional, but new DT platforms should support all |
| 1318 | dwc->num_clks = 0; | 1317 | * clocks as required by the DT-binding. |
| 1318 | */ | ||
| 1319 | if (ret) | ||
| 1320 | dwc->num_clks = 0; | ||
| 1321 | } | ||
| 1319 | 1322 | ||
| 1320 | ret = reset_control_deassert(dwc->reset); | 1323 | ret = reset_control_deassert(dwc->reset); |
| 1321 | if (ret) | 1324 | if (ret) |
diff --git a/drivers/usb/dwc3/dwc3-of-simple.c b/drivers/usb/dwc3/dwc3-of-simple.c index 6b3ccd542bd7..dbeff5e6ad14 100644 --- a/drivers/usb/dwc3/dwc3-of-simple.c +++ b/drivers/usb/dwc3/dwc3-of-simple.c | |||
| @@ -165,8 +165,9 @@ static int dwc3_of_simple_remove(struct platform_device *pdev) | |||
| 165 | 165 | ||
| 166 | reset_control_put(simple->resets); | 166 | reset_control_put(simple->resets); |
| 167 | 167 | ||
| 168 | pm_runtime_put_sync(dev); | ||
| 169 | pm_runtime_disable(dev); | 168 | pm_runtime_disable(dev); |
| 169 | pm_runtime_put_noidle(dev); | ||
| 170 | pm_runtime_set_suspended(dev); | ||
| 170 | 171 | ||
| 171 | return 0; | 172 | return 0; |
| 172 | } | 173 | } |
diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c index c961a94d136b..f57e7c94b8e5 100644 --- a/drivers/usb/dwc3/dwc3-pci.c +++ b/drivers/usb/dwc3/dwc3-pci.c | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | #define PCI_DEVICE_ID_INTEL_GLK 0x31aa | 34 | #define PCI_DEVICE_ID_INTEL_GLK 0x31aa |
| 35 | #define PCI_DEVICE_ID_INTEL_CNPLP 0x9dee | 35 | #define PCI_DEVICE_ID_INTEL_CNPLP 0x9dee |
| 36 | #define PCI_DEVICE_ID_INTEL_CNPH 0xa36e | 36 | #define PCI_DEVICE_ID_INTEL_CNPH 0xa36e |
| 37 | #define PCI_DEVICE_ID_INTEL_ICLLP 0x34ee | ||
| 37 | 38 | ||
| 38 | #define PCI_INTEL_BXT_DSM_GUID "732b85d5-b7a7-4a1b-9ba0-4bbd00ffd511" | 39 | #define PCI_INTEL_BXT_DSM_GUID "732b85d5-b7a7-4a1b-9ba0-4bbd00ffd511" |
| 39 | #define PCI_INTEL_BXT_FUNC_PMU_PWR 4 | 40 | #define PCI_INTEL_BXT_FUNC_PMU_PWR 4 |
| @@ -289,6 +290,7 @@ static const struct pci_device_id dwc3_pci_id_table[] = { | |||
| 289 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_GLK), }, | 290 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_GLK), }, |
| 290 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CNPLP), }, | 291 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CNPLP), }, |
| 291 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CNPH), }, | 292 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CNPH), }, |
| 293 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICLLP), }, | ||
| 292 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_NL_USB), }, | 294 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_NL_USB), }, |
| 293 | { } /* Terminating Entry */ | 295 | { } /* Terminating Entry */ |
| 294 | }; | 296 | }; |
diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c index b0e67ab2f98c..a6d0203e40b6 100644 --- a/drivers/usb/dwc3/dwc3-qcom.c +++ b/drivers/usb/dwc3/dwc3-qcom.c | |||
| @@ -490,6 +490,7 @@ static int dwc3_qcom_probe(struct platform_device *pdev) | |||
| 490 | qcom->dwc3 = of_find_device_by_node(dwc3_np); | 490 | qcom->dwc3 = of_find_device_by_node(dwc3_np); |
| 491 | if (!qcom->dwc3) { | 491 | if (!qcom->dwc3) { |
| 492 | dev_err(&pdev->dev, "failed to get dwc3 platform device\n"); | 492 | dev_err(&pdev->dev, "failed to get dwc3 platform device\n"); |
| 493 | ret = -ENODEV; | ||
| 493 | goto depopulate; | 494 | goto depopulate; |
| 494 | } | 495 | } |
| 495 | 496 | ||
| @@ -547,8 +548,7 @@ static int dwc3_qcom_remove(struct platform_device *pdev) | |||
| 547 | return 0; | 548 | return 0; |
| 548 | } | 549 | } |
| 549 | 550 | ||
| 550 | #ifdef CONFIG_PM_SLEEP | 551 | static int __maybe_unused dwc3_qcom_pm_suspend(struct device *dev) |
| 551 | static int dwc3_qcom_pm_suspend(struct device *dev) | ||
| 552 | { | 552 | { |
| 553 | struct dwc3_qcom *qcom = dev_get_drvdata(dev); | 553 | struct dwc3_qcom *qcom = dev_get_drvdata(dev); |
| 554 | int ret = 0; | 554 | int ret = 0; |
| @@ -560,7 +560,7 @@ static int dwc3_qcom_pm_suspend(struct device *dev) | |||
| 560 | return ret; | 560 | return ret; |
| 561 | } | 561 | } |
| 562 | 562 | ||
| 563 | static int dwc3_qcom_pm_resume(struct device *dev) | 563 | static int __maybe_unused dwc3_qcom_pm_resume(struct device *dev) |
| 564 | { | 564 | { |
| 565 | struct dwc3_qcom *qcom = dev_get_drvdata(dev); | 565 | struct dwc3_qcom *qcom = dev_get_drvdata(dev); |
| 566 | int ret; | 566 | int ret; |
| @@ -571,23 +571,20 @@ static int dwc3_qcom_pm_resume(struct device *dev) | |||
| 571 | 571 | ||
| 572 | return ret; | 572 | return ret; |
| 573 | } | 573 | } |
| 574 | #endif | ||
| 575 | 574 | ||
| 576 | #ifdef CONFIG_PM | 575 | static int __maybe_unused dwc3_qcom_runtime_suspend(struct device *dev) |
| 577 | static int dwc3_qcom_runtime_suspend(struct device *dev) | ||
| 578 | { | 576 | { |
| 579 | struct dwc3_qcom *qcom = dev_get_drvdata(dev); | 577 | struct dwc3_qcom *qcom = dev_get_drvdata(dev); |
| 580 | 578 | ||
| 581 | return dwc3_qcom_suspend(qcom); | 579 | return dwc3_qcom_suspend(qcom); |
| 582 | } | 580 | } |
| 583 | 581 | ||
| 584 | static int dwc3_qcom_runtime_resume(struct device *dev) | 582 | static int __maybe_unused dwc3_qcom_runtime_resume(struct device *dev) |
| 585 | { | 583 | { |
| 586 | struct dwc3_qcom *qcom = dev_get_drvdata(dev); | 584 | struct dwc3_qcom *qcom = dev_get_drvdata(dev); |
| 587 | 585 | ||
| 588 | return dwc3_qcom_resume(qcom); | 586 | return dwc3_qcom_resume(qcom); |
| 589 | } | 587 | } |
| 590 | #endif | ||
| 591 | 588 | ||
| 592 | static const struct dev_pm_ops dwc3_qcom_dev_pm_ops = { | 589 | static const struct dev_pm_ops dwc3_qcom_dev_pm_ops = { |
| 593 | SET_SYSTEM_SLEEP_PM_OPS(dwc3_qcom_pm_suspend, dwc3_qcom_pm_resume) | 590 | SET_SYSTEM_SLEEP_PM_OPS(dwc3_qcom_pm_suspend, dwc3_qcom_pm_resume) |
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index f242c2bcea81..d2fa071c21b1 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c | |||
| @@ -1719,6 +1719,8 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) | |||
| 1719 | */ | 1719 | */ |
| 1720 | if (w_value && !f->get_alt) | 1720 | if (w_value && !f->get_alt) |
| 1721 | break; | 1721 | break; |
| 1722 | |||
| 1723 | spin_lock(&cdev->lock); | ||
| 1722 | value = f->set_alt(f, w_index, w_value); | 1724 | value = f->set_alt(f, w_index, w_value); |
| 1723 | if (value == USB_GADGET_DELAYED_STATUS) { | 1725 | if (value == USB_GADGET_DELAYED_STATUS) { |
| 1724 | DBG(cdev, | 1726 | DBG(cdev, |
| @@ -1728,6 +1730,7 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) | |||
| 1728 | DBG(cdev, "delayed_status count %d\n", | 1730 | DBG(cdev, "delayed_status count %d\n", |
| 1729 | cdev->delayed_status); | 1731 | cdev->delayed_status); |
| 1730 | } | 1732 | } |
| 1733 | spin_unlock(&cdev->lock); | ||
| 1731 | break; | 1734 | break; |
| 1732 | case USB_REQ_GET_INTERFACE: | 1735 | case USB_REQ_GET_INTERFACE: |
| 1733 | if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE)) | 1736 | if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE)) |
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index dce9d12c7981..33e2030503fa 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c | |||
| @@ -215,6 +215,7 @@ struct ffs_io_data { | |||
| 215 | 215 | ||
| 216 | struct mm_struct *mm; | 216 | struct mm_struct *mm; |
| 217 | struct work_struct work; | 217 | struct work_struct work; |
| 218 | struct work_struct cancellation_work; | ||
| 218 | 219 | ||
| 219 | struct usb_ep *ep; | 220 | struct usb_ep *ep; |
| 220 | struct usb_request *req; | 221 | struct usb_request *req; |
| @@ -1072,22 +1073,31 @@ ffs_epfile_open(struct inode *inode, struct file *file) | |||
| 1072 | return 0; | 1073 | return 0; |
| 1073 | } | 1074 | } |
| 1074 | 1075 | ||
| 1076 | static void ffs_aio_cancel_worker(struct work_struct *work) | ||
| 1077 | { | ||
| 1078 | struct ffs_io_data *io_data = container_of(work, struct ffs_io_data, | ||
| 1079 | cancellation_work); | ||
| 1080 | |||
| 1081 | ENTER(); | ||
| 1082 | |||
| 1083 | usb_ep_dequeue(io_data->ep, io_data->req); | ||
| 1084 | } | ||
| 1085 | |||
| 1075 | static int ffs_aio_cancel(struct kiocb *kiocb) | 1086 | static int ffs_aio_cancel(struct kiocb *kiocb) |
| 1076 | { | 1087 | { |
| 1077 | struct ffs_io_data *io_data = kiocb->private; | 1088 | struct ffs_io_data *io_data = kiocb->private; |
| 1078 | struct ffs_epfile *epfile = kiocb->ki_filp->private_data; | 1089 | struct ffs_data *ffs = io_data->ffs; |
| 1079 | int value; | 1090 | int value; |
| 1080 | 1091 | ||
| 1081 | ENTER(); | 1092 | ENTER(); |
| 1082 | 1093 | ||
| 1083 | spin_lock_irq(&epfile->ffs->eps_lock); | 1094 | if (likely(io_data && io_data->ep && io_data->req)) { |
| 1084 | 1095 | INIT_WORK(&io_data->cancellation_work, ffs_aio_cancel_worker); | |
| 1085 | if (likely(io_data && io_data->ep && io_data->req)) | 1096 | queue_work(ffs->io_completion_wq, &io_data->cancellation_work); |
| 1086 | value = usb_ep_dequeue(io_data->ep, io_data->req); | 1097 | value = -EINPROGRESS; |
| 1087 | else | 1098 | } else { |
| 1088 | value = -EINVAL; | 1099 | value = -EINVAL; |
| 1089 | 1100 | } | |
| 1090 | spin_unlock_irq(&epfile->ffs->eps_lock); | ||
| 1091 | 1101 | ||
| 1092 | return value; | 1102 | return value; |
| 1093 | } | 1103 | } |
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index acbd3d7b8828..8a62eee9eee1 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
| @@ -886,12 +886,12 @@ void xhci_free_virt_device(struct xhci_hcd *xhci, int slot_id) | |||
| 886 | 886 | ||
| 887 | dev = xhci->devs[slot_id]; | 887 | dev = xhci->devs[slot_id]; |
| 888 | 888 | ||
| 889 | trace_xhci_free_virt_device(dev); | ||
| 890 | |||
| 891 | xhci->dcbaa->dev_context_ptrs[slot_id] = 0; | 889 | xhci->dcbaa->dev_context_ptrs[slot_id] = 0; |
| 892 | if (!dev) | 890 | if (!dev) |
| 893 | return; | 891 | return; |
| 894 | 892 | ||
| 893 | trace_xhci_free_virt_device(dev); | ||
| 894 | |||
| 895 | if (dev->tt_info) | 895 | if (dev->tt_info) |
| 896 | old_active_eps = dev->tt_info->active_eps; | 896 | old_active_eps = dev->tt_info->active_eps; |
| 897 | 897 | ||
diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c index a8c1d073cba0..4b463e5202a4 100644 --- a/drivers/usb/host/xhci-tegra.c +++ b/drivers/usb/host/xhci-tegra.c | |||
| @@ -481,7 +481,7 @@ static void tegra_xusb_mbox_handle(struct tegra_xusb *tegra, | |||
| 481 | unsigned long mask; | 481 | unsigned long mask; |
| 482 | unsigned int port; | 482 | unsigned int port; |
| 483 | bool idle, enable; | 483 | bool idle, enable; |
| 484 | int err; | 484 | int err = 0; |
| 485 | 485 | ||
| 486 | memset(&rsp, 0, sizeof(rsp)); | 486 | memset(&rsp, 0, sizeof(rsp)); |
| 487 | 487 | ||
| @@ -1223,10 +1223,10 @@ disable_rpm: | |||
| 1223 | pm_runtime_disable(&pdev->dev); | 1223 | pm_runtime_disable(&pdev->dev); |
| 1224 | usb_put_hcd(tegra->hcd); | 1224 | usb_put_hcd(tegra->hcd); |
| 1225 | disable_xusbc: | 1225 | disable_xusbc: |
| 1226 | if (!&pdev->dev.pm_domain) | 1226 | if (!pdev->dev.pm_domain) |
| 1227 | tegra_powergate_power_off(TEGRA_POWERGATE_XUSBC); | 1227 | tegra_powergate_power_off(TEGRA_POWERGATE_XUSBC); |
| 1228 | disable_xusba: | 1228 | disable_xusba: |
| 1229 | if (!&pdev->dev.pm_domain) | 1229 | if (!pdev->dev.pm_domain) |
| 1230 | tegra_powergate_power_off(TEGRA_POWERGATE_XUSBA); | 1230 | tegra_powergate_power_off(TEGRA_POWERGATE_XUSBA); |
| 1231 | put_padctl: | 1231 | put_padctl: |
| 1232 | tegra_xusb_padctl_put(tegra->padctl); | 1232 | tegra_xusb_padctl_put(tegra->padctl); |
diff --git a/drivers/usb/host/xhci-trace.h b/drivers/usb/host/xhci-trace.h index 410544ffe78f..88b427434bd8 100644 --- a/drivers/usb/host/xhci-trace.h +++ b/drivers/usb/host/xhci-trace.h | |||
| @@ -171,6 +171,37 @@ DEFINE_EVENT(xhci_log_trb, xhci_dbc_gadget_ep_queue, | |||
| 171 | TP_ARGS(ring, trb) | 171 | TP_ARGS(ring, trb) |
| 172 | ); | 172 | ); |
| 173 | 173 | ||
| 174 | DECLARE_EVENT_CLASS(xhci_log_free_virt_dev, | ||
| 175 | TP_PROTO(struct xhci_virt_device *vdev), | ||
| 176 | TP_ARGS(vdev), | ||
| 177 | TP_STRUCT__entry( | ||
| 178 | __field(void *, vdev) | ||
| 179 | __field(unsigned long long, out_ctx) | ||
| 180 | __field(unsigned long long, in_ctx) | ||
| 181 | __field(u8, fake_port) | ||
| 182 | __field(u8, real_port) | ||
| 183 | __field(u16, current_mel) | ||
| 184 | |||
| 185 | ), | ||
| 186 | TP_fast_assign( | ||
| 187 | __entry->vdev = vdev; | ||
| 188 | __entry->in_ctx = (unsigned long long) vdev->in_ctx->dma; | ||
| 189 | __entry->out_ctx = (unsigned long long) vdev->out_ctx->dma; | ||
| 190 | __entry->fake_port = (u8) vdev->fake_port; | ||
| 191 | __entry->real_port = (u8) vdev->real_port; | ||
| 192 | __entry->current_mel = (u16) vdev->current_mel; | ||
| 193 | ), | ||
| 194 | TP_printk("vdev %p ctx %llx | %llx fake_port %d real_port %d current_mel %d", | ||
| 195 | __entry->vdev, __entry->in_ctx, __entry->out_ctx, | ||
| 196 | __entry->fake_port, __entry->real_port, __entry->current_mel | ||
| 197 | ) | ||
| 198 | ); | ||
| 199 | |||
| 200 | DEFINE_EVENT(xhci_log_free_virt_dev, xhci_free_virt_device, | ||
| 201 | TP_PROTO(struct xhci_virt_device *vdev), | ||
| 202 | TP_ARGS(vdev) | ||
| 203 | ); | ||
| 204 | |||
| 174 | DECLARE_EVENT_CLASS(xhci_log_virt_dev, | 205 | DECLARE_EVENT_CLASS(xhci_log_virt_dev, |
| 175 | TP_PROTO(struct xhci_virt_device *vdev), | 206 | TP_PROTO(struct xhci_virt_device *vdev), |
| 176 | TP_ARGS(vdev), | 207 | TP_ARGS(vdev), |
| @@ -208,11 +239,6 @@ DEFINE_EVENT(xhci_log_virt_dev, xhci_alloc_virt_device, | |||
| 208 | TP_ARGS(vdev) | 239 | TP_ARGS(vdev) |
| 209 | ); | 240 | ); |
| 210 | 241 | ||
| 211 | DEFINE_EVENT(xhci_log_virt_dev, xhci_free_virt_device, | ||
| 212 | TP_PROTO(struct xhci_virt_device *vdev), | ||
| 213 | TP_ARGS(vdev) | ||
| 214 | ); | ||
| 215 | |||
| 216 | DEFINE_EVENT(xhci_log_virt_dev, xhci_setup_device, | 242 | DEFINE_EVENT(xhci_log_virt_dev, xhci_setup_device, |
| 217 | TP_PROTO(struct xhci_virt_device *vdev), | 243 | TP_PROTO(struct xhci_virt_device *vdev), |
| 218 | TP_ARGS(vdev) | 244 | TP_ARGS(vdev) |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 8c8da2d657fa..2f4850f25e82 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
| @@ -908,6 +908,41 @@ static void xhci_disable_port_wake_on_bits(struct xhci_hcd *xhci) | |||
| 908 | spin_unlock_irqrestore(&xhci->lock, flags); | 908 | spin_unlock_irqrestore(&xhci->lock, flags); |
| 909 | } | 909 | } |
| 910 | 910 | ||
| 911 | static bool xhci_pending_portevent(struct xhci_hcd *xhci) | ||
| 912 | { | ||
| 913 | struct xhci_port **ports; | ||
| 914 | int port_index; | ||
| 915 | u32 status; | ||
| 916 | u32 portsc; | ||
| 917 | |||
| 918 | status = readl(&xhci->op_regs->status); | ||
| 919 | if (status & STS_EINT) | ||
| 920 | return true; | ||
| 921 | /* | ||
| 922 | * Checking STS_EINT is not enough as there is a lag between a change | ||
| 923 | * bit being set and the Port Status Change Event that it generated | ||
| 924 | * being written to the Event Ring. See note in xhci 1.1 section 4.19.2. | ||
| 925 | */ | ||
| 926 | |||
| 927 | port_index = xhci->usb2_rhub.num_ports; | ||
| 928 | ports = xhci->usb2_rhub.ports; | ||
| 929 | while (port_index--) { | ||
| 930 | portsc = readl(ports[port_index]->addr); | ||
| 931 | if (portsc & PORT_CHANGE_MASK || | ||
| 932 | (portsc & PORT_PLS_MASK) == XDEV_RESUME) | ||
| 933 | return true; | ||
| 934 | } | ||
| 935 | port_index = xhci->usb3_rhub.num_ports; | ||
| 936 | ports = xhci->usb3_rhub.ports; | ||
| 937 | while (port_index--) { | ||
| 938 | portsc = readl(ports[port_index]->addr); | ||
| 939 | if (portsc & PORT_CHANGE_MASK || | ||
| 940 | (portsc & PORT_PLS_MASK) == XDEV_RESUME) | ||
| 941 | return true; | ||
| 942 | } | ||
| 943 | return false; | ||
| 944 | } | ||
| 945 | |||
| 911 | /* | 946 | /* |
| 912 | * Stop HC (not bus-specific) | 947 | * Stop HC (not bus-specific) |
| 913 | * | 948 | * |
| @@ -1009,7 +1044,7 @@ EXPORT_SYMBOL_GPL(xhci_suspend); | |||
| 1009 | */ | 1044 | */ |
| 1010 | int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | 1045 | int xhci_resume(struct xhci_hcd *xhci, bool hibernated) |
| 1011 | { | 1046 | { |
| 1012 | u32 command, temp = 0, status; | 1047 | u32 command, temp = 0; |
| 1013 | struct usb_hcd *hcd = xhci_to_hcd(xhci); | 1048 | struct usb_hcd *hcd = xhci_to_hcd(xhci); |
| 1014 | struct usb_hcd *secondary_hcd; | 1049 | struct usb_hcd *secondary_hcd; |
| 1015 | int retval = 0; | 1050 | int retval = 0; |
| @@ -1043,8 +1078,13 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | |||
| 1043 | command = readl(&xhci->op_regs->command); | 1078 | command = readl(&xhci->op_regs->command); |
| 1044 | command |= CMD_CRS; | 1079 | command |= CMD_CRS; |
| 1045 | writel(command, &xhci->op_regs->command); | 1080 | writel(command, &xhci->op_regs->command); |
| 1081 | /* | ||
| 1082 | * Some controllers take up to 55+ ms to complete the controller | ||
| 1083 | * restore so setting the timeout to 100ms. Xhci specification | ||
| 1084 | * doesn't mention any timeout value. | ||
| 1085 | */ | ||
| 1046 | if (xhci_handshake(&xhci->op_regs->status, | 1086 | if (xhci_handshake(&xhci->op_regs->status, |
| 1047 | STS_RESTORE, 0, 10 * 1000)) { | 1087 | STS_RESTORE, 0, 100 * 1000)) { |
| 1048 | xhci_warn(xhci, "WARN: xHC restore state timeout\n"); | 1088 | xhci_warn(xhci, "WARN: xHC restore state timeout\n"); |
| 1049 | spin_unlock_irq(&xhci->lock); | 1089 | spin_unlock_irq(&xhci->lock); |
| 1050 | return -ETIMEDOUT; | 1090 | return -ETIMEDOUT; |
| @@ -1134,8 +1174,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | |||
| 1134 | done: | 1174 | done: |
| 1135 | if (retval == 0) { | 1175 | if (retval == 0) { |
| 1136 | /* Resume root hubs only when have pending events. */ | 1176 | /* Resume root hubs only when have pending events. */ |
| 1137 | status = readl(&xhci->op_regs->status); | 1177 | if (xhci_pending_portevent(xhci)) { |
| 1138 | if (status & STS_EINT) { | ||
| 1139 | usb_hcd_resume_root_hub(xhci->shared_hcd); | 1178 | usb_hcd_resume_root_hub(xhci->shared_hcd); |
| 1140 | usb_hcd_resume_root_hub(hcd); | 1179 | usb_hcd_resume_root_hub(hcd); |
| 1141 | } | 1180 | } |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 939e2f86b595..841e89ffe2e9 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
| @@ -382,6 +382,10 @@ struct xhci_op_regs { | |||
| 382 | #define PORT_PLC (1 << 22) | 382 | #define PORT_PLC (1 << 22) |
| 383 | /* port configure error change - port failed to configure its link partner */ | 383 | /* port configure error change - port failed to configure its link partner */ |
| 384 | #define PORT_CEC (1 << 23) | 384 | #define PORT_CEC (1 << 23) |
| 385 | #define PORT_CHANGE_MASK (PORT_CSC | PORT_PEC | PORT_WRC | PORT_OCC | \ | ||
| 386 | PORT_RC | PORT_PLC | PORT_CEC) | ||
| 387 | |||
| 388 | |||
| 385 | /* Cold Attach Status - xHC can set this bit to report device attached during | 389 | /* Cold Attach Status - xHC can set this bit to report device attached during |
| 386 | * Sx state. Warm port reset should be perfomed to clear this bit and move port | 390 | * Sx state. Warm port reset should be perfomed to clear this bit and move port |
| 387 | * to connected state. | 391 | * to connected state. |
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index eb6c26cbe579..ee0cc1d90b51 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
| @@ -95,6 +95,9 @@ static const struct usb_device_id id_table[] = { | |||
| 95 | { USB_DEVICE(0x10C4, 0x8156) }, /* B&G H3000 link cable */ | 95 | { USB_DEVICE(0x10C4, 0x8156) }, /* B&G H3000 link cable */ |
| 96 | { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */ | 96 | { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */ |
| 97 | { USB_DEVICE(0x10C4, 0x815F) }, /* Timewave HamLinkUSB */ | 97 | { USB_DEVICE(0x10C4, 0x815F) }, /* Timewave HamLinkUSB */ |
| 98 | { USB_DEVICE(0x10C4, 0x817C) }, /* CESINEL MEDCAL N Power Quality Monitor */ | ||
| 99 | { USB_DEVICE(0x10C4, 0x817D) }, /* CESINEL MEDCAL NT Power Quality Monitor */ | ||
| 100 | { USB_DEVICE(0x10C4, 0x817E) }, /* CESINEL MEDCAL S Power Quality Monitor */ | ||
| 98 | { USB_DEVICE(0x10C4, 0x818B) }, /* AVIT Research USB to TTL */ | 101 | { USB_DEVICE(0x10C4, 0x818B) }, /* AVIT Research USB to TTL */ |
| 99 | { USB_DEVICE(0x10C4, 0x819F) }, /* MJS USB Toslink Switcher */ | 102 | { USB_DEVICE(0x10C4, 0x819F) }, /* MJS USB Toslink Switcher */ |
| 100 | { USB_DEVICE(0x10C4, 0x81A6) }, /* ThinkOptics WavIt */ | 103 | { USB_DEVICE(0x10C4, 0x81A6) }, /* ThinkOptics WavIt */ |
| @@ -112,6 +115,9 @@ static const struct usb_device_id id_table[] = { | |||
| 112 | { USB_DEVICE(0x10C4, 0x826B) }, /* Cygnal Integrated Products, Inc., Fasttrax GPS demonstration module */ | 115 | { USB_DEVICE(0x10C4, 0x826B) }, /* Cygnal Integrated Products, Inc., Fasttrax GPS demonstration module */ |
| 113 | { USB_DEVICE(0x10C4, 0x8281) }, /* Nanotec Plug & Drive */ | 116 | { USB_DEVICE(0x10C4, 0x8281) }, /* Nanotec Plug & Drive */ |
| 114 | { USB_DEVICE(0x10C4, 0x8293) }, /* Telegesis ETRX2USB */ | 117 | { USB_DEVICE(0x10C4, 0x8293) }, /* Telegesis ETRX2USB */ |
| 118 | { USB_DEVICE(0x10C4, 0x82EF) }, /* CESINEL FALCO 6105 AC Power Supply */ | ||
| 119 | { USB_DEVICE(0x10C4, 0x82F1) }, /* CESINEL MEDCAL EFD Earth Fault Detector */ | ||
| 120 | { USB_DEVICE(0x10C4, 0x82F2) }, /* CESINEL MEDCAL ST Network Analyzer */ | ||
| 115 | { USB_DEVICE(0x10C4, 0x82F4) }, /* Starizona MicroTouch */ | 121 | { USB_DEVICE(0x10C4, 0x82F4) }, /* Starizona MicroTouch */ |
| 116 | { USB_DEVICE(0x10C4, 0x82F9) }, /* Procyon AVS */ | 122 | { USB_DEVICE(0x10C4, 0x82F9) }, /* Procyon AVS */ |
| 117 | { USB_DEVICE(0x10C4, 0x8341) }, /* Siemens MC35PU GPRS Modem */ | 123 | { USB_DEVICE(0x10C4, 0x8341) }, /* Siemens MC35PU GPRS Modem */ |
| @@ -124,7 +130,9 @@ static const struct usb_device_id id_table[] = { | |||
| 124 | { USB_DEVICE(0x10C4, 0x8470) }, /* Juniper Networks BX Series System Console */ | 130 | { USB_DEVICE(0x10C4, 0x8470) }, /* Juniper Networks BX Series System Console */ |
| 125 | { USB_DEVICE(0x10C4, 0x8477) }, /* Balluff RFID */ | 131 | { USB_DEVICE(0x10C4, 0x8477) }, /* Balluff RFID */ |
| 126 | { USB_DEVICE(0x10C4, 0x84B6) }, /* Starizona Hyperion */ | 132 | { USB_DEVICE(0x10C4, 0x84B6) }, /* Starizona Hyperion */ |
| 133 | { USB_DEVICE(0x10C4, 0x851E) }, /* CESINEL MEDCAL PT Network Analyzer */ | ||
| 127 | { USB_DEVICE(0x10C4, 0x85A7) }, /* LifeScan OneTouch Verio IQ */ | 134 | { USB_DEVICE(0x10C4, 0x85A7) }, /* LifeScan OneTouch Verio IQ */ |
| 135 | { USB_DEVICE(0x10C4, 0x85B8) }, /* CESINEL ReCon T Energy Logger */ | ||
| 128 | { USB_DEVICE(0x10C4, 0x85EA) }, /* AC-Services IBUS-IF */ | 136 | { USB_DEVICE(0x10C4, 0x85EA) }, /* AC-Services IBUS-IF */ |
| 129 | { USB_DEVICE(0x10C4, 0x85EB) }, /* AC-Services CIS-IBUS */ | 137 | { USB_DEVICE(0x10C4, 0x85EB) }, /* AC-Services CIS-IBUS */ |
| 130 | { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ | 138 | { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ |
| @@ -134,17 +142,23 @@ static const struct usb_device_id id_table[] = { | |||
| 134 | { USB_DEVICE(0x10C4, 0x8857) }, /* CEL EM357 ZigBee USB Stick */ | 142 | { USB_DEVICE(0x10C4, 0x8857) }, /* CEL EM357 ZigBee USB Stick */ |
| 135 | { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */ | 143 | { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */ |
| 136 | { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ | 144 | { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ |
| 145 | { USB_DEVICE(0x10C4, 0x88FB) }, /* CESINEL MEDCAL STII Network Analyzer */ | ||
| 146 | { USB_DEVICE(0x10C4, 0x8938) }, /* CESINEL MEDCAL S II Network Analyzer */ | ||
| 137 | { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ | 147 | { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ |
| 138 | { USB_DEVICE(0x10C4, 0x8962) }, /* Brim Brothers charging dock */ | 148 | { USB_DEVICE(0x10C4, 0x8962) }, /* Brim Brothers charging dock */ |
| 139 | { USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */ | 149 | { USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */ |
| 140 | { USB_DEVICE(0x10C4, 0x8998) }, /* KCF Technologies PRN */ | 150 | { USB_DEVICE(0x10C4, 0x8998) }, /* KCF Technologies PRN */ |
| 151 | { USB_DEVICE(0x10C4, 0x89A4) }, /* CESINEL FTBC Flexible Thyristor Bridge Controller */ | ||
| 141 | { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */ | 152 | { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */ |
| 142 | { USB_DEVICE(0x10C4, 0x8A5E) }, /* CEL EM3588 ZigBee USB Stick Long Range */ | 153 | { USB_DEVICE(0x10C4, 0x8A5E) }, /* CEL EM3588 ZigBee USB Stick Long Range */ |
| 143 | { USB_DEVICE(0x10C4, 0x8B34) }, /* Qivicon ZigBee USB Radio Stick */ | 154 | { USB_DEVICE(0x10C4, 0x8B34) }, /* Qivicon ZigBee USB Radio Stick */ |
| 144 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ | 155 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ |
| 145 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ | 156 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ |
| 157 | { USB_DEVICE(0x10C4, 0xEA63) }, /* Silicon Labs Windows Update (CP2101-4/CP2102N) */ | ||
| 146 | { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ | 158 | { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ |
| 147 | { USB_DEVICE(0x10C4, 0xEA71) }, /* Infinity GPS-MIC-1 Radio Monophone */ | 159 | { USB_DEVICE(0x10C4, 0xEA71) }, /* Infinity GPS-MIC-1 Radio Monophone */ |
| 160 | { USB_DEVICE(0x10C4, 0xEA7A) }, /* Silicon Labs Windows Update (CP2105) */ | ||
| 161 | { USB_DEVICE(0x10C4, 0xEA7B) }, /* Silicon Labs Windows Update (CP2108) */ | ||
| 148 | { USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */ | 162 | { USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */ |
| 149 | { USB_DEVICE(0x10C4, 0xF002) }, /* Elan Digital Systems USBwave12 */ | 163 | { USB_DEVICE(0x10C4, 0xF002) }, /* Elan Digital Systems USBwave12 */ |
| 150 | { USB_DEVICE(0x10C4, 0xF003) }, /* Elan Digital Systems USBpulse100 */ | 164 | { USB_DEVICE(0x10C4, 0xF003) }, /* Elan Digital Systems USBpulse100 */ |
diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c index 8a201dd53d36..d961f1ec0e08 100644 --- a/drivers/usb/typec/tcpm.c +++ b/drivers/usb/typec/tcpm.c | |||
| @@ -418,17 +418,18 @@ static void _tcpm_log(struct tcpm_port *port, const char *fmt, va_list args) | |||
| 418 | u64 ts_nsec = local_clock(); | 418 | u64 ts_nsec = local_clock(); |
| 419 | unsigned long rem_nsec; | 419 | unsigned long rem_nsec; |
| 420 | 420 | ||
| 421 | mutex_lock(&port->logbuffer_lock); | ||
| 421 | if (!port->logbuffer[port->logbuffer_head]) { | 422 | if (!port->logbuffer[port->logbuffer_head]) { |
| 422 | port->logbuffer[port->logbuffer_head] = | 423 | port->logbuffer[port->logbuffer_head] = |
| 423 | kzalloc(LOG_BUFFER_ENTRY_SIZE, GFP_KERNEL); | 424 | kzalloc(LOG_BUFFER_ENTRY_SIZE, GFP_KERNEL); |
| 424 | if (!port->logbuffer[port->logbuffer_head]) | 425 | if (!port->logbuffer[port->logbuffer_head]) { |
| 426 | mutex_unlock(&port->logbuffer_lock); | ||
| 425 | return; | 427 | return; |
| 428 | } | ||
| 426 | } | 429 | } |
| 427 | 430 | ||
| 428 | vsnprintf(tmpbuffer, sizeof(tmpbuffer), fmt, args); | 431 | vsnprintf(tmpbuffer, sizeof(tmpbuffer), fmt, args); |
| 429 | 432 | ||
| 430 | mutex_lock(&port->logbuffer_lock); | ||
| 431 | |||
| 432 | if (tcpm_log_full(port)) { | 433 | if (tcpm_log_full(port)) { |
| 433 | port->logbuffer_head = max(port->logbuffer_head - 1, 0); | 434 | port->logbuffer_head = max(port->logbuffer_head - 1, 0); |
| 434 | strcpy(tmpbuffer, "overflow"); | 435 | strcpy(tmpbuffer, "overflow"); |
| @@ -3043,7 +3044,8 @@ static void run_state_machine(struct tcpm_port *port) | |||
| 3043 | tcpm_port_is_sink(port) && | 3044 | tcpm_port_is_sink(port) && |
| 3044 | time_is_after_jiffies(port->delayed_runtime)) { | 3045 | time_is_after_jiffies(port->delayed_runtime)) { |
| 3045 | tcpm_set_state(port, SNK_DISCOVERY, | 3046 | tcpm_set_state(port, SNK_DISCOVERY, |
| 3046 | port->delayed_runtime - jiffies); | 3047 | jiffies_to_msecs(port->delayed_runtime - |
| 3048 | jiffies)); | ||
| 3047 | break; | 3049 | break; |
| 3048 | } | 3050 | } |
| 3049 | tcpm_set_state(port, unattached_state(port), 0); | 3051 | tcpm_set_state(port, unattached_state(port), 0); |
diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c index bd5cca5632b3..8d0a6fe748bd 100644 --- a/drivers/usb/typec/ucsi/ucsi.c +++ b/drivers/usb/typec/ucsi/ucsi.c | |||
| @@ -350,6 +350,19 @@ static void ucsi_connector_change(struct work_struct *work) | |||
| 350 | } | 350 | } |
| 351 | 351 | ||
| 352 | if (con->status.change & UCSI_CONSTAT_CONNECT_CHANGE) { | 352 | if (con->status.change & UCSI_CONSTAT_CONNECT_CHANGE) { |
| 353 | typec_set_pwr_role(con->port, con->status.pwr_dir); | ||
| 354 | |||
| 355 | switch (con->status.partner_type) { | ||
| 356 | case UCSI_CONSTAT_PARTNER_TYPE_UFP: | ||
| 357 | typec_set_data_role(con->port, TYPEC_HOST); | ||
| 358 | break; | ||
| 359 | case UCSI_CONSTAT_PARTNER_TYPE_DFP: | ||
| 360 | typec_set_data_role(con->port, TYPEC_DEVICE); | ||
| 361 | break; | ||
| 362 | default: | ||
| 363 | break; | ||
| 364 | } | ||
| 365 | |||
| 353 | if (con->status.connected) | 366 | if (con->status.connected) |
| 354 | ucsi_register_partner(con); | 367 | ucsi_register_partner(con); |
| 355 | else | 368 | else |
diff --git a/drivers/usb/typec/ucsi/ucsi_acpi.c b/drivers/usb/typec/ucsi/ucsi_acpi.c index 44eb4e1ea817..a18112a83fae 100644 --- a/drivers/usb/typec/ucsi/ucsi_acpi.c +++ b/drivers/usb/typec/ucsi/ucsi_acpi.c | |||
| @@ -79,6 +79,11 @@ static int ucsi_acpi_probe(struct platform_device *pdev) | |||
| 79 | return -ENODEV; | 79 | return -ENODEV; |
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | /* This will make sure we can use ioremap_nocache() */ | ||
| 83 | status = acpi_release_memory(ACPI_HANDLE(&pdev->dev), res, 1); | ||
| 84 | if (ACPI_FAILURE(status)) | ||
| 85 | return -ENOMEM; | ||
| 86 | |||
| 82 | /* | 87 | /* |
| 83 | * NOTE: The memory region for the data structures is used also in an | 88 | * NOTE: The memory region for the data structures is used also in an |
| 84 | * operation region, which means ACPI has already reserved it. Therefore | 89 | * operation region, which means ACPI has already reserved it. Therefore |
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 4b35a66383f9..e54f40974eb0 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h | |||
| @@ -443,6 +443,9 @@ int acpi_check_resource_conflict(const struct resource *res); | |||
| 443 | int acpi_check_region(resource_size_t start, resource_size_t n, | 443 | int acpi_check_region(resource_size_t start, resource_size_t n, |
| 444 | const char *name); | 444 | const char *name); |
| 445 | 445 | ||
| 446 | acpi_status acpi_release_memory(acpi_handle handle, struct resource *res, | ||
| 447 | u32 level); | ||
| 448 | |||
| 446 | int acpi_resources_are_enforced(void); | 449 | int acpi_resources_are_enforced(void); |
| 447 | 450 | ||
| 448 | #ifdef CONFIG_HIBERNATION | 451 | #ifdef CONFIG_HIBERNATION |
