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

Commit 062e152d authored by Ajay Agarwal's avatar Ajay Agarwal Committed by Udipto Goswami
Browse files

usb: dwc3-msm: Enable pwr_evt_irq for wakeup after LPM is done



Platforms using Synopsys SS phy are enabling pwr_evt_irq for
wakeup events in host mode as a part of dwc3_msm_suspend, but
before all the resources have been relinquished. So it is
possible that an IRQ is fired before dwc->in_lpm could be set to
1. Because of this, the pwr_event_handler will try to read
STAT_REG without issuing resume_work leading to unclocked access.
Fix this by enabling pwr_evt_irq only after in_lpm flag is set to
1, hence ensuring resume when the irq is fired.

Change-Id: I9772f427ecd10c2922c998cf0d57734362413051
Signed-off-by: default avatarAjay Agarwal <ajaya@codeaurora.org>
parent 54a42cb3
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
 * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
 */

#include <linux/module.h>
@@ -2592,7 +2592,6 @@ static int dwc3_msm_suspend(struct dwc3_msm *mdwc, bool enable_wakeup)
		mdwc->lpm_flags |= MDWC3_SS_PHY_SUSPEND;
	} else if (mdwc->use_pwr_event_for_wakeup) {
		dwc3_msm_set_ss_pwr_events(mdwc, true);
		enable_irq(mdwc->wakeup_irq[PWR_EVNT_IRQ].irq);
	}

	/* make sure above writes are completed before turning off clocks */
@@ -2669,6 +2668,10 @@ static int dwc3_msm_suspend(struct dwc3_msm *mdwc, bool enable_wakeup)
		mdwc->lpm_flags |= MDWC3_ASYNC_IRQ_WAKE_CAPABILITY;
	}

	if (mdwc->use_pwr_event_for_wakeup &&
			!(mdwc->lpm_flags & MDWC3_SS_PHY_SUSPEND))
		enable_irq(mdwc->wakeup_irq[PWR_EVNT_IRQ].irq);

	dev_info(mdwc->dev, "DWC3 in low power mode\n");
	dbg_event(0xFF, "Ctl Sus", atomic_read(&dwc->in_lpm));