Commit 67f34fa8 authored by Linus Torvalds's avatar Linus Torvalds

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

Pull USB / PHY driver fixes from Greg KH:
 "Here are a few small USB and PHY driver fixes for 5.10-rc6. They
  include:

   - small PHY driver fixes to resolve reported issues

   - USB quirks added for "broken" devices

   - typec fixes for reported problems

   - USB gadget fixes for small issues

  Full details are in the shortlog, nothing major in here and all have
  been in linux-next with no reported issues"

* tag 'usb-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
  usb: typec: stusb160x: fix power-opmode property with typec-power-opmode
  USB: core: Change %pK for __user pointers to %px
  USB: core: Fix regression in Hercules audio card
  usb: gadget: Fix memleak in gadgetfs_fill_super
  usb: gadget: f_midi: Fix memleak in f_midi_alloc
  USB: quirks: Add USB_QUIRK_DISCONNECT_SUSPEND quirk for Lenovo A630Z TIO built-in usb-audio card
  usb: typec: qcom-pmic-typec: fix builtin build errors
  phy: mediatek: fix spelling mistake in Kconfig "veriosn" -> "version"
  phy: qualcomm: Fix 28 nm Hi-Speed USB PHY OF dependency
  phy: qualcomm: usb: Fix SuperSpeed PHY OF dependency
  phy: intel: PHY_INTEL_KEEMBAY_EMMC should depend on ARCH_KEEMBAY
  usb: cdns3: gadget: calculate TD_SIZE based on TD
  usb: cdns3: gadget: initialize link_trb as NULL
  phy: cpcap-usb: Use IRQF_ONESHOT
  phy: qcom-qmp: Initialize another pointer to NULL
  phy: tegra: xusb: Fix dangling pointer on probe failure
  phy: usb: Fix incorrect clearing of tca_drv_sel bit in SETUP reg for 7211
parents 7b2c800d 484cfbe5
...@@ -270,11 +270,6 @@ static void usb_init_common_7211b0(struct brcm_usb_init_params *params) ...@@ -270,11 +270,6 @@ static void usb_init_common_7211b0(struct brcm_usb_init_params *params)
reg |= params->mode << USB_PHY_UTMI_CTL_1_PHY_MODE_SHIFT; reg |= params->mode << USB_PHY_UTMI_CTL_1_PHY_MODE_SHIFT;
brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1); brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1);
/* Fix the incorrect default */
reg = brcm_usb_readl(ctrl + USB_CTRL_SETUP);
reg &= ~USB_CTRL_SETUP_tca_drv_sel_MASK;
brcm_usb_writel(reg, ctrl + USB_CTRL_SETUP);
usb_init_common(params); usb_init_common(params);
/* /*
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# #
config PHY_INTEL_KEEMBAY_EMMC config PHY_INTEL_KEEMBAY_EMMC
tristate "Intel Keem Bay EMMC PHY driver" tristate "Intel Keem Bay EMMC PHY driver"
depends on (OF && ARM64) || COMPILE_TEST depends on ARCH_KEEMBAY || COMPILE_TEST
depends on HAS_IOMEM depends on HAS_IOMEM
select GENERIC_PHY select GENERIC_PHY
select REGMAP_MMIO select REGMAP_MMIO
......
...@@ -12,7 +12,7 @@ config PHY_MTK_TPHY ...@@ -12,7 +12,7 @@ config PHY_MTK_TPHY
it supports multiple usb2.0, usb3.0 ports, PCIe and it supports multiple usb2.0, usb3.0 ports, PCIe and
SATA, and meanwhile supports two version T-PHY which have SATA, and meanwhile supports two version T-PHY which have
different banks layout, the T-PHY with shared banks between different banks layout, the T-PHY with shared banks between
multi-ports is first version, otherwise is second veriosn, multi-ports is first version, otherwise is second version,
so you can easily distinguish them by banks layout. so you can easily distinguish them by banks layout.
config PHY_MTK_UFS config PHY_MTK_UFS
......
...@@ -364,7 +364,8 @@ static int cpcap_usb_init_irq(struct platform_device *pdev, ...@@ -364,7 +364,8 @@ static int cpcap_usb_init_irq(struct platform_device *pdev,
error = devm_request_threaded_irq(ddata->dev, irq, NULL, error = devm_request_threaded_irq(ddata->dev, irq, NULL,
cpcap_phy_irq_thread, cpcap_phy_irq_thread,
IRQF_SHARED, IRQF_SHARED |
IRQF_ONESHOT,
name, ddata); name, ddata);
if (error) { if (error) {
dev_err(ddata->dev, "could not get irq %s: %i\n", dev_err(ddata->dev, "could not get irq %s: %i\n",
......
...@@ -87,7 +87,7 @@ config PHY_QCOM_USB_HSIC ...@@ -87,7 +87,7 @@ config PHY_QCOM_USB_HSIC
config PHY_QCOM_USB_HS_28NM config PHY_QCOM_USB_HS_28NM
tristate "Qualcomm 28nm High-Speed PHY" tristate "Qualcomm 28nm High-Speed PHY"
depends on ARCH_QCOM || COMPILE_TEST depends on OF && (ARCH_QCOM || COMPILE_TEST)
depends on EXTCON || !EXTCON # if EXTCON=m, this cannot be built-in depends on EXTCON || !EXTCON # if EXTCON=m, this cannot be built-in
select GENERIC_PHY select GENERIC_PHY
help help
...@@ -98,7 +98,7 @@ config PHY_QCOM_USB_HS_28NM ...@@ -98,7 +98,7 @@ config PHY_QCOM_USB_HS_28NM
config PHY_QCOM_USB_SS config PHY_QCOM_USB_SS
tristate "Qualcomm USB Super-Speed PHY driver" tristate "Qualcomm USB Super-Speed PHY driver"
depends on ARCH_QCOM || COMPILE_TEST depends on OF && (ARCH_QCOM || COMPILE_TEST)
depends on EXTCON || !EXTCON # if EXTCON=m, this cannot be built-in depends on EXTCON || !EXTCON # if EXTCON=m, this cannot be built-in
select GENERIC_PHY select GENERIC_PHY
help help
......
...@@ -3926,7 +3926,7 @@ static int qcom_qmp_phy_probe(struct platform_device *pdev) ...@@ -3926,7 +3926,7 @@ static int qcom_qmp_phy_probe(struct platform_device *pdev)
struct phy_provider *phy_provider; struct phy_provider *phy_provider;
void __iomem *serdes; void __iomem *serdes;
void __iomem *usb_serdes; void __iomem *usb_serdes;
void __iomem *dp_serdes; void __iomem *dp_serdes = NULL;
const struct qmp_phy_combo_cfg *combo_cfg = NULL; const struct qmp_phy_combo_cfg *combo_cfg = NULL;
const struct qmp_phy_cfg *cfg = NULL; const struct qmp_phy_cfg *cfg = NULL;
const struct qmp_phy_cfg *usb_cfg = NULL; const struct qmp_phy_cfg *usb_cfg = NULL;
......
...@@ -1242,6 +1242,7 @@ static int tegra_xusb_padctl_probe(struct platform_device *pdev) ...@@ -1242,6 +1242,7 @@ static int tegra_xusb_padctl_probe(struct platform_device *pdev)
reset: reset:
reset_control_assert(padctl->rst); reset_control_assert(padctl->rst);
remove: remove:
platform_set_drvdata(pdev, NULL);
soc->ops->remove(padctl); soc->ops->remove(padctl);
return err; return err;
} }
......
...@@ -1114,7 +1114,7 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep, ...@@ -1114,7 +1114,7 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep,
struct cdns3_device *priv_dev = priv_ep->cdns3_dev; struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
struct cdns3_request *priv_req; struct cdns3_request *priv_req;
struct cdns3_trb *trb; struct cdns3_trb *trb;
struct cdns3_trb *link_trb; struct cdns3_trb *link_trb = NULL;
dma_addr_t trb_dma; dma_addr_t trb_dma;
u32 togle_pcs = 1; u32 togle_pcs = 1;
int sg_iter = 0; int sg_iter = 0;
...@@ -1193,10 +1193,20 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep, ...@@ -1193,10 +1193,20 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep,
/* set incorrect Cycle Bit for first trb*/ /* set incorrect Cycle Bit for first trb*/
control = priv_ep->pcs ? 0 : TRB_CYCLE; control = priv_ep->pcs ? 0 : TRB_CYCLE;
trb->length = 0;
if (priv_dev->dev_ver >= DEV_VER_V2) {
u16 td_size;
td_size = DIV_ROUND_UP(request->length,
priv_ep->endpoint.maxpacket);
if (priv_dev->gadget.speed == USB_SPEED_SUPER)
trb->length = TRB_TDL_SS_SIZE(td_size);
else
control |= TRB_TDL_HS_SIZE(td_size);
}
do { do {
u32 length; u32 length;
u16 td_size = 0;
/* fill TRB */ /* fill TRB */
control |= TRB_TYPE(TRB_NORMAL); control |= TRB_TYPE(TRB_NORMAL);
...@@ -1208,20 +1218,12 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep, ...@@ -1208,20 +1218,12 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep,
length = request->length; length = request->length;
} }
if (likely(priv_dev->dev_ver >= DEV_VER_V2)) if (priv_ep->flags & EP_TDLCHK_EN)
td_size = DIV_ROUND_UP(length,
priv_ep->endpoint.maxpacket);
else if (priv_ep->flags & EP_TDLCHK_EN)
total_tdl += DIV_ROUND_UP(length, total_tdl += DIV_ROUND_UP(length,
priv_ep->endpoint.maxpacket); priv_ep->endpoint.maxpacket);
trb->length = cpu_to_le32(TRB_BURST_LEN(priv_ep->trb_burst_size) | trb->length |= cpu_to_le32(TRB_BURST_LEN(priv_ep->trb_burst_size) |
TRB_LEN(length)); TRB_LEN(length));
if (priv_dev->gadget.speed == USB_SPEED_SUPER)
trb->length |= cpu_to_le32(TRB_TDL_SS_SIZE(td_size));
else
control |= TRB_TDL_HS_SIZE(td_size);
pcs = priv_ep->pcs ? TRB_CYCLE : 0; pcs = priv_ep->pcs ? TRB_CYCLE : 0;
/* /*
......
...@@ -482,11 +482,11 @@ static void snoop_urb(struct usb_device *udev, ...@@ -482,11 +482,11 @@ static void snoop_urb(struct usb_device *udev,
if (userurb) { /* Async */ if (userurb) { /* Async */
if (when == SUBMIT) if (when == SUBMIT)
dev_info(&udev->dev, "userurb %pK, ep%d %s-%s, " dev_info(&udev->dev, "userurb %px, ep%d %s-%s, "
"length %u\n", "length %u\n",
userurb, ep, t, d, length); userurb, ep, t, d, length);
else else
dev_info(&udev->dev, "userurb %pK, ep%d %s-%s, " dev_info(&udev->dev, "userurb %px, ep%d %s-%s, "
"actual_length %u status %d\n", "actual_length %u status %d\n",
userurb, ep, t, d, length, userurb, ep, t, d, length,
timeout_or_status); timeout_or_status);
...@@ -1997,7 +1997,7 @@ static int proc_reapurb(struct usb_dev_state *ps, void __user *arg) ...@@ -1997,7 +1997,7 @@ static int proc_reapurb(struct usb_dev_state *ps, void __user *arg)
if (as) { if (as) {
int retval; int retval;
snoop(&ps->dev->dev, "reap %pK\n", as->userurb); snoop(&ps->dev->dev, "reap %px\n", as->userurb);
retval = processcompl(as, (void __user * __user *)arg); retval = processcompl(as, (void __user * __user *)arg);
free_async(as); free_async(as);
return retval; return retval;
...@@ -2014,7 +2014,7 @@ static int proc_reapurbnonblock(struct usb_dev_state *ps, void __user *arg) ...@@ -2014,7 +2014,7 @@ static int proc_reapurbnonblock(struct usb_dev_state *ps, void __user *arg)
as = async_getcompleted(ps); as = async_getcompleted(ps);
if (as) { if (as) {
snoop(&ps->dev->dev, "reap %pK\n", as->userurb); snoop(&ps->dev->dev, "reap %px\n", as->userurb);
retval = processcompl(as, (void __user * __user *)arg); retval = processcompl(as, (void __user * __user *)arg);
free_async(as); free_async(as);
} else { } else {
...@@ -2142,7 +2142,7 @@ static int proc_reapurb_compat(struct usb_dev_state *ps, void __user *arg) ...@@ -2142,7 +2142,7 @@ static int proc_reapurb_compat(struct usb_dev_state *ps, void __user *arg)
if (as) { if (as) {
int retval; int retval;
snoop(&ps->dev->dev, "reap %pK\n", as->userurb); snoop(&ps->dev->dev, "reap %px\n", as->userurb);
retval = processcompl_compat(as, (void __user * __user *)arg); retval = processcompl_compat(as, (void __user * __user *)arg);
free_async(as); free_async(as);
return retval; return retval;
...@@ -2159,7 +2159,7 @@ static int proc_reapurbnonblock_compat(struct usb_dev_state *ps, void __user *ar ...@@ -2159,7 +2159,7 @@ static int proc_reapurbnonblock_compat(struct usb_dev_state *ps, void __user *ar
as = async_getcompleted(ps); as = async_getcompleted(ps);
if (as) { if (as) {
snoop(&ps->dev->dev, "reap %pK\n", as->userurb); snoop(&ps->dev->dev, "reap %px\n", as->userurb);
retval = processcompl_compat(as, (void __user * __user *)arg); retval = processcompl_compat(as, (void __user * __user *)arg);
free_async(as); free_async(as);
} else { } else {
...@@ -2624,7 +2624,7 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd, ...@@ -2624,7 +2624,7 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd,
#endif #endif
case USBDEVFS_DISCARDURB: case USBDEVFS_DISCARDURB:
snoop(&dev->dev, "%s: DISCARDURB %pK\n", __func__, p); snoop(&dev->dev, "%s: DISCARDURB %px\n", __func__, p);
ret = proc_unlinkurb(ps, p); ret = proc_unlinkurb(ps, p);
break; break;
......
...@@ -348,6 +348,10 @@ static const struct usb_device_id usb_quirk_list[] = { ...@@ -348,6 +348,10 @@ static const struct usb_device_id usb_quirk_list[] = {
/* Guillemot Webcam Hercules Dualpix Exchange*/ /* Guillemot Webcam Hercules Dualpix Exchange*/
{ USB_DEVICE(0x06f8, 0x3005), .driver_info = USB_QUIRK_RESET_RESUME }, { USB_DEVICE(0x06f8, 0x3005), .driver_info = USB_QUIRK_RESET_RESUME },
/* Guillemot Hercules DJ Console audio card (BZ 208357) */
{ USB_DEVICE(0x06f8, 0xb000), .driver_info =
USB_QUIRK_ENDPOINT_IGNORE },
/* Midiman M-Audio Keystation 88es */ /* Midiman M-Audio Keystation 88es */
{ USB_DEVICE(0x0763, 0x0192), .driver_info = USB_QUIRK_RESET_RESUME }, { USB_DEVICE(0x0763, 0x0192), .driver_info = USB_QUIRK_RESET_RESUME },
...@@ -421,6 +425,10 @@ static const struct usb_device_id usb_quirk_list[] = { ...@@ -421,6 +425,10 @@ static const struct usb_device_id usb_quirk_list[] = {
{ USB_DEVICE(0x1532, 0x0116), .driver_info = { USB_DEVICE(0x1532, 0x0116), .driver_info =
USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL }, USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL },
/* Lenovo ThinkCenter A630Z TI024Gen3 usb-audio */
{ USB_DEVICE(0x17ef, 0xa012), .driver_info =
USB_QUIRK_DISCONNECT_SUSPEND },
/* BUILDWIN Photo Frame */ /* BUILDWIN Photo Frame */
{ USB_DEVICE(0x1908, 0x1315), .driver_info = { USB_DEVICE(0x1908, 0x1315), .driver_info =
USB_QUIRK_HONOR_BNUMINTERFACES }, USB_QUIRK_HONOR_BNUMINTERFACES },
...@@ -521,6 +529,8 @@ static const struct usb_device_id usb_amd_resume_quirk_list[] = { ...@@ -521,6 +529,8 @@ static const struct usb_device_id usb_amd_resume_quirk_list[] = {
* Matched for devices with USB_QUIRK_ENDPOINT_IGNORE. * Matched for devices with USB_QUIRK_ENDPOINT_IGNORE.
*/ */
static const struct usb_device_id usb_endpoint_ignore[] = { static const struct usb_device_id usb_endpoint_ignore[] = {
{ USB_DEVICE_INTERFACE_NUMBER(0x06f8, 0xb000, 5), .driver_info = 0x01 },
{ USB_DEVICE_INTERFACE_NUMBER(0x06f8, 0xb000, 5), .driver_info = 0x81 },
{ USB_DEVICE_INTERFACE_NUMBER(0x0926, 0x0202, 1), .driver_info = 0x85 }, { USB_DEVICE_INTERFACE_NUMBER(0x0926, 0x0202, 1), .driver_info = 0x85 },
{ USB_DEVICE_INTERFACE_NUMBER(0x0926, 0x0208, 1), .driver_info = 0x85 }, { USB_DEVICE_INTERFACE_NUMBER(0x0926, 0x0208, 1), .driver_info = 0x85 },
{ } { }
......
...@@ -1315,7 +1315,7 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi) ...@@ -1315,7 +1315,7 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi)
midi->id = kstrdup(opts->id, GFP_KERNEL); midi->id = kstrdup(opts->id, GFP_KERNEL);
if (opts->id && !midi->id) { if (opts->id && !midi->id) {
status = -ENOMEM; status = -ENOMEM;
goto setup_fail; goto midi_free;
} }
midi->in_ports = opts->in_ports; midi->in_ports = opts->in_ports;
midi->out_ports = opts->out_ports; midi->out_ports = opts->out_ports;
...@@ -1327,7 +1327,7 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi) ...@@ -1327,7 +1327,7 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi)
status = kfifo_alloc(&midi->in_req_fifo, midi->qlen, GFP_KERNEL); status = kfifo_alloc(&midi->in_req_fifo, midi->qlen, GFP_KERNEL);
if (status) if (status)
goto setup_fail; goto midi_free;
spin_lock_init(&midi->transmit_lock); spin_lock_init(&midi->transmit_lock);
...@@ -1343,9 +1343,13 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi) ...@@ -1343,9 +1343,13 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi)
return &midi->func; return &midi->func;
midi_free:
if (midi)
kfree(midi->id);
kfree(midi);
setup_fail: setup_fail:
mutex_unlock(&opts->lock); mutex_unlock(&opts->lock);
kfree(midi);
return ERR_PTR(status); return ERR_PTR(status);
} }
......
...@@ -2039,6 +2039,9 @@ gadgetfs_fill_super (struct super_block *sb, struct fs_context *fc) ...@@ -2039,6 +2039,9 @@ gadgetfs_fill_super (struct super_block *sb, struct fs_context *fc)
return 0; return 0;
Enomem: Enomem:
kfree(CHIP);
CHIP = NULL;
return -ENOMEM; return -ENOMEM;
} }
......
...@@ -88,6 +88,7 @@ config TYPEC_STUSB160X ...@@ -88,6 +88,7 @@ config TYPEC_STUSB160X
config TYPEC_QCOM_PMIC config TYPEC_QCOM_PMIC
tristate "Qualcomm PMIC USB Type-C driver" tristate "Qualcomm PMIC USB Type-C driver"
depends on ARCH_QCOM || COMPILE_TEST depends on ARCH_QCOM || COMPILE_TEST
depends on USB_ROLE_SWITCH || !USB_ROLE_SWITCH
help help
Driver for supporting role switch over the Qualcomm PMIC. This will Driver for supporting role switch over the Qualcomm PMIC. This will
handle the USB Type-C role and orientation detection reported by the handle the USB Type-C role and orientation detection reported by the
......
...@@ -562,7 +562,7 @@ static int stusb160x_get_fw_caps(struct stusb160x *chip, ...@@ -562,7 +562,7 @@ static int stusb160x_get_fw_caps(struct stusb160x *chip,
* Supported power operation mode can be configured through device tree * Supported power operation mode can be configured through device tree
* else it is read from chip registers in stusb160x_get_caps. * else it is read from chip registers in stusb160x_get_caps.
*/ */
ret = fwnode_property_read_string(fwnode, "power-opmode", &cap_str); ret = fwnode_property_read_string(fwnode, "typec-power-opmode", &cap_str);
if (!ret) { if (!ret) {
ret = typec_find_pwr_opmode(cap_str); ret = typec_find_pwr_opmode(cap_str);
/* Power delivery not yet supported */ /* Power delivery not yet supported */
......
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