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;
 }