You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'usb-4.16-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB fixes from Greg KH: "Here are a number of USB fixes for 4.16-rc3 Nothing major, but a number of different fixes all over the place in the USB stack for reported issues. Mostly gadget driver fixes, although the typical set of xhci bugfixes are there, along with some new quirks additions as well. All of these have been in linux-next for a while with no reported issues" * tag 'usb-4.16-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (39 commits) Revert "usb: musb: host: don't start next rx urb if current one failed" usb: musb: fix enumeration after resume usb: cdc_acm: prevent race at write to acm while system resumes Add delay-init quirk for Corsair K70 RGB keyboards usb: ohci: Proper handling of ed_rm_list to handle race condition between usb_kill_urb() and finish_unlinks() usb: host: ehci: always enable interrupt for qtd completion at test mode usb: ldusb: add PIDs for new CASSY devices supported by this driver usb: renesas_usbhs: missed the "running" flag in usb_dmac with rx path usb: host: ehci: use correct device pointer for dma ops usbip: keep usbip_device sockfd state in sync with tcp_socket ohci-hcd: Fix race condition caused by ohci_urb_enqueue() and io_watchdog_func() USB: serial: option: Add support for Quectel EP06 xhci: fix xhci debugfs errors in xhci_stop xhci: xhci debugfs device nodes weren't removed after device plugged out xhci: Fix xhci debugfs devices node disappearance after hibernation xhci: Fix NULL pointer in xhci debugfs xhci: Don't print a warning when setting link state for disabled ports xhci: workaround for AMD Promontory disabled ports wakeup usb: dwc3: core: Fix ULPI PHYs and prevent phy_get/ulpi_init during suspend/resume USB: gadget: udc: Add missing platform_device_put() on error in bdc_pci_probe() ...
This commit is contained in:
@@ -645,6 +645,9 @@
|
||||
#define USB_DEVICE_ID_LD_MICROCASSYTIME 0x1033
|
||||
#define USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE 0x1035
|
||||
#define USB_DEVICE_ID_LD_MICROCASSYPH 0x1038
|
||||
#define USB_DEVICE_ID_LD_POWERANALYSERCASSY 0x1040
|
||||
#define USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY 0x1042
|
||||
#define USB_DEVICE_ID_LD_MACHINETESTCASSY 0x1043
|
||||
#define USB_DEVICE_ID_LD_JWM 0x1080
|
||||
#define USB_DEVICE_ID_LD_DMMP 0x1081
|
||||
#define USB_DEVICE_ID_LD_UMIP 0x1090
|
||||
|
||||
@@ -809,6 +809,9 @@ static const struct hid_device_id hid_ignore_list[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTIME) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYPH) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERANALYSERCASSY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETESTCASSY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) },
|
||||
|
||||
@@ -174,6 +174,7 @@ static int acm_wb_alloc(struct acm *acm)
|
||||
wb = &acm->wb[wbn];
|
||||
if (!wb->use) {
|
||||
wb->use = 1;
|
||||
wb->len = 0;
|
||||
return wbn;
|
||||
}
|
||||
wbn = (wbn + 1) % ACM_NW;
|
||||
@@ -805,16 +806,18 @@ static int acm_tty_write(struct tty_struct *tty,
|
||||
static void acm_tty_flush_chars(struct tty_struct *tty)
|
||||
{
|
||||
struct acm *acm = tty->driver_data;
|
||||
struct acm_wb *cur = acm->putbuffer;
|
||||
struct acm_wb *cur;
|
||||
int err;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&acm->write_lock, flags);
|
||||
|
||||
cur = acm->putbuffer;
|
||||
if (!cur) /* nothing to do */
|
||||
return;
|
||||
goto out;
|
||||
|
||||
acm->putbuffer = NULL;
|
||||
err = usb_autopm_get_interface_async(acm->control);
|
||||
spin_lock_irqsave(&acm->write_lock, flags);
|
||||
if (err < 0) {
|
||||
cur->use = 0;
|
||||
acm->putbuffer = cur;
|
||||
|
||||
@@ -226,6 +226,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
{ USB_DEVICE(0x1a0a, 0x0200), .driver_info =
|
||||
USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL },
|
||||
|
||||
/* Corsair K70 RGB */
|
||||
{ USB_DEVICE(0x1b1c, 0x1b13), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||
|
||||
/* Corsair Strafe RGB */
|
||||
{ USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||
|
||||
|
||||
+16
-10
@@ -1917,7 +1917,9 @@ static void dwc2_hsotg_program_zlp(struct dwc2_hsotg *hsotg,
|
||||
/* Not specific buffer needed for ep0 ZLP */
|
||||
dma_addr_t dma = hs_ep->desc_list_dma;
|
||||
|
||||
dwc2_gadget_set_ep0_desc_chain(hsotg, hs_ep);
|
||||
if (!index)
|
||||
dwc2_gadget_set_ep0_desc_chain(hsotg, hs_ep);
|
||||
|
||||
dwc2_gadget_config_nonisoc_xfer_ddma(hs_ep, dma, 0);
|
||||
} else {
|
||||
dwc2_writel(DXEPTSIZ_MC(1) | DXEPTSIZ_PKTCNT(1) |
|
||||
@@ -2974,9 +2976,13 @@ static void dwc2_hsotg_epint(struct dwc2_hsotg *hsotg, unsigned int idx,
|
||||
if (ints & DXEPINT_STSPHSERCVD) {
|
||||
dev_dbg(hsotg->dev, "%s: StsPhseRcvd\n", __func__);
|
||||
|
||||
/* Move to STATUS IN for DDMA */
|
||||
if (using_desc_dma(hsotg))
|
||||
dwc2_hsotg_ep0_zlp(hsotg, true);
|
||||
/* Safety check EP0 state when STSPHSERCVD asserted */
|
||||
if (hsotg->ep0_state == DWC2_EP0_DATA_OUT) {
|
||||
/* Move to STATUS IN for DDMA */
|
||||
if (using_desc_dma(hsotg))
|
||||
dwc2_hsotg_ep0_zlp(hsotg, true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (ints & DXEPINT_BACK2BACKSETUP)
|
||||
@@ -3375,12 +3381,6 @@ void dwc2_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg,
|
||||
dwc2_writel(dwc2_hsotg_ep0_mps(hsotg->eps_out[0]->ep.maxpacket) |
|
||||
DXEPCTL_USBACTEP, hsotg->regs + DIEPCTL0);
|
||||
|
||||
dwc2_hsotg_enqueue_setup(hsotg);
|
||||
|
||||
dev_dbg(hsotg->dev, "EP0: DIEPCTL0=0x%08x, DOEPCTL0=0x%08x\n",
|
||||
dwc2_readl(hsotg->regs + DIEPCTL0),
|
||||
dwc2_readl(hsotg->regs + DOEPCTL0));
|
||||
|
||||
/* clear global NAKs */
|
||||
val = DCTL_CGOUTNAK | DCTL_CGNPINNAK;
|
||||
if (!is_usb_reset)
|
||||
@@ -3391,6 +3391,12 @@ void dwc2_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg,
|
||||
mdelay(3);
|
||||
|
||||
hsotg->lx_state = DWC2_L0;
|
||||
|
||||
dwc2_hsotg_enqueue_setup(hsotg);
|
||||
|
||||
dev_dbg(hsotg->dev, "EP0: DIEPCTL0=0x%08x, DOEPCTL0=0x%08x\n",
|
||||
dwc2_readl(hsotg->regs + DIEPCTL0),
|
||||
dwc2_readl(hsotg->regs + DOEPCTL0));
|
||||
}
|
||||
|
||||
static void dwc2_hsotg_core_disconnect(struct dwc2_hsotg *hsotg)
|
||||
|
||||
+63
-27
@@ -100,6 +100,8 @@ static void dwc3_set_prtcap(struct dwc3 *dwc, u32 mode)
|
||||
reg &= ~(DWC3_GCTL_PRTCAPDIR(DWC3_GCTL_PRTCAP_OTG));
|
||||
reg |= DWC3_GCTL_PRTCAPDIR(mode);
|
||||
dwc3_writel(dwc->regs, DWC3_GCTL, reg);
|
||||
|
||||
dwc->current_dr_role = mode;
|
||||
}
|
||||
|
||||
static void __dwc3_set_mode(struct work_struct *work)
|
||||
@@ -133,8 +135,6 @@ static void __dwc3_set_mode(struct work_struct *work)
|
||||
|
||||
dwc3_set_prtcap(dwc, dwc->desired_dr_role);
|
||||
|
||||
dwc->current_dr_role = dwc->desired_dr_role;
|
||||
|
||||
spin_unlock_irqrestore(&dwc->lock, flags);
|
||||
|
||||
switch (dwc->desired_dr_role) {
|
||||
@@ -219,7 +219,7 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc)
|
||||
* XHCI driver will reset the host block. If dwc3 was configured for
|
||||
* host-only mode, then we can return early.
|
||||
*/
|
||||
if (dwc->dr_mode == USB_DR_MODE_HOST)
|
||||
if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_HOST)
|
||||
return 0;
|
||||
|
||||
reg = dwc3_readl(dwc->regs, DWC3_DCTL);
|
||||
@@ -234,6 +234,9 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc)
|
||||
udelay(1);
|
||||
} while (--retries);
|
||||
|
||||
phy_exit(dwc->usb3_generic_phy);
|
||||
phy_exit(dwc->usb2_generic_phy);
|
||||
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
@@ -483,6 +486,22 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc)
|
||||
parms->hwparams8 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS8);
|
||||
}
|
||||
|
||||
static int dwc3_core_ulpi_init(struct dwc3 *dwc)
|
||||
{
|
||||
int intf;
|
||||
int ret = 0;
|
||||
|
||||
intf = DWC3_GHWPARAMS3_HSPHY_IFC(dwc->hwparams.hwparams3);
|
||||
|
||||
if (intf == DWC3_GHWPARAMS3_HSPHY_IFC_ULPI ||
|
||||
(intf == DWC3_GHWPARAMS3_HSPHY_IFC_UTMI_ULPI &&
|
||||
dwc->hsphy_interface &&
|
||||
!strncmp(dwc->hsphy_interface, "ulpi", 4)))
|
||||
ret = dwc3_ulpi_init(dwc);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* dwc3_phy_setup - Configure USB PHY Interface of DWC3 Core
|
||||
* @dwc: Pointer to our controller context structure
|
||||
@@ -494,7 +513,6 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc)
|
||||
static int dwc3_phy_setup(struct dwc3 *dwc)
|
||||
{
|
||||
u32 reg;
|
||||
int ret;
|
||||
|
||||
reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));
|
||||
|
||||
@@ -565,9 +583,6 @@ static int dwc3_phy_setup(struct dwc3 *dwc)
|
||||
}
|
||||
/* FALLTHROUGH */
|
||||
case DWC3_GHWPARAMS3_HSPHY_IFC_ULPI:
|
||||
ret = dwc3_ulpi_init(dwc);
|
||||
if (ret)
|
||||
return ret;
|
||||
/* FALLTHROUGH */
|
||||
default:
|
||||
break;
|
||||
@@ -724,6 +739,7 @@ static void dwc3_core_setup_global_control(struct dwc3 *dwc)
|
||||
}
|
||||
|
||||
static int dwc3_core_get_phy(struct dwc3 *dwc);
|
||||
static int dwc3_core_ulpi_init(struct dwc3 *dwc);
|
||||
|
||||
/**
|
||||
* dwc3_core_init - Low-level initialization of DWC3 Core
|
||||
@@ -755,18 +771,28 @@ static int dwc3_core_init(struct dwc3 *dwc)
|
||||
dwc->maximum_speed = USB_SPEED_HIGH;
|
||||
}
|
||||
|
||||
ret = dwc3_core_get_phy(dwc);
|
||||
if (ret)
|
||||
goto err0;
|
||||
|
||||
ret = dwc3_core_soft_reset(dwc);
|
||||
if (ret)
|
||||
goto err0;
|
||||
|
||||
ret = dwc3_phy_setup(dwc);
|
||||
if (ret)
|
||||
goto err0;
|
||||
|
||||
if (!dwc->ulpi_ready) {
|
||||
ret = dwc3_core_ulpi_init(dwc);
|
||||
if (ret)
|
||||
goto err0;
|
||||
dwc->ulpi_ready = true;
|
||||
}
|
||||
|
||||
if (!dwc->phys_ready) {
|
||||
ret = dwc3_core_get_phy(dwc);
|
||||
if (ret)
|
||||
goto err0a;
|
||||
dwc->phys_ready = true;
|
||||
}
|
||||
|
||||
ret = dwc3_core_soft_reset(dwc);
|
||||
if (ret)
|
||||
goto err0a;
|
||||
|
||||
dwc3_core_setup_global_control(dwc);
|
||||
dwc3_core_num_eps(dwc);
|
||||
|
||||
@@ -838,6 +864,9 @@ err1:
|
||||
phy_exit(dwc->usb2_generic_phy);
|
||||
phy_exit(dwc->usb3_generic_phy);
|
||||
|
||||
err0a:
|
||||
dwc3_ulpi_exit(dwc);
|
||||
|
||||
err0:
|
||||
return ret;
|
||||
}
|
||||
@@ -916,7 +945,6 @@ static int dwc3_core_init_mode(struct dwc3 *dwc)
|
||||
|
||||
switch (dwc->dr_mode) {
|
||||
case USB_DR_MODE_PERIPHERAL:
|
||||
dwc->current_dr_role = DWC3_GCTL_PRTCAP_DEVICE;
|
||||
dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_DEVICE);
|
||||
|
||||
if (dwc->usb2_phy)
|
||||
@@ -932,7 +960,6 @@ static int dwc3_core_init_mode(struct dwc3 *dwc)
|
||||
}
|
||||
break;
|
||||
case USB_DR_MODE_HOST:
|
||||
dwc->current_dr_role = DWC3_GCTL_PRTCAP_HOST;
|
||||
dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_HOST);
|
||||
|
||||
if (dwc->usb2_phy)
|
||||
@@ -1234,7 +1261,6 @@ err4:
|
||||
|
||||
err3:
|
||||
dwc3_free_event_buffers(dwc);
|
||||
dwc3_ulpi_exit(dwc);
|
||||
|
||||
err2:
|
||||
pm_runtime_allow(&pdev->dev);
|
||||
@@ -1284,7 +1310,7 @@ static int dwc3_remove(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int dwc3_suspend_common(struct dwc3 *dwc)
|
||||
static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
@@ -1296,6 +1322,10 @@ static int dwc3_suspend_common(struct dwc3 *dwc)
|
||||
dwc3_core_exit(dwc);
|
||||
break;
|
||||
case DWC3_GCTL_PRTCAP_HOST:
|
||||
/* do nothing during host runtime_suspend */
|
||||
if (!PMSG_IS_AUTO(msg))
|
||||
dwc3_core_exit(dwc);
|
||||
break;
|
||||
default:
|
||||
/* do nothing */
|
||||
break;
|
||||
@@ -1304,7 +1334,7 @@ static int dwc3_suspend_common(struct dwc3 *dwc)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dwc3_resume_common(struct dwc3 *dwc)
|
||||
static int dwc3_resume_common(struct dwc3 *dwc, pm_message_t msg)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
@@ -1320,6 +1350,13 @@ static int dwc3_resume_common(struct dwc3 *dwc)
|
||||
spin_unlock_irqrestore(&dwc->lock, flags);
|
||||
break;
|
||||
case DWC3_GCTL_PRTCAP_HOST:
|
||||
/* nothing to do on host runtime_resume */
|
||||
if (!PMSG_IS_AUTO(msg)) {
|
||||
ret = dwc3_core_init(dwc);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* do nothing */
|
||||
break;
|
||||
@@ -1331,12 +1368,11 @@ static int dwc3_resume_common(struct dwc3 *dwc)
|
||||
static int dwc3_runtime_checks(struct dwc3 *dwc)
|
||||
{
|
||||
switch (dwc->current_dr_role) {
|
||||
case USB_DR_MODE_PERIPHERAL:
|
||||
case USB_DR_MODE_OTG:
|
||||
case DWC3_GCTL_PRTCAP_DEVICE:
|
||||
if (dwc->connected)
|
||||
return -EBUSY;
|
||||
break;
|
||||
case USB_DR_MODE_HOST:
|
||||
case DWC3_GCTL_PRTCAP_HOST:
|
||||
default:
|
||||
/* do nothing */
|
||||
break;
|
||||
@@ -1353,7 +1389,7 @@ static int dwc3_runtime_suspend(struct device *dev)
|
||||
if (dwc3_runtime_checks(dwc))
|
||||
return -EBUSY;
|
||||
|
||||
ret = dwc3_suspend_common(dwc);
|
||||
ret = dwc3_suspend_common(dwc, PMSG_AUTO_SUSPEND);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -1369,7 +1405,7 @@ static int dwc3_runtime_resume(struct device *dev)
|
||||
|
||||
device_init_wakeup(dev, false);
|
||||
|
||||
ret = dwc3_resume_common(dwc);
|
||||
ret = dwc3_resume_common(dwc, PMSG_AUTO_RESUME);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -1416,7 +1452,7 @@ static int dwc3_suspend(struct device *dev)
|
||||
struct dwc3 *dwc = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
ret = dwc3_suspend_common(dwc);
|
||||
ret = dwc3_suspend_common(dwc, PMSG_SUSPEND);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -1432,7 +1468,7 @@ static int dwc3_resume(struct device *dev)
|
||||
|
||||
pinctrl_pm_select_default_state(dev);
|
||||
|
||||
ret = dwc3_resume_common(dwc);
|
||||
ret = dwc3_resume_common(dwc, PMSG_RESUME);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
+14
-7
@@ -158,13 +158,15 @@
|
||||
#define DWC3_GDBGFIFOSPACE_TYPE(n) (((n) << 5) & 0x1e0)
|
||||
#define DWC3_GDBGFIFOSPACE_SPACE_AVAILABLE(n) (((n) >> 16) & 0xffff)
|
||||
|
||||
#define DWC3_TXFIFOQ 1
|
||||
#define DWC3_RXFIFOQ 3
|
||||
#define DWC3_TXREQQ 5
|
||||
#define DWC3_RXREQQ 7
|
||||
#define DWC3_RXINFOQ 9
|
||||
#define DWC3_DESCFETCHQ 13
|
||||
#define DWC3_EVENTQ 15
|
||||
#define DWC3_TXFIFOQ 0
|
||||
#define DWC3_RXFIFOQ 1
|
||||
#define DWC3_TXREQQ 2
|
||||
#define DWC3_RXREQQ 3
|
||||
#define DWC3_RXINFOQ 4
|
||||
#define DWC3_PSTATQ 5
|
||||
#define DWC3_DESCFETCHQ 6
|
||||
#define DWC3_EVENTQ 7
|
||||
#define DWC3_AUXEVENTQ 8
|
||||
|
||||
/* Global RX Threshold Configuration Register */
|
||||
#define DWC3_GRXTHRCFG_MAXRXBURSTSIZE(n) (((n) & 0x1f) << 19)
|
||||
@@ -795,7 +797,9 @@ struct dwc3_scratchpad_array {
|
||||
* @usb3_phy: pointer to USB3 PHY
|
||||
* @usb2_generic_phy: pointer to USB2 PHY
|
||||
* @usb3_generic_phy: pointer to USB3 PHY
|
||||
* @phys_ready: flag to indicate that PHYs are ready
|
||||
* @ulpi: pointer to ulpi interface
|
||||
* @ulpi_ready: flag to indicate that ULPI is initialized
|
||||
* @u2sel: parameter from Set SEL request.
|
||||
* @u2pel: parameter from Set SEL request.
|
||||
* @u1sel: parameter from Set SEL request.
|
||||
@@ -893,7 +897,10 @@ struct dwc3 {
|
||||
struct phy *usb2_generic_phy;
|
||||
struct phy *usb3_generic_phy;
|
||||
|
||||
bool phys_ready;
|
||||
|
||||
struct ulpi *ulpi;
|
||||
bool ulpi_ready;
|
||||
|
||||
void __iomem *regs;
|
||||
size_t regs_size;
|
||||
|
||||
@@ -143,6 +143,7 @@ static int dwc3_of_simple_remove(struct platform_device *pdev)
|
||||
clk_disable_unprepare(simple->clks[i]);
|
||||
clk_put(simple->clks[i]);
|
||||
}
|
||||
simple->num_clocks = 0;
|
||||
|
||||
reset_control_assert(simple->resets);
|
||||
reset_control_put(simple->resets);
|
||||
|
||||
@@ -582,9 +582,25 @@ static int dwc3_omap_resume(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dwc3_omap_complete(struct device *dev)
|
||||
{
|
||||
struct dwc3_omap *omap = dev_get_drvdata(dev);
|
||||
|
||||
if (extcon_get_state(omap->edev, EXTCON_USB))
|
||||
dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_VALID);
|
||||
else
|
||||
dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_OFF);
|
||||
|
||||
if (extcon_get_state(omap->edev, EXTCON_USB_HOST))
|
||||
dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_GROUND);
|
||||
else
|
||||
dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_FLOAT);
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops dwc3_omap_dev_pm_ops = {
|
||||
|
||||
SET_SYSTEM_SLEEP_PM_OPS(dwc3_omap_suspend, dwc3_omap_resume)
|
||||
.complete = dwc3_omap_complete,
|
||||
};
|
||||
|
||||
#define DEV_PM_OPS (&dwc3_omap_dev_pm_ops)
|
||||
|
||||
@@ -854,7 +854,12 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc,
|
||||
trb++;
|
||||
trb->ctrl &= ~DWC3_TRB_CTRL_HWO;
|
||||
trace_dwc3_complete_trb(ep0, trb);
|
||||
ep0->trb_enqueue = 0;
|
||||
|
||||
if (r->direction)
|
||||
dwc->eps[1]->trb_enqueue = 0;
|
||||
else
|
||||
dwc->eps[0]->trb_enqueue = 0;
|
||||
|
||||
dwc->ep0_bounced = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -2745,6 +2745,8 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)
|
||||
break;
|
||||
}
|
||||
|
||||
dwc->eps[1]->endpoint.maxpacket = dwc->gadget.ep0->maxpacket;
|
||||
|
||||
/* Enable USB2 LPM Capability */
|
||||
|
||||
if ((dwc->revision > DWC3_REVISION_194A) &&
|
||||
|
||||
@@ -1855,44 +1855,20 @@ static int ffs_func_eps_enable(struct ffs_function *func)
|
||||
|
||||
spin_lock_irqsave(&func->ffs->eps_lock, flags);
|
||||
while(count--) {
|
||||
struct usb_endpoint_descriptor *ds;
|
||||
struct usb_ss_ep_comp_descriptor *comp_desc = NULL;
|
||||
int needs_comp_desc = false;
|
||||
int desc_idx;
|
||||
|
||||
if (ffs->gadget->speed == USB_SPEED_SUPER) {
|
||||
desc_idx = 2;
|
||||
needs_comp_desc = true;
|
||||
} else if (ffs->gadget->speed == USB_SPEED_HIGH)
|
||||
desc_idx = 1;
|
||||
else
|
||||
desc_idx = 0;
|
||||
|
||||
/* fall-back to lower speed if desc missing for current speed */
|
||||
do {
|
||||
ds = ep->descs[desc_idx];
|
||||
} while (!ds && --desc_idx >= 0);
|
||||
|
||||
if (!ds) {
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
ep->ep->driver_data = ep;
|
||||
ep->ep->desc = ds;
|
||||
|
||||
if (needs_comp_desc) {
|
||||
comp_desc = (struct usb_ss_ep_comp_descriptor *)(ds +
|
||||
USB_DT_ENDPOINT_SIZE);
|
||||
ep->ep->maxburst = comp_desc->bMaxBurst + 1;
|
||||
ep->ep->comp_desc = comp_desc;
|
||||
ret = config_ep_by_speed(func->gadget, &func->function, ep->ep);
|
||||
if (ret) {
|
||||
pr_err("%s: config_ep_by_speed(%s) returned %d\n",
|
||||
__func__, ep->ep->name, ret);
|
||||
break;
|
||||
}
|
||||
|
||||
ret = usb_ep_enable(ep->ep);
|
||||
if (likely(!ret)) {
|
||||
epfile->ep = ep;
|
||||
epfile->in = usb_endpoint_dir_in(ds);
|
||||
epfile->isoc = usb_endpoint_xfer_isoc(ds);
|
||||
epfile->in = usb_endpoint_dir_in(ep->ep->desc);
|
||||
epfile->isoc = usb_endpoint_xfer_isoc(ep->ep->desc);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
@@ -2979,10 +2955,8 @@ static int _ffs_func_bind(struct usb_configuration *c,
|
||||
struct ffs_data *ffs = func->ffs;
|
||||
|
||||
const int full = !!func->ffs->fs_descs_count;
|
||||
const int high = gadget_is_dualspeed(func->gadget) &&
|
||||
func->ffs->hs_descs_count;
|
||||
const int super = gadget_is_superspeed(func->gadget) &&
|
||||
func->ffs->ss_descs_count;
|
||||
const int high = !!func->ffs->hs_descs_count;
|
||||
const int super = !!func->ffs->ss_descs_count;
|
||||
|
||||
int fs_len, hs_len, ss_len, ret, i;
|
||||
struct ffs_ep *eps_ptr;
|
||||
|
||||
@@ -524,6 +524,8 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
|
||||
dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
|
||||
return ret;
|
||||
}
|
||||
iad_desc.bFirstInterface = ret;
|
||||
|
||||
std_ac_if_desc.bInterfaceNumber = ret;
|
||||
uac2->ac_intf = ret;
|
||||
uac2->ac_alt = 0;
|
||||
|
||||
@@ -274,7 +274,6 @@ config USB_SNP_UDC_PLAT
|
||||
tristate "Synopsys USB 2.0 Device controller"
|
||||
depends on USB_GADGET && OF && HAS_DMA
|
||||
depends on EXTCON || EXTCON=n
|
||||
select USB_GADGET_DUALSPEED
|
||||
select USB_SNP_CORE
|
||||
default ARCH_BCM_IPROC
|
||||
help
|
||||
|
||||
@@ -77,6 +77,7 @@ static int bdc_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
|
||||
if (ret) {
|
||||
dev_err(&pci->dev,
|
||||
"couldn't add resources to bdc device\n");
|
||||
platform_device_put(bdc);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -180,8 +180,8 @@ EXPORT_SYMBOL_GPL(usb_ep_alloc_request);
|
||||
void usb_ep_free_request(struct usb_ep *ep,
|
||||
struct usb_request *req)
|
||||
{
|
||||
ep->ops->free_request(ep, req);
|
||||
trace_usb_ep_free_request(ep, req, 0);
|
||||
ep->ops->free_request(ep, req);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(usb_ep_free_request);
|
||||
|
||||
|
||||
@@ -1305,7 +1305,7 @@ static void udc_reset_ep_queue(struct fsl_udc *udc, u8 pipe)
|
||||
{
|
||||
struct fsl_ep *ep = get_ep_by_pipe(udc, pipe);
|
||||
|
||||
if (ep->name)
|
||||
if (ep->ep.name)
|
||||
nuke(ep, -ESHUTDOWN);
|
||||
}
|
||||
|
||||
@@ -1693,7 +1693,7 @@ static void dtd_complete_irq(struct fsl_udc *udc)
|
||||
curr_ep = get_ep_by_pipe(udc, i);
|
||||
|
||||
/* If the ep is configured */
|
||||
if (curr_ep->name == NULL) {
|
||||
if (!curr_ep->ep.name) {
|
||||
WARNING("Invalid EP?");
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -2410,7 +2410,7 @@ static int renesas_usb3_remove(struct platform_device *pdev)
|
||||
__renesas_usb3_ep_free_request(usb3->ep0_req);
|
||||
if (usb3->phy)
|
||||
phy_put(usb3->phy);
|
||||
pm_runtime_disable(usb3_to_dev(usb3));
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -774,12 +774,12 @@ static struct urb *request_single_step_set_feature_urb(
|
||||
atomic_inc(&urb->use_count);
|
||||
atomic_inc(&urb->dev->urbnum);
|
||||
urb->setup_dma = dma_map_single(
|
||||
hcd->self.controller,
|
||||
hcd->self.sysdev,
|
||||
urb->setup_packet,
|
||||
sizeof(struct usb_ctrlrequest),
|
||||
DMA_TO_DEVICE);
|
||||
urb->transfer_dma = dma_map_single(
|
||||
hcd->self.controller,
|
||||
hcd->self.sysdev,
|
||||
urb->transfer_buffer,
|
||||
urb->transfer_buffer_length,
|
||||
DMA_FROM_DEVICE);
|
||||
|
||||
@@ -1188,10 +1188,10 @@ static int submit_single_step_set_feature(
|
||||
* 15 secs after the setup
|
||||
*/
|
||||
if (is_setup) {
|
||||
/* SETUP pid */
|
||||
/* SETUP pid, and interrupt after SETUP completion */
|
||||
qtd_fill(ehci, qtd, urb->setup_dma,
|
||||
sizeof(struct usb_ctrlrequest),
|
||||
token | (2 /* "setup" */ << 8), 8);
|
||||
QTD_IOC | token | (2 /* "setup" */ << 8), 8);
|
||||
|
||||
submit_async(ehci, urb, &qtd_list, GFP_ATOMIC);
|
||||
return 0; /*Return now; we shall come back after 15 seconds*/
|
||||
@@ -1228,12 +1228,8 @@ static int submit_single_step_set_feature(
|
||||
qtd_prev->hw_next = QTD_NEXT(ehci, qtd->qtd_dma);
|
||||
list_add_tail(&qtd->qtd_list, head);
|
||||
|
||||
/* dont fill any data in such packets */
|
||||
qtd_fill(ehci, qtd, 0, 0, token, 0);
|
||||
|
||||
/* by default, enable interrupt on urb completion */
|
||||
if (likely(!(urb->transfer_flags & URB_NO_INTERRUPT)))
|
||||
qtd->hw_token |= cpu_to_hc32(ehci, QTD_IOC);
|
||||
/* Interrupt after STATUS completion */
|
||||
qtd_fill(ehci, qtd, 0, 0, token | QTD_IOC, 0);
|
||||
|
||||
submit_async(ehci, urb, &qtd_list, GFP_KERNEL);
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user