mirror of
https://github.com/torvalds/linux.git
synced 2024-12-25 20:32:22 +00: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
@ -4463,7 +4463,6 @@ CADENCE USB3 DRD IP DRIVER
|
||||
M: Peter Chen <peter.chen@kernel.org>
|
||||
M: Pawel Laszczak <pawell@cadence.com>
|
||||
R: Roger Quadros <rogerq@kernel.org>
|
||||
R: Aswath Govindraju <a-govindraju@ti.com>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
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)
|
||||
{
|
||||
struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget);
|
||||
struct cdns3_endpoint *priv_ep;
|
||||
struct usb_ep *ep;
|
||||
int n_in = 0;
|
||||
int total;
|
||||
|
||||
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++;
|
||||
}
|
||||
|
||||
|
@ -436,6 +436,10 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
/* novation SoundControl XL */
|
||||
{ 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 */
|
||||
{ USB_DEVICE(0x12d1, 0x15bb), .driver_info =
|
||||
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,
|
||||
* 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;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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
|
||||
* RX and/or TX threshold.
|
||||
|
@ -256,9 +256,6 @@
|
||||
#define DWC3_GCTL_GBLHIBERNATIONEN BIT(1)
|
||||
#define DWC3_GCTL_DSBLCLKGTNG BIT(0)
|
||||
|
||||
/* Global User Control Register */
|
||||
#define DWC3_GUCTL_HSTINAUTORETRY BIT(14)
|
||||
|
||||
/* Global User Control 1 Register */
|
||||
#define DWC3_GUCTL1_DEV_DECOUPLE_L1L2_EVT BIT(31)
|
||||
#define DWC3_GUCTL1_TX_IPGAP_LINECHECK_DIS BIT(28)
|
||||
|
@ -233,10 +233,12 @@ static int dwc3_pci_quirks(struct dwc3_pci *dwc,
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
gpiod_add_lookup_table(&platform_bytcr_gpios);
|
||||
if (acpi_dev_present("INT33FC", NULL, -1))
|
||||
gpiod_add_lookup_table(&platform_bytcr_gpios);
|
||||
|
||||
/*
|
||||
* These GPIOs will turn on the USB2 PHY. Note that we have to
|
||||
|
@ -1125,6 +1125,10 @@ int usb_add_config(struct usb_composite_dev *cdev,
|
||||
goto done;
|
||||
|
||||
status = bind(config);
|
||||
|
||||
if (status == 0)
|
||||
status = usb_gadget_check_config(cdev->gadget);
|
||||
|
||||
if (status < 0) {
|
||||
while (!list_empty(&config->functions)) {
|
||||
struct usb_function *f;
|
||||
|
@ -310,13 +310,15 @@ static int gadget_bind(struct usb_gadget *gadget,
|
||||
dev->eps_num = i;
|
||||
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(). */
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -878,7 +878,6 @@ int usb_gadget_activate(struct usb_gadget *gadget)
|
||||
*/
|
||||
if (gadget->connected)
|
||||
ret = usb_gadget_connect_locked(gadget);
|
||||
mutex_unlock(&gadget->udc->connect_lock);
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&gadget->udc->connect_lock);
|
||||
|
@ -3718,15 +3718,15 @@ static int tegra_xudc_powerdomain_init(struct tegra_xudc *xudc)
|
||||
int err;
|
||||
|
||||
xudc->genpd_dev_device = dev_pm_domain_attach_by_name(dev, "dev");
|
||||
if (IS_ERR_OR_NULL(xudc->genpd_dev_device)) {
|
||||
err = PTR_ERR(xudc->genpd_dev_device) ? : -ENODATA;
|
||||
if (IS_ERR(xudc->genpd_dev_device)) {
|
||||
err = PTR_ERR(xudc->genpd_dev_device);
|
||||
dev_err(dev, "failed to get device power domain: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
xudc->genpd_dev_ss = dev_pm_domain_attach_by_name(dev, "ss");
|
||||
if (IS_ERR_OR_NULL(xudc->genpd_dev_ss)) {
|
||||
err = PTR_ERR(xudc->genpd_dev_ss) ? : -ENODATA;
|
||||
if (IS_ERR(xudc->genpd_dev_ss)) {
|
||||
err = PTR_ERR(xudc->genpd_dev_ss);
|
||||
dev_err(dev, "failed to get SuperSpeed power domain: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
@ -672,7 +672,13 @@ ohci_hcd_at91_drv_resume(struct device *dev)
|
||||
else
|
||||
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;
|
||||
}
|
||||
|
@ -586,6 +586,7 @@ static int xhci_mtk_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
device_init_wakeup(dev, true);
|
||||
dma_set_max_seg_size(dev, UINT_MAX);
|
||||
|
||||
xhci = hcd_to_xhci(hcd);
|
||||
xhci->main_hcd = hcd;
|
||||
|
@ -479,10 +479,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||
pdev->device == 0x3432)
|
||||
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_EP_CTX_BROKEN_DCS;
|
||||
}
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
||||
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_command *cmd;
|
||||
struct xhci_segment *new_seg;
|
||||
struct xhci_segment *halted_seg = NULL;
|
||||
union xhci_trb *new_deq;
|
||||
int new_cycle;
|
||||
union xhci_trb *halted_trb;
|
||||
int index = 0;
|
||||
dma_addr_t addr;
|
||||
u64 hw_dequeue;
|
||||
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);
|
||||
new_seg = ep_ring->deq_seg;
|
||||
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
|
||||
|
@ -1145,15 +1145,15 @@ static int tegra_xusb_powerdomain_init(struct device *dev,
|
||||
int err;
|
||||
|
||||
tegra->genpd_dev_host = dev_pm_domain_attach_by_name(dev, "xusb_host");
|
||||
if (IS_ERR_OR_NULL(tegra->genpd_dev_host)) {
|
||||
err = PTR_ERR(tegra->genpd_dev_host) ? : -ENODATA;
|
||||
if (IS_ERR(tegra->genpd_dev_host)) {
|
||||
err = PTR_ERR(tegra->genpd_dev_host);
|
||||
dev_err(dev, "failed to get host pm-domain: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
tegra->genpd_dev_ss = dev_pm_domain_attach_by_name(dev, "xusb_ss");
|
||||
if (IS_ERR_OR_NULL(tegra->genpd_dev_ss)) {
|
||||
err = PTR_ERR(tegra->genpd_dev_ss) ? : -ENODATA;
|
||||
if (IS_ERR(tegra->genpd_dev_ss)) {
|
||||
err = PTR_ERR(tegra->genpd_dev_ss);
|
||||
dev_err(dev, "failed to get superspeed pm-domain: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ static int ehset_probe(struct usb_interface *intf,
|
||||
switch (test_pid) {
|
||||
case TEST_SE0_NAK_PID:
|
||||
ret = ehset_prepare_port_for_testing(hub_udev, portnum);
|
||||
if (!ret)
|
||||
if (ret < 0)
|
||||
break;
|
||||
ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
|
||||
USB_RT_PORT, USB_PORT_FEAT_TEST,
|
||||
@ -86,7 +86,7 @@ static int ehset_probe(struct usb_interface *intf,
|
||||
break;
|
||||
case TEST_J_PID:
|
||||
ret = ehset_prepare_port_for_testing(hub_udev, portnum);
|
||||
if (!ret)
|
||||
if (ret < 0)
|
||||
break;
|
||||
ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
|
||||
USB_RT_PORT, USB_PORT_FEAT_TEST,
|
||||
@ -95,7 +95,7 @@ static int ehset_probe(struct usb_interface *intf,
|
||||
break;
|
||||
case TEST_K_PID:
|
||||
ret = ehset_prepare_port_for_testing(hub_udev, portnum);
|
||||
if (!ret)
|
||||
if (ret < 0)
|
||||
break;
|
||||
ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
|
||||
USB_RT_PORT, USB_PORT_FEAT_TEST,
|
||||
@ -104,7 +104,7 @@ static int ehset_probe(struct usb_interface *intf,
|
||||
break;
|
||||
case TEST_PACKET_PID:
|
||||
ret = ehset_prepare_port_for_testing(hub_udev, portnum);
|
||||
if (!ret)
|
||||
if (ret < 0)
|
||||
break;
|
||||
ret = usb_control_msg_send(hub_udev, 0, USB_REQ_SET_FEATURE,
|
||||
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_LMS 0x0124
|
||||
#define QUECTEL_PRODUCT_EC25 0x0125
|
||||
#define QUECTEL_PRODUCT_EM060K_128 0x0128
|
||||
#define QUECTEL_PRODUCT_EG91 0x0191
|
||||
#define QUECTEL_PRODUCT_EG95 0x0195
|
||||
#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_EC200U 0x0901
|
||||
#define QUECTEL_PRODUCT_EC200S_CN 0x6002
|
||||
#define QUECTEL_PRODUCT_EC200A 0x6005
|
||||
#define QUECTEL_PRODUCT_EM061K_LWW 0x6008
|
||||
#define QUECTEL_PRODUCT_EM061K_LCN 0x6009
|
||||
#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, 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_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, 0x00, 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, 0x0900, 0xff, 0, 0), /* RM500U-CN */
|
||||
.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_EC200S_CN, 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 */
|
||||
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 */
|
||||
#define FLASHLOADER_IDS() \
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x058b, 0x0041, USB_CLASS_CDC_DATA) }, \
|
||||
@ -55,6 +45,11 @@ DEVICE(funsoft, FUNSOFT_IDS);
|
||||
{ USB_DEVICE(0x8087, 0x0801) }
|
||||
DEVICE(flashloader, FLASHLOADER_IDS);
|
||||
|
||||
/* Funsoft Serial USB driver */
|
||||
#define FUNSOFT_IDS() \
|
||||
{ USB_DEVICE(0x1404, 0xcddc) }
|
||||
DEVICE(funsoft, FUNSOFT_IDS);
|
||||
|
||||
/* Google Serial USB SubClass */
|
||||
#define GOOGLE_IDS() \
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(0x18d1, \
|
||||
@ -63,16 +58,21 @@ DEVICE(flashloader, FLASHLOADER_IDS);
|
||||
0x01) }
|
||||
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 */
|
||||
#define LIBTRANSISTOR_IDS() \
|
||||
{ USB_DEVICE(0x1209, 0x8b00) }
|
||||
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 */
|
||||
#define MOTO_IDS() \
|
||||
{ USB_DEVICE(0x05c6, 0x3197) }, /* unknown Motorola phone */ \
|
||||
@ -101,10 +101,10 @@ DEVICE(nokia, NOKIA_IDS);
|
||||
{ USB_DEVICE(0x09d7, 0x0100) } /* NovAtel FlexPack GPS */
|
||||
DEVICE_N(novatel_gps, NOVATEL_IDS, 3);
|
||||
|
||||
/* HP4x (48/49) Generic Serial driver */
|
||||
#define HP4X_IDS() \
|
||||
{ USB_DEVICE(0x03f0, 0x0121) }
|
||||
DEVICE(hp4x, HP4X_IDS);
|
||||
/* Siemens USB/MPI adapter */
|
||||
#define SIEMENS_IDS() \
|
||||
{ USB_DEVICE(0x908, 0x0004) }
|
||||
DEVICE(siemens_mpi, SIEMENS_IDS);
|
||||
|
||||
/* Suunto ANT+ USB Driver */
|
||||
#define SUUNTO_IDS() \
|
||||
@ -112,45 +112,52 @@ DEVICE(hp4x, HP4X_IDS);
|
||||
{ USB_DEVICE(0x0fcf, 0x1009) } /* Dynastream ANT USB-m Stick */
|
||||
DEVICE(suunto, SUUNTO_IDS);
|
||||
|
||||
/* Siemens USB/MPI adapter */
|
||||
#define SIEMENS_IDS() \
|
||||
{ USB_DEVICE(0x908, 0x0004) }
|
||||
DEVICE(siemens_mpi, SIEMENS_IDS);
|
||||
/* ViVOpay USB Serial Driver */
|
||||
#define VIVOPAY_IDS() \
|
||||
{ USB_DEVICE(0x1d5f, 0x1004) } /* ViVOpay 8800 */
|
||||
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 */
|
||||
static struct usb_serial_driver * const serial_drivers[] = {
|
||||
&carelink_device,
|
||||
&zio_device,
|
||||
&funsoft_device,
|
||||
&flashloader_device,
|
||||
&funsoft_device,
|
||||
&google_device,
|
||||
&hp4x_device,
|
||||
&kaufmann_device,
|
||||
&libtransistor_device,
|
||||
&vivopay_device,
|
||||
&moto_modem_device,
|
||||
&motorola_tetra_device,
|
||||
&nokia_device,
|
||||
&novatel_gps_device,
|
||||
&hp4x_device,
|
||||
&suunto_device,
|
||||
&siemens_mpi_device,
|
||||
&suunto_device,
|
||||
&vivopay_device,
|
||||
&zio_device,
|
||||
NULL
|
||||
};
|
||||
|
||||
static const struct usb_device_id id_table[] = {
|
||||
CARELINK_IDS(),
|
||||
ZIO_IDS(),
|
||||
FUNSOFT_IDS(),
|
||||
FLASHLOADER_IDS(),
|
||||
FUNSOFT_IDS(),
|
||||
GOOGLE_IDS(),
|
||||
HP4X_IDS(),
|
||||
KAUFMANN_IDS(),
|
||||
LIBTRANSISTOR_IDS(),
|
||||
VIVOPAY_IDS(),
|
||||
MOTO_IDS(),
|
||||
MOTOROLA_TETRA_IDS(),
|
||||
NOKIA_IDS(),
|
||||
NOVATEL_IDS(),
|
||||
HP4X_IDS(),
|
||||
SUUNTO_IDS(),
|
||||
SIEMENS_IDS(),
|
||||
SUUNTO_IDS(),
|
||||
VIVOPAY_IDS(),
|
||||
ZIO_IDS(),
|
||||
{ },
|
||||
};
|
||||
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 usb_power_delivery **pds;
|
||||
struct usb_power_delivery *pd;
|
||||
int ret = 0;
|
||||
int i, ret = 0;
|
||||
|
||||
if (!port->ops || !port->ops->pd_get)
|
||||
return -EOPNOTSUPP;
|
||||
@ -1287,11 +1286,11 @@ static ssize_t select_usb_power_delivery_show(struct device *dev,
|
||||
if (!pds)
|
||||
return 0;
|
||||
|
||||
for (pd = pds[0]; pd; pd++) {
|
||||
if (pd == port->pd)
|
||||
ret += sysfs_emit(buf + ret, "[%s] ", dev_name(&pd->dev));
|
||||
for (i = 0; pds[i]; i++) {
|
||||
if (pds[i] == port->pd)
|
||||
ret += sysfs_emit_at(buf, ret, "[%s] ", dev_name(&pds[i]->dev));
|
||||
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';
|
||||
@ -2288,6 +2287,8 @@ struct typec_port *typec_register_port(struct device *parent,
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
port->pd = cap->pd;
|
||||
|
||||
ret = device_add(&port->dev);
|
||||
if (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);
|
||||
}
|
||||
|
||||
ret = typec_port_set_usb_power_delivery(port, cap->pd);
|
||||
ret = usb_power_delivery_link_device(port->pd, &port->dev);
|
||||
if (ret) {
|
||||
dev_err(&port->dev, "failed to link pd\n");
|
||||
device_unregister(&port->dev);
|
||||
|
@ -209,8 +209,8 @@ static int qcom_pmic_typec_probe(struct platform_device *pdev)
|
||||
platform_set_drvdata(pdev, tcpm);
|
||||
|
||||
tcpm->tcpc.fwnode = device_get_named_child_node(tcpm->dev, "connector");
|
||||
if (IS_ERR(tcpm->tcpc.fwnode))
|
||||
return PTR_ERR(tcpm->tcpc.fwnode);
|
||||
if (!tcpm->tcpc.fwnode)
|
||||
return -EINVAL;
|
||||
|
||||
tcpm->tcpm_port = tcpm_register_port(tcpm->dev, &tcpm->tcpc);
|
||||
if (IS_ERR(tcpm->tcpm_port)) {
|
||||
|
@ -785,6 +785,8 @@ static void ucsi_unregister_partner(struct ucsi_connector *con)
|
||||
if (!con->partner)
|
||||
return;
|
||||
|
||||
typec_set_mode(con->port, TYPEC_STATE_SAFE);
|
||||
|
||||
ucsi_unregister_partner_pdos(con);
|
||||
ucsi_unregister_altmodes(con, UCSI_RECIPIENT_SOP);
|
||||
typec_unregister_partner(con->partner);
|
||||
@ -825,8 +827,6 @@ static void ucsi_partner_change(struct ucsi_connector *con)
|
||||
UCSI_CONSTAT_PARTNER_FLAG_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 */
|
||||
|
Loading…
Reference in New Issue
Block a user