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-5.1-rc3' 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 5.1-rc3.

Nothing major at all here, just a small collection of fixes for
reported issues, and potential problems with error handling paths.
Also a few new device ids, as normal.

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

* tag 'usb-5.1-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (25 commits)
USB: serial: option: add Olicard 600
USB: serial: cp210x: add new device id
usb: u132-hcd: fix resource leak
usb: cdc-acm: fix race during wakeup blocking TX traffic
usb: mtu3: fix EXTCON dependency
usb: usb251xb: fix to avoid potential NULL pointer dereference
usb: core: Try generic PHY_MODE_USB_HOST if usb_phy_roothub_set_mode fails
phy: sun4i-usb: Support set_mode to USB_HOST for non-OTG PHYs
xhci: Don't let USB3 ports stuck in polling state prevent suspend
usb: xhci: dbc: Don't free all memory with spinlock held
xhci: Fix port resume done detection for SS ports with LPM enabled
USB: serial: mos7720: fix mos_parport refcount imbalance on error path
USB: gadget: f_hid: fix deadlock in f_hidg_write()
usb: gadget: net2272: Fix net2272_dequeue()
usb: gadget: net2280: Fix net2280_dequeue()
usb: gadget: net2280: Fix overrun of OUT messages
usb: dwc3: pci: add support for Comet Lake PCH ID
usb: usb251xb: Remove unnecessary comparison of unsigned integer with >= 0
usb: common: Consider only available nodes for dr_mode
usb: typec: tcpm: Try PD-2.0 if sink does not respond to 3.0 source-caps
...

+110 -37
+4 -1
drivers/phy/allwinner/phy-sun4i-usb.c
··· 485 485 struct sun4i_usb_phy_data *data = to_sun4i_usb_phy_data(phy); 486 486 int new_mode; 487 487 488 - if (phy->index != 0) 488 + if (phy->index != 0) { 489 + if (mode == PHY_MODE_USB_HOST) 490 + return 0; 489 491 return -EINVAL; 492 + } 490 493 491 494 switch (mode) { 492 495 case PHY_MODE_USB_HOST:
+1 -3
drivers/usb/class/cdc-acm.c
··· 558 558 clear_bit(EVENT_RX_STALL, &acm->flags); 559 559 } 560 560 561 - if (test_bit(EVENT_TTY_WAKEUP, &acm->flags)) { 561 + if (test_and_clear_bit(EVENT_TTY_WAKEUP, &acm->flags)) 562 562 tty_port_tty_wakeup(&acm->port); 563 - clear_bit(EVENT_TTY_WAKEUP, &acm->flags); 564 - } 565 563 } 566 564 567 565 /*
+2
drivers/usb/common/common.c
··· 145 145 146 146 do { 147 147 controller = of_find_node_with_property(controller, "phys"); 148 + if (!of_device_is_available(controller)) 149 + continue; 148 150 index = 0; 149 151 do { 150 152 if (arg0 == -1) {
+3
drivers/usb/core/hcd.c
··· 2742 2742 retval = usb_phy_roothub_set_mode(hcd->phy_roothub, 2743 2743 PHY_MODE_USB_HOST_SS); 2744 2744 if (retval) 2745 + retval = usb_phy_roothub_set_mode(hcd->phy_roothub, 2746 + PHY_MODE_USB_HOST); 2747 + if (retval) 2745 2748 goto err_usb_phy_roothub_power_on; 2746 2749 2747 2750 retval = usb_phy_roothub_power_on(hcd->phy_roothub);
+4
drivers/usb/dwc3/dwc3-pci.c
··· 29 29 #define PCI_DEVICE_ID_INTEL_BXT_M 0x1aaa 30 30 #define PCI_DEVICE_ID_INTEL_APL 0x5aaa 31 31 #define PCI_DEVICE_ID_INTEL_KBP 0xa2b0 32 + #define PCI_DEVICE_ID_INTEL_CMLH 0x02ee 32 33 #define PCI_DEVICE_ID_INTEL_GLK 0x31aa 33 34 #define PCI_DEVICE_ID_INTEL_CNPLP 0x9dee 34 35 #define PCI_DEVICE_ID_INTEL_CNPH 0xa36e ··· 305 304 306 305 { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MRFLD), 307 306 (kernel_ulong_t) &dwc3_pci_mrfld_properties, }, 307 + 308 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CMLH), 309 + (kernel_ulong_t) &dwc3_pci_intel_properties, }, 308 310 309 311 { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_SPTLP), 310 312 (kernel_ulong_t) &dwc3_pci_intel_properties, },
+3 -3
drivers/usb/gadget/function/f_hid.c
··· 391 391 req->complete = f_hidg_req_complete; 392 392 req->context = hidg; 393 393 394 + spin_unlock_irqrestore(&hidg->write_spinlock, flags); 395 + 394 396 status = usb_ep_queue(hidg->in_ep, req, GFP_ATOMIC); 395 397 if (status < 0) { 396 398 ERROR(hidg->func.config->cdev, 397 399 "usb_ep_queue error on int endpoint %zd\n", status); 398 - goto release_write_pending_unlocked; 400 + goto release_write_pending; 399 401 } else { 400 402 status = count; 401 403 } 402 - spin_unlock_irqrestore(&hidg->write_spinlock, flags); 403 404 404 405 return status; 405 406 release_write_pending: 406 407 spin_lock_irqsave(&hidg->write_spinlock, flags); 407 - release_write_pending_unlocked: 408 408 hidg->write_pending = 0; 409 409 spin_unlock_irqrestore(&hidg->write_spinlock, flags); 410 410
+1
drivers/usb/gadget/udc/net2272.c
··· 945 945 break; 946 946 } 947 947 if (&req->req != _req) { 948 + ep->stopped = stopped; 948 949 spin_unlock_irqrestore(&ep->dev->lock, flags); 949 950 return -EINVAL; 950 951 }
+3 -5
drivers/usb/gadget/udc/net2280.c
··· 866 866 (void) readl(&ep->dev->pci->pcimstctl); 867 867 868 868 writel(BIT(DMA_START), &dma->dmastat); 869 - 870 - if (!ep->is_in) 871 - stop_out_naking(ep); 872 869 } 873 870 874 871 static void start_dma(struct net2280_ep *ep, struct net2280_request *req) ··· 904 907 writel(BIT(DMA_START), &dma->dmastat); 905 908 return; 906 909 } 910 + stop_out_naking(ep); 907 911 } 908 912 909 913 tmp = dmactl_default; ··· 1273 1275 break; 1274 1276 } 1275 1277 if (&req->req != _req) { 1278 + ep->stopped = stopped; 1276 1279 spin_unlock_irqrestore(&ep->dev->lock, flags); 1277 - dev_err(&ep->dev->pdev->dev, "%s: Request mismatch\n", 1278 - __func__); 1280 + ep_dbg(ep->dev, "%s: Request mismatch\n", __func__); 1279 1281 return -EINVAL; 1280 1282 } 1281 1283
+3
drivers/usb/host/u132-hcd.c
··· 3204 3204 printk(KERN_INFO "driver %s\n", hcd_name); 3205 3205 workqueue = create_singlethread_workqueue("u132"); 3206 3206 retval = platform_driver_register(&u132_platform_driver); 3207 + if (retval) 3208 + destroy_workqueue(workqueue); 3209 + 3207 3210 return retval; 3208 3211 } 3209 3212
+3 -2
drivers/usb/host/xhci-dbgcap.c
··· 516 516 return -1; 517 517 518 518 writel(0, &dbc->regs->control); 519 - xhci_dbc_mem_cleanup(xhci); 520 519 dbc->state = DS_DISABLED; 521 520 522 521 return 0; ··· 561 562 ret = xhci_do_dbc_stop(xhci); 562 563 spin_unlock_irqrestore(&dbc->lock, flags); 563 564 564 - if (!ret) 565 + if (!ret) { 566 + xhci_dbc_mem_cleanup(xhci); 565 567 pm_runtime_put_sync(xhci_to_hcd(xhci)->self.controller); 568 + } 566 569 } 567 570 568 571 static void
+12 -7
drivers/usb/host/xhci-hub.c
··· 1545 1545 port_index = max_ports; 1546 1546 while (port_index--) { 1547 1547 u32 t1, t2; 1548 - 1548 + int retries = 10; 1549 + retry: 1549 1550 t1 = readl(ports[port_index]->addr); 1550 1551 t2 = xhci_port_state_to_neutral(t1); 1551 1552 portsc_buf[port_index] = 0; 1552 1553 1553 - /* Bail out if a USB3 port has a new device in link training */ 1554 - if ((hcd->speed >= HCD_USB3) && 1554 + /* 1555 + * Give a USB3 port in link training time to finish, but don't 1556 + * prevent suspend as port might be stuck 1557 + */ 1558 + if ((hcd->speed >= HCD_USB3) && retries-- && 1555 1559 (t1 & PORT_PLS_MASK) == XDEV_POLLING) { 1556 - bus_state->bus_suspended = 0; 1557 1560 spin_unlock_irqrestore(&xhci->lock, flags); 1558 - xhci_dbg(xhci, "Bus suspend bailout, port in polling\n"); 1559 - return -EBUSY; 1561 + msleep(XHCI_PORT_POLLING_LFPS_TIME); 1562 + spin_lock_irqsave(&xhci->lock, flags); 1563 + xhci_dbg(xhci, "port %d polling in bus suspend, waiting\n", 1564 + port_index); 1565 + goto retry; 1560 1566 } 1561 - 1562 1567 /* suspend ports in U0, or bail out for new connect changes */ 1563 1568 if ((t1 & PORT_PE) && (t1 & PORT_PLS_MASK) == XDEV_U0) { 1564 1569 if ((t1 & PORT_CSC) && wake_enabled) {
+1
drivers/usb/host/xhci-rcar.c
··· 246 246 if (!xhci_rcar_wait_for_pll_active(hcd)) 247 247 return -ETIMEDOUT; 248 248 249 + xhci->quirks |= XHCI_TRUST_TX_LENGTH; 249 250 return xhci_rcar_download_firmware(hcd); 250 251 } 251 252
+6 -3
drivers/usb/host/xhci-ring.c
··· 1647 1647 } 1648 1648 } 1649 1649 1650 - if ((portsc & PORT_PLC) && (portsc & PORT_PLS_MASK) == XDEV_U0 && 1651 - DEV_SUPERSPEED_ANY(portsc)) { 1650 + if ((portsc & PORT_PLC) && 1651 + DEV_SUPERSPEED_ANY(portsc) && 1652 + ((portsc & PORT_PLS_MASK) == XDEV_U0 || 1653 + (portsc & PORT_PLS_MASK) == XDEV_U1 || 1654 + (portsc & PORT_PLS_MASK) == XDEV_U2)) { 1652 1655 xhci_dbg(xhci, "resume SS port %d finished\n", port_id); 1653 - /* We've just brought the device into U0 through either the 1656 + /* We've just brought the device into U0/1/2 through either the 1654 1657 * Resume state after a device remote wakeup, or through the 1655 1658 * U3Exit state after a host-initiated resume. If it's a device 1656 1659 * initiated remote wake, don't pass up the link state change,
+8
drivers/usb/host/xhci.h
··· 452 452 */ 453 453 #define XHCI_DEFAULT_BESL 4 454 454 455 + /* 456 + * USB3 specification define a 360ms tPollingLFPSTiemout for USB3 ports 457 + * to complete link training. usually link trainig completes much faster 458 + * so check status 10 times with 36ms sleep in places we need to wait for 459 + * polling to complete. 460 + */ 461 + #define XHCI_PORT_POLLING_LFPS_TIME 36 462 + 455 463 /** 456 464 * struct xhci_intr_reg - Interrupt Register Set 457 465 * @irq_pending: IMAN - Interrupt Management Register. Used to enable
+2 -2
drivers/usb/misc/usb251xb.c
··· 547 547 */ 548 548 hub->port_swap = USB251XB_DEF_PORT_SWAP; 549 549 of_property_for_each_u32(np, "swap-dx-lanes", prop, p, port) { 550 - if ((port >= 0) && (port <= data->port_cnt)) 550 + if (port <= data->port_cnt) 551 551 hub->port_swap |= BIT(port); 552 552 } 553 553 ··· 612 612 dev); 613 613 int err; 614 614 615 - if (np) { 615 + if (np && of_id) { 616 616 err = usb251xb_get_ofdata(hub, 617 617 (struct usb251xb_data *)of_id->data); 618 618 if (err) {
+1
drivers/usb/mtu3/Kconfig
··· 6 6 tristate "MediaTek USB3 Dual Role controller" 7 7 depends on USB || USB_GADGET 8 8 depends on ARCH_MEDIATEK || COMPILE_TEST 9 + depends on EXTCON || !EXTCON 9 10 select USB_XHCI_MTK if USB_SUPPORT && USB_XHCI_HCD 10 11 help 11 12 Say Y or M here if your system runs on MediaTek SoCs with
+1
drivers/usb/serial/cp210x.c
··· 80 80 { USB_DEVICE(0x10C4, 0x804E) }, /* Software Bisque Paramount ME build-in converter */ 81 81 { USB_DEVICE(0x10C4, 0x8053) }, /* Enfora EDG1228 */ 82 82 { USB_DEVICE(0x10C4, 0x8054) }, /* Enfora GSM2228 */ 83 + { USB_DEVICE(0x10C4, 0x8056) }, /* Lorenz Messtechnik devices */ 83 84 { USB_DEVICE(0x10C4, 0x8066) }, /* Argussoft In-System Programmer */ 84 85 { USB_DEVICE(0x10C4, 0x806F) }, /* IMS USB to RS422 Converter Cable */ 85 86 { USB_DEVICE(0x10C4, 0x807A) }, /* Crumb128 board */
+2
drivers/usb/serial/ftdi_sio.c
··· 609 609 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, 610 610 { USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLXM_PID), 611 611 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, 612 + { USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLX_PLUS_PID) }, 613 + { USB_DEVICE(FTDI_VID, FTDI_NT_ORION_IO_PID) }, 612 614 { USB_DEVICE(FTDI_VID, FTDI_SYNAPSE_SS200_PID) }, 613 615 { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX_PID) }, 614 616 { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX2_PID) },
+3 -1
drivers/usb/serial/ftdi_sio_ids.h
··· 567 567 /* 568 568 * NovaTech product ids (FTDI_VID) 569 569 */ 570 - #define FTDI_NT_ORIONLXM_PID 0x7c90 /* OrionLXm Substation Automation Platform */ 570 + #define FTDI_NT_ORIONLXM_PID 0x7c90 /* OrionLXm Substation Automation Platform */ 571 + #define FTDI_NT_ORIONLX_PLUS_PID 0x7c91 /* OrionLX+ Substation Automation Platform */ 572 + #define FTDI_NT_ORION_IO_PID 0x7c92 /* Orion I/O */ 571 573 572 574 /* 573 575 * Synapse Wireless product ids (FTDI_VID)
+2 -2
drivers/usb/serial/mos7720.c
··· 366 366 if (!urbtrack) 367 367 return -ENOMEM; 368 368 369 - kref_get(&mos_parport->ref_count); 370 - urbtrack->mos_parport = mos_parport; 371 369 urbtrack->urb = usb_alloc_urb(0, GFP_ATOMIC); 372 370 if (!urbtrack->urb) { 373 371 kfree(urbtrack); ··· 386 388 usb_sndctrlpipe(usbdev, 0), 387 389 (unsigned char *)urbtrack->setup, 388 390 NULL, 0, async_complete, urbtrack); 391 + kref_get(&mos_parport->ref_count); 392 + urbtrack->mos_parport = mos_parport; 389 393 kref_init(&urbtrack->ref_count); 390 394 INIT_LIST_HEAD(&urbtrack->urblist_entry); 391 395
+12 -5
drivers/usb/serial/option.c
··· 246 246 #define QUECTEL_PRODUCT_EC25 0x0125 247 247 #define QUECTEL_PRODUCT_BG96 0x0296 248 248 #define QUECTEL_PRODUCT_EP06 0x0306 249 + #define QUECTEL_PRODUCT_EM12 0x0512 249 250 250 251 #define CMOTECH_VENDOR_ID 0x16d8 251 252 #define CMOTECH_PRODUCT_6001 0x6001 ··· 1067 1066 .driver_info = RSVD(3) }, 1068 1067 { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ 1069 1068 { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ 1070 - { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ 1069 + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000), /* SIMCom SIM5218 */ 1070 + .driver_info = NCTRL(0) | NCTRL(1) | NCTRL(2) | NCTRL(3) | RSVD(4) }, 1071 1071 /* Quectel products using Qualcomm vendor ID */ 1072 1072 { USB_DEVICE(QUALCOMM_VENDOR_ID, QUECTEL_PRODUCT_UC15)}, 1073 1073 { USB_DEVICE(QUALCOMM_VENDOR_ID, QUECTEL_PRODUCT_UC20), ··· 1089 1087 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0xff, 0xff), 1090 1088 .driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | NUMEP2 }, 1091 1089 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0, 0) }, 1090 + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM12, 0xff, 0xff, 0xff), 1091 + .driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | NUMEP2 }, 1092 + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM12, 0xff, 0, 0) }, 1092 1093 { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, 1093 1094 { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, 1094 1095 { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), ··· 1945 1940 .driver_info = RSVD(4) }, 1946 1941 { USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7e35, 0xff), /* D-Link DWM-222 */ 1947 1942 .driver_info = RSVD(4) }, 1948 - { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */ 1949 - { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */ 1950 - { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x7e11, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/A3 */ 1951 - { USB_DEVICE_INTERFACE_CLASS(0x2020, 0x4000, 0xff) }, /* OLICARD300 - MT6225 */ 1943 + { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */ 1944 + { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */ 1945 + { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x7e11, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/A3 */ 1946 + { USB_DEVICE_INTERFACE_CLASS(0x2020, 0x2031, 0xff), /* Olicard 600 */ 1947 + .driver_info = RSVD(4) }, 1948 + { USB_DEVICE_INTERFACE_CLASS(0x2020, 0x4000, 0xff) }, /* OLICARD300 - MT6225 */ 1952 1949 { USB_DEVICE(INOVIA_VENDOR_ID, INOVIA_SEW858) }, 1953 1950 { USB_DEVICE(VIATELECOM_VENDOR_ID, VIATELECOM_PRODUCT_CDS7) }, 1954 1951 { USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_WMD200, 0xff, 0xff, 0xff) },
+26 -1
drivers/usb/typec/tcpm/tcpm.c
··· 37 37 S(SRC_ATTACHED), \ 38 38 S(SRC_STARTUP), \ 39 39 S(SRC_SEND_CAPABILITIES), \ 40 + S(SRC_SEND_CAPABILITIES_TIMEOUT), \ 40 41 S(SRC_NEGOTIATE_CAPABILITIES), \ 41 42 S(SRC_TRANSITION_SUPPLY), \ 42 43 S(SRC_READY), \ ··· 2967 2966 /* port->hard_reset_count = 0; */ 2968 2967 port->caps_count = 0; 2969 2968 port->pd_capable = true; 2970 - tcpm_set_state_cond(port, hard_reset_state(port), 2969 + tcpm_set_state_cond(port, SRC_SEND_CAPABILITIES_TIMEOUT, 2971 2970 PD_T_SEND_SOURCE_CAP); 2971 + } 2972 + break; 2973 + case SRC_SEND_CAPABILITIES_TIMEOUT: 2974 + /* 2975 + * Error recovery for a PD_DATA_SOURCE_CAP reply timeout. 2976 + * 2977 + * PD 2.0 sinks are supposed to accept src-capabilities with a 2978 + * 3.0 header and simply ignore any src PDOs which the sink does 2979 + * not understand such as PPS but some 2.0 sinks instead ignore 2980 + * the entire PD_DATA_SOURCE_CAP message, causing contract 2981 + * negotiation to fail. 2982 + * 2983 + * After PD_N_HARD_RESET_COUNT hard-reset attempts, we try 2984 + * sending src-capabilities with a lower PD revision to 2985 + * make these broken sinks work. 2986 + */ 2987 + if (port->hard_reset_count < PD_N_HARD_RESET_COUNT) { 2988 + tcpm_set_state(port, HARD_RESET_SEND, 0); 2989 + } else if (port->negotiated_rev > PD_REV20) { 2990 + port->negotiated_rev--; 2991 + port->hard_reset_count = 0; 2992 + tcpm_set_state(port, SRC_SEND_CAPABILITIES, 0); 2993 + } else { 2994 + tcpm_set_state(port, hard_reset_state(port), 0); 2972 2995 } 2973 2996 break; 2974 2997 case SRC_NEGOTIATE_CAPABILITIES:
+7 -2
drivers/usb/typec/tcpm/wcove.c
··· 615 615 wcove->dev = &pdev->dev; 616 616 wcove->regmap = pmic->regmap; 617 617 618 - irq = regmap_irq_get_virq(pmic->irq_chip_data_chgr, 619 - platform_get_irq(pdev, 0)); 618 + irq = platform_get_irq(pdev, 0); 619 + if (irq < 0) { 620 + dev_err(&pdev->dev, "Failed to get IRQ: %d\n", irq); 621 + return irq; 622 + } 623 + 624 + irq = regmap_irq_get_virq(pmic->irq_chip_data_chgr, irq); 620 625 if (irq < 0) 621 626 return irq; 622 627