Commit 88f66f13 authored by Linus Torvalds's avatar Linus Torvalds

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
  ...
parents e6d34ced 7f232766
...@@ -4463,7 +4463,6 @@ CADENCE USB3 DRD IP DRIVER ...@@ -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) ...@@ -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[] = { ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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,10 +233,12 @@ static int dwc3_pci_quirks(struct dwc3_pci *dwc, ...@@ -233,10 +233,12 @@ 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.
*/ */
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 * 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, ...@@ -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, ...@@ -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);
/* Matches kref_put() in gadget_unbind(). */
kref_get(&dev->count);
ret = raw_queue_event(dev, USB_RAW_EVENT_CONNECT, 0, NULL); ret = raw_queue_event(dev, USB_RAW_EVENT_CONNECT, 0, NULL);
if (ret < 0) if (ret < 0) {
dev_err(&gadget->dev, "failed to queue event\n"); 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);
return ret; return ret;
} }
......
...@@ -878,7 +878,6 @@ int usb_gadget_activate(struct usb_gadget *gadget) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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;
new_cycle = hw_dequeue & 0x1;
/*
* 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;
}
/* /*
* 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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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); ...@@ -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); ...@@ -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[] = { ...@@ -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[] = { ...@@ -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 = { \ ...@@ -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); ...@@ -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); ...@@ -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); ...@@ -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); ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment