summaryrefslogtreecommitdiff
path: root/drivers/platform
diff options
context:
space:
mode:
authorUtkarsh Saxena <usaxena@codeaurora.org>2017-03-07 16:53:38 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2017-03-09 09:16:54 -0800
commitb09c22c040d134cc316048e95be617199d4da7ec (patch)
tree399e93d1b4c2d5810950133e66c94125486e3645 /drivers/platform
parent9bf700385d74d738a0f6d982886ed8a51ae8fbb9 (diff)
msm: ipa: Fix incorrect wakelock handling
For every __pm_stay_awake call, there must be a __pm_relax call to ensure there is no stale wakelock is held. with the current logic __pm_stay_awake is called whenever wakelock ref cnt is non-zero and released only when it is 0. This leads to wakelock being held even when it is not required. Make a change to acquire wakelock only when it is not held previously. Change-Id: I8c61c184506c705fd5866de8a606f642c5de3d5b Acked-by: Chaitanya Pratapa <cpratapa@qti.qualcomm.com> Signed-off-by: Utkarsh Saxena <usaxena@codeaurora.org>
Diffstat (limited to 'drivers/platform')
-rw-r--r--drivers/platform/msm/ipa/ipa_v2/ipa.c12
-rw-r--r--drivers/platform/msm/ipa/ipa_v2/ipa_i.h1
2 files changed, 10 insertions, 3 deletions
diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa.c b/drivers/platform/msm/ipa/ipa_v2/ipa.c
index d4b0dd9910e1..553480660722 100644
--- a/drivers/platform/msm/ipa/ipa_v2/ipa.c
+++ b/drivers/platform/msm/ipa/ipa_v2/ipa.c
@@ -3418,11 +3418,14 @@ void ipa_inc_acquire_wakelock(enum ipa_wakelock_ref_client ref_client)
return;
spin_lock_irqsave(&ipa_ctx->wakelock_ref_cnt.spinlock, flags);
if (ipa_ctx->wakelock_ref_cnt.cnt & (1 << ref_client))
- IPAERR("client enum %d mask already set. ref cnt = %d\n",
+ IPADBG("client enum %d mask already set. ref cnt = %d\n",
ref_client, ipa_ctx->wakelock_ref_cnt.cnt);
ipa_ctx->wakelock_ref_cnt.cnt |= (1 << ref_client);
- if (ipa_ctx->wakelock_ref_cnt.cnt)
+ if (ipa_ctx->wakelock_ref_cnt.cnt &&
+ !ipa_ctx->wakelock_ref_cnt.wakelock_acquired) {
__pm_stay_awake(&ipa_ctx->w_lock);
+ ipa_ctx->wakelock_ref_cnt.wakelock_acquired = true;
+ }
IPADBG_LOW("active wakelock ref cnt = %d client enum %d\n",
ipa_ctx->wakelock_ref_cnt.cnt, ref_client);
spin_unlock_irqrestore(&ipa_ctx->wakelock_ref_cnt.spinlock, flags);
@@ -3446,8 +3449,11 @@ void ipa_dec_release_wakelock(enum ipa_wakelock_ref_client ref_client)
ipa_ctx->wakelock_ref_cnt.cnt &= ~(1 << ref_client);
IPADBG_LOW("active wakelock ref cnt = %d client enum %d\n",
ipa_ctx->wakelock_ref_cnt.cnt, ref_client);
- if (ipa_ctx->wakelock_ref_cnt.cnt == 0)
+ if (ipa_ctx->wakelock_ref_cnt.cnt == 0 &&
+ ipa_ctx->wakelock_ref_cnt.wakelock_acquired) {
__pm_relax(&ipa_ctx->w_lock);
+ ipa_ctx->wakelock_ref_cnt.wakelock_acquired = false;
+ }
spin_unlock_irqrestore(&ipa_ctx->wakelock_ref_cnt.spinlock, flags);
}
diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_i.h b/drivers/platform/msm/ipa/ipa_v2/ipa_i.h
index 94d76db6f993..a14d1fee9c35 100644
--- a/drivers/platform/msm/ipa/ipa_v2/ipa_i.h
+++ b/drivers/platform/msm/ipa/ipa_v2/ipa_i.h
@@ -841,6 +841,7 @@ struct ipa_active_clients {
struct ipa_wakelock_ref_cnt {
spinlock_t spinlock;
u32 cnt;
+ bool wakelock_acquired;
};
struct ipa_tag_completion {