Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fb33fdc8 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "usb: dwc3: Disable the irq before clearing run_stop bit"

parents 95ec895e 33d289bc
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -2172,7 +2172,18 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
			dev_err(dwc->dev, "timed out waiting for SETUP phase\n");
	}

	/* pull-up disable: clear pending events without queueing bh */
	dwc->pullups_connected = is_on;

	disable_irq(dwc->irq);

	/* prevent pending bh to run later */
	flush_work(&dwc->bh_work);

	spin_lock_irqsave(&dwc->lock, flags);
	if (dwc->ep0state != EP0_SETUP_PHASE)
		dbg_event(0xFF, "EP0 is not in SETUP phase\n", 0);

	/*
	 * If we are here after bus suspend notify otg state machine to
	 * increment pm usage count of dwc to prevent pm_runtime_suspend
@@ -2183,6 +2194,7 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)

	ret = dwc3_gadget_run_stop(dwc, is_on, false);
	spin_unlock_irqrestore(&dwc->lock, flags);
	enable_irq(dwc->irq);

	pm_runtime_mark_last_busy(dwc->dev);
	pm_runtime_put_autosuspend(dwc->dev);
@@ -3746,6 +3758,15 @@ static irqreturn_t dwc3_check_event_buf(struct dwc3_event_buffer *evt)
	if (dwc->err_evt_seen)
		return IRQ_HANDLED;

	/* Controller is being halted, ignore the interrupts */
	if (!dwc->pullups_connected) {
		count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0));
		count &= DWC3_GEVNTCOUNT_MASK;
		dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), count);
		dbg_event(0xFF, "NO_PULLUP", count);
		return IRQ_HANDLED;
	}

	/*
	 * With PCIe legacy interrupt, test shows that top-half irq handler can
	 * be called again after HW interrupt deassertion. Check if bottom-half