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

Commit 07d9f731 authored by Bhaumik Bhatt's avatar Bhaumik Bhatt
Browse files

mhi: core: unconditionally trigger resume to assert device wake



In order to ensure that a DRV resume follows immediately after
a client calls device wake assert or deassert, MHI core driver
must unconditionally increment the PM runtime usage count and
post a wake source before waiting for the state change.

Change-Id: I50228742c090a5df6fcb06f89f53723179bcd76d
Signed-off-by: default avatarBhaumik Bhatt <bbhatt@codeaurora.org>
parent cfab2293
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -1506,10 +1506,11 @@ int __mhi_device_get_sync(struct mhi_controller *mhi_cntrl)

	read_lock_bh(&mhi_cntrl->pm_lock);
	mhi_cntrl->wake_get(mhi_cntrl, true);
	if (MHI_PM_IN_SUSPEND_STATE(mhi_cntrl->pm_state))
		mhi_trigger_resume(mhi_cntrl);
	read_unlock_bh(&mhi_cntrl->pm_lock);

	pm_wakeup_hard_event(&mhi_cntrl->mhi_dev->dev);
	mhi_cntrl->runtime_get(mhi_cntrl, mhi_cntrl->priv_data);

	mhi_force_reg_write(mhi_cntrl);

	ret = wait_event_timeout(mhi_cntrl->state_event,
@@ -1524,9 +1525,11 @@ int __mhi_device_get_sync(struct mhi_controller *mhi_cntrl)
		read_lock_bh(&mhi_cntrl->pm_lock);
		mhi_cntrl->wake_put(mhi_cntrl, false);
		read_unlock_bh(&mhi_cntrl->pm_lock);
		mhi_cntrl->runtime_put(mhi_cntrl, mhi_cntrl->priv_data);
		return -EIO;
	}

	mhi_cntrl->runtime_put(mhi_cntrl, mhi_cntrl->priv_data);
	return 0;
}

@@ -1587,9 +1590,7 @@ void mhi_device_put(struct mhi_device *mhi_dev, int vote)
	if (vote & MHI_VOTE_DEVICE) {
		atomic_dec(&mhi_dev->dev_vote);
		read_lock_bh(&mhi_cntrl->pm_lock);
		if (MHI_PM_IN_SUSPEND_STATE(mhi_cntrl->pm_state))
		mhi_trigger_resume(mhi_cntrl);

		mhi_cntrl->wake_put(mhi_cntrl, false);
		MHI_LOG("dev_wake %d\n", atomic_read(&mhi_cntrl->dev_wake));
		read_unlock_bh(&mhi_cntrl->pm_lock);