mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-24 14:07:52 -04:00
USB fixes for 6.5-rc4
Here are a set of USB driver fixes for 6.5-rc4. Include in here are: - new USB serial device ids - dwc3 driver fixes for reported issues - typec driver fixes for reported problems - gadget driver fixes - reverts of some problematic USB changes that went into -rc1 All of these have been in linux-next with no reported problems. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCZMZBhg8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ymTeQCgvq+ArxA52j9RXNSFIudQ+vWvnIkAoM1Jy/5q Y+16cRAf6k4AbDXHbuyN =V3uc -----END PGP SIGNATURE----- Merge tag 'usb-6.5-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb Pull USB fixes from Greg KH: "Here are a set of USB driver fixes for 6.5-rc4. Include in here are: - new USB serial device ids - dwc3 driver fixes for reported issues - typec driver fixes for reported problems - gadget driver fixes - reverts of some problematic USB changes that went into -rc1 All of these have been in linux-next with no reported problems" * tag 'usb-6.5-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (24 commits) usb: misc: ehset: fix wrong if condition usb: dwc3: pci: skip BYT GPIO lookup table for hardwired phy usb: cdns3: fix incorrect calculation of ep_buf_size when more than one config usb: gadget: call usb_gadget_check_config() to verify UDC capability usb: typec: Use sysfs_emit_at when concatenating the string usb: typec: Iterate pds array when showing the pd list usb: typec: Set port->pd before adding device for typec_port usb: typec: qcom: fix return value check in qcom_pmic_typec_probe() Revert "usb: gadget: tegra-xudc: Fix error check in tegra_xudc_powerdomain_init()" Revert "usb: xhci: tegra: Fix error check" USB: gadget: Fix the memory leak in raw_gadget driver usb: gadget: core: remove unbalanced mutex_unlock in usb_gadget_activate Revert "usb: dwc3: core: Enable AutoRetry feature in the controller" Revert "xhci: add quirk for host controllers that don't update endpoint DCS" USB: quirks: add quirk for Focusrite Scarlett usb: xhci-mtk: set the dma max_seg_size MAINTAINERS: drop invalid usb/cdns3 Reviewer e-mail usb: dwc3: don't reset device side if dwc3 was configured as host-only usb: typec: ucsi: move typec_set_mode(TYPEC_STATE_SAFE) to ucsi_unregister_partner() usb: ohci-at91: Fix the unhandle interrupt when resume ...
This commit is contained in:
commit
88f66f13ea
21 changed files with 104 additions and 115 deletions
|
@ -4463,7 +4463,6 @@ CADENCE USB3 DRD IP DRIVER
|
||||||
M: Peter Chen <peter.chen@kernel.org>
|
M: Peter Chen <peter.chen@kernel.org>
|
||||||
M: Pawel Laszczak <pawell@cadence.com>
|
M: Pawel Laszczak <pawell@cadence.com>
|
||||||
R: Roger Quadros <rogerq@kernel.org>
|
R: Roger Quadros <rogerq@kernel.org>
|
||||||
R: Aswath Govindraju <a-govindraju@ti.com>
|
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git
|
||||||
|
|
|
@ -3015,12 +3015,14 @@ static int cdns3_gadget_udc_stop(struct usb_gadget *gadget)
|
||||||
static int cdns3_gadget_check_config(struct usb_gadget *gadget)
|
static int cdns3_gadget_check_config(struct usb_gadget *gadget)
|
||||||
{
|
{
|
||||||
struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget);
|
struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget);
|
||||||
|
struct cdns3_endpoint *priv_ep;
|
||||||
struct usb_ep *ep;
|
struct usb_ep *ep;
|
||||||
int n_in = 0;
|
int n_in = 0;
|
||||||
int total;
|
int total;
|
||||||
|
|
||||||
list_for_each_entry(ep, &gadget->ep_list, ep_list) {
|
list_for_each_entry(ep, &gadget->ep_list, ep_list) {
|
||||||
if (ep->claimed && (ep->address & USB_DIR_IN))
|
priv_ep = ep_to_cdns3_ep(ep);
|
||||||
|
if ((priv_ep->flags & EP_CLAIMED) && (ep->address & USB_DIR_IN))
|
||||||
n_in++;
|
n_in++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -436,6 +436,10 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||||
/* novation SoundControl XL */
|
/* novation SoundControl XL */
|
||||||
{ USB_DEVICE(0x1235, 0x0061), .driver_info = USB_QUIRK_RESET_RESUME },
|
{ USB_DEVICE(0x1235, 0x0061), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||||
|
|
||||||
|
/* Focusrite Scarlett Solo USB */
|
||||||
|
{ USB_DEVICE(0x1235, 0x8211), .driver_info =
|
||||||
|
USB_QUIRK_DISCONNECT_SUSPEND },
|
||||||
|
|
||||||
/* Huawei 4G LTE module */
|
/* Huawei 4G LTE module */
|
||||||
{ USB_DEVICE(0x12d1, 0x15bb), .driver_info =
|
{ USB_DEVICE(0x12d1, 0x15bb), .driver_info =
|
||||||
USB_QUIRK_DISCONNECT_SUSPEND },
|
USB_QUIRK_DISCONNECT_SUSPEND },
|
||||||
|
|
|
@ -277,9 +277,9 @@ int dwc3_core_soft_reset(struct dwc3 *dwc)
|
||||||
/*
|
/*
|
||||||
* We're resetting only the device side because, if we're in host mode,
|
* We're resetting only the device side because, if we're in host mode,
|
||||||
* XHCI driver will reset the host block. If dwc3 was configured for
|
* XHCI driver will reset the host block. If dwc3 was configured for
|
||||||
* host-only mode, then we can return early.
|
* host-only mode or current role is host, then we can return early.
|
||||||
*/
|
*/
|
||||||
if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_HOST)
|
if (dwc->dr_mode == USB_DR_MODE_HOST || dwc->current_dr_role == DWC3_GCTL_PRTCAP_HOST)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
reg = dwc3_readl(dwc->regs, DWC3_DCTL);
|
reg = dwc3_readl(dwc->regs, DWC3_DCTL);
|
||||||
|
@ -1209,22 +1209,6 @@ static int dwc3_core_init(struct dwc3 *dwc)
|
||||||
dwc3_writel(dwc->regs, DWC3_GUCTL1, reg);
|
dwc3_writel(dwc->regs, DWC3_GUCTL1, reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dwc->dr_mode == USB_DR_MODE_HOST ||
|
|
||||||
dwc->dr_mode == USB_DR_MODE_OTG) {
|
|
||||||
reg = dwc3_readl(dwc->regs, DWC3_GUCTL);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Enable Auto retry Feature to make the controller operating in
|
|
||||||
* Host mode on seeing transaction errors(CRC errors or internal
|
|
||||||
* overrun scenerios) on IN transfers to reply to the device
|
|
||||||
* with a non-terminating retry ACK (i.e, an ACK transcation
|
|
||||||
* packet with Retry=1 & Nump != 0)
|
|
||||||
*/
|
|
||||||
reg |= DWC3_GUCTL_HSTINAUTORETRY;
|
|
||||||
|
|
||||||
dwc3_writel(dwc->regs, DWC3_GUCTL, reg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Must config both number of packets and max burst settings to enable
|
* Must config both number of packets and max burst settings to enable
|
||||||
* RX and/or TX threshold.
|
* RX and/or TX threshold.
|
||||||
|
|
|
@ -256,9 +256,6 @@
|
||||||
#define DWC3_GCTL_GBLHIBERNATIONEN BIT(1)
|
#define DWC3_GCTL_GBLHIBERNATIONEN BIT(1)
|
||||||
#define DWC3_GCTL_DSBLCLKGTNG BIT(0)
|
#define DWC3_GCTL_DSBLCLKGTNG BIT(0)
|
||||||
|
|
||||||
/* Global User Control Register */
|
|
||||||
#define DWC3_GUCTL_HSTINAUTORETRY BIT(14)
|
|
||||||
|
|
||||||
/* Global User Control 1 Register */
|
/* Global User Control 1 Register */
|
||||||
#define DWC3_GUCTL1_DEV_DECOUPLE_L1L2_EVT BIT(31)
|
#define DWC3_GUCTL1_DEV_DECOUPLE_L1L2_EVT BIT(31)
|
||||||
#define DWC3_GUCTL1_TX_IPGAP_LINECHECK_DIS BIT(28)
|
#define DWC3_GUCTL1_TX_IPGAP_LINECHECK_DIS BIT(28)
|
||||||
|
|
|
@ -233,9 +233,11 @@ static int dwc3_pci_quirks(struct dwc3_pci *dwc,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A lot of BYT devices lack ACPI resource entries for
|
* A lot of BYT devices lack ACPI resource entries for
|
||||||
* the GPIOs, add a fallback mapping to the reference
|
* the GPIOs. If the ACPI entry for the GPIO controller
|
||||||
|
* is present add a fallback mapping to the reference
|
||||||
* design GPIOs which all boards seem to use.
|
* design GPIOs which all boards seem to use.
|
||||||
*/
|
*/
|
||||||
|
if (acpi_dev_present("INT33FC", NULL, -1))
|
||||||
gpiod_add_lookup_table(&platform_bytcr_gpios);
|
gpiod_add_lookup_table(&platform_bytcr_gpios);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1125,6 +1125,10 @@ int usb_add_config(struct usb_composite_dev *cdev,
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
status = bind(config);
|
status = bind(config);
|
||||||
|
|
||||||
|
if (status == 0)
|
||||||
|
status = usb_gadget_check_config(cdev->gadget);
|
||||||
|
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
while (!list_empty(&config->functions)) {
|
while (!list_empty(&config->functions)) {
|
||||||
struct usb_function *f;
|
struct usb_function *f;
|
||||||
|
|
|
@ -310,13 +310,15 @@ static int gadget_bind(struct usb_gadget *gadget,
|
||||||
dev->eps_num = i;
|
dev->eps_num = i;
|
||||||
spin_unlock_irqrestore(&dev->lock, flags);
|
spin_unlock_irqrestore(&dev->lock, flags);
|
||||||
|
|
||||||
|
ret = raw_queue_event(dev, USB_RAW_EVENT_CONNECT, 0, NULL);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(&gadget->dev, "failed to queue event\n");
|
||||||
|
set_gadget_data(gadget, NULL);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Matches kref_put() in gadget_unbind(). */
|
/* Matches kref_put() in gadget_unbind(). */
|
||||||
kref_get(&dev->count);
|
kref_get(&dev->count);
|
||||||
|
|
||||||
ret = raw_queue_event(dev, USB_RAW_EVENT_CONNECT, 0, NULL);
|
|
||||||
if (ret < 0)
|
|
||||||
dev_err(&gadget->dev, "failed to queue event\n");
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -878,7 +878,6 @@ int usb_gadget_activate(struct usb_gadget *gadget)
|
||||||
*/
|
*/
|
||||||
if (gadget->connected)
|
if (gadget->connected)
|
||||||
ret = usb_gadget_connect_locked(gadget);
|
ret = usb_gadget_connect_locked(gadget);
|
||||||
mutex_unlock(&gadget->udc->connect_lock);
|
|
||||||
|
|
||||||
unlock:
|
unlock:
|
||||||
mutex_unlock(&gadget->udc->connect_lock);
|
mutex_unlock(&gadget->udc->connect_lock);
|
||||||
|
|
|
@ -3718,15 +3718,15 @@ static int tegra_xudc_powerdomain_init(struct tegra_xudc *xudc)
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
xudc->genpd_dev_device = dev_pm_domain_attach_by_name(dev, "dev");
|
xudc->genpd_dev_device = dev_pm_domain_attach_by_name(dev, "dev");
|
||||||
if (IS_ERR_OR_NULL(xudc->genpd_dev_device)) {
|
if (IS_ERR(xudc->genpd_dev_device)) {
|
||||||
err = PTR_ERR(xudc->genpd_dev_device) ? : -ENODATA;
|
err = PTR_ERR(xudc->genpd_dev_device);
|
||||||
dev_err(dev, "failed to get device power domain: %d\n", err);
|
dev_err(dev, "failed to get device power domain: %d\n", err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
xudc->genpd_dev_ss = dev_pm_domain_attach_by_name(dev, "ss");
|
xudc->genpd_dev_ss = dev_pm_domain_attach_by_name(dev, "ss");
|
||||||
if (IS_ERR_OR_NULL(xudc->genpd_dev_ss)) {
|
if (IS_ERR(xudc->genpd_dev_ss)) {
|
||||||
err = PTR_ERR(xudc->genpd_dev_ss) ? : -ENODATA;
|
err = PTR_ERR(xudc->genpd_dev_ss);
|
||||||
dev_err(dev, "failed to get SuperSpeed power domain: %d\n", err);
|
dev_err(dev, "failed to get SuperSpeed power domain: %d\n", err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -672,7 +672,13 @@ ohci_hcd_at91_drv_resume(struct device *dev)
|
||||||
else
|
else
|
||||||
at91_start_clock(ohci_at91);
|
at91_start_clock(ohci_at91);
|
||||||
|
|
||||||
ohci_resume(hcd, false);
|
/*
|
||||||
|
* According to the comment in ohci_hcd_at91_drv_suspend()
|
||||||
|
* we need to do a reset if the 48Mhz clock was stopped,
|
||||||
|
* that is, if ohci_at91->wakeup is clear. Tell ohci_resume()
|
||||||
|
* to reset in this case by setting its "hibernated" flag.
|
||||||
|
*/
|
||||||
|
ohci_resume(hcd, !ohci_at91->wakeup);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -586,6 +586,7 @@ static int xhci_mtk_probe(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
device_init_wakeup(dev, true);
|
device_init_wakeup(dev, true);
|
||||||
|
dma_set_max_seg_size(dev, UINT_MAX);
|
||||||
|
|
||||||
xhci = hcd_to_xhci(hcd);
|
xhci = hcd_to_xhci(hcd);
|
||||||
xhci->main_hcd = hcd;
|
xhci->main_hcd = hcd;
|
||||||
|
|
|
@ -479,10 +479,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||||
pdev->device == 0x3432)
|
pdev->device == 0x3432)
|
||||||
xhci->quirks |= XHCI_BROKEN_STREAMS;
|
xhci->quirks |= XHCI_BROKEN_STREAMS;
|
||||||
|
|
||||||
if (pdev->vendor == PCI_VENDOR_ID_VIA && pdev->device == 0x3483) {
|
if (pdev->vendor == PCI_VENDOR_ID_VIA && pdev->device == 0x3483)
|
||||||
xhci->quirks |= XHCI_LPM_SUPPORT;
|
xhci->quirks |= XHCI_LPM_SUPPORT;
|
||||||
xhci->quirks |= XHCI_EP_CTX_BROKEN_DCS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
||||||
pdev->device == PCI_DEVICE_ID_ASMEDIA_1042_XHCI) {
|
pdev->device == PCI_DEVICE_ID_ASMEDIA_1042_XHCI) {
|
||||||
|
|
|
@ -626,11 +626,8 @@ static int xhci_move_dequeue_past_td(struct xhci_hcd *xhci,
|
||||||
struct xhci_ring *ep_ring;
|
struct xhci_ring *ep_ring;
|
||||||
struct xhci_command *cmd;
|
struct xhci_command *cmd;
|
||||||
struct xhci_segment *new_seg;
|
struct xhci_segment *new_seg;
|
||||||
struct xhci_segment *halted_seg = NULL;
|
|
||||||
union xhci_trb *new_deq;
|
union xhci_trb *new_deq;
|
||||||
int new_cycle;
|
int new_cycle;
|
||||||
union xhci_trb *halted_trb;
|
|
||||||
int index = 0;
|
|
||||||
dma_addr_t addr;
|
dma_addr_t addr;
|
||||||
u64 hw_dequeue;
|
u64 hw_dequeue;
|
||||||
bool cycle_found = false;
|
bool cycle_found = false;
|
||||||
|
@ -668,27 +665,7 @@ static int xhci_move_dequeue_past_td(struct xhci_hcd *xhci,
|
||||||
hw_dequeue = xhci_get_hw_deq(xhci, dev, ep_index, stream_id);
|
hw_dequeue = xhci_get_hw_deq(xhci, dev, ep_index, stream_id);
|
||||||
new_seg = ep_ring->deq_seg;
|
new_seg = ep_ring->deq_seg;
|
||||||
new_deq = ep_ring->dequeue;
|
new_deq = ep_ring->dequeue;
|
||||||
|
|
||||||
/*
|
|
||||||
* Quirk: xHC write-back of the DCS field in the hardware dequeue
|
|
||||||
* pointer is wrong - use the cycle state of the TRB pointed to by
|
|
||||||
* the dequeue pointer.
|
|
||||||
*/
|
|
||||||
if (xhci->quirks & XHCI_EP_CTX_BROKEN_DCS &&
|
|
||||||
!(ep->ep_state & EP_HAS_STREAMS))
|
|
||||||
halted_seg = trb_in_td(xhci, td->start_seg,
|
|
||||||
td->first_trb, td->last_trb,
|
|
||||||
hw_dequeue & ~0xf, false);
|
|
||||||
if (halted_seg) {
|
|
||||||
index = ((dma_addr_t)(hw_dequeue & ~0xf) - halted_seg->dma) /
|
|
||||||
sizeof(*halted_trb);
|
|
||||||
halted_trb = &halted_seg->trbs[index];
|
|
||||||
new_cycle = halted_trb->generic.field[3] & 0x1;
|
|
||||||
xhci_dbg(xhci, "Endpoint DCS = %d TRB index = %d cycle = %d\n",
|
|
||||||
(u8)(hw_dequeue & 0x1), index, new_cycle);
|
|
||||||
} else {
|
|
||||||
new_cycle = hw_dequeue & 0x1;
|
new_cycle = hw_dequeue & 0x1;
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We want to find the pointer, segment and cycle state of the new trb
|
* We want to find the pointer, segment and cycle state of the new trb
|
||||||
|
|
|
@ -1145,15 +1145,15 @@ static int tegra_xusb_powerdomain_init(struct device *dev,
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
tegra->genpd_dev_host = dev_pm_domain_attach_by_name(dev, "xusb_host");
|
tegra->genpd_dev_host = dev_pm_domain_attach_by_name(dev, "xusb_host");
|
||||||
if (IS_ERR_OR_NULL(tegra->genpd_dev_host)) {
|
if (IS_ERR(tegra->genpd_dev_host)) {
|
||||||
err = PTR_ERR(tegra->genpd_dev_host) ? : -ENODATA;
|
err = PTR_ERR(tegra->genpd_dev_host);
|
||||||
dev_err(dev, "failed to get host pm-domain: %d\n", err);
|
dev_err(dev, "failed to get host pm-domain: %d\n", err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
tegra->genpd_dev_ss = dev_pm_domain_attach_by_name(dev, "xusb_ss");
|
tegra->genpd_dev_ss = dev_pm_domain_attach_by_name(dev, "xusb_ss");
|
||||||
if (IS_ERR_OR_NULL(tegra->genpd_dev_ss)) {
|
if (IS_ERR(tegra->genpd_dev_ss)) {
|
||||||
err = PTR_ERR(tegra->genpd_dev_ss) ? : -ENODATA;
|
err = PTR_ERR(tegra->genpd_dev_ss);
|
||||||
dev_err(dev, "failed to get superspeed pm-domain: %d\n", err);
|
dev_err(dev, "failed to get superspeed pm-domain: %d\n", err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,7 +77,7 @@ static int ehset_probe(struct usb_interface *intf,
|
||||||
switch (test_pid) {
|
switch (test_pid) {
|
||||||
case TEST_SE0_NAK_PID:
|
case TEST_SE0_NAK_PID:
|
||||||
ret = ehset_prepare_port_for_testing(hub_udev, portnum);
|
ret = ehset_prepare_port_for_testing(hub_udev, portnum);
|
||||||
if (!ret)
|
if (ret < 0)
|
||||||
break;
|
break;
|
||||||
ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
|
ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
|
||||||
USB_RT_PORT, USB_PORT_FEAT_TEST,
|
USB_RT_PORT, USB_PORT_FEAT_TEST,
|
||||||
|
@ -86,7 +86,7 @@ static int ehset_probe(struct usb_interface *intf,
|
||||||
break;
|
break;
|
||||||
case TEST_J_PID:
|
case TEST_J_PID:
|
||||||
ret = ehset_prepare_port_for_testing(hub_udev, portnum);
|
ret = ehset_prepare_port_for_testing(hub_udev, portnum);
|
||||||
if (!ret)
|
if (ret < 0)
|
||||||
break;
|
break;
|
||||||
ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
|
ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
|
||||||
USB_RT_PORT, USB_PORT_FEAT_TEST,
|
USB_RT_PORT, USB_PORT_FEAT_TEST,
|
||||||
|
@ -95,7 +95,7 @@ static int ehset_probe(struct usb_interface *intf,
|
||||||
break;
|
break;
|
||||||
case TEST_K_PID:
|
case TEST_K_PID:
|
||||||
ret = ehset_prepare_port_for_testing(hub_udev, portnum);
|
ret = ehset_prepare_port_for_testing(hub_udev, portnum);
|
||||||
if (!ret)
|
if (ret < 0)
|
||||||
break;
|
break;
|
||||||
ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
|
ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
|
||||||
USB_RT_PORT, USB_PORT_FEAT_TEST,
|
USB_RT_PORT, USB_PORT_FEAT_TEST,
|
||||||
|
@ -104,7 +104,7 @@ static int ehset_probe(struct usb_interface *intf,
|
||||||
break;
|
break;
|
||||||
case TEST_PACKET_PID:
|
case TEST_PACKET_PID:
|
||||||
ret = ehset_prepare_port_for_testing(hub_udev, portnum);
|
ret = ehset_prepare_port_for_testing(hub_udev, portnum);
|
||||||
if (!ret)
|
if (ret < 0)
|
||||||
break;
|
break;
|
||||||
ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
|
ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
|
||||||
USB_RT_PORT, USB_PORT_FEAT_TEST,
|
USB_RT_PORT, USB_PORT_FEAT_TEST,
|
||||||
|
|
|
@ -251,6 +251,7 @@ static void option_instat_callback(struct urb *urb);
|
||||||
#define QUECTEL_PRODUCT_EM061K_LTA 0x0123
|
#define QUECTEL_PRODUCT_EM061K_LTA 0x0123
|
||||||
#define QUECTEL_PRODUCT_EM061K_LMS 0x0124
|
#define QUECTEL_PRODUCT_EM061K_LMS 0x0124
|
||||||
#define QUECTEL_PRODUCT_EC25 0x0125
|
#define QUECTEL_PRODUCT_EC25 0x0125
|
||||||
|
#define QUECTEL_PRODUCT_EM060K_128 0x0128
|
||||||
#define QUECTEL_PRODUCT_EG91 0x0191
|
#define QUECTEL_PRODUCT_EG91 0x0191
|
||||||
#define QUECTEL_PRODUCT_EG95 0x0195
|
#define QUECTEL_PRODUCT_EG95 0x0195
|
||||||
#define QUECTEL_PRODUCT_BG96 0x0296
|
#define QUECTEL_PRODUCT_BG96 0x0296
|
||||||
|
@ -268,6 +269,7 @@ static void option_instat_callback(struct urb *urb);
|
||||||
#define QUECTEL_PRODUCT_RM520N 0x0801
|
#define QUECTEL_PRODUCT_RM520N 0x0801
|
||||||
#define QUECTEL_PRODUCT_EC200U 0x0901
|
#define QUECTEL_PRODUCT_EC200U 0x0901
|
||||||
#define QUECTEL_PRODUCT_EC200S_CN 0x6002
|
#define QUECTEL_PRODUCT_EC200S_CN 0x6002
|
||||||
|
#define QUECTEL_PRODUCT_EC200A 0x6005
|
||||||
#define QUECTEL_PRODUCT_EM061K_LWW 0x6008
|
#define QUECTEL_PRODUCT_EM061K_LWW 0x6008
|
||||||
#define QUECTEL_PRODUCT_EM061K_LCN 0x6009
|
#define QUECTEL_PRODUCT_EM061K_LCN 0x6009
|
||||||
#define QUECTEL_PRODUCT_EC200T 0x6026
|
#define QUECTEL_PRODUCT_EC200T 0x6026
|
||||||
|
@ -1197,6 +1199,9 @@ static const struct usb_device_id option_ids[] = {
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K, 0xff, 0x00, 0x40) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K, 0xff, 0x00, 0x40) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K, 0xff, 0xff, 0x30) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K, 0xff, 0xff, 0x30) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K, 0xff, 0xff, 0x40) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K, 0xff, 0xff, 0x40) },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_128, 0xff, 0xff, 0x30) },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_128, 0xff, 0x00, 0x40) },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_128, 0xff, 0xff, 0x40) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM061K_LCN, 0xff, 0xff, 0x30) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM061K_LCN, 0xff, 0xff, 0x30) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM061K_LCN, 0xff, 0x00, 0x40) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM061K_LCN, 0xff, 0x00, 0x40) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM061K_LCN, 0xff, 0xff, 0x40) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM061K_LCN, 0xff, 0xff, 0x40) },
|
||||||
|
@ -1225,6 +1230,7 @@ static const struct usb_device_id option_ids[] = {
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM520N, 0xff, 0, 0) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM520N, 0xff, 0, 0) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 0x0900, 0xff, 0, 0), /* RM500U-CN */
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 0x0900, 0xff, 0, 0), /* RM500U-CN */
|
||||||
.driver_info = ZLP },
|
.driver_info = ZLP },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200A, 0xff, 0, 0) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200U, 0xff, 0, 0) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200U, 0xff, 0, 0) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) },
|
||||||
|
|
|
@ -38,16 +38,6 @@ static struct usb_serial_driver vendor##_device = { \
|
||||||
{ USB_DEVICE(0x0a21, 0x8001) } /* MMT-7305WW */
|
{ USB_DEVICE(0x0a21, 0x8001) } /* MMT-7305WW */
|
||||||
DEVICE(carelink, CARELINK_IDS);
|
DEVICE(carelink, CARELINK_IDS);
|
||||||
|
|
||||||
/* ZIO Motherboard USB driver */
|
|
||||||
#define ZIO_IDS() \
|
|
||||||
{ USB_DEVICE(0x1CBE, 0x0103) }
|
|
||||||
DEVICE(zio, ZIO_IDS);
|
|
||||||
|
|
||||||
/* Funsoft Serial USB driver */
|
|
||||||
#define FUNSOFT_IDS() \
|
|
||||||
{ USB_DEVICE(0x1404, 0xcddc) }
|
|
||||||
DEVICE(funsoft, FUNSOFT_IDS);
|
|
||||||
|
|
||||||
/* Infineon Flashloader driver */
|
/* Infineon Flashloader driver */
|
||||||
#define FLASHLOADER_IDS() \
|
#define FLASHLOADER_IDS() \
|
||||||
{ USB_DEVICE_INTERFACE_CLASS(0x058b, 0x0041, USB_CLASS_CDC_DATA) }, \
|
{ USB_DEVICE_INTERFACE_CLASS(0x058b, 0x0041, USB_CLASS_CDC_DATA) }, \
|
||||||
|
@ -55,6 +45,11 @@ DEVICE(funsoft, FUNSOFT_IDS);
|
||||||
{ USB_DEVICE(0x8087, 0x0801) }
|
{ USB_DEVICE(0x8087, 0x0801) }
|
||||||
DEVICE(flashloader, FLASHLOADER_IDS);
|
DEVICE(flashloader, FLASHLOADER_IDS);
|
||||||
|
|
||||||
|
/* Funsoft Serial USB driver */
|
||||||
|
#define FUNSOFT_IDS() \
|
||||||
|
{ USB_DEVICE(0x1404, 0xcddc) }
|
||||||
|
DEVICE(funsoft, FUNSOFT_IDS);
|
||||||
|
|
||||||
/* Google Serial USB SubClass */
|
/* Google Serial USB SubClass */
|
||||||
#define GOOGLE_IDS() \
|
#define GOOGLE_IDS() \
|
||||||
{ USB_VENDOR_AND_INTERFACE_INFO(0x18d1, \
|
{ USB_VENDOR_AND_INTERFACE_INFO(0x18d1, \
|
||||||
|
@ -63,16 +58,21 @@ DEVICE(flashloader, FLASHLOADER_IDS);
|
||||||
0x01) }
|
0x01) }
|
||||||
DEVICE(google, GOOGLE_IDS);
|
DEVICE(google, GOOGLE_IDS);
|
||||||
|
|
||||||
|
/* HP4x (48/49) Generic Serial driver */
|
||||||
|
#define HP4X_IDS() \
|
||||||
|
{ USB_DEVICE(0x03f0, 0x0121) }
|
||||||
|
DEVICE(hp4x, HP4X_IDS);
|
||||||
|
|
||||||
|
/* KAUFMANN RKS+CAN VCP */
|
||||||
|
#define KAUFMANN_IDS() \
|
||||||
|
{ USB_DEVICE(0x16d0, 0x0870) }
|
||||||
|
DEVICE(kaufmann, KAUFMANN_IDS);
|
||||||
|
|
||||||
/* Libtransistor USB console */
|
/* Libtransistor USB console */
|
||||||
#define LIBTRANSISTOR_IDS() \
|
#define LIBTRANSISTOR_IDS() \
|
||||||
{ USB_DEVICE(0x1209, 0x8b00) }
|
{ USB_DEVICE(0x1209, 0x8b00) }
|
||||||
DEVICE(libtransistor, LIBTRANSISTOR_IDS);
|
DEVICE(libtransistor, LIBTRANSISTOR_IDS);
|
||||||
|
|
||||||
/* ViVOpay USB Serial Driver */
|
|
||||||
#define VIVOPAY_IDS() \
|
|
||||||
{ USB_DEVICE(0x1d5f, 0x1004) } /* ViVOpay 8800 */
|
|
||||||
DEVICE(vivopay, VIVOPAY_IDS);
|
|
||||||
|
|
||||||
/* Motorola USB Phone driver */
|
/* Motorola USB Phone driver */
|
||||||
#define MOTO_IDS() \
|
#define MOTO_IDS() \
|
||||||
{ USB_DEVICE(0x05c6, 0x3197) }, /* unknown Motorola phone */ \
|
{ USB_DEVICE(0x05c6, 0x3197) }, /* unknown Motorola phone */ \
|
||||||
|
@ -101,10 +101,10 @@ DEVICE(nokia, NOKIA_IDS);
|
||||||
{ USB_DEVICE(0x09d7, 0x0100) } /* NovAtel FlexPack GPS */
|
{ USB_DEVICE(0x09d7, 0x0100) } /* NovAtel FlexPack GPS */
|
||||||
DEVICE_N(novatel_gps, NOVATEL_IDS, 3);
|
DEVICE_N(novatel_gps, NOVATEL_IDS, 3);
|
||||||
|
|
||||||
/* HP4x (48/49) Generic Serial driver */
|
/* Siemens USB/MPI adapter */
|
||||||
#define HP4X_IDS() \
|
#define SIEMENS_IDS() \
|
||||||
{ USB_DEVICE(0x03f0, 0x0121) }
|
{ USB_DEVICE(0x908, 0x0004) }
|
||||||
DEVICE(hp4x, HP4X_IDS);
|
DEVICE(siemens_mpi, SIEMENS_IDS);
|
||||||
|
|
||||||
/* Suunto ANT+ USB Driver */
|
/* Suunto ANT+ USB Driver */
|
||||||
#define SUUNTO_IDS() \
|
#define SUUNTO_IDS() \
|
||||||
|
@ -112,45 +112,52 @@ DEVICE(hp4x, HP4X_IDS);
|
||||||
{ USB_DEVICE(0x0fcf, 0x1009) } /* Dynastream ANT USB-m Stick */
|
{ USB_DEVICE(0x0fcf, 0x1009) } /* Dynastream ANT USB-m Stick */
|
||||||
DEVICE(suunto, SUUNTO_IDS);
|
DEVICE(suunto, SUUNTO_IDS);
|
||||||
|
|
||||||
/* Siemens USB/MPI adapter */
|
/* ViVOpay USB Serial Driver */
|
||||||
#define SIEMENS_IDS() \
|
#define VIVOPAY_IDS() \
|
||||||
{ USB_DEVICE(0x908, 0x0004) }
|
{ USB_DEVICE(0x1d5f, 0x1004) } /* ViVOpay 8800 */
|
||||||
DEVICE(siemens_mpi, SIEMENS_IDS);
|
DEVICE(vivopay, VIVOPAY_IDS);
|
||||||
|
|
||||||
|
/* ZIO Motherboard USB driver */
|
||||||
|
#define ZIO_IDS() \
|
||||||
|
{ USB_DEVICE(0x1CBE, 0x0103) }
|
||||||
|
DEVICE(zio, ZIO_IDS);
|
||||||
|
|
||||||
/* All of the above structures mushed into two lists */
|
/* All of the above structures mushed into two lists */
|
||||||
static struct usb_serial_driver * const serial_drivers[] = {
|
static struct usb_serial_driver * const serial_drivers[] = {
|
||||||
&carelink_device,
|
&carelink_device,
|
||||||
&zio_device,
|
|
||||||
&funsoft_device,
|
|
||||||
&flashloader_device,
|
&flashloader_device,
|
||||||
|
&funsoft_device,
|
||||||
&google_device,
|
&google_device,
|
||||||
|
&hp4x_device,
|
||||||
|
&kaufmann_device,
|
||||||
&libtransistor_device,
|
&libtransistor_device,
|
||||||
&vivopay_device,
|
|
||||||
&moto_modem_device,
|
&moto_modem_device,
|
||||||
&motorola_tetra_device,
|
&motorola_tetra_device,
|
||||||
&nokia_device,
|
&nokia_device,
|
||||||
&novatel_gps_device,
|
&novatel_gps_device,
|
||||||
&hp4x_device,
|
|
||||||
&suunto_device,
|
|
||||||
&siemens_mpi_device,
|
&siemens_mpi_device,
|
||||||
|
&suunto_device,
|
||||||
|
&vivopay_device,
|
||||||
|
&zio_device,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct usb_device_id id_table[] = {
|
static const struct usb_device_id id_table[] = {
|
||||||
CARELINK_IDS(),
|
CARELINK_IDS(),
|
||||||
ZIO_IDS(),
|
|
||||||
FUNSOFT_IDS(),
|
|
||||||
FLASHLOADER_IDS(),
|
FLASHLOADER_IDS(),
|
||||||
|
FUNSOFT_IDS(),
|
||||||
GOOGLE_IDS(),
|
GOOGLE_IDS(),
|
||||||
|
HP4X_IDS(),
|
||||||
|
KAUFMANN_IDS(),
|
||||||
LIBTRANSISTOR_IDS(),
|
LIBTRANSISTOR_IDS(),
|
||||||
VIVOPAY_IDS(),
|
|
||||||
MOTO_IDS(),
|
MOTO_IDS(),
|
||||||
MOTOROLA_TETRA_IDS(),
|
MOTOROLA_TETRA_IDS(),
|
||||||
NOKIA_IDS(),
|
NOKIA_IDS(),
|
||||||
NOVATEL_IDS(),
|
NOVATEL_IDS(),
|
||||||
HP4X_IDS(),
|
|
||||||
SUUNTO_IDS(),
|
|
||||||
SIEMENS_IDS(),
|
SIEMENS_IDS(),
|
||||||
|
SUUNTO_IDS(),
|
||||||
|
VIVOPAY_IDS(),
|
||||||
|
ZIO_IDS(),
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(usb, id_table);
|
MODULE_DEVICE_TABLE(usb, id_table);
|
||||||
|
|
|
@ -1277,8 +1277,7 @@ static ssize_t select_usb_power_delivery_show(struct device *dev,
|
||||||
{
|
{
|
||||||
struct typec_port *port = to_typec_port(dev);
|
struct typec_port *port = to_typec_port(dev);
|
||||||
struct usb_power_delivery **pds;
|
struct usb_power_delivery **pds;
|
||||||
struct usb_power_delivery *pd;
|
int i, ret = 0;
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (!port->ops || !port->ops->pd_get)
|
if (!port->ops || !port->ops->pd_get)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
@ -1287,11 +1286,11 @@ static ssize_t select_usb_power_delivery_show(struct device *dev,
|
||||||
if (!pds)
|
if (!pds)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (pd = pds[0]; pd; pd++) {
|
for (i = 0; pds[i]; i++) {
|
||||||
if (pd == port->pd)
|
if (pds[i] == port->pd)
|
||||||
ret += sysfs_emit(buf + ret, "[%s] ", dev_name(&pd->dev));
|
ret += sysfs_emit_at(buf, ret, "[%s] ", dev_name(&pds[i]->dev));
|
||||||
else
|
else
|
||||||
ret += sysfs_emit(buf + ret, "%s ", dev_name(&pd->dev));
|
ret += sysfs_emit_at(buf, ret, "%s ", dev_name(&pds[i]->dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
buf[ret - 1] = '\n';
|
buf[ret - 1] = '\n';
|
||||||
|
@ -2288,6 +2287,8 @@ struct typec_port *typec_register_port(struct device *parent,
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
port->pd = cap->pd;
|
||||||
|
|
||||||
ret = device_add(&port->dev);
|
ret = device_add(&port->dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(parent, "failed to register port (%d)\n", ret);
|
dev_err(parent, "failed to register port (%d)\n", ret);
|
||||||
|
@ -2295,7 +2296,7 @@ struct typec_port *typec_register_port(struct device *parent,
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = typec_port_set_usb_power_delivery(port, cap->pd);
|
ret = usb_power_delivery_link_device(port->pd, &port->dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&port->dev, "failed to link pd\n");
|
dev_err(&port->dev, "failed to link pd\n");
|
||||||
device_unregister(&port->dev);
|
device_unregister(&port->dev);
|
||||||
|
|
|
@ -209,8 +209,8 @@ static int qcom_pmic_typec_probe(struct platform_device *pdev)
|
||||||
platform_set_drvdata(pdev, tcpm);
|
platform_set_drvdata(pdev, tcpm);
|
||||||
|
|
||||||
tcpm->tcpc.fwnode = device_get_named_child_node(tcpm->dev, "connector");
|
tcpm->tcpc.fwnode = device_get_named_child_node(tcpm->dev, "connector");
|
||||||
if (IS_ERR(tcpm->tcpc.fwnode))
|
if (!tcpm->tcpc.fwnode)
|
||||||
return PTR_ERR(tcpm->tcpc.fwnode);
|
return -EINVAL;
|
||||||
|
|
||||||
tcpm->tcpm_port = tcpm_register_port(tcpm->dev, &tcpm->tcpc);
|
tcpm->tcpm_port = tcpm_register_port(tcpm->dev, &tcpm->tcpc);
|
||||||
if (IS_ERR(tcpm->tcpm_port)) {
|
if (IS_ERR(tcpm->tcpm_port)) {
|
||||||
|
|
|
@ -785,6 +785,8 @@ static void ucsi_unregister_partner(struct ucsi_connector *con)
|
||||||
if (!con->partner)
|
if (!con->partner)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
typec_set_mode(con->port, TYPEC_STATE_SAFE);
|
||||||
|
|
||||||
ucsi_unregister_partner_pdos(con);
|
ucsi_unregister_partner_pdos(con);
|
||||||
ucsi_unregister_altmodes(con, UCSI_RECIPIENT_SOP);
|
ucsi_unregister_altmodes(con, UCSI_RECIPIENT_SOP);
|
||||||
typec_unregister_partner(con->partner);
|
typec_unregister_partner(con->partner);
|
||||||
|
@ -825,8 +827,6 @@ static void ucsi_partner_change(struct ucsi_connector *con)
|
||||||
UCSI_CONSTAT_PARTNER_FLAG_USB)
|
UCSI_CONSTAT_PARTNER_FLAG_USB)
|
||||||
typec_set_mode(con->port, TYPEC_STATE_USB);
|
typec_set_mode(con->port, TYPEC_STATE_USB);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
typec_set_mode(con->port, TYPEC_STATE_SAFE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Only notify USB controller if partner supports USB data */
|
/* Only notify USB controller if partner supports USB data */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue