diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa.c b/drivers/platform/msm/ipa/ipa_v2/ipa.c index 06f8ab6e3e94..feb6225470ab 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa.c @@ -3473,6 +3473,7 @@ static int apps_cons_request_resource(void) static void ipa_sps_release_resource(struct work_struct *work) { + mutex_lock(&ipa_ctx->sps_pm.sps_pm_lock); /* check whether still need to decrease client usage */ if (atomic_read(&ipa_ctx->sps_pm.dec_clients)) { if (atomic_read(&ipa_ctx->sps_pm.eot_activity)) { @@ -3484,6 +3485,7 @@ static void ipa_sps_release_resource(struct work_struct *work) } } atomic_set(&ipa_ctx->sps_pm.eot_activity, 0); + mutex_unlock(&ipa_ctx->sps_pm.sps_pm_lock); } int ipa_create_apps_resource(void) @@ -3946,6 +3948,9 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p, wakeup_source_init(&ipa_ctx->w_lock, "IPA_WS"); spin_lock_init(&ipa_ctx->wakelock_ref_cnt.spinlock); + /* Initialize the SPS PM lock. */ + mutex_init(&ipa_ctx->sps_pm.sps_pm_lock); + /* Initialize IPA RM (resource manager) */ result = ipa_rm_initialize(); if (result) { diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_i.h b/drivers/platform/msm/ipa/ipa_v2/ipa_i.h index ce2ffc8f1cee..7d5daf202112 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_i.h @@ -1111,10 +1111,12 @@ struct ipa_uc_wdi_ctx { * @dec_clients: true if need to decrease active clients count * @eot_activity: represent EOT interrupt activity to determine to reset * the inactivity timer + * @sps_pm_lock: Lock to protect the sps_pm functionality. */ struct ipa_sps_pm { atomic_t dec_clients; atomic_t eot_activity; + struct mutex sps_pm_lock; }; /**