Commit c34a4f9d authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'fixes-for-v5.7-rc5' of...

Merge tag 'fixes-for-v5.7-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-linus

Felipe writes:

USB: fixes for v5.7-rc5

Fixing raw-gadget's IOCTL return value. Enabling EXTCON for Intel
Merrifield. Couple leaks have been plugged in net2272 and
twl6030-usb. Returning an error code when things fail in cdc and ncm
legacy gadgets. An old bug on dwc3 regarding HWO bit handling has been
fixed.

Apart from these, some minor fixes.
Signed-off-by: default avatarFelipe Balbi <balbi@kernel.org>

* tag 'fixes-for-v5.7-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb:
  usb: raw-gadget: fix return value of ep read ioctls
  usb: dwc3: select USB_ROLE_SWITCH
  usb: gadget: legacy: fix error return code in gncm_bind()
  usb: gadget: legacy: fix error return code in cdc_bind()
  usb: gadget: legacy: fix redundant initialization warnings
  usb: gadget: tegra-xudc: Fix idle suspend/resume
  usb: gadget: net2272: Fix a memory leak in an error handling path in 'net2272_plat_probe()'
  usb: phy: twl6030-usb: Fix a resource leak in an error handling path in 'twl6030_usb_probe()'
  usb: cdns3: gadget: prev_req->trb is NULL for ep0
  usb: gadget: audio: Fix a missing error return value in audio_bind()
  usb: dwc3: pci: Enable extcon driver for Intel Merrifield
  dwc3: Remove check for HWO flag in dwc3_gadget_ep_reclaim_trb_sg()
parents 2ef96a5b 6e507644
...@@ -2548,7 +2548,7 @@ int cdns3_gadget_ep_dequeue(struct usb_ep *ep, ...@@ -2548,7 +2548,7 @@ int cdns3_gadget_ep_dequeue(struct usb_ep *ep,
link_trb = priv_req->trb; link_trb = priv_req->trb;
/* Update ring only if removed request is on pending_req_list list */ /* Update ring only if removed request is on pending_req_list list */
if (req_on_hw_ring) { if (req_on_hw_ring && link_trb) {
link_trb->buffer = TRB_BUFFER(priv_ep->trb_pool_dma + link_trb->buffer = TRB_BUFFER(priv_ep->trb_pool_dma +
((priv_req->end_trb + 1) * TRB_SIZE)); ((priv_req->end_trb + 1) * TRB_SIZE));
link_trb->control = (link_trb->control & TRB_CYCLE) | link_trb->control = (link_trb->control & TRB_CYCLE) |
......
...@@ -4,6 +4,7 @@ config USB_DWC3 ...@@ -4,6 +4,7 @@ config USB_DWC3
tristate "DesignWare USB3 DRD Core Support" tristate "DesignWare USB3 DRD Core Support"
depends on (USB || USB_GADGET) && HAS_DMA depends on (USB || USB_GADGET) && HAS_DMA
select USB_XHCI_PLATFORM if USB_XHCI_HCD select USB_XHCI_PLATFORM if USB_XHCI_HCD
select USB_ROLE_SWITCH if USB_DWC3_DUAL_ROLE
help help
Say Y or M here if your system has a Dual Role SuperSpeed Say Y or M here if your system has a Dual Role SuperSpeed
USB controller based on the DesignWare USB3 IP Core. USB controller based on the DesignWare USB3 IP Core.
......
...@@ -114,6 +114,7 @@ static const struct property_entry dwc3_pci_intel_properties[] = { ...@@ -114,6 +114,7 @@ static const struct property_entry dwc3_pci_intel_properties[] = {
static const struct property_entry dwc3_pci_mrfld_properties[] = { static const struct property_entry dwc3_pci_mrfld_properties[] = {
PROPERTY_ENTRY_STRING("dr_mode", "otg"), PROPERTY_ENTRY_STRING("dr_mode", "otg"),
PROPERTY_ENTRY_STRING("linux,extcon-name", "mrfld_bcove_pwrsrc"),
PROPERTY_ENTRY_BOOL("linux,sysdev_is_parent"), PROPERTY_ENTRY_BOOL("linux,sysdev_is_parent"),
{} {}
}; };
......
...@@ -2483,9 +2483,6 @@ static int dwc3_gadget_ep_reclaim_trb_sg(struct dwc3_ep *dep, ...@@ -2483,9 +2483,6 @@ static int dwc3_gadget_ep_reclaim_trb_sg(struct dwc3_ep *dep,
for_each_sg(sg, s, pending, i) { for_each_sg(sg, s, pending, i) {
trb = &dep->trb_pool[dep->trb_dequeue]; trb = &dep->trb_pool[dep->trb_dequeue];
if (trb->ctrl & DWC3_TRB_CTRL_HWO)
break;
req->sg = sg_next(s); req->sg = sg_next(s);
req->num_pending_sgs--; req->num_pending_sgs--;
......
...@@ -300,8 +300,10 @@ static int audio_bind(struct usb_composite_dev *cdev) ...@@ -300,8 +300,10 @@ static int audio_bind(struct usb_composite_dev *cdev)
struct usb_descriptor_header *usb_desc; struct usb_descriptor_header *usb_desc;
usb_desc = usb_otg_descriptor_alloc(cdev->gadget); usb_desc = usb_otg_descriptor_alloc(cdev->gadget);
if (!usb_desc) if (!usb_desc) {
status = -ENOMEM;
goto fail; goto fail;
}
usb_otg_descriptor_init(cdev->gadget, usb_desc); usb_otg_descriptor_init(cdev->gadget, usb_desc);
otg_desc[0] = usb_desc; otg_desc[0] = usb_desc;
otg_desc[1] = NULL; otg_desc[1] = NULL;
......
...@@ -179,8 +179,10 @@ static int cdc_bind(struct usb_composite_dev *cdev) ...@@ -179,8 +179,10 @@ static int cdc_bind(struct usb_composite_dev *cdev)
struct usb_descriptor_header *usb_desc; struct usb_descriptor_header *usb_desc;
usb_desc = usb_otg_descriptor_alloc(gadget); usb_desc = usb_otg_descriptor_alloc(gadget);
if (!usb_desc) if (!usb_desc) {
status = -ENOMEM;
goto fail1; goto fail1;
}
usb_otg_descriptor_init(gadget, usb_desc); usb_otg_descriptor_init(gadget, usb_desc);
otg_desc[0] = usb_desc; otg_desc[0] = usb_desc;
otg_desc[1] = NULL; otg_desc[1] = NULL;
......
...@@ -1361,7 +1361,6 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) ...@@ -1361,7 +1361,6 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
req->buf = dev->rbuf; req->buf = dev->rbuf;
req->context = NULL; req->context = NULL;
value = -EOPNOTSUPP;
switch (ctrl->bRequest) { switch (ctrl->bRequest) {
case USB_REQ_GET_DESCRIPTOR: case USB_REQ_GET_DESCRIPTOR:
...@@ -1784,7 +1783,7 @@ static ssize_t ...@@ -1784,7 +1783,7 @@ static ssize_t
dev_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) dev_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
{ {
struct dev_data *dev = fd->private_data; struct dev_data *dev = fd->private_data;
ssize_t value = len, length = len; ssize_t value, length = len;
unsigned total; unsigned total;
u32 tag; u32 tag;
char *kbuf; char *kbuf;
......
...@@ -156,8 +156,10 @@ static int gncm_bind(struct usb_composite_dev *cdev) ...@@ -156,8 +156,10 @@ static int gncm_bind(struct usb_composite_dev *cdev)
struct usb_descriptor_header *usb_desc; struct usb_descriptor_header *usb_desc;
usb_desc = usb_otg_descriptor_alloc(gadget); usb_desc = usb_otg_descriptor_alloc(gadget);
if (!usb_desc) if (!usb_desc) {
status = -ENOMEM;
goto fail; goto fail;
}
usb_otg_descriptor_init(gadget, usb_desc); usb_otg_descriptor_init(gadget, usb_desc);
otg_desc[0] = usb_desc; otg_desc[0] = usb_desc;
otg_desc[1] = NULL; otg_desc[1] = NULL;
......
...@@ -669,12 +669,14 @@ static int raw_ioctl_ep0_read(struct raw_dev *dev, unsigned long value) ...@@ -669,12 +669,14 @@ static int raw_ioctl_ep0_read(struct raw_dev *dev, unsigned long value)
if (IS_ERR(data)) if (IS_ERR(data))
return PTR_ERR(data); return PTR_ERR(data);
ret = raw_process_ep0_io(dev, &io, data, false); ret = raw_process_ep0_io(dev, &io, data, false);
if (ret) if (ret < 0)
goto free; goto free;
length = min(io.length, (unsigned int)ret); length = min(io.length, (unsigned int)ret);
if (copy_to_user((void __user *)(value + sizeof(io)), data, length)) if (copy_to_user((void __user *)(value + sizeof(io)), data, length))
ret = -EFAULT; ret = -EFAULT;
else
ret = length;
free: free:
kfree(data); kfree(data);
return ret; return ret;
...@@ -964,12 +966,14 @@ static int raw_ioctl_ep_read(struct raw_dev *dev, unsigned long value) ...@@ -964,12 +966,14 @@ static int raw_ioctl_ep_read(struct raw_dev *dev, unsigned long value)
if (IS_ERR(data)) if (IS_ERR(data))
return PTR_ERR(data); return PTR_ERR(data);
ret = raw_process_ep_io(dev, &io, data, false); ret = raw_process_ep_io(dev, &io, data, false);
if (ret) if (ret < 0)
goto free; goto free;
length = min(io.length, (unsigned int)ret); length = min(io.length, (unsigned int)ret);
if (copy_to_user((void __user *)(value + sizeof(io)), data, length)) if (copy_to_user((void __user *)(value + sizeof(io)), data, length))
ret = -EFAULT; ret = -EFAULT;
else
ret = length;
free: free:
kfree(data); kfree(data);
return ret; return ret;
......
...@@ -2647,6 +2647,8 @@ net2272_plat_probe(struct platform_device *pdev) ...@@ -2647,6 +2647,8 @@ net2272_plat_probe(struct platform_device *pdev)
err_req: err_req:
release_mem_region(base, len); release_mem_region(base, len);
err: err:
kfree(dev);
return ret; return ret;
} }
......
...@@ -3840,11 +3840,11 @@ static int __maybe_unused tegra_xudc_suspend(struct device *dev) ...@@ -3840,11 +3840,11 @@ static int __maybe_unused tegra_xudc_suspend(struct device *dev)
flush_work(&xudc->usb_role_sw_work); flush_work(&xudc->usb_role_sw_work);
/* Forcibly disconnect before powergating. */ if (!pm_runtime_status_suspended(dev)) {
tegra_xudc_device_mode_off(xudc); /* Forcibly disconnect before powergating. */
tegra_xudc_device_mode_off(xudc);
if (!pm_runtime_status_suspended(dev))
tegra_xudc_powergate(xudc); tegra_xudc_powergate(xudc);
}
pm_runtime_disable(dev); pm_runtime_disable(dev);
......
...@@ -377,7 +377,7 @@ static int twl6030_usb_probe(struct platform_device *pdev) ...@@ -377,7 +377,7 @@ static int twl6030_usb_probe(struct platform_device *pdev)
if (status < 0) { if (status < 0) {
dev_err(&pdev->dev, "can't get IRQ %d, err %d\n", dev_err(&pdev->dev, "can't get IRQ %d, err %d\n",
twl->irq1, status); twl->irq1, status);
return status; goto err_put_regulator;
} }
status = request_threaded_irq(twl->irq2, NULL, twl6030_usb_irq, status = request_threaded_irq(twl->irq2, NULL, twl6030_usb_irq,
...@@ -386,8 +386,7 @@ static int twl6030_usb_probe(struct platform_device *pdev) ...@@ -386,8 +386,7 @@ static int twl6030_usb_probe(struct platform_device *pdev)
if (status < 0) { if (status < 0) {
dev_err(&pdev->dev, "can't get IRQ %d, err %d\n", dev_err(&pdev->dev, "can't get IRQ %d, err %d\n",
twl->irq2, status); twl->irq2, status);
free_irq(twl->irq1, twl); goto err_free_irq1;
return status;
} }
twl->asleep = 0; twl->asleep = 0;
...@@ -396,6 +395,13 @@ static int twl6030_usb_probe(struct platform_device *pdev) ...@@ -396,6 +395,13 @@ static int twl6030_usb_probe(struct platform_device *pdev)
dev_info(&pdev->dev, "Initialized TWL6030 USB module\n"); dev_info(&pdev->dev, "Initialized TWL6030 USB module\n");
return 0; return 0;
err_free_irq1:
free_irq(twl->irq1, twl);
err_put_regulator:
regulator_put(twl->usb3v3);
return status;
} }
static int twl6030_usb_remove(struct platform_device *pdev) static int twl6030_usb_remove(struct platform_device *pdev)
......
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