提交 da1b4042 编写于 作者: L Linus Torvalds

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

Pull USB fixes from Greg KH:
 "Here are a number of small USB driver fixes for 5.18-rc5 for some
  reported issues and new quirks. They include:

   - dwc3 driver fixes

   - xhci driver fixes

   - typec driver fixes

   - new usb-serial driver ids

   - added new USB devices to existing quirk tables

   - other tiny fixes

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

* tag 'usb-5.18-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (31 commits)
  usb: phy: generic: Get the vbus supply
  usb: dwc3: gadget: Return proper request status
  usb: dwc3: pci: add support for the Intel Meteor Lake-P
  usb: dwc3: core: Only handle soft-reset in DCTL
  usb: gadget: configfs: clear deactivation flag in configfs_composite_unbind()
  usb: misc: eud: Fix an error handling path in eud_probe()
  usb: core: Don't hold the device lock while sleeping in do_proc_control()
  usb: dwc3: Try usb-role-switch first in dwc3_drd_init
  usb: dwc3: core: Fix tx/rx threshold settings
  usb: mtu3: fix USB 3.0 dual-role-switch from device to host
  xhci: Enable runtime PM on second Alderlake controller
  usb: dwc3: fix backwards compat with rockchip devices
  dt-bindings: usb: samsung,exynos-usb2: add missing required reg
  usb: misc: fix improper handling of refcount in uss720_probe()
  USB: Fix ehci infinite suspend-resume loop issue in zhaoxin
  usb: typec: tcpm: Fix undefined behavior due to shift overflowing the constant
  usb: typec: rt1719: Fix build error without CONFIG_POWER_SUPPLY
  usb: typec: ucsi: Fix role swapping
  usb: typec: ucsi: Fix reuse of completion structure
  usb: xhci: tegra:Fix PM usage reference leak of tegra_xusb_unpowergate_partitions
  ...
...@@ -62,6 +62,7 @@ required: ...@@ -62,6 +62,7 @@ required:
- interrupts - interrupts
- phys - phys
- phy-names - phy-names
- reg
allOf: allOf:
- if: - if:
......
...@@ -2684,6 +2684,7 @@ int __cdns3_gadget_ep_clear_halt(struct cdns3_endpoint *priv_ep) ...@@ -2684,6 +2684,7 @@ int __cdns3_gadget_ep_clear_halt(struct cdns3_endpoint *priv_ep)
struct usb_request *request; struct usb_request *request;
struct cdns3_request *priv_req; struct cdns3_request *priv_req;
struct cdns3_trb *trb = NULL; struct cdns3_trb *trb = NULL;
struct cdns3_trb trb_tmp;
int ret; int ret;
int val; int val;
...@@ -2693,8 +2694,10 @@ int __cdns3_gadget_ep_clear_halt(struct cdns3_endpoint *priv_ep) ...@@ -2693,8 +2694,10 @@ int __cdns3_gadget_ep_clear_halt(struct cdns3_endpoint *priv_ep)
if (request) { if (request) {
priv_req = to_cdns3_request(request); priv_req = to_cdns3_request(request);
trb = priv_req->trb; trb = priv_req->trb;
if (trb) if (trb) {
trb_tmp = *trb;
trb->control = trb->control ^ cpu_to_le32(TRB_CYCLE); trb->control = trb->control ^ cpu_to_le32(TRB_CYCLE);
}
} }
writel(EP_CMD_CSTALL | EP_CMD_EPRST, &priv_dev->regs->ep_cmd); writel(EP_CMD_CSTALL | EP_CMD_EPRST, &priv_dev->regs->ep_cmd);
...@@ -2709,7 +2712,7 @@ int __cdns3_gadget_ep_clear_halt(struct cdns3_endpoint *priv_ep) ...@@ -2709,7 +2712,7 @@ int __cdns3_gadget_ep_clear_halt(struct cdns3_endpoint *priv_ep)
if (request) { if (request) {
if (trb) if (trb)
trb->control = trb->control ^ cpu_to_le32(TRB_CYCLE); *trb = trb_tmp;
cdns3_rearm_transfer(priv_ep, 1); cdns3_rearm_transfer(priv_ep, 1);
} }
......
...@@ -1209,12 +1209,16 @@ static int do_proc_control(struct usb_dev_state *ps, ...@@ -1209,12 +1209,16 @@ static int do_proc_control(struct usb_dev_state *ps,
usb_unlock_device(dev); usb_unlock_device(dev);
i = usbfs_start_wait_urb(urb, tmo, &actlen); i = usbfs_start_wait_urb(urb, tmo, &actlen);
/* Linger a bit, prior to the next control message. */
if (dev->quirks & USB_QUIRK_DELAY_CTRL_MSG)
msleep(200);
usb_lock_device(dev); usb_lock_device(dev);
snoop_urb(dev, NULL, pipe, actlen, i, COMPLETE, tbuf, actlen); snoop_urb(dev, NULL, pipe, actlen, i, COMPLETE, tbuf, actlen);
if (!i && actlen) { if (!i && actlen) {
if (copy_to_user(ctrl->data, tbuf, actlen)) { if (copy_to_user(ctrl->data, tbuf, actlen)) {
ret = -EFAULT; ret = -EFAULT;
goto recv_fault; goto done;
} }
} }
} else { } else {
...@@ -1231,6 +1235,10 @@ static int do_proc_control(struct usb_dev_state *ps, ...@@ -1231,6 +1235,10 @@ static int do_proc_control(struct usb_dev_state *ps,
usb_unlock_device(dev); usb_unlock_device(dev);
i = usbfs_start_wait_urb(urb, tmo, &actlen); i = usbfs_start_wait_urb(urb, tmo, &actlen);
/* Linger a bit, prior to the next control message. */
if (dev->quirks & USB_QUIRK_DELAY_CTRL_MSG)
msleep(200);
usb_lock_device(dev); usb_lock_device(dev);
snoop_urb(dev, NULL, pipe, actlen, i, COMPLETE, NULL, 0); snoop_urb(dev, NULL, pipe, actlen, i, COMPLETE, NULL, 0);
} }
...@@ -1242,10 +1250,6 @@ static int do_proc_control(struct usb_dev_state *ps, ...@@ -1242,10 +1250,6 @@ static int do_proc_control(struct usb_dev_state *ps,
} }
ret = (i < 0 ? i : actlen); ret = (i < 0 ? i : actlen);
recv_fault:
/* Linger a bit, prior to the next control message. */
if (dev->quirks & USB_QUIRK_DELAY_CTRL_MSG)
msleep(200);
done: done:
kfree(dr); kfree(dr);
usb_free_urb(urb); usb_free_urb(urb);
......
...@@ -404,6 +404,9 @@ static const struct usb_device_id usb_quirk_list[] = { ...@@ -404,6 +404,9 @@ static const struct usb_device_id usb_quirk_list[] = {
{ USB_DEVICE(0x0b05, 0x17e0), .driver_info = { USB_DEVICE(0x0b05, 0x17e0), .driver_info =
USB_QUIRK_IGNORE_REMOTE_WAKEUP }, USB_QUIRK_IGNORE_REMOTE_WAKEUP },
/* Realtek Semiconductor Corp. Mass Storage Device (Multicard Reader)*/
{ USB_DEVICE(0x0bda, 0x0151), .driver_info = USB_QUIRK_CONFIG_INTF_STRINGS },
/* Realtek hub in Dell WD19 (Type-C) */ /* Realtek hub in Dell WD19 (Type-C) */
{ USB_DEVICE(0x0bda, 0x0487), .driver_info = USB_QUIRK_NO_LPM }, { USB_DEVICE(0x0bda, 0x0487), .driver_info = USB_QUIRK_NO_LPM },
...@@ -507,6 +510,9 @@ static const struct usb_device_id usb_quirk_list[] = { ...@@ -507,6 +510,9 @@ static const struct usb_device_id usb_quirk_list[] = {
/* DJI CineSSD */ /* DJI CineSSD */
{ USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM }, { USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM },
/* VCOM device */
{ USB_DEVICE(0x4296, 0x7570), .driver_info = USB_QUIRK_CONFIG_INTF_STRINGS },
/* INTEL VALUE SSD */ /* INTEL VALUE SSD */
{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME }, { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
......
...@@ -274,7 +274,8 @@ int dwc3_core_soft_reset(struct dwc3 *dwc) ...@@ -274,7 +274,8 @@ int dwc3_core_soft_reset(struct dwc3 *dwc)
reg = dwc3_readl(dwc->regs, DWC3_DCTL); reg = dwc3_readl(dwc->regs, DWC3_DCTL);
reg |= DWC3_DCTL_CSFTRST; reg |= DWC3_DCTL_CSFTRST;
dwc3_writel(dwc->regs, DWC3_DCTL, reg); reg &= ~DWC3_DCTL_RUN_STOP;
dwc3_gadget_dctl_write_safe(dwc, reg);
/* /*
* For DWC_usb31 controller 1.90a and later, the DCTL.CSFRST bit * For DWC_usb31 controller 1.90a and later, the DCTL.CSFRST bit
...@@ -1377,10 +1378,10 @@ static void dwc3_get_properties(struct dwc3 *dwc) ...@@ -1377,10 +1378,10 @@ static void dwc3_get_properties(struct dwc3 *dwc)
u8 lpm_nyet_threshold; u8 lpm_nyet_threshold;
u8 tx_de_emphasis; u8 tx_de_emphasis;
u8 hird_threshold; u8 hird_threshold;
u8 rx_thr_num_pkt_prd; u8 rx_thr_num_pkt_prd = 0;
u8 rx_max_burst_prd; u8 rx_max_burst_prd = 0;
u8 tx_thr_num_pkt_prd; u8 tx_thr_num_pkt_prd = 0;
u8 tx_max_burst_prd; u8 tx_max_burst_prd = 0;
u8 tx_fifo_resize_max_num; u8 tx_fifo_resize_max_num;
const char *usb_psy_name; const char *usb_psy_name;
int ret; int ret;
...@@ -1690,21 +1691,44 @@ static int dwc3_probe(struct platform_device *pdev) ...@@ -1690,21 +1691,44 @@ static int dwc3_probe(struct platform_device *pdev)
/* /*
* Clocks are optional, but new DT platforms should support all * Clocks are optional, but new DT platforms should support all
* clocks as required by the DT-binding. * clocks as required by the DT-binding.
* Some devices have different clock names in legacy device trees,
* check for them to retain backwards compatibility.
*/ */
dwc->bus_clk = devm_clk_get_optional(dev, "bus_early"); dwc->bus_clk = devm_clk_get_optional(dev, "bus_early");
if (IS_ERR(dwc->bus_clk)) if (IS_ERR(dwc->bus_clk))
return dev_err_probe(dev, PTR_ERR(dwc->bus_clk), return dev_err_probe(dev, PTR_ERR(dwc->bus_clk),
"could not get bus clock\n"); "could not get bus clock\n");
if (dwc->bus_clk == NULL) {
dwc->bus_clk = devm_clk_get_optional(dev, "bus_clk");
if (IS_ERR(dwc->bus_clk))
return dev_err_probe(dev, PTR_ERR(dwc->bus_clk),
"could not get bus clock\n");
}
dwc->ref_clk = devm_clk_get_optional(dev, "ref"); dwc->ref_clk = devm_clk_get_optional(dev, "ref");
if (IS_ERR(dwc->ref_clk)) if (IS_ERR(dwc->ref_clk))
return dev_err_probe(dev, PTR_ERR(dwc->ref_clk), return dev_err_probe(dev, PTR_ERR(dwc->ref_clk),
"could not get ref clock\n"); "could not get ref clock\n");
if (dwc->ref_clk == NULL) {
dwc->ref_clk = devm_clk_get_optional(dev, "ref_clk");
if (IS_ERR(dwc->ref_clk))
return dev_err_probe(dev, PTR_ERR(dwc->ref_clk),
"could not get ref clock\n");
}
dwc->susp_clk = devm_clk_get_optional(dev, "suspend"); dwc->susp_clk = devm_clk_get_optional(dev, "suspend");
if (IS_ERR(dwc->susp_clk)) if (IS_ERR(dwc->susp_clk))
return dev_err_probe(dev, PTR_ERR(dwc->susp_clk), return dev_err_probe(dev, PTR_ERR(dwc->susp_clk),
"could not get suspend clock\n"); "could not get suspend clock\n");
if (dwc->susp_clk == NULL) {
dwc->susp_clk = devm_clk_get_optional(dev, "suspend_clk");
if (IS_ERR(dwc->susp_clk))
return dev_err_probe(dev, PTR_ERR(dwc->susp_clk),
"could not get suspend clock\n");
}
} }
ret = reset_control_deassert(dwc->reset); ret = reset_control_deassert(dwc->reset);
......
...@@ -584,16 +584,15 @@ int dwc3_drd_init(struct dwc3 *dwc) ...@@ -584,16 +584,15 @@ int dwc3_drd_init(struct dwc3 *dwc)
{ {
int ret, irq; int ret, irq;
if (ROLE_SWITCH &&
device_property_read_bool(dwc->dev, "usb-role-switch"))
return dwc3_setup_role_switch(dwc);
dwc->edev = dwc3_get_extcon(dwc); dwc->edev = dwc3_get_extcon(dwc);
if (IS_ERR(dwc->edev)) if (IS_ERR(dwc->edev))
return PTR_ERR(dwc->edev); return PTR_ERR(dwc->edev);
if (ROLE_SWITCH && if (dwc->edev) {
device_property_read_bool(dwc->dev, "usb-role-switch")) {
ret = dwc3_setup_role_switch(dwc);
if (ret < 0)
return ret;
} else if (dwc->edev) {
dwc->edev_nb.notifier_call = dwc3_drd_notifier; dwc->edev_nb.notifier_call = dwc3_drd_notifier;
ret = extcon_register_notifier(dwc->edev, EXTCON_USB_HOST, ret = extcon_register_notifier(dwc->edev, EXTCON_USB_HOST,
&dwc->edev_nb); &dwc->edev_nb);
......
...@@ -45,6 +45,8 @@ ...@@ -45,6 +45,8 @@
#define PCI_DEVICE_ID_INTEL_ADLM 0x54ee #define PCI_DEVICE_ID_INTEL_ADLM 0x54ee
#define PCI_DEVICE_ID_INTEL_ADLS 0x7ae1 #define PCI_DEVICE_ID_INTEL_ADLS 0x7ae1
#define PCI_DEVICE_ID_INTEL_RPLS 0x7a61 #define PCI_DEVICE_ID_INTEL_RPLS 0x7a61
#define PCI_DEVICE_ID_INTEL_MTLP 0x7ec1
#define PCI_DEVICE_ID_INTEL_MTL 0x7e7e
#define PCI_DEVICE_ID_INTEL_TGL 0x9a15 #define PCI_DEVICE_ID_INTEL_TGL 0x9a15
#define PCI_DEVICE_ID_AMD_MR 0x163a #define PCI_DEVICE_ID_AMD_MR 0x163a
...@@ -456,6 +458,12 @@ static const struct pci_device_id dwc3_pci_id_table[] = { ...@@ -456,6 +458,12 @@ static const struct pci_device_id dwc3_pci_id_table[] = {
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_RPLS), { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_RPLS),
(kernel_ulong_t) &dwc3_pci_intel_swnode, }, (kernel_ulong_t) &dwc3_pci_intel_swnode, },
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MTLP),
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MTL),
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGL), { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGL),
(kernel_ulong_t) &dwc3_pci_intel_swnode, }, (kernel_ulong_t) &dwc3_pci_intel_swnode, },
......
...@@ -3274,6 +3274,7 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep, ...@@ -3274,6 +3274,7 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep,
const struct dwc3_event_depevt *event, const struct dwc3_event_depevt *event,
struct dwc3_request *req, int status) struct dwc3_request *req, int status)
{ {
int request_status;
int ret; int ret;
if (req->request.num_mapped_sgs) if (req->request.num_mapped_sgs)
...@@ -3294,7 +3295,35 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep, ...@@ -3294,7 +3295,35 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep,
req->needs_extra_trb = false; req->needs_extra_trb = false;
} }
dwc3_gadget_giveback(dep, req, status); /*
* The event status only reflects the status of the TRB with IOC set.
* For the requests that don't set interrupt on completion, the driver
* needs to check and return the status of the completed TRBs associated
* with the request. Use the status of the last TRB of the request.
*/
if (req->request.no_interrupt) {
struct dwc3_trb *trb;
trb = dwc3_ep_prev_trb(dep, dep->trb_dequeue);
switch (DWC3_TRB_SIZE_TRBSTS(trb->size)) {
case DWC3_TRBSTS_MISSED_ISOC:
/* Isoc endpoint only */
request_status = -EXDEV;
break;
case DWC3_TRB_STS_XFER_IN_PROG:
/* Applicable when End Transfer with ForceRM=0 */
case DWC3_TRBSTS_SETUP_PENDING:
/* Control endpoint only */
case DWC3_TRBSTS_OK:
default:
request_status = 0;
break;
}
} else {
request_status = status;
}
dwc3_gadget_giveback(dep, req, request_status);
out: out:
return ret; return ret;
......
...@@ -1438,6 +1438,8 @@ static void configfs_composite_unbind(struct usb_gadget *gadget) ...@@ -1438,6 +1438,8 @@ static void configfs_composite_unbind(struct usb_gadget *gadget)
usb_ep_autoconfig_reset(cdev->gadget); usb_ep_autoconfig_reset(cdev->gadget);
spin_lock_irqsave(&gi->spinlock, flags); spin_lock_irqsave(&gi->spinlock, flags);
cdev->gadget = NULL; cdev->gadget = NULL;
cdev->deactivations = 0;
gadget->deactivated = false;
set_gadget_data(gadget, NULL); set_gadget_data(gadget, NULL);
spin_unlock_irqrestore(&gi->spinlock, flags); spin_unlock_irqrestore(&gi->spinlock, flags);
} }
......
...@@ -264,6 +264,8 @@ void uvcg_queue_cancel(struct uvc_video_queue *queue, int disconnect) ...@@ -264,6 +264,8 @@ void uvcg_queue_cancel(struct uvc_video_queue *queue, int disconnect)
buf->state = UVC_BUF_STATE_ERROR; buf->state = UVC_BUF_STATE_ERROR;
vb2_buffer_done(&buf->buf.vb2_buf, VB2_BUF_STATE_ERROR); vb2_buffer_done(&buf->buf.vb2_buf, VB2_BUF_STATE_ERROR);
} }
queue->buf_used = 0;
/* This must be protected by the irqlock spinlock to avoid race /* This must be protected by the irqlock spinlock to avoid race
* conditions between uvc_queue_buffer and the disconnection event that * conditions between uvc_queue_buffer and the disconnection event that
* could result in an interruptible wait in uvc_dequeue_buffer. Do not * could result in an interruptible wait in uvc_dequeue_buffer. Do not
......
...@@ -1103,6 +1103,26 @@ static void ehci_remove_device(struct usb_hcd *hcd, struct usb_device *udev) ...@@ -1103,6 +1103,26 @@ static void ehci_remove_device(struct usb_hcd *hcd, struct usb_device *udev)
#ifdef CONFIG_PM #ifdef CONFIG_PM
/* Clear wakeup signal locked in zhaoxin platform when device plug in. */
static void ehci_zx_wakeup_clear(struct ehci_hcd *ehci)
{
u32 __iomem *reg = &ehci->regs->port_status[4];
u32 t1 = ehci_readl(ehci, reg);
t1 &= (u32)~0xf0000;
t1 |= PORT_TEST_FORCE;
ehci_writel(ehci, t1, reg);
t1 = ehci_readl(ehci, reg);
msleep(1);
t1 &= (u32)~0xf0000;
ehci_writel(ehci, t1, reg);
ehci_readl(ehci, reg);
msleep(1);
t1 = ehci_readl(ehci, reg);
ehci_writel(ehci, t1 | PORT_CSC, reg);
ehci_readl(ehci, reg);
}
/* suspend/resume, section 4.3 */ /* suspend/resume, section 4.3 */
/* These routines handle the generic parts of controller suspend/resume */ /* These routines handle the generic parts of controller suspend/resume */
...@@ -1154,6 +1174,9 @@ int ehci_resume(struct usb_hcd *hcd, bool force_reset) ...@@ -1154,6 +1174,9 @@ int ehci_resume(struct usb_hcd *hcd, bool force_reset)
if (ehci->shutdown) if (ehci->shutdown)
return 0; /* Controller is dead */ return 0; /* Controller is dead */
if (ehci->zx_wakeup_clear_needed)
ehci_zx_wakeup_clear(ehci);
/* /*
* If CF is still set and reset isn't forced * If CF is still set and reset isn't forced
* then we maintained suspend power. * then we maintained suspend power.
......
...@@ -231,6 +231,10 @@ static int ehci_pci_setup(struct usb_hcd *hcd) ...@@ -231,6 +231,10 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
ehci->is_aspeed = 1; ehci->is_aspeed = 1;
} }
break; break;
case PCI_VENDOR_ID_ZHAOXIN:
if (pdev->device == 0x3104 && (pdev->revision & 0xf0) == 0x90)
ehci->zx_wakeup_clear_needed = 1;
break;
} }
/* optional debug port, normally in the first BAR */ /* optional debug port, normally in the first BAR */
......
...@@ -220,6 +220,7 @@ struct ehci_hcd { /* one per controller */ ...@@ -220,6 +220,7 @@ struct ehci_hcd { /* one per controller */
unsigned imx28_write_fix:1; /* For Freescale i.MX28 */ unsigned imx28_write_fix:1; /* For Freescale i.MX28 */
unsigned spurious_oc:1; unsigned spurious_oc:1;
unsigned is_aspeed:1; unsigned is_aspeed:1;
unsigned zx_wakeup_clear_needed:1;
/* required for usb32 quirk */ /* required for usb32 quirk */
#define OHCI_CTRL_HCFS (3 << 6) #define OHCI_CTRL_HCFS (3 << 6)
......
...@@ -1434,7 +1434,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ...@@ -1434,7 +1434,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
} }
spin_unlock_irqrestore(&xhci->lock, flags); spin_unlock_irqrestore(&xhci->lock, flags);
if (!wait_for_completion_timeout(&bus_state->u3exit_done[wIndex], if (!wait_for_completion_timeout(&bus_state->u3exit_done[wIndex],
msecs_to_jiffies(100))) msecs_to_jiffies(500)))
xhci_dbg(xhci, "missing U0 port change event for port %d-%d\n", xhci_dbg(xhci, "missing U0 port change event for port %d-%d\n",
hcd->self.busnum, wIndex + 1); hcd->self.busnum, wIndex + 1);
spin_lock_irqsave(&xhci->lock, flags); spin_lock_irqsave(&xhci->lock, flags);
......
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
#define PCI_DEVICE_ID_INTEL_TIGER_LAKE_XHCI 0x9a13 #define PCI_DEVICE_ID_INTEL_TIGER_LAKE_XHCI 0x9a13
#define PCI_DEVICE_ID_INTEL_MAPLE_RIDGE_XHCI 0x1138 #define PCI_DEVICE_ID_INTEL_MAPLE_RIDGE_XHCI 0x1138
#define PCI_DEVICE_ID_INTEL_ALDER_LAKE_XHCI 0x461e #define PCI_DEVICE_ID_INTEL_ALDER_LAKE_XHCI 0x461e
#define PCI_DEVICE_ID_INTEL_ALDER_LAKE_PCH_XHCI 0x51ed
#define PCI_DEVICE_ID_AMD_RENOIR_XHCI 0x1639 #define PCI_DEVICE_ID_AMD_RENOIR_XHCI 0x1639
#define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9 #define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9
...@@ -266,7 +267,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) ...@@ -266,7 +267,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
pdev->device == PCI_DEVICE_ID_INTEL_ICE_LAKE_XHCI || pdev->device == PCI_DEVICE_ID_INTEL_ICE_LAKE_XHCI ||
pdev->device == PCI_DEVICE_ID_INTEL_TIGER_LAKE_XHCI || pdev->device == PCI_DEVICE_ID_INTEL_TIGER_LAKE_XHCI ||
pdev->device == PCI_DEVICE_ID_INTEL_MAPLE_RIDGE_XHCI || pdev->device == PCI_DEVICE_ID_INTEL_MAPLE_RIDGE_XHCI ||
pdev->device == PCI_DEVICE_ID_INTEL_ALDER_LAKE_XHCI)) pdev->device == PCI_DEVICE_ID_INTEL_ALDER_LAKE_XHCI ||
pdev->device == PCI_DEVICE_ID_INTEL_ALDER_LAKE_PCH_XHCI))
xhci->quirks |= XHCI_DEFAULT_PM_RUNTIME_ALLOW; xhci->quirks |= XHCI_DEFAULT_PM_RUNTIME_ALLOW;
if (pdev->vendor == PCI_VENDOR_ID_ETRON && if (pdev->vendor == PCI_VENDOR_ID_ETRON &&
......
...@@ -3141,6 +3141,7 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd) ...@@ -3141,6 +3141,7 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd)
if (event_loop++ < TRBS_PER_SEGMENT / 2) if (event_loop++ < TRBS_PER_SEGMENT / 2)
continue; continue;
xhci_update_erst_dequeue(xhci, event_ring_deq); xhci_update_erst_dequeue(xhci, event_ring_deq);
event_ring_deq = xhci->event_ring->dequeue;
/* ring is half-full, force isoc trbs to interrupt more often */ /* ring is half-full, force isoc trbs to interrupt more often */
if (xhci->isoc_bei_interval > AVOID_BEI_INTERVAL_MIN) if (xhci->isoc_bei_interval > AVOID_BEI_INTERVAL_MIN)
......
...@@ -1034,13 +1034,13 @@ static int tegra_xusb_unpowergate_partitions(struct tegra_xusb *tegra) ...@@ -1034,13 +1034,13 @@ static int tegra_xusb_unpowergate_partitions(struct tegra_xusb *tegra)
int rc; int rc;
if (tegra->use_genpd) { if (tegra->use_genpd) {
rc = pm_runtime_get_sync(tegra->genpd_dev_ss); rc = pm_runtime_resume_and_get(tegra->genpd_dev_ss);
if (rc < 0) { if (rc < 0) {
dev_err(dev, "failed to enable XUSB SS partition\n"); dev_err(dev, "failed to enable XUSB SS partition\n");
return rc; return rc;
} }
rc = pm_runtime_get_sync(tegra->genpd_dev_host); rc = pm_runtime_resume_and_get(tegra->genpd_dev_host);
if (rc < 0) { if (rc < 0) {
dev_err(dev, "failed to enable XUSB Host partition\n"); dev_err(dev, "failed to enable XUSB Host partition\n");
pm_runtime_put_sync(tegra->genpd_dev_ss); pm_runtime_put_sync(tegra->genpd_dev_ss);
......
...@@ -781,6 +781,17 @@ void xhci_shutdown(struct usb_hcd *hcd) ...@@ -781,6 +781,17 @@ void xhci_shutdown(struct usb_hcd *hcd)
if (xhci->quirks & XHCI_SPURIOUS_REBOOT) if (xhci->quirks & XHCI_SPURIOUS_REBOOT)
usb_disable_xhci_ports(to_pci_dev(hcd->self.sysdev)); usb_disable_xhci_ports(to_pci_dev(hcd->self.sysdev));
/* Don't poll the roothubs after shutdown. */
xhci_dbg(xhci, "%s: stopping usb%d port polling.\n",
__func__, hcd->self.busnum);
clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
del_timer_sync(&hcd->rh_timer);
if (xhci->shared_hcd) {
clear_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
del_timer_sync(&xhci->shared_hcd->rh_timer);
}
spin_lock_irq(&xhci->lock); spin_lock_irq(&xhci->lock);
xhci_halt(xhci); xhci_halt(xhci);
/* Workaround for spurious wakeups at shutdown with HSW */ /* Workaround for spurious wakeups at shutdown with HSW */
......
...@@ -186,16 +186,16 @@ static int eud_probe(struct platform_device *pdev) ...@@ -186,16 +186,16 @@ static int eud_probe(struct platform_device *pdev)
chip->dev = &pdev->dev; chip->dev = &pdev->dev;
ret = devm_add_action_or_reset(chip->dev, eud_role_switch_release, chip);
if (ret)
return dev_err_probe(chip->dev, ret,
"failed to add role switch release action\n");
chip->role_sw = usb_role_switch_get(&pdev->dev); chip->role_sw = usb_role_switch_get(&pdev->dev);
if (IS_ERR(chip->role_sw)) if (IS_ERR(chip->role_sw))
return dev_err_probe(chip->dev, PTR_ERR(chip->role_sw), return dev_err_probe(chip->dev, PTR_ERR(chip->role_sw),
"failed to get role switch\n"); "failed to get role switch\n");
ret = devm_add_action_or_reset(chip->dev, eud_role_switch_release, chip);
if (ret)
return dev_err_probe(chip->dev, ret,
"failed to add role switch release action\n");
chip->base = devm_platform_ioremap_resource(pdev, 0); chip->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(chip->base)) if (IS_ERR(chip->base))
return PTR_ERR(chip->base); return PTR_ERR(chip->base);
......
...@@ -71,6 +71,7 @@ static void destroy_priv(struct kref *kref) ...@@ -71,6 +71,7 @@ static void destroy_priv(struct kref *kref)
dev_dbg(&priv->usbdev->dev, "destroying priv datastructure\n"); dev_dbg(&priv->usbdev->dev, "destroying priv datastructure\n");
usb_put_dev(priv->usbdev); usb_put_dev(priv->usbdev);
priv->usbdev = NULL;
kfree(priv); kfree(priv);
} }
...@@ -736,7 +737,6 @@ static int uss720_probe(struct usb_interface *intf, ...@@ -736,7 +737,6 @@ static int uss720_probe(struct usb_interface *intf,
parport_announce_port(pp); parport_announce_port(pp);
usb_set_intfdata(intf, pp); usb_set_intfdata(intf, pp);
usb_put_dev(usbdev);
return 0; return 0;
probe_abort: probe_abort:
...@@ -754,7 +754,6 @@ static void uss720_disconnect(struct usb_interface *intf) ...@@ -754,7 +754,6 @@ static void uss720_disconnect(struct usb_interface *intf)
usb_set_intfdata(intf, NULL); usb_set_intfdata(intf, NULL);
if (pp) { if (pp) {
priv = pp->private_data; priv = pp->private_data;
priv->usbdev = NULL;
priv->pp = NULL; priv->pp = NULL;
dev_dbg(&intf->dev, "parport_remove_port\n"); dev_dbg(&intf->dev, "parport_remove_port\n");
parport_remove_port(pp); parport_remove_port(pp);
......
...@@ -21,10 +21,8 @@ static inline struct ssusb_mtk *otg_sx_to_ssusb(struct otg_switch_mtk *otg_sx) ...@@ -21,10 +21,8 @@ static inline struct ssusb_mtk *otg_sx_to_ssusb(struct otg_switch_mtk *otg_sx)
static void toggle_opstate(struct ssusb_mtk *ssusb) static void toggle_opstate(struct ssusb_mtk *ssusb)
{ {
if (!ssusb->otg_switch.is_u3_drd) { mtu3_setbits(ssusb->mac_base, U3D_DEVICE_CONTROL, DC_SESSION);
mtu3_setbits(ssusb->mac_base, U3D_DEVICE_CONTROL, DC_SESSION); mtu3_setbits(ssusb->mac_base, U3D_POWER_MANAGEMENT, SOFT_CONN);
mtu3_setbits(ssusb->mac_base, U3D_POWER_MANAGEMENT, SOFT_CONN);
}
} }
/* only port0 supports dual-role mode */ /* only port0 supports dual-role mode */
......
...@@ -268,6 +268,13 @@ int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_generic *nop) ...@@ -268,6 +268,13 @@ int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_generic *nop)
return -EPROBE_DEFER; return -EPROBE_DEFER;
} }
nop->vbus_draw = devm_regulator_get_exclusive(dev, "vbus");
if (PTR_ERR(nop->vbus_draw) == -ENODEV)
nop->vbus_draw = NULL;
if (IS_ERR(nop->vbus_draw))
return dev_err_probe(dev, PTR_ERR(nop->vbus_draw),
"could not get vbus regulator\n");
nop->dev = dev; nop->dev = dev;
nop->phy.dev = nop->dev; nop->phy.dev = nop->dev;
nop->phy.label = "nop-xceiv"; nop->phy.label = "nop-xceiv";
......
...@@ -194,6 +194,8 @@ static const struct usb_device_id id_table[] = { ...@@ -194,6 +194,8 @@ static const struct usb_device_id id_table[] = {
{ USB_DEVICE(0x16DC, 0x0015) }, /* W-IE-NE-R Plein & Baus GmbH CML Control, Monitoring and Data Logger */ { USB_DEVICE(0x16DC, 0x0015) }, /* W-IE-NE-R Plein & Baus GmbH CML Control, Monitoring and Data Logger */
{ USB_DEVICE(0x17A8, 0x0001) }, /* Kamstrup Optical Eye/3-wire */ { USB_DEVICE(0x17A8, 0x0001) }, /* Kamstrup Optical Eye/3-wire */
{ USB_DEVICE(0x17A8, 0x0005) }, /* Kamstrup M-Bus Master MultiPort 250D */ { USB_DEVICE(0x17A8, 0x0005) }, /* Kamstrup M-Bus Master MultiPort 250D */
{ USB_DEVICE(0x17A8, 0x0101) }, /* Kamstrup 868 MHz wM-Bus C-Mode Meter Reader (Int Ant) */
{ USB_DEVICE(0x17A8, 0x0102) }, /* Kamstrup 868 MHz wM-Bus C-Mode Meter Reader (Ext Ant) */
{ USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */ { USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */
{ USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */
{ USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */
......
...@@ -432,6 +432,8 @@ static void option_instat_callback(struct urb *urb); ...@@ -432,6 +432,8 @@ static void option_instat_callback(struct urb *urb);
#define CINTERION_PRODUCT_CLS8 0x00b0 #define CINTERION_PRODUCT_CLS8 0x00b0
#define CINTERION_PRODUCT_MV31_MBIM 0x00b3 #define CINTERION_PRODUCT_MV31_MBIM 0x00b3
#define CINTERION_PRODUCT_MV31_RMNET 0x00b7 #define CINTERION_PRODUCT_MV31_RMNET 0x00b7
#define CINTERION_PRODUCT_MV32_WA 0x00f1
#define CINTERION_PRODUCT_MV32_WB 0x00f2
/* Olivetti products */ /* Olivetti products */
#define OLIVETTI_VENDOR_ID 0x0b3c #define OLIVETTI_VENDOR_ID 0x0b3c
...@@ -1217,6 +1219,10 @@ static const struct usb_device_id option_ids[] = { ...@@ -1217,6 +1219,10 @@ static const struct usb_device_id option_ids[] = {
.driver_info = NCTRL(0) | RSVD(1) }, .driver_info = NCTRL(0) | RSVD(1) },
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1056, 0xff), /* Telit FD980 */ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1056, 0xff), /* Telit FD980 */
.driver_info = NCTRL(2) | RSVD(3) }, .driver_info = NCTRL(2) | RSVD(3) },
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1057, 0xff), /* Telit FN980 */
.driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1058, 0xff), /* Telit FN980 (PCIe) */
.driver_info = NCTRL(0) | RSVD(1) },
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1060, 0xff), /* Telit LN920 (rmnet) */ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1060, 0xff), /* Telit LN920 (rmnet) */
.driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1061, 0xff), /* Telit LN920 (MBIM) */ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1061, 0xff), /* Telit LN920 (MBIM) */
...@@ -1233,6 +1239,8 @@ static const struct usb_device_id option_ids[] = { ...@@ -1233,6 +1239,8 @@ static const struct usb_device_id option_ids[] = {
.driver_info = NCTRL(2) | RSVD(3) }, .driver_info = NCTRL(2) | RSVD(3) },
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1073, 0xff), /* Telit FN990 (ECM) */ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1073, 0xff), /* Telit FN990 (ECM) */
.driver_info = NCTRL(0) | RSVD(1) }, .driver_info = NCTRL(0) | RSVD(1) },
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1075, 0xff), /* Telit FN990 (PCIe) */
.driver_info = RSVD(0) },
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910), { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910),
.driver_info = NCTRL(0) | RSVD(1) | RSVD(3) }, .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) },
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM), { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
...@@ -1969,6 +1977,10 @@ static const struct usb_device_id option_ids[] = { ...@@ -1969,6 +1977,10 @@ static const struct usb_device_id option_ids[] = {
.driver_info = RSVD(3)}, .driver_info = RSVD(3)},
{ USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_MV31_RMNET, 0xff), { USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_MV31_RMNET, 0xff),
.driver_info = RSVD(0)}, .driver_info = RSVD(0)},
{ USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_MV32_WA, 0xff),
.driver_info = RSVD(3)},
{ USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_MV32_WB, 0xff),
.driver_info = RSVD(3)},
{ USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100), { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100),
.driver_info = RSVD(4) }, .driver_info = RSVD(4) },
{ USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD120), { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD120),
......
...@@ -584,9 +584,8 @@ static int firm_send_command(struct usb_serial_port *port, __u8 command, ...@@ -584,9 +584,8 @@ static int firm_send_command(struct usb_serial_port *port, __u8 command,
switch (command) { switch (command) {
case WHITEHEAT_GET_DTR_RTS: case WHITEHEAT_GET_DTR_RTS:
info = usb_get_serial_port_data(port); info = usb_get_serial_port_data(port);
memcpy(&info->mcr, command_info->result_buffer, info->mcr = command_info->result_buffer[0];
sizeof(struct whiteheat_dr_info)); break;
break;
} }
} }
exit: exit:
......
...@@ -56,6 +56,7 @@ config TYPEC_RT1719 ...@@ -56,6 +56,7 @@ config TYPEC_RT1719
tristate "Richtek RT1719 Sink Only Type-C controller driver" tristate "Richtek RT1719 Sink Only Type-C controller driver"
depends on USB_ROLE_SWITCH || !USB_ROLE_SWITCH depends on USB_ROLE_SWITCH || !USB_ROLE_SWITCH
depends on I2C depends on I2C
depends on POWER_SUPPLY
select REGMAP_I2C select REGMAP_I2C
help help
Say Y or M here if your system has Richtek RT1719 sink only Say Y or M here if your system has Richtek RT1719 sink only
......
...@@ -949,6 +949,8 @@ static int ucsi_dr_swap(struct typec_port *port, enum typec_data_role role) ...@@ -949,6 +949,8 @@ static int ucsi_dr_swap(struct typec_port *port, enum typec_data_role role)
role == TYPEC_HOST)) role == TYPEC_HOST))
goto out_unlock; goto out_unlock;
reinit_completion(&con->complete);
command = UCSI_SET_UOR | UCSI_CONNECTOR_NUMBER(con->num); command = UCSI_SET_UOR | UCSI_CONNECTOR_NUMBER(con->num);
command |= UCSI_SET_UOR_ROLE(role); command |= UCSI_SET_UOR_ROLE(role);
command |= UCSI_SET_UOR_ACCEPT_ROLE_SWAPS; command |= UCSI_SET_UOR_ACCEPT_ROLE_SWAPS;
...@@ -956,14 +958,18 @@ static int ucsi_dr_swap(struct typec_port *port, enum typec_data_role role) ...@@ -956,14 +958,18 @@ static int ucsi_dr_swap(struct typec_port *port, enum typec_data_role role)
if (ret < 0) if (ret < 0)
goto out_unlock; goto out_unlock;
mutex_unlock(&con->lock);
if (!wait_for_completion_timeout(&con->complete, if (!wait_for_completion_timeout(&con->complete,
msecs_to_jiffies(UCSI_SWAP_TIMEOUT_MS))) msecs_to_jiffies(UCSI_SWAP_TIMEOUT_MS)))
ret = -ETIMEDOUT; return -ETIMEDOUT;
return 0;
out_unlock: out_unlock:
mutex_unlock(&con->lock); mutex_unlock(&con->lock);
return ret < 0 ? ret : 0; return ret;
} }
static int ucsi_pr_swap(struct typec_port *port, enum typec_role role) static int ucsi_pr_swap(struct typec_port *port, enum typec_role role)
...@@ -985,6 +991,8 @@ static int ucsi_pr_swap(struct typec_port *port, enum typec_role role) ...@@ -985,6 +991,8 @@ static int ucsi_pr_swap(struct typec_port *port, enum typec_role role)
if (cur_role == role) if (cur_role == role)
goto out_unlock; goto out_unlock;
reinit_completion(&con->complete);
command = UCSI_SET_PDR | UCSI_CONNECTOR_NUMBER(con->num); command = UCSI_SET_PDR | UCSI_CONNECTOR_NUMBER(con->num);
command |= UCSI_SET_PDR_ROLE(role); command |= UCSI_SET_PDR_ROLE(role);
command |= UCSI_SET_PDR_ACCEPT_ROLE_SWAPS; command |= UCSI_SET_PDR_ACCEPT_ROLE_SWAPS;
...@@ -992,11 +1000,13 @@ static int ucsi_pr_swap(struct typec_port *port, enum typec_role role) ...@@ -992,11 +1000,13 @@ static int ucsi_pr_swap(struct typec_port *port, enum typec_role role)
if (ret < 0) if (ret < 0)
goto out_unlock; goto out_unlock;
mutex_unlock(&con->lock);
if (!wait_for_completion_timeout(&con->complete, if (!wait_for_completion_timeout(&con->complete,
msecs_to_jiffies(UCSI_SWAP_TIMEOUT_MS))) { msecs_to_jiffies(UCSI_SWAP_TIMEOUT_MS)))
ret = -ETIMEDOUT; return -ETIMEDOUT;
goto out_unlock;
} mutex_lock(&con->lock);
/* Something has gone wrong while swapping the role */ /* Something has gone wrong while swapping the role */
if (UCSI_CONSTAT_PWR_OPMODE(con->status.flags) != if (UCSI_CONSTAT_PWR_OPMODE(con->status.flags) !=
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#define BDO_MODE_CARRIER2 (5 << 28) #define BDO_MODE_CARRIER2 (5 << 28)
#define BDO_MODE_CARRIER3 (6 << 28) #define BDO_MODE_CARRIER3 (6 << 28)
#define BDO_MODE_EYE (7 << 28) #define BDO_MODE_EYE (7 << 28)
#define BDO_MODE_TESTDATA (8 << 28) #define BDO_MODE_TESTDATA (8U << 28)
#define BDO_MODE_MASK(mode) ((mode) & 0xf0000000) #define BDO_MODE_MASK(mode) ((mode) & 0xf0000000)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册