USB fixes for 5.8-rc3
Here are some small USB fixes for 5.8-rc3 to resolve some reported issues. Nothing major here: - gadget driver fixes - cdns3 driver fixes - xhci fixes - renesas_usbhs driver fixes - some new device support with ids - documentation update All of these have been in linux-next with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCXvcu5w8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ymcewCgrSLzmFCeXWeoK5qIyv+hRaBu1eoAoJ2eDihC 5ahPGEU1CGstW3Rp0Yhv =LAT6 -----END PGP SIGNATURE----- Merge tag 'usb-5.8-rc3' 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.8-rc3 to resolve some reported issues. Nothing major here: - gadget driver fixes - cdns3 driver fixes - xhci fixes - renesas_usbhs driver fixes - some new device support with ids - documentation update All of these have been in linux-next with no reported issues" * tag 'usb-5.8-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (27 commits) usb: renesas_usbhs: getting residue from callback_result Revert "usb: dwc3: exynos: Add support for Exynos5422 suspend clk" xhci: Poll for U0 after disabling USB2 LPM xhci: Return if xHCI doesn't support LPM usb: host: xhci-mtk: avoid runtime suspend when removing hcd xhci: Fix enumeration issue when setting max packet size for FS devices. xhci: Fix incorrect EP_STATE_MASK usb: cdns3: ep0: add spinlock for cdns3_check_new_setup usb: cdns3: trace: using correct dir value usb: cdns3: ep0: fix the test mode set incorrectly Revert "usb: dwc3: exynos: Add support for Exynos5422 suspend clk" usb: gadget: udc: Potential Oops in error handling code usb: phy: tegra: Fix unnecessary check in tegra_usb_phy_probe() usb: dwc3: pci: Fix reference count leak in dwc3_pci_resume_work usb: cdns3: ep0: add spinlock for cdns3_check_new_setup usb: cdns3: trace: using correct dir value usb: cdns3: ep0: fix the test mode set incorrectly usb: typec: tcpci_rt1711h: avoid screaming irq causing boot hangs USB: ohci-sm501: Add missed iounmap() in remove cdc-acm: Add DISABLE_ECHO quirk for Microchip/SMSC chip ...
This commit is contained in:
commit
7eb8f53b8a
|
@ -1,6 +1,6 @@
|
||||||
What: /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_req
|
What: /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_req
|
||||||
Date: Feb 2014
|
Date: Feb 2014
|
||||||
Contact: Li Jun <b47624@freescale.com>
|
Contact: Li Jun <jun.li@nxp.com>
|
||||||
Description:
|
Description:
|
||||||
Can be set and read.
|
Can be set and read.
|
||||||
Set a_bus_req(A-device bus request) input to be 1 if
|
Set a_bus_req(A-device bus request) input to be 1 if
|
||||||
|
@ -17,7 +17,7 @@ Description:
|
||||||
|
|
||||||
What: /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_drop
|
What: /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_drop
|
||||||
Date: Feb 2014
|
Date: Feb 2014
|
||||||
Contact: Li Jun <b47624@freescale.com>
|
Contact: Li Jun <jun.li@nxp.com>
|
||||||
Description:
|
Description:
|
||||||
Can be set and read
|
Can be set and read
|
||||||
The a_bus_drop(A-device bus drop) input is 1 when the
|
The a_bus_drop(A-device bus drop) input is 1 when the
|
||||||
|
@ -32,7 +32,7 @@ Description:
|
||||||
|
|
||||||
What: /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req
|
What: /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req
|
||||||
Date: Feb 2014
|
Date: Feb 2014
|
||||||
Contact: Li Jun <b47624@freescale.com>
|
Contact: Li Jun <jun.li@nxp.com>
|
||||||
Description:
|
Description:
|
||||||
Can be set and read.
|
Can be set and read.
|
||||||
The b_bus_req(B-device bus request) input is 1 during the time
|
The b_bus_req(B-device bus request) input is 1 during the time
|
||||||
|
@ -47,7 +47,7 @@ Description:
|
||||||
|
|
||||||
What: /sys/bus/platform/devices/ci_hdrc.0/inputs/a_clr_err
|
What: /sys/bus/platform/devices/ci_hdrc.0/inputs/a_clr_err
|
||||||
Date: Feb 2014
|
Date: Feb 2014
|
||||||
Contact: Li Jun <b47624@freescale.com>
|
Contact: Li Jun <jun.li@nxp.com>
|
||||||
Description:
|
Description:
|
||||||
Only can be set.
|
Only can be set.
|
||||||
The a_clr_err(A-device Vbus error clear) input is used to clear
|
The a_clr_err(A-device Vbus error clear) input is used to clear
|
||||||
|
|
|
@ -327,7 +327,8 @@ static int cdns3_ep0_feature_handle_device(struct cdns3_device *priv_dev,
|
||||||
if (!set || (tmode & 0xff) != 0)
|
if (!set || (tmode & 0xff) != 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
switch (tmode >> 8) {
|
tmode >>= 8;
|
||||||
|
switch (tmode) {
|
||||||
case TEST_J:
|
case TEST_J:
|
||||||
case TEST_K:
|
case TEST_K:
|
||||||
case TEST_SE0_NAK:
|
case TEST_SE0_NAK:
|
||||||
|
@ -704,15 +705,17 @@ static int cdns3_gadget_ep0_queue(struct usb_ep *ep,
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
u8 zlp = 0;
|
u8 zlp = 0;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&priv_dev->lock, flags);
|
||||||
trace_cdns3_ep0_queue(priv_dev, request);
|
trace_cdns3_ep0_queue(priv_dev, request);
|
||||||
|
|
||||||
/* cancel the request if controller receive new SETUP packet. */
|
/* cancel the request if controller receive new SETUP packet. */
|
||||||
if (cdns3_check_new_setup(priv_dev))
|
if (cdns3_check_new_setup(priv_dev)) {
|
||||||
|
spin_unlock_irqrestore(&priv_dev->lock, flags);
|
||||||
return -ECONNRESET;
|
return -ECONNRESET;
|
||||||
|
}
|
||||||
|
|
||||||
/* send STATUS stage. Should be called only for SET_CONFIGURATION */
|
/* send STATUS stage. Should be called only for SET_CONFIGURATION */
|
||||||
if (priv_dev->ep0_stage == CDNS3_STATUS_STAGE) {
|
if (priv_dev->ep0_stage == CDNS3_STATUS_STAGE) {
|
||||||
spin_lock_irqsave(&priv_dev->lock, flags);
|
|
||||||
cdns3_select_ep(priv_dev, 0x00);
|
cdns3_select_ep(priv_dev, 0x00);
|
||||||
|
|
||||||
erdy_sent = !priv_dev->hw_configured_flag;
|
erdy_sent = !priv_dev->hw_configured_flag;
|
||||||
|
@ -737,7 +740,6 @@ static int cdns3_gadget_ep0_queue(struct usb_ep *ep,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&priv_dev->lock, flags);
|
|
||||||
if (!list_empty(&priv_ep->pending_req_list)) {
|
if (!list_empty(&priv_ep->pending_req_list)) {
|
||||||
dev_err(priv_dev->dev,
|
dev_err(priv_dev->dev,
|
||||||
"can't handle multiple requests for ep0\n");
|
"can't handle multiple requests for ep0\n");
|
||||||
|
|
|
@ -156,7 +156,7 @@ DECLARE_EVENT_CLASS(cdns3_log_ep0_irq,
|
||||||
__dynamic_array(char, str, CDNS3_MSG_MAX)
|
__dynamic_array(char, str, CDNS3_MSG_MAX)
|
||||||
),
|
),
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
__entry->ep_dir = priv_dev->ep0_data_dir;
|
__entry->ep_dir = priv_dev->selected_ep;
|
||||||
__entry->ep_sts = ep_sts;
|
__entry->ep_sts = ep_sts;
|
||||||
),
|
),
|
||||||
TP_printk("%s", cdns3_decode_ep0_irq(__get_str(str),
|
TP_printk("%s", cdns3_decode_ep0_irq(__get_str(str),
|
||||||
|
|
|
@ -1689,6 +1689,8 @@ static int acm_pre_reset(struct usb_interface *intf)
|
||||||
|
|
||||||
static const struct usb_device_id acm_ids[] = {
|
static const struct usb_device_id acm_ids[] = {
|
||||||
/* quirky and broken devices */
|
/* quirky and broken devices */
|
||||||
|
{ USB_DEVICE(0x0424, 0x274e), /* Microchip Technology, Inc. (formerly SMSC) */
|
||||||
|
.driver_info = DISABLE_ECHO, }, /* DISABLE ECHO in termios flag */
|
||||||
{ USB_DEVICE(0x076d, 0x0006), /* Denso Cradle CU-321 */
|
{ USB_DEVICE(0x076d, 0x0006), /* Denso Cradle CU-321 */
|
||||||
.driver_info = NO_UNION_NORMAL, },/* has no union descriptor */
|
.driver_info = NO_UNION_NORMAL, },/* has no union descriptor */
|
||||||
{ USB_DEVICE(0x17ef, 0x7000), /* Lenovo USB modem */
|
{ USB_DEVICE(0x17ef, 0x7000), /* Lenovo USB modem */
|
||||||
|
|
|
@ -218,11 +218,12 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||||
/* Logitech HD Webcam C270 */
|
/* Logitech HD Webcam C270 */
|
||||||
{ USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME },
|
{ USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||||
|
|
||||||
/* Logitech HD Pro Webcams C920, C920-C, C925e and C930e */
|
/* Logitech HD Pro Webcams C920, C920-C, C922, C925e and C930e */
|
||||||
{ USB_DEVICE(0x046d, 0x082d), .driver_info = USB_QUIRK_DELAY_INIT },
|
{ USB_DEVICE(0x046d, 0x082d), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||||
{ USB_DEVICE(0x046d, 0x0841), .driver_info = USB_QUIRK_DELAY_INIT },
|
{ USB_DEVICE(0x046d, 0x0841), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||||
{ USB_DEVICE(0x046d, 0x0843), .driver_info = USB_QUIRK_DELAY_INIT },
|
{ USB_DEVICE(0x046d, 0x0843), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||||
{ USB_DEVICE(0x046d, 0x085b), .driver_info = USB_QUIRK_DELAY_INIT },
|
{ USB_DEVICE(0x046d, 0x085b), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||||
|
{ USB_DEVICE(0x046d, 0x085c), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||||
|
|
||||||
/* Logitech ConferenceCam CC3000e */
|
/* Logitech ConferenceCam CC3000e */
|
||||||
{ USB_DEVICE(0x046d, 0x0847), .driver_info = USB_QUIRK_DELAY_INIT },
|
{ USB_DEVICE(0x046d, 0x0847), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||||
|
|
|
@ -4920,12 +4920,6 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg)
|
||||||
epnum, 0);
|
epnum, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = usb_add_gadget_udc(dev, &hsotg->gadget);
|
|
||||||
if (ret) {
|
|
||||||
dwc2_hsotg_ep_free_request(&hsotg->eps_out[0]->ep,
|
|
||||||
hsotg->ctrl_req);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
dwc2_hsotg_dump(hsotg);
|
dwc2_hsotg_dump(hsotg);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -575,6 +575,17 @@ static int dwc2_driver_probe(struct platform_device *dev)
|
||||||
if (hsotg->dr_mode == USB_DR_MODE_PERIPHERAL)
|
if (hsotg->dr_mode == USB_DR_MODE_PERIPHERAL)
|
||||||
dwc2_lowlevel_hw_disable(hsotg);
|
dwc2_lowlevel_hw_disable(hsotg);
|
||||||
|
|
||||||
|
#if IS_ENABLED(CONFIG_USB_DWC2_PERIPHERAL) || \
|
||||||
|
IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE)
|
||||||
|
/* Postponed adding a new gadget to the udc class driver list */
|
||||||
|
if (hsotg->gadget_enabled) {
|
||||||
|
retval = usb_add_gadget_udc(hsotg->dev, &hsotg->gadget);
|
||||||
|
if (retval) {
|
||||||
|
dwc2_hsotg_remove(hsotg);
|
||||||
|
goto error_init;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_USB_DWC2_PERIPHERAL || CONFIG_USB_DWC2_DUAL_ROLE */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error_init:
|
error_init:
|
||||||
|
|
|
@ -162,12 +162,6 @@ static const struct dwc3_exynos_driverdata exynos5250_drvdata = {
|
||||||
.suspend_clk_idx = -1,
|
.suspend_clk_idx = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct dwc3_exynos_driverdata exynos5420_drvdata = {
|
|
||||||
.clk_names = { "usbdrd30", "usbdrd30_susp_clk"},
|
|
||||||
.num_clks = 2,
|
|
||||||
.suspend_clk_idx = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct dwc3_exynos_driverdata exynos5433_drvdata = {
|
static const struct dwc3_exynos_driverdata exynos5433_drvdata = {
|
||||||
.clk_names = { "aclk", "susp_clk", "pipe_pclk", "phyclk" },
|
.clk_names = { "aclk", "susp_clk", "pipe_pclk", "phyclk" },
|
||||||
.num_clks = 4,
|
.num_clks = 4,
|
||||||
|
@ -184,9 +178,6 @@ static const struct of_device_id exynos_dwc3_match[] = {
|
||||||
{
|
{
|
||||||
.compatible = "samsung,exynos5250-dwusb3",
|
.compatible = "samsung,exynos5250-dwusb3",
|
||||||
.data = &exynos5250_drvdata,
|
.data = &exynos5250_drvdata,
|
||||||
}, {
|
|
||||||
.compatible = "samsung,exynos5420-dwusb3",
|
|
||||||
.data = &exynos5420_drvdata,
|
|
||||||
}, {
|
}, {
|
||||||
.compatible = "samsung,exynos5433-dwusb3",
|
.compatible = "samsung,exynos5433-dwusb3",
|
||||||
.data = &exynos5433_drvdata,
|
.data = &exynos5433_drvdata,
|
||||||
|
|
|
@ -206,8 +206,10 @@ static void dwc3_pci_resume_work(struct work_struct *work)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = pm_runtime_get_sync(&dwc3->dev);
|
ret = pm_runtime_get_sync(&dwc3->dev);
|
||||||
if (ret)
|
if (ret) {
|
||||||
|
pm_runtime_put_sync_autosuspend(&dwc3->dev);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
pm_runtime_mark_last_busy(&dwc3->dev);
|
pm_runtime_mark_last_busy(&dwc3->dev);
|
||||||
pm_runtime_put_sync_autosuspend(&dwc3->dev);
|
pm_runtime_put_sync_autosuspend(&dwc3->dev);
|
||||||
|
|
|
@ -2313,6 +2313,7 @@ static int mv_udc_probe(struct platform_device *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_create_workqueue:
|
err_create_workqueue:
|
||||||
|
if (udc->qwork)
|
||||||
destroy_workqueue(udc->qwork);
|
destroy_workqueue(udc->qwork);
|
||||||
err_destroy_dma:
|
err_destroy_dma:
|
||||||
dma_pool_destroy(udc->dtd_pool);
|
dma_pool_destroy(udc->dtd_pool);
|
||||||
|
|
|
@ -203,9 +203,8 @@ static int exynos_ehci_probe(struct platform_device *pdev)
|
||||||
hcd->rsrc_len = resource_size(res);
|
hcd->rsrc_len = resource_size(res);
|
||||||
|
|
||||||
irq = platform_get_irq(pdev, 0);
|
irq = platform_get_irq(pdev, 0);
|
||||||
if (!irq) {
|
if (irq < 0) {
|
||||||
dev_err(&pdev->dev, "Failed to get IRQ\n");
|
err = irq;
|
||||||
err = -ENODEV;
|
|
||||||
goto fail_io;
|
goto fail_io;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -216,6 +216,13 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
|
||||||
ehci_info(ehci, "applying MosChip frame-index workaround\n");
|
ehci_info(ehci, "applying MosChip frame-index workaround\n");
|
||||||
ehci->frame_index_bug = 1;
|
ehci->frame_index_bug = 1;
|
||||||
break;
|
break;
|
||||||
|
case PCI_VENDOR_ID_HUAWEI:
|
||||||
|
/* Synopsys HC bug */
|
||||||
|
if (pdev->device == 0xa239) {
|
||||||
|
ehci_info(ehci, "applying Synopsys HC workaround\n");
|
||||||
|
ehci->has_synopsys_hc_bug = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* optional debug port, normally in the first BAR */
|
/* optional debug port, normally in the first BAR */
|
||||||
|
|
|
@ -191,6 +191,7 @@ static int ohci_hcd_sm501_drv_remove(struct platform_device *pdev)
|
||||||
struct resource *mem;
|
struct resource *mem;
|
||||||
|
|
||||||
usb_remove_hcd(hcd);
|
usb_remove_hcd(hcd);
|
||||||
|
iounmap(hcd->regs);
|
||||||
release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
|
release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
|
||||||
usb_put_hcd(hcd);
|
usb_put_hcd(hcd);
|
||||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
mem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||||
|
|
|
@ -587,6 +587,9 @@ static int xhci_mtk_remove(struct platform_device *dev)
|
||||||
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
|
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
|
||||||
struct usb_hcd *shared_hcd = xhci->shared_hcd;
|
struct usb_hcd *shared_hcd = xhci->shared_hcd;
|
||||||
|
|
||||||
|
pm_runtime_put_noidle(&dev->dev);
|
||||||
|
pm_runtime_disable(&dev->dev);
|
||||||
|
|
||||||
usb_remove_hcd(shared_hcd);
|
usb_remove_hcd(shared_hcd);
|
||||||
xhci->shared_hcd = NULL;
|
xhci->shared_hcd = NULL;
|
||||||
device_init_wakeup(&dev->dev, false);
|
device_init_wakeup(&dev->dev, false);
|
||||||
|
@ -597,8 +600,6 @@ static int xhci_mtk_remove(struct platform_device *dev)
|
||||||
xhci_mtk_sch_exit(mtk);
|
xhci_mtk_sch_exit(mtk);
|
||||||
xhci_mtk_clks_disable(mtk);
|
xhci_mtk_clks_disable(mtk);
|
||||||
xhci_mtk_ldos_disable(mtk);
|
xhci_mtk_ldos_disable(mtk);
|
||||||
pm_runtime_put_sync(&dev->dev);
|
|
||||||
pm_runtime_disable(&dev->dev);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1430,6 +1430,7 @@ static int xhci_check_maxpacket(struct xhci_hcd *xhci, unsigned int slot_id,
|
||||||
xhci->devs[slot_id]->out_ctx, ep_index);
|
xhci->devs[slot_id]->out_ctx, ep_index);
|
||||||
|
|
||||||
ep_ctx = xhci_get_ep_ctx(xhci, command->in_ctx, ep_index);
|
ep_ctx = xhci_get_ep_ctx(xhci, command->in_ctx, ep_index);
|
||||||
|
ep_ctx->ep_info &= cpu_to_le32(~EP_STATE_MASK);/* must clear */
|
||||||
ep_ctx->ep_info2 &= cpu_to_le32(~MAX_PACKET_MASK);
|
ep_ctx->ep_info2 &= cpu_to_le32(~MAX_PACKET_MASK);
|
||||||
ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet_size));
|
ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet_size));
|
||||||
|
|
||||||
|
@ -4390,6 +4391,9 @@ static int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd,
|
||||||
int hird, exit_latency;
|
int hird, exit_latency;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (xhci->quirks & XHCI_HW_LPM_DISABLE)
|
||||||
|
return -EPERM;
|
||||||
|
|
||||||
if (hcd->speed >= HCD_USB3 || !xhci->hw_lpm_support ||
|
if (hcd->speed >= HCD_USB3 || !xhci->hw_lpm_support ||
|
||||||
!udev->lpm_capable)
|
!udev->lpm_capable)
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
|
@ -4412,7 +4416,7 @@ static int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd,
|
||||||
xhci_dbg(xhci, "%s port %d USB2 hardware LPM\n",
|
xhci_dbg(xhci, "%s port %d USB2 hardware LPM\n",
|
||||||
enable ? "enable" : "disable", port_num + 1);
|
enable ? "enable" : "disable", port_num + 1);
|
||||||
|
|
||||||
if (enable && !(xhci->quirks & XHCI_HW_LPM_DISABLE)) {
|
if (enable) {
|
||||||
/* Host supports BESL timeout instead of HIRD */
|
/* Host supports BESL timeout instead of HIRD */
|
||||||
if (udev->usb2_hw_lpm_besl_capable) {
|
if (udev->usb2_hw_lpm_besl_capable) {
|
||||||
/* if device doesn't have a preferred BESL value use a
|
/* if device doesn't have a preferred BESL value use a
|
||||||
|
@ -4471,6 +4475,9 @@ static int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd,
|
||||||
mutex_lock(hcd->bandwidth_mutex);
|
mutex_lock(hcd->bandwidth_mutex);
|
||||||
xhci_change_max_exit_latency(xhci, udev, 0);
|
xhci_change_max_exit_latency(xhci, udev, 0);
|
||||||
mutex_unlock(hcd->bandwidth_mutex);
|
mutex_unlock(hcd->bandwidth_mutex);
|
||||||
|
readl_poll_timeout(ports[port_num]->addr, pm_val,
|
||||||
|
(pm_val & PORT_PLS_MASK) == XDEV_U0,
|
||||||
|
100, 10000);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -716,7 +716,7 @@ struct xhci_ep_ctx {
|
||||||
* 4 - TRB error
|
* 4 - TRB error
|
||||||
* 5-7 - reserved
|
* 5-7 - reserved
|
||||||
*/
|
*/
|
||||||
#define EP_STATE_MASK (0xf)
|
#define EP_STATE_MASK (0x7)
|
||||||
#define EP_STATE_DISABLED 0
|
#define EP_STATE_DISABLED 0
|
||||||
#define EP_STATE_RUNNING 1
|
#define EP_STATE_RUNNING 1
|
||||||
#define EP_STATE_HALTED 2
|
#define EP_STATE_HALTED 2
|
||||||
|
|
|
@ -2873,6 +2873,7 @@ static void usbtest_disconnect(struct usb_interface *intf)
|
||||||
|
|
||||||
usb_set_intfdata(intf, NULL);
|
usb_set_intfdata(intf, NULL);
|
||||||
dev_dbg(&intf->dev, "disconnect\n");
|
dev_dbg(&intf->dev, "disconnect\n");
|
||||||
|
kfree(dev->buf);
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1199,11 +1199,7 @@ static int tegra_usb_phy_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
platform_set_drvdata(pdev, tegra_phy);
|
platform_set_drvdata(pdev, tegra_phy);
|
||||||
|
|
||||||
err = usb_add_phy_dev(&tegra_phy->u_phy);
|
return usb_add_phy_dev(&tegra_phy->u_phy);
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra_usb_phy_remove(struct platform_device *pdev)
|
static int tegra_usb_phy_remove(struct platform_device *pdev)
|
||||||
|
|
|
@ -803,7 +803,8 @@ static int __usbhsf_dma_map_ctrl(struct usbhs_pkt *pkt, int map)
|
||||||
return info->dma_map_ctrl(chan->device->dev, pkt, map);
|
return info->dma_map_ctrl(chan->device->dev, pkt, map);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void usbhsf_dma_complete(void *arg);
|
static void usbhsf_dma_complete(void *arg,
|
||||||
|
const struct dmaengine_result *result);
|
||||||
static void usbhsf_dma_xfer_preparing(struct usbhs_pkt *pkt)
|
static void usbhsf_dma_xfer_preparing(struct usbhs_pkt *pkt)
|
||||||
{
|
{
|
||||||
struct usbhs_pipe *pipe = pkt->pipe;
|
struct usbhs_pipe *pipe = pkt->pipe;
|
||||||
|
@ -813,6 +814,7 @@ static void usbhsf_dma_xfer_preparing(struct usbhs_pkt *pkt)
|
||||||
struct dma_chan *chan;
|
struct dma_chan *chan;
|
||||||
struct device *dev = usbhs_priv_to_dev(priv);
|
struct device *dev = usbhs_priv_to_dev(priv);
|
||||||
enum dma_transfer_direction dir;
|
enum dma_transfer_direction dir;
|
||||||
|
dma_cookie_t cookie;
|
||||||
|
|
||||||
fifo = usbhs_pipe_to_fifo(pipe);
|
fifo = usbhs_pipe_to_fifo(pipe);
|
||||||
if (!fifo)
|
if (!fifo)
|
||||||
|
@ -827,11 +829,11 @@ static void usbhsf_dma_xfer_preparing(struct usbhs_pkt *pkt)
|
||||||
if (!desc)
|
if (!desc)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
desc->callback = usbhsf_dma_complete;
|
desc->callback_result = usbhsf_dma_complete;
|
||||||
desc->callback_param = pipe;
|
desc->callback_param = pkt;
|
||||||
|
|
||||||
pkt->cookie = dmaengine_submit(desc);
|
cookie = dmaengine_submit(desc);
|
||||||
if (pkt->cookie < 0) {
|
if (cookie < 0) {
|
||||||
dev_err(dev, "Failed to submit dma descriptor\n");
|
dev_err(dev, "Failed to submit dma descriptor\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1152,12 +1154,10 @@ static size_t usbhs_dma_calc_received_size(struct usbhs_pkt *pkt,
|
||||||
struct dma_chan *chan, int dtln)
|
struct dma_chan *chan, int dtln)
|
||||||
{
|
{
|
||||||
struct usbhs_pipe *pipe = pkt->pipe;
|
struct usbhs_pipe *pipe = pkt->pipe;
|
||||||
struct dma_tx_state state;
|
|
||||||
size_t received_size;
|
size_t received_size;
|
||||||
int maxp = usbhs_pipe_get_maxpacket(pipe);
|
int maxp = usbhs_pipe_get_maxpacket(pipe);
|
||||||
|
|
||||||
dmaengine_tx_status(chan, pkt->cookie, &state);
|
received_size = pkt->length - pkt->dma_result->residue;
|
||||||
received_size = pkt->length - state.residue;
|
|
||||||
|
|
||||||
if (dtln) {
|
if (dtln) {
|
||||||
received_size -= USBHS_USB_DMAC_XFER_SIZE;
|
received_size -= USBHS_USB_DMAC_XFER_SIZE;
|
||||||
|
@ -1363,13 +1363,16 @@ static int usbhsf_irq_ready(struct usbhs_priv *priv,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void usbhsf_dma_complete(void *arg)
|
static void usbhsf_dma_complete(void *arg,
|
||||||
|
const struct dmaengine_result *result)
|
||||||
{
|
{
|
||||||
struct usbhs_pipe *pipe = arg;
|
struct usbhs_pkt *pkt = arg;
|
||||||
|
struct usbhs_pipe *pipe = pkt->pipe;
|
||||||
struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
|
struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
|
||||||
struct device *dev = usbhs_priv_to_dev(priv);
|
struct device *dev = usbhs_priv_to_dev(priv);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
pkt->dma_result = result;
|
||||||
ret = usbhsf_pkt_handler(pipe, USBHSF_PKT_DMA_DONE);
|
ret = usbhsf_pkt_handler(pipe, USBHSF_PKT_DMA_DONE);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
dev_err(dev, "dma_complete run_error %d : %d\n",
|
dev_err(dev, "dma_complete run_error %d : %d\n",
|
||||||
|
|
|
@ -50,7 +50,7 @@ struct usbhs_pkt {
|
||||||
struct usbhs_pkt *pkt);
|
struct usbhs_pkt *pkt);
|
||||||
struct work_struct work;
|
struct work_struct work;
|
||||||
dma_addr_t dma;
|
dma_addr_t dma;
|
||||||
dma_cookie_t cookie;
|
const struct dmaengine_result *dma_result;
|
||||||
void *buf;
|
void *buf;
|
||||||
int length;
|
int length;
|
||||||
int trans;
|
int trans;
|
||||||
|
|
|
@ -148,6 +148,7 @@ pmc_usb_mux_dp_hpd(struct pmc_usb_port *port, struct typec_mux_state *state)
|
||||||
msg[0] = PMC_USB_DP_HPD;
|
msg[0] = PMC_USB_DP_HPD;
|
||||||
msg[0] |= port->usb3_port << PMC_USB_MSG_USB3_PORT_SHIFT;
|
msg[0] |= port->usb3_port << PMC_USB_MSG_USB3_PORT_SHIFT;
|
||||||
|
|
||||||
|
if (data->status & DP_STATUS_IRQ_HPD)
|
||||||
msg[1] = PMC_USB_DP_HPD_IRQ;
|
msg[1] = PMC_USB_DP_HPD_IRQ;
|
||||||
|
|
||||||
if (data->status & DP_STATUS_HPD_STATE)
|
if (data->status & DP_STATUS_HPD_STATE)
|
||||||
|
@ -161,6 +162,7 @@ pmc_usb_mux_dp(struct pmc_usb_port *port, struct typec_mux_state *state)
|
||||||
{
|
{
|
||||||
struct typec_displayport_data *data = state->data;
|
struct typec_displayport_data *data = state->data;
|
||||||
struct altmode_req req = { };
|
struct altmode_req req = { };
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (data->status & DP_STATUS_IRQ_HPD)
|
if (data->status & DP_STATUS_IRQ_HPD)
|
||||||
return pmc_usb_mux_dp_hpd(port, state);
|
return pmc_usb_mux_dp_hpd(port, state);
|
||||||
|
@ -181,7 +183,14 @@ pmc_usb_mux_dp(struct pmc_usb_port *port, struct typec_mux_state *state)
|
||||||
if (data->status & DP_STATUS_HPD_STATE)
|
if (data->status & DP_STATUS_HPD_STATE)
|
||||||
req.mode_data |= PMC_USB_ALTMODE_HPD_HIGH;
|
req.mode_data |= PMC_USB_ALTMODE_HPD_HIGH;
|
||||||
|
|
||||||
return pmc_usb_command(port, (void *)&req, sizeof(req));
|
ret = pmc_usb_command(port, (void *)&req, sizeof(req));
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (data->status & DP_STATUS_HPD_STATE)
|
||||||
|
return pmc_usb_mux_dp_hpd(port, state);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
|
@ -179,26 +179,6 @@ out:
|
||||||
return tcpci_irq(chip->tcpci);
|
return tcpci_irq(chip->tcpci);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rt1711h_init_alert(struct rt1711h_chip *chip,
|
|
||||||
struct i2c_client *client)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
/* Disable chip interrupts before requesting irq */
|
|
||||||
ret = rt1711h_write16(chip, TCPC_ALERT_MASK, 0);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = devm_request_threaded_irq(chip->dev, client->irq, NULL,
|
|
||||||
rt1711h_irq,
|
|
||||||
IRQF_ONESHOT | IRQF_TRIGGER_LOW,
|
|
||||||
dev_name(chip->dev), chip);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
enable_irq_wake(client->irq);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int rt1711h_sw_reset(struct rt1711h_chip *chip)
|
static int rt1711h_sw_reset(struct rt1711h_chip *chip)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -260,7 +240,8 @@ static int rt1711h_probe(struct i2c_client *client,
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = rt1711h_init_alert(chip, client);
|
/* Disable chip interrupts before requesting irq */
|
||||||
|
ret = rt1711h_write16(chip, TCPC_ALERT_MASK, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -271,6 +252,14 @@ static int rt1711h_probe(struct i2c_client *client,
|
||||||
if (IS_ERR_OR_NULL(chip->tcpci))
|
if (IS_ERR_OR_NULL(chip->tcpci))
|
||||||
return PTR_ERR(chip->tcpci);
|
return PTR_ERR(chip->tcpci);
|
||||||
|
|
||||||
|
ret = devm_request_threaded_irq(chip->dev, client->irq, NULL,
|
||||||
|
rt1711h_irq,
|
||||||
|
IRQF_ONESHOT | IRQF_TRIGGER_LOW,
|
||||||
|
dev_name(chip->dev), chip);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
enable_irq_wake(client->irq);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue