msm: audio: qdsp6v2: Acquire wakelocks during record.
Acquire wakelocks during recording usecase to prevent apps
proc from freezing.
CRs-fixed: 303049
Signed-off-by: Bharath Ramachandramurthy <bramacha@codeaurora.org>
diff --git a/arch/arm/mach-msm/qdsp6v2/pcm_in.c b/arch/arm/mach-msm/qdsp6v2/pcm_in.c
index be1927d..1f20aa7 100644
--- a/arch/arm/mach-msm/qdsp6v2/pcm_in.c
+++ b/arch/arm/mach-msm/qdsp6v2/pcm_in.c
@@ -29,6 +29,7 @@
#include <mach/qdsp6v2/audio_dev_ctl.h>
#include <sound/q6asm.h>
#include <sound/apr_audio.h>
+#include <linux/wakelock.h>
#define MAX_BUF 4
#define BUFSZ (480 * 8)
@@ -53,6 +54,8 @@
atomic_t in_enabled;
atomic_t in_opened;
atomic_t in_stopped;
+ struct wake_lock wakelock;
+ struct wake_lock idlelock;
};
static void pcm_in_get_dsp_buffers(struct pcm*,
@@ -74,6 +77,19 @@
}
spin_unlock_irqrestore(&pcm->dsp_lock, flags);
}
+static void pcm_in_prevent_sleep(struct pcm *audio)
+{
+ pr_debug("%s:\n", __func__);
+ wake_lock(&audio->wakelock);
+ wake_lock(&audio->idlelock);
+}
+
+static void pcm_in_allow_sleep(struct pcm *audio)
+{
+ pr_debug("%s:\n", __func__);
+ wake_unlock(&audio->wakelock);
+ wake_unlock(&audio->idlelock);
+}
static void pcm_in_get_dsp_buffers(struct pcm *pcm,
uint32_t token, uint32_t *payload)
@@ -169,7 +185,7 @@
rc = -EFAULT;
break;
}
-
+ pcm_in_prevent_sleep(pcm);
atomic_set(&pcm->in_enabled, 1);
while (cnt++ < pcm->buffer_count)
@@ -298,6 +314,7 @@
{
struct pcm *pcm;
int rc = 0;
+ char name[24];
pcm = kzalloc(sizeof(struct pcm), GFP_KERNEL);
if (!pcm)
@@ -330,6 +347,10 @@
atomic_set(&pcm->in_enabled, 0);
atomic_set(&pcm->in_count, 0);
atomic_set(&pcm->in_opened, 1);
+ snprintf(name, sizeof name, "pcm_in_%x", pcm->ac->session);
+ wake_lock_init(&pcm->wakelock, WAKE_LOCK_SUSPEND, name);
+ snprintf(name, sizeof name, "pcm_in_idle_%x", pcm->ac->session);
+ wake_lock_init(&pcm->idlelock, WAKE_LOCK_IDLE, name);
pcm->rec_mode = VOC_REC_NONE;
@@ -436,6 +457,9 @@
rc = pcm_in_disable(pcm);
msm_clear_session_id(pcm->ac->session);
q6asm_audio_client_free(pcm->ac);
+ pcm_in_allow_sleep(pcm);
+ wake_lock_destroy(&pcm->wakelock);
+ wake_lock_destroy(&pcm->idlelock);
kfree(pcm);
return rc;
}