Commit 741668ef authored by Linus Torvalds's avatar Linus Torvalds

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

Pull USB fixes from Greg KH:
 "Here are some small USB fixes for 5.15-rc5 that resolve a number of
  reported issues:

   - gadget driver fixes

   - xhci build warning fixes

   - build configuration fix

   - cdc-acm tty handling fixes

   - cdc-wdm fix

   - typec fixes

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

* tag 'usb-5.15-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
  USB: cdc-acm: fix break reporting
  USB: cdc-acm: fix racy tty buffer accesses
  usb: gadget: f_uac2: fixed EP-IN wMaxPacketSize
  usb: cdc-wdm: Fix check for WWAN
  usb: chipidea: ci_hdrc_imx: Also search for 'phys' phandle
  usb: typec: tcpm: handle SRC_STARTUP state if cc changes
  usb: typec: tcpci: don't handle vSafe0V event if it's not enabled
  usb: typec: tipd: Remove dependency on "connector" child fwnode
  Partially revert "usb: Kconfig: using select for USB_COMMON dependency"
  usb: dwc3: gadget: Revert "set gadgets parent to the right controller"
  usb: xhci: tegra: mark PM functions as __maybe_unused
parents 9c7e7050 58fc1daa
...@@ -420,11 +420,16 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev) ...@@ -420,11 +420,16 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)
data->phy = devm_usb_get_phy_by_phandle(dev, "fsl,usbphy", 0); data->phy = devm_usb_get_phy_by_phandle(dev, "fsl,usbphy", 0);
if (IS_ERR(data->phy)) { if (IS_ERR(data->phy)) {
ret = PTR_ERR(data->phy); ret = PTR_ERR(data->phy);
/* Return -EINVAL if no usbphy is available */ if (ret == -ENODEV) {
if (ret == -ENODEV) data->phy = devm_usb_get_phy_by_phandle(dev, "phys", 0);
data->phy = NULL; if (IS_ERR(data->phy)) {
else ret = PTR_ERR(data->phy);
goto err_clk; if (ret == -ENODEV)
data->phy = NULL;
else
goto err_clk;
}
}
} }
pdata.usb_phy = data->phy; pdata.usb_phy = data->phy;
......
...@@ -340,6 +340,9 @@ static void acm_process_notification(struct acm *acm, unsigned char *buf) ...@@ -340,6 +340,9 @@ static void acm_process_notification(struct acm *acm, unsigned char *buf)
acm->iocount.overrun++; acm->iocount.overrun++;
spin_unlock_irqrestore(&acm->read_lock, flags); spin_unlock_irqrestore(&acm->read_lock, flags);
if (newctrl & ACM_CTRL_BRK)
tty_flip_buffer_push(&acm->port);
if (difference) if (difference)
wake_up_all(&acm->wioctl); wake_up_all(&acm->wioctl);
...@@ -475,11 +478,16 @@ static int acm_submit_read_urbs(struct acm *acm, gfp_t mem_flags) ...@@ -475,11 +478,16 @@ static int acm_submit_read_urbs(struct acm *acm, gfp_t mem_flags)
static void acm_process_read_urb(struct acm *acm, struct urb *urb) static void acm_process_read_urb(struct acm *acm, struct urb *urb)
{ {
unsigned long flags;
if (!urb->actual_length) if (!urb->actual_length)
return; return;
spin_lock_irqsave(&acm->read_lock, flags);
tty_insert_flip_string(&acm->port, urb->transfer_buffer, tty_insert_flip_string(&acm->port, urb->transfer_buffer,
urb->actual_length); urb->actual_length);
spin_unlock_irqrestore(&acm->read_lock, flags);
tty_flip_buffer_push(&acm->port); tty_flip_buffer_push(&acm->port);
} }
......
...@@ -824,7 +824,7 @@ static struct usb_class_driver wdm_class = { ...@@ -824,7 +824,7 @@ static struct usb_class_driver wdm_class = {
}; };
/* --- WWAN framework integration --- */ /* --- WWAN framework integration --- */
#ifdef CONFIG_WWAN_CORE #ifdef CONFIG_WWAN
static int wdm_wwan_port_start(struct wwan_port *port) static int wdm_wwan_port_start(struct wwan_port *port)
{ {
struct wdm_device *desc = wwan_port_get_drvdata(port); struct wdm_device *desc = wwan_port_get_drvdata(port);
...@@ -963,11 +963,11 @@ static void wdm_wwan_rx(struct wdm_device *desc, int length) ...@@ -963,11 +963,11 @@ static void wdm_wwan_rx(struct wdm_device *desc, int length)
/* inbuf has been copied, it is safe to check for outstanding data */ /* inbuf has been copied, it is safe to check for outstanding data */
schedule_work(&desc->service_outs_intr); schedule_work(&desc->service_outs_intr);
} }
#else /* CONFIG_WWAN_CORE */ #else /* CONFIG_WWAN */
static void wdm_wwan_init(struct wdm_device *desc) {} static void wdm_wwan_init(struct wdm_device *desc) {}
static void wdm_wwan_deinit(struct wdm_device *desc) {} static void wdm_wwan_deinit(struct wdm_device *desc) {}
static void wdm_wwan_rx(struct wdm_device *desc, int length) {} static void wdm_wwan_rx(struct wdm_device *desc, int length) {}
#endif /* CONFIG_WWAN_CORE */ #endif /* CONFIG_WWAN */
/* --- error handling --- */ /* --- error handling --- */
static void wdm_rxwork(struct work_struct *work) static void wdm_rxwork(struct work_struct *work)
......
...@@ -6,8 +6,7 @@ config USB_COMMON ...@@ -6,8 +6,7 @@ config USB_COMMON
config USB_LED_TRIG config USB_LED_TRIG
bool "USB LED Triggers" bool "USB LED Triggers"
depends on LEDS_CLASS && LEDS_TRIGGERS depends on LEDS_CLASS && USB_COMMON && LEDS_TRIGGERS
select USB_COMMON
help help
This option adds LED triggers for USB host and/or gadget activity. This option adds LED triggers for USB host and/or gadget activity.
......
...@@ -4243,7 +4243,7 @@ int dwc3_gadget_init(struct dwc3 *dwc) ...@@ -4243,7 +4243,7 @@ int dwc3_gadget_init(struct dwc3 *dwc)
} }
usb_initialize_gadget(dwc->sysdev, dwc->gadget, dwc_gadget_release); usb_initialize_gadget(dwc->dev, dwc->gadget, dwc_gadget_release);
dev = &dwc->gadget->dev; dev = &dwc->gadget->dev;
dev->platform_data = dwc; dev->platform_data = dwc;
dwc->gadget->ops = &dwc3_gadget_ops; dwc->gadget->ops = &dwc3_gadget_ops;
......
...@@ -674,11 +674,17 @@ static int set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts, ...@@ -674,11 +674,17 @@ static int set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts,
ssize = uac2_opts->c_ssize; ssize = uac2_opts->c_ssize;
} }
if (!is_playback && (uac2_opts->c_sync == USB_ENDPOINT_SYNC_ASYNC)) if (!is_playback && (uac2_opts->c_sync == USB_ENDPOINT_SYNC_ASYNC)) {
// Win10 requires max packet size + 1 frame
srate = srate * (1000 + uac2_opts->fb_max) / 1000; srate = srate * (1000 + uac2_opts->fb_max) / 1000;
// updated srate is always bigger, therefore DIV_ROUND_UP always yields +1
max_size_bw = num_channels(chmask) * ssize * max_size_bw = num_channels(chmask) * ssize *
DIV_ROUND_UP(srate, factor / (1 << (ep_desc->bInterval - 1))); (DIV_ROUND_UP(srate, factor / (1 << (ep_desc->bInterval - 1))));
} else {
// adding 1 frame provision for Win10
max_size_bw = num_channels(chmask) * ssize *
(DIV_ROUND_UP(srate, factor / (1 << (ep_desc->bInterval - 1))) + 1);
}
ep_desc->wMaxPacketSize = cpu_to_le16(min_t(u16, max_size_bw, ep_desc->wMaxPacketSize = cpu_to_le16(min_t(u16, max_size_bw,
max_size_ep)); max_size_ep));
......
...@@ -1787,7 +1787,6 @@ static int tegra_xusb_remove(struct platform_device *pdev) ...@@ -1787,7 +1787,6 @@ static int tegra_xusb_remove(struct platform_device *pdev)
return 0; return 0;
} }
#if IS_ENABLED(CONFIG_PM) || IS_ENABLED(CONFIG_PM_SLEEP)
static bool xhci_hub_ports_suspended(struct xhci_hub *hub) static bool xhci_hub_ports_suspended(struct xhci_hub *hub)
{ {
struct device *dev = hub->hcd->self.controller; struct device *dev = hub->hcd->self.controller;
...@@ -2102,7 +2101,7 @@ static int tegra_xusb_exit_elpg(struct tegra_xusb *tegra, bool runtime) ...@@ -2102,7 +2101,7 @@ static int tegra_xusb_exit_elpg(struct tegra_xusb *tegra, bool runtime)
return err; return err;
} }
static int tegra_xusb_suspend(struct device *dev) static __maybe_unused int tegra_xusb_suspend(struct device *dev)
{ {
struct tegra_xusb *tegra = dev_get_drvdata(dev); struct tegra_xusb *tegra = dev_get_drvdata(dev);
int err; int err;
...@@ -2144,7 +2143,7 @@ static int tegra_xusb_suspend(struct device *dev) ...@@ -2144,7 +2143,7 @@ static int tegra_xusb_suspend(struct device *dev)
return err; return err;
} }
static int tegra_xusb_resume(struct device *dev) static __maybe_unused int tegra_xusb_resume(struct device *dev)
{ {
struct tegra_xusb *tegra = dev_get_drvdata(dev); struct tegra_xusb *tegra = dev_get_drvdata(dev);
int err; int err;
...@@ -2174,10 +2173,8 @@ static int tegra_xusb_resume(struct device *dev) ...@@ -2174,10 +2173,8 @@ static int tegra_xusb_resume(struct device *dev)
return 0; return 0;
} }
#endif
#ifdef CONFIG_PM static __maybe_unused int tegra_xusb_runtime_suspend(struct device *dev)
static int tegra_xusb_runtime_suspend(struct device *dev)
{ {
struct tegra_xusb *tegra = dev_get_drvdata(dev); struct tegra_xusb *tegra = dev_get_drvdata(dev);
int ret; int ret;
...@@ -2190,7 +2187,7 @@ static int tegra_xusb_runtime_suspend(struct device *dev) ...@@ -2190,7 +2187,7 @@ static int tegra_xusb_runtime_suspend(struct device *dev)
return ret; return ret;
} }
static int tegra_xusb_runtime_resume(struct device *dev) static __maybe_unused int tegra_xusb_runtime_resume(struct device *dev)
{ {
struct tegra_xusb *tegra = dev_get_drvdata(dev); struct tegra_xusb *tegra = dev_get_drvdata(dev);
int err; int err;
...@@ -2201,7 +2198,6 @@ static int tegra_xusb_runtime_resume(struct device *dev) ...@@ -2201,7 +2198,6 @@ static int tegra_xusb_runtime_resume(struct device *dev)
return err; return err;
} }
#endif
static const struct dev_pm_ops tegra_xusb_pm_ops = { static const struct dev_pm_ops tegra_xusb_pm_ops = {
SET_RUNTIME_PM_OPS(tegra_xusb_runtime_suspend, SET_RUNTIME_PM_OPS(tegra_xusb_runtime_suspend,
......
...@@ -696,7 +696,7 @@ irqreturn_t tcpci_irq(struct tcpci *tcpci) ...@@ -696,7 +696,7 @@ irqreturn_t tcpci_irq(struct tcpci *tcpci)
tcpm_pd_receive(tcpci->port, &msg); tcpm_pd_receive(tcpci->port, &msg);
} }
if (status & TCPC_ALERT_EXTENDED_STATUS) { if (tcpci->data->vbus_vsafe0v && (status & TCPC_ALERT_EXTENDED_STATUS)) {
ret = regmap_read(tcpci->regmap, TCPC_EXTENDED_STATUS, &raw); ret = regmap_read(tcpci->regmap, TCPC_EXTENDED_STATUS, &raw);
if (!ret && (raw & TCPC_EXTENDED_STATUS_VSAFE0V)) if (!ret && (raw & TCPC_EXTENDED_STATUS_VSAFE0V))
tcpm_vbus_change(tcpci->port); tcpm_vbus_change(tcpci->port);
......
...@@ -4876,6 +4876,7 @@ static void _tcpm_cc_change(struct tcpm_port *port, enum typec_cc_status cc1, ...@@ -4876,6 +4876,7 @@ static void _tcpm_cc_change(struct tcpm_port *port, enum typec_cc_status cc1,
tcpm_set_state(port, SRC_ATTACH_WAIT, 0); tcpm_set_state(port, SRC_ATTACH_WAIT, 0);
break; break;
case SRC_ATTACHED: case SRC_ATTACHED:
case SRC_STARTUP:
case SRC_SEND_CAPABILITIES: case SRC_SEND_CAPABILITIES:
case SRC_READY: case SRC_READY:
if (tcpm_port_is_disconnected(port) || if (tcpm_port_is_disconnected(port) ||
......
...@@ -625,10 +625,6 @@ static int tps6598x_probe(struct i2c_client *client) ...@@ -625,10 +625,6 @@ static int tps6598x_probe(struct i2c_client *client)
if (ret < 0) if (ret < 0)
return ret; return ret;
fwnode = device_get_named_child_node(&client->dev, "connector");
if (!fwnode)
return -ENODEV;
/* /*
* This fwnode has a "compatible" property, but is never populated as a * This fwnode has a "compatible" property, but is never populated as a
* struct device. Instead we simply parse it to read the properties. * struct device. Instead we simply parse it to read the properties.
...@@ -636,7 +632,9 @@ static int tps6598x_probe(struct i2c_client *client) ...@@ -636,7 +632,9 @@ static int tps6598x_probe(struct i2c_client *client)
* with existing DT files, we work around this by deleting any * with existing DT files, we work around this by deleting any
* fwnode_links to/from this fwnode. * fwnode_links to/from this fwnode.
*/ */
fw_devlink_purge_absent_suppliers(fwnode); fwnode = device_get_named_child_node(&client->dev, "connector");
if (fwnode)
fw_devlink_purge_absent_suppliers(fwnode);
tps->role_sw = fwnode_usb_role_switch_get(fwnode); tps->role_sw = fwnode_usb_role_switch_get(fwnode);
if (IS_ERR(tps->role_sw)) { if (IS_ERR(tps->role_sw)) {
......
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