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

Commit 726bf061 authored by Hemant Kumar's avatar Hemant Kumar
Browse files

mhi: core: Force PM state to M0 while processing BW scaling event



Driver defers processing of BW scaling event if PM state is not in
M0. This delays the BW scaling to take effect. Fix this issue by
resuming the device if it was suspended state and assert wake DB.
After changing the BW of the link de-assert the wake DB.

Change-Id: Ibf827912a4de71d14f461382c28080157c65d6e0
Signed-off-by: default avatarHemant Kumar <hemantk@codeaurora.org>
parent 3acd0858
Loading
Loading
Loading
Loading
+15 −13
Original line number Diff line number Diff line
@@ -1406,29 +1406,28 @@ int mhi_process_bw_scale_ev_ring(struct mhi_controller *mhi_cntrl,
	struct mhi_link_info link_info, *cur_info = &mhi_cntrl->mhi_link_info;
	int result, ret = 0;

	mutex_lock(&mhi_cntrl->pm_mutex);

	if (unlikely(MHI_EVENT_ACCESS_INVALID(mhi_cntrl->pm_state))) {
		MHI_LOG("No EV access, PM_STATE:%s\n",
			to_mhi_pm_state_str(mhi_cntrl->pm_state));
		ret = -EIO;
		goto exit_bw_process;
		goto exit_no_lock;
	}

	/*
	 * BW change is not process during suspend since we're suspending link,
	 * host will process it during resume
	 */
	if (MHI_PM_IN_SUSPEND_STATE(mhi_cntrl->pm_state)) {
		ret = -EACCES;
		goto exit_bw_process;
	}
	ret = __mhi_device_get_sync(mhi_cntrl);
	if (ret)
		goto exit_no_lock;

	mutex_lock(&mhi_cntrl->pm_mutex);

	spin_lock_bh(&mhi_event->lock);
	dev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);

	if (ev_ring->rp == dev_rp) {
		spin_unlock_bh(&mhi_event->lock);
		read_lock_bh(&mhi_cntrl->pm_lock);
		mhi_cntrl->wake_put(mhi_cntrl, false);
		read_unlock_bh(&mhi_cntrl->pm_lock);
		MHI_VERB("no pending event found\n");
		goto exit_bw_process;
	}

@@ -1473,13 +1472,16 @@ int mhi_process_bw_scale_ev_ring(struct mhi_controller *mhi_cntrl,
		mhi_write_reg(mhi_cntrl, mhi_cntrl->bw_scale_db, 0,
			      MHI_BW_SCALE_RESULT(result,
						  link_info.sequence_num));

	mhi_cntrl->wake_put(mhi_cntrl, false);
	read_unlock_bh(&mhi_cntrl->pm_lock);

exit_bw_process:
	MHI_VERB("exit er_index:%u\n", mhi_event->er_index);

	mutex_unlock(&mhi_cntrl->pm_mutex);

exit_no_lock:
	MHI_VERB("exit er_index:%u\n", mhi_event->er_index);

	return ret;
}