msm: mhi_dev: Release wakelock after sending completion

After the device receives a M3 event it updates the channel
state field on the host to suspend and releases the wakelock
before sending the M3 completion and can cause the system
to suspend before sending the M3 completion. Update to release
the wakelock after completing the M3 request to MHI and IPA MHI.

Change-Id: I084778805f5219a51045f093ddc71b3cecefede2
Signed-off-by: Siddartha Mohanadoss <smohanad@codeaurora.org>
tirimbino
Siddartha Mohanadoss 5 years ago
parent ad5acfe8fb
commit 4b5c390475
  1. 12
      drivers/platform/msm/mhi_dev/mhi.c
  2. 1
      drivers/platform/msm/mhi_dev/mhi.h
  3. 1
      drivers/platform/msm/mhi_dev/mhi_sm.c

@ -2459,6 +2459,14 @@ static int mhi_dev_cache_host_cfg(struct mhi_dev *mhi)
(union mhi_dev_ring_ctx *)mhi->cmd_ctx_cache, mhi);
}
void mhi_dev_pm_relax(void)
{
atomic_set(&mhi_ctx->mhi_dev_wake, 0);
pm_relax(mhi_ctx->dev);
mhi_log(MHI_MSG_VERBOSE, "releasing mhi wakelock\n");
}
EXPORT_SYMBOL(mhi_dev_pm_relax);
int mhi_dev_suspend(struct mhi_dev *mhi)
{
int ch_id = 0, rc = 0;
@ -2493,10 +2501,6 @@ int mhi_dev_suspend(struct mhi_dev *mhi)
}
atomic_set(&mhi->mhi_dev_wake, 0);
pm_relax(mhi->dev);
mhi_log(MHI_MSG_VERBOSE, "releasing mhi wakelock\n");
mutex_unlock(&mhi_ctx->mhi_write_test);
return rc;

@ -1116,4 +1116,5 @@ void mhi_uci_chan_state_notify_all(struct mhi_dev *mhi,
void mhi_uci_chan_state_notify(struct mhi_dev *mhi,
enum mhi_client_channel ch_id, enum mhi_ctrl_info ch_state);
void mhi_dev_pm_relax(void);
#endif /* _MHI_H */

@ -888,6 +888,7 @@ static void mhi_sm_dev_event_manager(struct work_struct *work)
res = mhi_sm_prepare_suspend(MHI_DEV_M3_STATE);
if (res)
MHI_SM_ERR("Failed switching to M3 state\n");
mhi_dev_pm_relax();
break;
case MHI_DEV_EVENT_HW_ACC_WAKEUP:
case MHI_DEV_EVENT_CORE_WAKEUP:

Loading…
Cancel
Save