Commit 8f3bfd21 authored by Linus Torvalds's avatar Linus Torvalds

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

Pull USB fixes from Greg KH:
 "Here are some small USB driver fixes for 5.11-rc5.  They resolve:

   - xhci issues for some reported problems

   - ehci driver issue for one specific device

   - USB gadget fixes for some reported problems

   - cdns3 driver fixes for issues reported

   - MAINTAINERS file update

   - thunderbolt minor fix

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

* tag 'usb-5.11-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
  usb: bdc: Make bdc pci driver depend on BROKEN
  xhci: tegra: Delay for disabling LFPS detector
  xhci: make sure TRB is fully written before giving it to the controller
  usb: udc: core: Use lock when write to soft_connect
  USB: gadget: dummy-hcd: Fix errors in port-reset handling
  usb: gadget: aspeed: fix stop dma register setting.
  USB: ehci: fix an interrupt calltrace error
  ehci: fix EHCI host controller initialization sequence
  MAINTAINERS: update Peter Chen's email address
  thunderbolt: Drop duplicated 0x prefix from format string
  MAINTAINERS: Update address for Cadence USB3 driver
  usb: cdns3: imx: improve driver .remove API
  usb: cdns3: imx: fix can't create core device the second time issue
  usb: cdns3: imx: fix writing read-only memory issue
parents e6806137 ef02684c
...@@ -3879,7 +3879,7 @@ F: Documentation/devicetree/bindings/mtd/cadence-nand-controller.txt ...@@ -3879,7 +3879,7 @@ F: Documentation/devicetree/bindings/mtd/cadence-nand-controller.txt
F: drivers/mtd/nand/raw/cadence-nand-controller.c F: drivers/mtd/nand/raw/cadence-nand-controller.c
CADENCE USB3 DRD IP DRIVER CADENCE USB3 DRD IP DRIVER
M: Peter Chen <peter.chen@nxp.com> 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> R: Aswath Govindraju <a-govindraju@ti.com>
...@@ -4161,7 +4161,7 @@ S: Maintained ...@@ -4161,7 +4161,7 @@ S: Maintained
F: Documentation/translations/zh_CN/ F: Documentation/translations/zh_CN/
CHIPIDEA USB HIGH SPEED DUAL ROLE CONTROLLER CHIPIDEA USB HIGH SPEED DUAL ROLE CONTROLLER
M: Peter Chen <Peter.Chen@nxp.com> M: Peter Chen <peter.chen@kernel.org>
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
...@@ -18420,7 +18420,7 @@ F: Documentation/usb/ohci.rst ...@@ -18420,7 +18420,7 @@ F: Documentation/usb/ohci.rst
F: drivers/usb/host/ohci* F: drivers/usb/host/ohci*
USB OTG FSM (Finite State Machine) USB OTG FSM (Finite State Machine)
M: Peter Chen <Peter.Chen@nxp.com> M: Peter Chen <peter.chen@kernel.org>
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
......
...@@ -2316,7 +2316,7 @@ static int icm_usb4_switch_nvm_authenticate_status(struct tb_switch *sw, ...@@ -2316,7 +2316,7 @@ static int icm_usb4_switch_nvm_authenticate_status(struct tb_switch *sw,
if (auth && auth->reply.route_hi == sw->config.route_hi && if (auth && auth->reply.route_hi == sw->config.route_hi &&
auth->reply.route_lo == sw->config.route_lo) { auth->reply.route_lo == sw->config.route_lo) {
tb_dbg(tb, "NVM_AUTH found for %llx flags 0x%#x status %#x\n", tb_dbg(tb, "NVM_AUTH found for %llx flags %#x status %#x\n",
tb_route(sw), auth->reply.hdr.flags, auth->reply.status); tb_route(sw), auth->reply.hdr.flags, auth->reply.status);
if (auth->reply.hdr.flags & ICM_FLAGS_ERROR) if (auth->reply.hdr.flags & ICM_FLAGS_ERROR)
ret = -EIO; ret = -EIO;
......
...@@ -185,7 +185,11 @@ static int cdns_imx_probe(struct platform_device *pdev) ...@@ -185,7 +185,11 @@ static int cdns_imx_probe(struct platform_device *pdev)
} }
data->num_clks = ARRAY_SIZE(imx_cdns3_core_clks); data->num_clks = ARRAY_SIZE(imx_cdns3_core_clks);
data->clks = (struct clk_bulk_data *)imx_cdns3_core_clks; data->clks = devm_kmemdup(dev, imx_cdns3_core_clks,
sizeof(imx_cdns3_core_clks), GFP_KERNEL);
if (!data->clks)
return -ENOMEM;
ret = devm_clk_bulk_get(dev, data->num_clks, data->clks); ret = devm_clk_bulk_get(dev, data->num_clks, data->clks);
if (ret) if (ret)
return ret; return ret;
...@@ -214,20 +218,16 @@ static int cdns_imx_probe(struct platform_device *pdev) ...@@ -214,20 +218,16 @@ static int cdns_imx_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int cdns_imx_remove_core(struct device *dev, void *data)
{
struct platform_device *pdev = to_platform_device(dev);
platform_device_unregister(pdev);
return 0;
}
static int cdns_imx_remove(struct platform_device *pdev) static int cdns_imx_remove(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct cdns_imx *data = dev_get_drvdata(dev);
device_for_each_child(dev, NULL, cdns_imx_remove_core); pm_runtime_get_sync(dev);
of_platform_depopulate(dev);
clk_bulk_disable_unprepare(data->num_clks, data->clks);
pm_runtime_disable(dev);
pm_runtime_put_noidle(dev);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
return 0; return 0;
......
...@@ -420,7 +420,10 @@ static void ast_vhub_stop_active_req(struct ast_vhub_ep *ep, ...@@ -420,7 +420,10 @@ static void ast_vhub_stop_active_req(struct ast_vhub_ep *ep,
u32 state, reg, loops; u32 state, reg, loops;
/* Stop DMA activity */ /* Stop DMA activity */
writel(0, ep->epn.regs + AST_VHUB_EP_DMA_CTLSTAT); if (ep->epn.desc_mode)
writel(VHUB_EP_DMA_CTRL_RESET, ep->epn.regs + AST_VHUB_EP_DMA_CTLSTAT);
else
writel(0, ep->epn.regs + AST_VHUB_EP_DMA_CTLSTAT);
/* Wait for it to complete */ /* Wait for it to complete */
for (loops = 0; loops < 1000; loops++) { for (loops = 0; loops < 1000; loops++) {
......
...@@ -17,7 +17,7 @@ if USB_BDC_UDC ...@@ -17,7 +17,7 @@ if USB_BDC_UDC
comment "Platform Support" comment "Platform Support"
config USB_BDC_PCI config USB_BDC_PCI
tristate "BDC support for PCIe based platforms" tristate "BDC support for PCIe based platforms"
depends on USB_PCI depends on USB_PCI && BROKEN
default USB_BDC_UDC default USB_BDC_UDC
help help
Enable support for platforms which have BDC connected through PCIe, such as Lego3 FPGA platform. Enable support for platforms which have BDC connected through PCIe, such as Lego3 FPGA platform.
......
...@@ -1529,10 +1529,13 @@ static ssize_t soft_connect_store(struct device *dev, ...@@ -1529,10 +1529,13 @@ static ssize_t soft_connect_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t n) struct device_attribute *attr, const char *buf, size_t n)
{ {
struct usb_udc *udc = container_of(dev, struct usb_udc, dev); struct usb_udc *udc = container_of(dev, struct usb_udc, dev);
ssize_t ret;
mutex_lock(&udc_lock);
if (!udc->driver) { if (!udc->driver) {
dev_err(dev, "soft-connect without a gadget driver\n"); dev_err(dev, "soft-connect without a gadget driver\n");
return -EOPNOTSUPP; ret = -EOPNOTSUPP;
goto out;
} }
if (sysfs_streq(buf, "connect")) { if (sysfs_streq(buf, "connect")) {
...@@ -1543,10 +1546,14 @@ static ssize_t soft_connect_store(struct device *dev, ...@@ -1543,10 +1546,14 @@ static ssize_t soft_connect_store(struct device *dev,
usb_gadget_udc_stop(udc); usb_gadget_udc_stop(udc);
} else { } else {
dev_err(dev, "unsupported command '%s'\n", buf); dev_err(dev, "unsupported command '%s'\n", buf);
return -EINVAL; ret = -EINVAL;
goto out;
} }
return n; ret = n;
out:
mutex_unlock(&udc_lock);
return ret;
} }
static DEVICE_ATTR_WO(soft_connect); static DEVICE_ATTR_WO(soft_connect);
......
...@@ -2270,17 +2270,20 @@ static int dummy_hub_control( ...@@ -2270,17 +2270,20 @@ static int dummy_hub_control(
} }
fallthrough; fallthrough;
case USB_PORT_FEAT_RESET: case USB_PORT_FEAT_RESET:
if (!(dum_hcd->port_status & USB_PORT_STAT_CONNECTION))
break;
/* if it's already enabled, disable */ /* if it's already enabled, disable */
if (hcd->speed == HCD_USB3) { if (hcd->speed == HCD_USB3) {
dum_hcd->port_status = 0;
dum_hcd->port_status = dum_hcd->port_status =
(USB_SS_PORT_STAT_POWER | (USB_SS_PORT_STAT_POWER |
USB_PORT_STAT_CONNECTION | USB_PORT_STAT_CONNECTION |
USB_PORT_STAT_RESET); USB_PORT_STAT_RESET);
} else } else {
dum_hcd->port_status &= ~(USB_PORT_STAT_ENABLE dum_hcd->port_status &= ~(USB_PORT_STAT_ENABLE
| USB_PORT_STAT_LOW_SPEED | USB_PORT_STAT_LOW_SPEED
| USB_PORT_STAT_HIGH_SPEED); | USB_PORT_STAT_HIGH_SPEED);
dum_hcd->port_status |= USB_PORT_STAT_RESET;
}
/* /*
* We want to reset device status. All but the * We want to reset device status. All but the
* Self powered feature * Self powered feature
...@@ -2292,7 +2295,8 @@ static int dummy_hub_control( ...@@ -2292,7 +2295,8 @@ static int dummy_hub_control(
* interval? Is it still 50msec as for HS? * interval? Is it still 50msec as for HS?
*/ */
dum_hcd->re_timeout = jiffies + msecs_to_jiffies(50); dum_hcd->re_timeout = jiffies + msecs_to_jiffies(50);
fallthrough; set_link_state(dum_hcd);
break;
case USB_PORT_FEAT_C_CONNECTION: case USB_PORT_FEAT_C_CONNECTION:
case USB_PORT_FEAT_C_RESET: case USB_PORT_FEAT_C_RESET:
case USB_PORT_FEAT_C_ENABLE: case USB_PORT_FEAT_C_ENABLE:
......
...@@ -574,6 +574,7 @@ static int ehci_run (struct usb_hcd *hcd) ...@@ -574,6 +574,7 @@ static int ehci_run (struct usb_hcd *hcd)
struct ehci_hcd *ehci = hcd_to_ehci (hcd); struct ehci_hcd *ehci = hcd_to_ehci (hcd);
u32 temp; u32 temp;
u32 hcc_params; u32 hcc_params;
int rc;
hcd->uses_new_polling = 1; hcd->uses_new_polling = 1;
...@@ -629,9 +630,20 @@ static int ehci_run (struct usb_hcd *hcd) ...@@ -629,9 +630,20 @@ static int ehci_run (struct usb_hcd *hcd)
down_write(&ehci_cf_port_reset_rwsem); down_write(&ehci_cf_port_reset_rwsem);
ehci->rh_state = EHCI_RH_RUNNING; ehci->rh_state = EHCI_RH_RUNNING;
ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag); ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag);
/* Wait until HC become operational */
ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */ ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */
msleep(5); msleep(5);
rc = ehci_handshake(ehci, &ehci->regs->status, STS_HALT, 0, 100 * 1000);
up_write(&ehci_cf_port_reset_rwsem); up_write(&ehci_cf_port_reset_rwsem);
if (rc) {
ehci_err(ehci, "USB %x.%x, controller refused to start: %d\n",
((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f), rc);
return rc;
}
ehci->last_periodic_enable = ktime_get_real(); ehci->last_periodic_enable = ktime_get_real();
temp = HC_VERSION(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); temp = HC_VERSION(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase));
......
...@@ -345,6 +345,9 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) ...@@ -345,6 +345,9 @@ static int ehci_bus_suspend (struct usb_hcd *hcd)
unlink_empty_async_suspended(ehci); unlink_empty_async_suspended(ehci);
/* Some Synopsys controllers mistakenly leave IAA turned on */
ehci_writel(ehci, STS_IAA, &ehci->regs->status);
/* Any IAA cycle that started before the suspend is now invalid */ /* Any IAA cycle that started before the suspend is now invalid */
end_iaa_cycle(ehci); end_iaa_cycle(ehci);
ehci_handle_start_intr_unlinks(ehci); ehci_handle_start_intr_unlinks(ehci);
......
...@@ -2931,6 +2931,8 @@ static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring, ...@@ -2931,6 +2931,8 @@ static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring,
trb->field[0] = cpu_to_le32(field1); trb->field[0] = cpu_to_le32(field1);
trb->field[1] = cpu_to_le32(field2); trb->field[1] = cpu_to_le32(field2);
trb->field[2] = cpu_to_le32(field3); trb->field[2] = cpu_to_le32(field3);
/* make sure TRB is fully written before giving it to the controller */
wmb();
trb->field[3] = cpu_to_le32(field4); trb->field[3] = cpu_to_le32(field4);
trace_xhci_queue_trb(ring, trb); trace_xhci_queue_trb(ring, trb);
......
...@@ -623,6 +623,13 @@ static void tegra_xusb_mbox_handle(struct tegra_xusb *tegra, ...@@ -623,6 +623,13 @@ static void tegra_xusb_mbox_handle(struct tegra_xusb *tegra,
enable); enable);
if (err < 0) if (err < 0)
break; break;
/*
* wait 500us for LFPS detector to be disabled before
* sending ACK
*/
if (!enable)
usleep_range(500, 1000);
} }
if (err < 0) { if (err < 0) {
......
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