USB fixes for 5.15-rc5
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. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCYWBsEw8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+yn5KwCfYnVRiMWOqOfbOc3pROB9fV6BrocAoIKyzVoR BkEqytEaB/DW/5vPzns6 =W9cz -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
741668ef78
|
@ -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);
|
||||
if (IS_ERR(data->phy)) {
|
||||
ret = PTR_ERR(data->phy);
|
||||
/* Return -EINVAL if no usbphy is available */
|
||||
if (ret == -ENODEV)
|
||||
data->phy = NULL;
|
||||
else
|
||||
goto err_clk;
|
||||
if (ret == -ENODEV) {
|
||||
data->phy = devm_usb_get_phy_by_phandle(dev, "phys", 0);
|
||||
if (IS_ERR(data->phy)) {
|
||||
ret = PTR_ERR(data->phy);
|
||||
if (ret == -ENODEV)
|
||||
data->phy = NULL;
|
||||
else
|
||||
goto err_clk;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pdata.usb_phy = data->phy;
|
||||
|
|
|
@ -340,6 +340,9 @@ static void acm_process_notification(struct acm *acm, unsigned char *buf)
|
|||
acm->iocount.overrun++;
|
||||
spin_unlock_irqrestore(&acm->read_lock, flags);
|
||||
|
||||
if (newctrl & ACM_CTRL_BRK)
|
||||
tty_flip_buffer_push(&acm->port);
|
||||
|
||||
if (difference)
|
||||
wake_up_all(&acm->wioctl);
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (!urb->actual_length)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&acm->read_lock, flags);
|
||||
tty_insert_flip_string(&acm->port, urb->transfer_buffer,
|
||||
urb->actual_length);
|
||||
spin_unlock_irqrestore(&acm->read_lock, flags);
|
||||
|
||||
tty_flip_buffer_push(&acm->port);
|
||||
}
|
||||
|
||||
|
|
|
@ -824,7 +824,7 @@ static struct usb_class_driver wdm_class = {
|
|||
};
|
||||
|
||||
/* --- WWAN framework integration --- */
|
||||
#ifdef CONFIG_WWAN_CORE
|
||||
#ifdef CONFIG_WWAN
|
||||
static int wdm_wwan_port_start(struct wwan_port *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)
|
|||
/* inbuf has been copied, it is safe to check for outstanding data */
|
||||
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_deinit(struct wdm_device *desc) {}
|
||||
static void wdm_wwan_rx(struct wdm_device *desc, int length) {}
|
||||
#endif /* CONFIG_WWAN_CORE */
|
||||
#endif /* CONFIG_WWAN */
|
||||
|
||||
/* --- error handling --- */
|
||||
static void wdm_rxwork(struct work_struct *work)
|
||||
|
|
|
@ -6,8 +6,7 @@ config USB_COMMON
|
|||
|
||||
config USB_LED_TRIG
|
||||
bool "USB LED Triggers"
|
||||
depends on LEDS_CLASS && LEDS_TRIGGERS
|
||||
select USB_COMMON
|
||||
depends on LEDS_CLASS && USB_COMMON && LEDS_TRIGGERS
|
||||
help
|
||||
This option adds LED triggers for USB host and/or gadget activity.
|
||||
|
||||
|
|
|
@ -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->platform_data = dwc;
|
||||
dwc->gadget->ops = &dwc3_gadget_ops;
|
||||
|
|
|
@ -674,11 +674,17 @@ static int set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts,
|
|||
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;
|
||||
|
||||
max_size_bw = num_channels(chmask) * ssize *
|
||||
DIV_ROUND_UP(srate, factor / (1 << (ep_desc->bInterval - 1)));
|
||||
// updated srate is always bigger, therefore DIV_ROUND_UP always yields +1
|
||||
max_size_bw = num_channels(chmask) * ssize *
|
||||
(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,
|
||||
max_size_ep));
|
||||
|
||||
|
|
|
@ -1787,7 +1787,6 @@ static int tegra_xusb_remove(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_PM) || IS_ENABLED(CONFIG_PM_SLEEP)
|
||||
static bool xhci_hub_ports_suspended(struct xhci_hub *hub)
|
||||
{
|
||||
struct device *dev = hub->hcd->self.controller;
|
||||
|
@ -2102,7 +2101,7 @@ out:
|
|||
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);
|
||||
int err;
|
||||
|
@ -2144,7 +2143,7 @@ out:
|
|||
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);
|
||||
int err;
|
||||
|
@ -2174,10 +2173,8 @@ static int tegra_xusb_resume(struct device *dev)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int tegra_xusb_runtime_suspend(struct device *dev)
|
||||
static __maybe_unused int tegra_xusb_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct tegra_xusb *tegra = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
@ -2190,7 +2187,7 @@ static int tegra_xusb_runtime_suspend(struct device *dev)
|
|||
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);
|
||||
int err;
|
||||
|
@ -2201,7 +2198,6 @@ static int tegra_xusb_runtime_resume(struct device *dev)
|
|||
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct dev_pm_ops tegra_xusb_pm_ops = {
|
||||
SET_RUNTIME_PM_OPS(tegra_xusb_runtime_suspend,
|
||||
|
|
|
@ -696,7 +696,7 @@ irqreturn_t tcpci_irq(struct tcpci *tcpci)
|
|||
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);
|
||||
if (!ret && (raw & TCPC_EXTENDED_STATUS_VSAFE0V))
|
||||
tcpm_vbus_change(tcpci->port);
|
||||
|
|
|
@ -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);
|
||||
break;
|
||||
case SRC_ATTACHED:
|
||||
case SRC_STARTUP:
|
||||
case SRC_SEND_CAPABILITIES:
|
||||
case SRC_READY:
|
||||
if (tcpm_port_is_disconnected(port) ||
|
||||
|
|
|
@ -625,10 +625,6 @@ static int tps6598x_probe(struct i2c_client *client)
|
|||
if (ret < 0)
|
||||
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
|
||||
* struct device. Instead we simply parse it to read the properties.
|
||||
|
@ -636,7 +632,9 @@ static int tps6598x_probe(struct i2c_client *client)
|
|||
* with existing DT files, we work around this by deleting any
|
||||
* 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);
|
||||
if (IS_ERR(tps->role_sw)) {
|
||||
|
|
Loading…
Reference in New Issue