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

Commit fef6be44 authored by Mayank Rana's avatar Mayank Rana Committed by Gerrit - the friendly Code Review server
Browse files

usb: dwc-msm: Handle power event IRQ with block reset



Power Event IRQ is enabled from DWC3 driver probe and different
USB low power state related events are masked/unmasked with
USB LPM functionality. USB block reset requires to turns
off USB clocks and re-enable it. Power event IRQ races with it
on turning off host mode and causing unclock register access from
this interrupt context. Fix this issue by disabling power event irq
before disabling USB clocks and re-enable after enabling USB clocks.

CRs-Fixed: 798693
Change-Id: Ie8f2cbb9bb94328662edf54cbe94ea8b9211e91e
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent f265ab81
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1049,6 +1049,8 @@ static int dwc3_msm_link_clk_reset(struct dwc3_msm *mdwc, bool assert)
	int ret = 0;

	if (assert) {
		if (mdwc->pwr_event_irq)
			disable_irq(mdwc->pwr_event_irq);
		/* Using asynchronous block reset to the hardware */
		dev_dbg(mdwc->dev, "block_reset ASSERT\n");
		clk_disable_unprepare(mdwc->ref_clk);
@@ -1070,6 +1072,8 @@ static int dwc3_msm_link_clk_reset(struct dwc3_msm *mdwc, bool assert)
		clk_prepare_enable(mdwc->iface_clk);
		if (ret)
			dev_err(mdwc->dev, "dwc3 core_clk deassert failed\n");
		if (mdwc->pwr_event_irq)
			enable_irq(mdwc->pwr_event_irq);
	}

	return ret;