Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'usb-6.11-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb

Pull USB fixes from Greg KH:
"Here are some small USB fixes for 6.11-rc6. Included in here are:

- dwc3 driver fixes for reported issues

- MAINTAINER file update, marking a driver as unsupported :(

- cdnsp driver fixes

- USB gadget driver fix

- USB sysfs fix

- other tiny fixes

- new device ids for usb serial driver

All of these have been in linux-next this week with no reported
issues"

* tag 'usb-6.11-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
USB: serial: option: add MeiG Smart SRM825L
usb: cdnsp: fix for Link TRB with TC
usb: dwc3: st: add missing depopulate in probe error path
usb: dwc3: st: fix probed platform device ref count on probe error path
usb: dwc3: ep0: Don't reset resource alloc flag (including ep0)
usb: core: sysfs: Unmerge @usb3_hardware_lpm_attr_group in remove_power_attributes()
usb: typec: fsa4480: Relax CHIP_ID check
usb: dwc3: xilinx: add missing depopulate in probe error path
usb: dwc3: omap: add missing depopulate in probe error path
dt-bindings: usb: microchip,usb2514: Fix reference USB device schema
usb: gadget: uvc: queue pump work in uvcg_video_enable()
cdc-acm: Add DISABLE_ECHO quirk for GE HealthCare UI Controller
usb: cdnsp: fix incorrect index in cdnsp_get_hw_deq function
usb: dwc3: core: Prevent USB core invalid event buffer address access
MAINTAINERS: Mark UVC gadget driver as orphan

+78 -18
+8 -1
Documentation/devicetree/bindings/usb/microchip,usb2514.yaml
··· 10 10 - Fabio Estevam <festevam@gmail.com> 11 11 12 12 allOf: 13 - - $ref: usb-hcd.yaml# 13 + - $ref: usb-device.yaml# 14 14 15 15 properties: 16 16 compatible: ··· 35 35 required: 36 36 - compatible 37 37 - reg 38 + 39 + patternProperties: 40 + "^.*@[0-9a-f]{1,2}$": 41 + description: The hard wired USB devices 42 + type: object 43 + $ref: /schemas/usb/usb-device.yaml 44 + additionalProperties: true 38 45 39 46 unevaluatedProperties: false 40 47
+1 -3
MAINTAINERS
··· 23848 23848 F: include/uapi/linux/uvcvideo.h 23849 23849 23850 23850 USB WEBCAM GADGET 23851 - M: Laurent Pinchart <laurent.pinchart@ideasonboard.com> 23852 - M: Daniel Scally <dan.scally@ideasonboard.com> 23853 23851 L: linux-usb@vger.kernel.org 23854 - S: Maintained 23852 + S: Orphan 23855 23853 F: drivers/usb/gadget/function/*uvc* 23856 23854 F: drivers/usb/gadget/legacy/webcam.c 23857 23855 F: include/uapi/linux/usb/g_uvc.h
+3
drivers/usb/cdns3/cdnsp-gadget.h
··· 811 811 * generate Missed Service Error Event. 812 812 * Set skip flag when receive a Missed Service Error Event and 813 813 * process the missed tds on the endpoint ring. 814 + * @wa1_nop_trb: hold pointer to NOP trb. 814 815 */ 815 816 struct cdnsp_ep { 816 817 struct usb_ep endpoint; ··· 839 838 #define EP_UNCONFIGURED BIT(7) 840 839 841 840 bool skip; 841 + union cdnsp_trb *wa1_nop_trb; 842 + 842 843 }; 843 844 844 845 /**
+29 -1
drivers/usb/cdns3/cdnsp-ring.c
··· 402 402 struct cdnsp_stream_ctx *st_ctx; 403 403 struct cdnsp_ep *pep; 404 404 405 - pep = &pdev->eps[stream_id]; 405 + pep = &pdev->eps[ep_index]; 406 406 407 407 if (pep->ep_state & EP_HAS_STREAMS) { 408 408 st_ctx = &pep->stream_info.stream_ctx_array[stream_id]; ··· 1905 1905 return ret; 1906 1906 1907 1907 /* 1908 + * workaround 1: STOP EP command on LINK TRB with TC bit set to 1 1909 + * causes that internal cycle bit can have incorrect state after 1910 + * command complete. In consequence empty transfer ring can be 1911 + * incorrectly detected when EP is resumed. 1912 + * NOP TRB before LINK TRB avoid such scenario. STOP EP command is 1913 + * then on NOP TRB and internal cycle bit is not changed and have 1914 + * correct value. 1915 + */ 1916 + if (pep->wa1_nop_trb) { 1917 + field = le32_to_cpu(pep->wa1_nop_trb->trans_event.flags); 1918 + field ^= TRB_CYCLE; 1919 + 1920 + pep->wa1_nop_trb->trans_event.flags = cpu_to_le32(field); 1921 + pep->wa1_nop_trb = NULL; 1922 + } 1923 + 1924 + /* 1908 1925 * Don't give the first TRB to the hardware (by toggling the cycle bit) 1909 1926 * until we've finished creating all the other TRBs. The ring's cycle 1910 1927 * state may change as we enqueue the other TRBs, so save it too. ··· 2014 1997 } 2015 1998 block_len -= sent_len; 2016 1999 send_addr = addr; 2000 + } 2001 + 2002 + if (cdnsp_trb_is_link(ring->enqueue + 1)) { 2003 + field = TRB_TYPE(TRB_TR_NOOP) | TRB_IOC; 2004 + if (!ring->cycle_state) 2005 + field |= TRB_CYCLE; 2006 + 2007 + pep->wa1_nop_trb = ring->enqueue; 2008 + 2009 + cdnsp_queue_trb(pdev, ring, 0, 0x0, 0x0, 2010 + TRB_INTR_TARGET(0), field); 2017 2011 } 2018 2012 2019 2013 cdnsp_check_trb_math(preq, enqd_len);
+3
drivers/usb/class/cdc-acm.c
··· 1761 1761 { USB_DEVICE(0x11ca, 0x0201), /* VeriFone Mx870 Gadget Serial */ 1762 1762 .driver_info = SINGLE_RX_URB, 1763 1763 }, 1764 + { USB_DEVICE(0x1901, 0x0006), /* GE Healthcare Patient Monitor UI Controller */ 1765 + .driver_info = DISABLE_ECHO, /* DISABLE ECHO in termios flag */ 1766 + }, 1764 1767 { USB_DEVICE(0x1965, 0x0018), /* Uniden UBC125XLT */ 1765 1768 .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ 1766 1769 },
+1
drivers/usb/core/sysfs.c
··· 670 670 671 671 static void remove_power_attributes(struct device *dev) 672 672 { 673 + sysfs_unmerge_group(&dev->kobj, &usb3_hardware_lpm_attr_group); 673 674 sysfs_unmerge_group(&dev->kobj, &usb2_hardware_lpm_attr_group); 674 675 sysfs_unmerge_group(&dev->kobj, &power_attr_group); 675 676 }
+8
drivers/usb/dwc3/core.c
··· 564 564 void dwc3_event_buffers_cleanup(struct dwc3 *dwc) 565 565 { 566 566 struct dwc3_event_buffer *evt; 567 + u32 reg; 567 568 568 569 if (!dwc->ev_buf) 570 + return; 571 + /* 572 + * Exynos platforms may not be able to access event buffer if the 573 + * controller failed to halt on dwc3_core_exit(). 574 + */ 575 + reg = dwc3_readl(dwc->regs, DWC3_DSTS); 576 + if (!(reg & DWC3_DSTS_DEVCTRLHLT)) 569 577 return; 570 578 571 579 evt = dwc->ev_buf;
+3 -1
drivers/usb/dwc3/dwc3-omap.c
··· 522 522 if (ret) { 523 523 dev_err(dev, "failed to request IRQ #%d --> %d\n", 524 524 omap->irq, ret); 525 - goto err1; 525 + goto err2; 526 526 } 527 527 dwc3_omap_enable_irqs(omap); 528 528 return 0; 529 529 530 + err2: 531 + of_platform_depopulate(dev); 530 532 err1: 531 533 pm_runtime_put_sync(dev); 532 534 pm_runtime_disable(dev);
+7 -9
drivers/usb/dwc3/dwc3-st.c
··· 219 219 dwc3_data->regmap = regmap; 220 220 221 221 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "syscfg-reg"); 222 - if (!res) { 223 - ret = -ENXIO; 224 - goto undo_platform_dev_alloc; 225 - } 222 + if (!res) 223 + return -ENXIO; 226 224 227 225 dwc3_data->syscfg_reg_off = res->start; 228 226 ··· 231 233 devm_reset_control_get_exclusive(dev, "powerdown"); 232 234 if (IS_ERR(dwc3_data->rstc_pwrdn)) { 233 235 dev_err(&pdev->dev, "could not get power controller\n"); 234 - ret = PTR_ERR(dwc3_data->rstc_pwrdn); 235 - goto undo_platform_dev_alloc; 236 + return PTR_ERR(dwc3_data->rstc_pwrdn); 236 237 } 237 238 238 239 /* Manage PowerDown */ ··· 266 269 if (!child_pdev) { 267 270 dev_err(dev, "failed to find dwc3 core device\n"); 268 271 ret = -ENODEV; 269 - goto err_node_put; 272 + goto depopulate; 270 273 } 271 274 272 275 dwc3_data->dr_mode = usb_get_dr_mode(&child_pdev->dev); ··· 282 285 ret = st_dwc3_drd_init(dwc3_data); 283 286 if (ret) { 284 287 dev_err(dev, "drd initialisation failed\n"); 288 + of_platform_depopulate(dev); 285 289 goto undo_softreset; 286 290 } 287 291 ··· 292 294 platform_set_drvdata(pdev, dwc3_data); 293 295 return 0; 294 296 297 + depopulate: 298 + of_platform_depopulate(dev); 295 299 err_node_put: 296 300 of_node_put(child); 297 301 undo_softreset: 298 302 reset_control_assert(dwc3_data->rstc_rst); 299 303 undo_powerdown: 300 304 reset_control_assert(dwc3_data->rstc_pwrdn); 301 - undo_platform_dev_alloc: 302 - platform_device_put(pdev); 303 305 return ret; 304 306 } 305 307
+6 -1
drivers/usb/dwc3/dwc3-xilinx.c
··· 327 327 goto err_pm_set_suspended; 328 328 329 329 pm_suspend_ignore_children(dev, false); 330 - return pm_runtime_resume_and_get(dev); 330 + ret = pm_runtime_resume_and_get(dev); 331 + if (ret < 0) 332 + goto err_pm_set_suspended; 333 + 334 + return 0; 331 335 332 336 err_pm_set_suspended: 337 + of_platform_depopulate(dev); 333 338 pm_runtime_set_suspended(dev); 334 339 335 340 err_clk_put:
+2 -1
drivers/usb/dwc3/ep0.c
··· 232 232 /* stall is always issued on EP0 */ 233 233 dep = dwc->eps[0]; 234 234 __dwc3_gadget_ep_set_halt(dep, 1, false); 235 - dep->flags = DWC3_EP_ENABLED; 235 + dep->flags &= DWC3_EP_RESOURCE_ALLOCATED; 236 + dep->flags |= DWC3_EP_ENABLED; 236 237 dwc->delayed_status = false; 237 238 238 239 if (!list_empty(&dep->pending_list)) {
+1
drivers/usb/gadget/function/uvc_video.c
··· 753 753 video->req_int_count = 0; 754 754 755 755 uvc_video_ep_queue_initial_requests(video); 756 + queue_work(video->async_wq, &video->pump); 756 757 757 758 return ret; 758 759 }
+5
drivers/usb/serial/option.c
··· 619 619 620 620 /* MeiG Smart Technology products */ 621 621 #define MEIGSMART_VENDOR_ID 0x2dee 622 + /* MeiG Smart SRM825L based on Qualcomm 315 */ 623 + #define MEIGSMART_PRODUCT_SRM825L 0x4d22 622 624 /* MeiG Smart SLM320 based on UNISOC UIS8910 */ 623 625 #define MEIGSMART_PRODUCT_SLM320 0x4d41 624 626 ··· 2368 2366 { USB_DEVICE_AND_INTERFACE_INFO(UNISOC_VENDOR_ID, TOZED_PRODUCT_LT70C, 0xff, 0, 0) }, 2369 2367 { USB_DEVICE_AND_INTERFACE_INFO(UNISOC_VENDOR_ID, LUAT_PRODUCT_AIR720U, 0xff, 0, 0) }, 2370 2368 { USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SLM320, 0xff, 0, 0) }, 2369 + { USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x30) }, 2370 + { USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x40) }, 2371 + { USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x60) }, 2371 2372 { } /* Terminating entry */ 2372 2373 }; 2373 2374 MODULE_DEVICE_TABLE(usb, option_ids);
+1 -1
drivers/usb/typec/mux/fsa4480.c
··· 274 274 return dev_err_probe(dev, PTR_ERR(fsa->regmap), "failed to initialize regmap\n"); 275 275 276 276 ret = regmap_read(fsa->regmap, FSA4480_DEVICE_ID, &val); 277 - if (ret || !val) 277 + if (ret) 278 278 return dev_err_probe(dev, -ENODEV, "FSA4480 not found\n"); 279 279 280 280 dev_dbg(dev, "Found FSA4480 v%lu.%lu (Vendor ID = %lu)\n",