msm: Replace idle wakelocks with pm_qos

Idle wakelocks are being removed so replace them with pm_qos.
Since we don't know every driver's latency requirements we
maintain one-to-one compatabilty with the idle wakelock API by
replacing the wakelock with a pm_qos request of the correct
latency.

Once we determine the actual latency requirements of each driver
we can replace the latency used with the correct latency for the
device.

Change-Id: Icc40f1642218e0de8fc2f56eaf9e8f92914d142f
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
diff --git a/arch/arm/mach-msm/include/mach/camera.h b/arch/arm/mach-msm/include/mach/camera.h
index 47d9b5f..87e7de1 100644
--- a/arch/arm/mach-msm/include/mach/camera.h
+++ b/arch/arm/mach-msm/include/mach/camera.h
@@ -18,7 +18,7 @@
 #include <linux/poll.h>
 #include <linux/cdev.h>
 #include <linux/platform_device.h>
-#include <linux/wakelock.h>
+#include <linux/pm_qos.h>
 #include <linux/regulator/consumer.h>
 #include "linux/types.h"
 
@@ -414,7 +414,7 @@
 	struct msm_camvpe_fn vpefn;
 	struct msm_sensor_ctrl sctrl;
 	struct msm_strobe_flash_ctrl sfctrl;
-	struct wake_lock wake_lock;
+	struct pm_qos_request idle_pm_qos;
 	struct platform_device *pdev;
 	int16_t ignore_qcmd_type;
 	uint8_t ignore_qcmd;
diff --git a/arch/arm/mach-msm/qdsp5/audio_mvs.c b/arch/arm/mach-msm/qdsp5/audio_mvs.c
index 5ccd18b..9b524b4 100644
--- a/arch/arm/mach-msm/qdsp5/audio_mvs.c
+++ b/arch/arm/mach-msm/qdsp5/audio_mvs.c
@@ -20,8 +20,11 @@
 #include <linux/slab.h>
 #include <linux/uaccess.h>
 #include <linux/wakelock.h>
+#include <linux/pm_qos.h>
+
 #include <mach/debug_mm.h>
 #include <mach/msm_rpcrouter.h>
+#include <mach/cpuidle.h>
 
 #define MVS_PROG 0x30000014
 #define MVS_VERS 0x00030001
@@ -330,7 +333,7 @@
 	struct mutex out_lock;
 
 	struct wake_lock suspend_lock;
-	struct wake_lock idle_lock;
+	struct pm_qos_request pm_qos_req;
 };
 
 static struct audio_mvs_info_type audio_mvs_info;
@@ -691,7 +694,8 @@
 
 	/* Prevent sleep. */
 	wake_lock(&audio->suspend_lock);
-	wake_lock(&audio->idle_lock);
+	pm_qos_update_request(&audio->pm_qos_req,
+			      msm_cpuidle_get_deep_idle_latency());
 
 	/* Acquire MVS. */
 	memset(&acquire_msg, 0, sizeof(acquire_msg));
@@ -778,8 +782,8 @@
 	}
 
 	/* Allow sleep. */
+	pm_qos_update_request(&audio->pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	wake_unlock(&audio->suspend_lock);
-	wake_unlock(&audio->idle_lock);
 
 	return rc;
 }
@@ -1599,9 +1603,8 @@
 	wake_lock_init(&audio_mvs_info.suspend_lock,
 		       WAKE_LOCK_SUSPEND,
 		       "audio_mvs_suspend");
-	wake_lock_init(&audio_mvs_info.idle_lock,
-		       WAKE_LOCK_IDLE,
-		       "audio_mvs_idle");
+	pm_qos_add_request(&audio_mvs_info.pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+				PM_QOS_DEFAULT_VALUE);
 
 	audio_mvs_info.rpc_endpt = msm_rpc_connect_compatible(MVS_PROG,
 					MVS_VERS_COMP_VER2,
diff --git a/arch/arm/mach-msm/qdsp5/audio_out.c b/arch/arm/mach-msm/qdsp5/audio_out.c
index 91ce29d..8eaf829 100644
--- a/arch/arm/mach-msm/qdsp5/audio_out.c
+++ b/arch/arm/mach-msm/qdsp5/audio_out.c
@@ -28,12 +28,14 @@
 #include <linux/debugfs.h>
 #include <linux/delay.h>
 #include <linux/wakelock.h>
+#include <linux/pm_qos.h>
 
 #include <linux/msm_audio.h>
 
 #include <asm/atomic.h>
 #include <asm/ioctls.h>
 #include <mach/msm_adsp.h>
+#include <mach/cpuidle.h>
 
 #include "audmgr.h"
 
@@ -155,7 +157,7 @@
 	int stopped; /* set when stopped, cleared on flush */
 
 	struct wake_lock wakelock;
-	struct wake_lock idlelock;
+	struct pm_qos_request pm_qos_req;
 
 	audpp_cmd_cfg_object_params_volume vol_pan;
 };
@@ -204,13 +206,14 @@
 {
 	MM_DBG("\n"); /* Macro prints the file name and function */
 	wake_lock(&audio->wakelock);
-	wake_lock(&audio->idlelock);
+	pm_qos_update_request(&audio->pm_qos_req,
+			      msm_cpuidle_get_deep_idle_latency());
 }
 
 static void audio_allow_sleep(struct audio *audio)
 {
+	pm_qos_update_request(&audio->pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	wake_unlock(&audio->wakelock);
-	wake_unlock(&audio->idlelock);
 	MM_DBG("\n"); /* Macro prints the file name and function */
 }
 
@@ -1147,7 +1150,8 @@
 	spin_lock_init(&the_audio.dsp_lock);
 	init_waitqueue_head(&the_audio.wait);
 	wake_lock_init(&the_audio.wakelock, WAKE_LOCK_SUSPEND, "audio_pcm");
-	wake_lock_init(&the_audio.idlelock, WAKE_LOCK_IDLE, "audio_pcm_idle");
+	pm_qos_add_request(&the_audio.pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+				PM_QOS_DEFAULT_VALUE);
 	return (misc_register(&audio_misc) || misc_register(&audpp_misc));
 }
 
diff --git a/arch/arm/mach-msm/qdsp5v2/audio_mvs.c b/arch/arm/mach-msm/qdsp5v2/audio_mvs.c
index fae2401..99da836 100644
--- a/arch/arm/mach-msm/qdsp5v2/audio_mvs.c
+++ b/arch/arm/mach-msm/qdsp5v2/audio_mvs.c
@@ -20,7 +20,10 @@
 #include <linux/wakelock.h>
 #include <linux/msm_audio_mvs.h>
 #include <linux/slab.h>
+#include <linux/pm_qos.h>
+
 #include <mach/msm_rpcrouter.h>
+#include <mach/cpuidle.h>
 
 #define MVS_PROG 0x30000014
 #define MVS_VERS 0x00030001
@@ -326,7 +329,7 @@
 	struct mutex out_lock;
 
 	struct wake_lock suspend_lock;
-	struct wake_lock idle_lock;
+	struct pm_qos_request pm_qos_req;
 };
 
 static struct audio_mvs_info_type audio_mvs_info;
@@ -699,7 +702,8 @@
 
 	/* Prevent sleep. */
 	wake_lock(&audio->suspend_lock);
-	wake_lock(&audio->idle_lock);
+	pm_qos_update_request(&audio->pm_qos_req,
+			      msm_cpuidle_get_deep_idle_latency());
 
 	/* Acquire MVS. */
 	memset(&acquire_msg, 0, sizeof(acquire_msg));
@@ -789,8 +793,8 @@
 	}
 
 	/* Allow sleep. */
+	pm_qos_update_request(&audio->pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	wake_unlock(&audio->suspend_lock);
-	wake_unlock(&audio->idle_lock);
 
 	return rc;
 }
@@ -1677,9 +1681,8 @@
 	wake_lock_init(&audio_mvs_info.suspend_lock,
 		       WAKE_LOCK_SUSPEND,
 		       "audio_mvs_suspend");
-	wake_lock_init(&audio_mvs_info.idle_lock,
-		       WAKE_LOCK_IDLE,
-		       "audio_mvs_idle");
+	pm_qos_add_request(&audio_mvs_info.pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+				PM_QOS_DEFAULT_VALUE);
 
 	audio_mvs_info.rpc_endpt = msm_rpc_connect_compatible(MVS_PROG,
 					MVS_VERS_COMP_VER5,
diff --git a/arch/arm/mach-msm/qdsp5v2/audio_out.c b/arch/arm/mach-msm/qdsp5v2/audio_out.c
index 288a717..147ac77 100644
--- a/arch/arm/mach-msm/qdsp5v2/audio_out.c
+++ b/arch/arm/mach-msm/qdsp5v2/audio_out.c
@@ -29,9 +29,9 @@
 #include <linux/delay.h>
 #include <linux/wakelock.h>
 #include <linux/memory_alloc.h>
-
 #include <linux/msm_audio.h>
 #include <linux/android_pmem.h>
+#include <linux/pm_qos.h>
 
 #include <mach/msm_adsp.h>
 #include <mach/iommu.h>
@@ -42,7 +42,7 @@
 #include <mach/qdsp5v2/audpp.h>
 #include <mach/qdsp5v2/audio_dev_ctl.h>
 #include <mach/msm_memtypes.h>
-
+#include <mach/cpuidle.h>
 
 #include <mach/htc_pwrsink.h>
 #include <mach/debug_mm.h>
@@ -95,7 +95,7 @@
 	int voice_state;
 
 	struct wake_lock wakelock;
-	struct wake_lock idlelock;
+	struct pm_qos_request pm_qos_req;
 
 	struct audpp_cmd_cfg_object_params_volume vol_pan;
 };
@@ -148,13 +148,14 @@
 {
 	MM_DBG("\n"); /* Macro prints the file name and function */
 	wake_lock(&audio->wakelock);
-	wake_lock(&audio->idlelock);
+	pm_qos_update_request(&audio->pm_qos_req,
+			      msm_cpuidle_get_deep_idle_latency());
 }
 
 static void audio_allow_sleep(struct audio *audio)
 {
+	pm_qos_update_request(&audio->pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	wake_unlock(&audio->wakelock);
-	wake_unlock(&audio->idlelock);
 	MM_DBG("\n"); /* Macro prints the file name and function */
 }
 
@@ -721,7 +722,8 @@
 	spin_lock_init(&the_audio.dsp_lock);
 	init_waitqueue_head(&the_audio.wait);
 	wake_lock_init(&the_audio.wakelock, WAKE_LOCK_SUSPEND, "audio_pcm");
-	wake_lock_init(&the_audio.idlelock, WAKE_LOCK_IDLE, "audio_pcm_idle");
+	pm_qos_add_request(&the_audio.pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+				PM_QOS_DEFAULT_VALUE);
 	return misc_register(&audio_misc);
 }
 
diff --git a/arch/arm/mach-msm/qdsp5v2/audpreproc.c b/arch/arm/mach-msm/qdsp5v2/audpreproc.c
index 09611a5..c9abdab 100644
--- a/arch/arm/mach-msm/qdsp5v2/audpreproc.c
+++ b/arch/arm/mach-msm/qdsp5v2/audpreproc.c
@@ -20,15 +20,18 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/wakelock.h>
+#include <linux/pm_qos.h>
+
 #include <mach/msm_adsp.h>
 #include <mach/qdsp5v2/audio_acdbi.h>
 #include <mach/qdsp5v2/audpreproc.h>
 #include <mach/debug_mm.h>
 #include <mach/qdsp5v2/qdsp5audpreprocmsg.h>
+#include <mach/cpuidle.h>
 
 static DEFINE_MUTEX(audpreproc_lock);
 static struct wake_lock audpre_wake_lock;
-static struct wake_lock audpre_idle_wake_lock;
+static struct pm_qos_request audpre_pm_qos_req;
 
 struct msm_adspenc_info {
 	const char *module_name;
@@ -106,12 +109,13 @@
 static inline void prevent_suspend(void)
 {
 	wake_lock(&audpre_wake_lock);
-	wake_lock(&audpre_idle_wake_lock);
+	pm_qos_update_request(&audpre_pm_qos_req,
+			      msm_cpuidle_get_deep_idle_latency());
 }
 static inline void allow_suspend(void)
 {
+	pm_qos_update_request(&audpre_pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	wake_unlock(&audpre_wake_lock);
-	wake_unlock(&audpre_idle_wake_lock);
 }
 
 /* DSP preproc event handler */
@@ -413,8 +417,8 @@
 
 	if (!wakelock_init) {
 		wake_lock_init(&audpre_wake_lock, WAKE_LOCK_SUSPEND, "audpre");
-		wake_lock_init(&audpre_idle_wake_lock, WAKE_LOCK_IDLE,
-				"audpre_idle");
+		pm_qos_add_request(&audpre_pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+					PM_QOS_DEFAULT_VALUE);
 		wakelock_init = 1;
 	}
 
diff --git a/arch/arm/mach-msm/qdsp5v2/snddev_icodec.c b/arch/arm/mach-msm/qdsp5v2/snddev_icodec.c
index dbeda82..80c9a01 100644
--- a/arch/arm/mach-msm/qdsp5v2/snddev_icodec.c
+++ b/arch/arm/mach-msm/qdsp5v2/snddev_icodec.c
@@ -16,6 +16,8 @@
 #include <linux/clk.h>
 #include <linux/err.h>
 #include <linux/debugfs.h>
+#include <linux/pm_qos.h>
+
 #include <asm/uaccess.h>
 #include <mach/qdsp5v2/snddev_icodec.h>
 #include <mach/qdsp5v2/audio_dev_ctl.h>
@@ -31,6 +33,7 @@
 #include <mach/rpc_pmapp.h>
 #include <mach/qdsp5v2/audio_acdb_def.h>
 #include <linux/slab.h>
+#include <mach/cpuidle.h>
 
 #define SMPS_AUDIO_PLAYBACK_ID	"AUPB"
 #define SMPS_AUDIO_RECORD_ID	"AURC"
@@ -159,8 +162,8 @@
 	struct clk *lpa_p_clk;
 	struct lpa_drv *lpa;
 
-	struct wake_lock rx_idlelock;
-	struct wake_lock tx_idlelock;
+	struct pm_qos_request rx_pm_qos_req;
+	struct pm_qos_request tx_pm_qos_req;
 };
 
 static struct snddev_icodec_drv_state snddev_icodec_drv;
@@ -173,7 +176,8 @@
 	struct snddev_icodec_drv_state *drv = &snddev_icodec_drv;
 	struct lpa_codec_config lpa_config;
 
-	wake_lock(&drv->rx_idlelock);
+	pm_qos_update_request(&drv->rx_pm_qos_req,
+			      msm_cpuidle_get_deep_idle_latency());
 
 	if ((icodec->data->acdb_id == ACDB_ID_HEADSET_SPKR_MONO) ||
 		(icodec->data->acdb_id == ACDB_ID_HEADSET_SPKR_STEREO)) {
@@ -250,7 +254,7 @@
 
 	icodec->enabled = 1;
 
-	wake_unlock(&drv->rx_idlelock);
+	pm_qos_update_request(&drv->rx_pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	return 0;
 
 error_afe:
@@ -268,7 +272,7 @@
 
 	MM_ERR("encounter error\n");
 
-	wake_unlock(&drv->rx_idlelock);
+	pm_qos_update_request(&drv->rx_pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	return -ENODEV;
 }
 
@@ -279,7 +283,8 @@
 	struct msm_afe_config afe_config;
 	struct snddev_icodec_drv_state *drv = &snddev_icodec_drv;;
 
-	wake_lock(&drv->tx_idlelock);
+	pm_qos_update_request(&drv->tx_pm_qos_req,
+			      msm_cpuidle_get_deep_idle_latency());
 
 	/* Vote for PWM mode*/
 	err = pmapp_smps_mode_vote(SMPS_AUDIO_RECORD_ID,
@@ -332,7 +337,7 @@
 
 	icodec->enabled = 1;
 
-	wake_unlock(&drv->tx_idlelock);
+	pm_qos_update_request(&drv->tx_pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	return 0;
 
 error_afe:
@@ -354,7 +359,7 @@
 
 	MM_ERR("encounter error\n");
 
-	wake_unlock(&drv->tx_idlelock);
+	pm_qos_update_request(&drv->tx_pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	return -ENODEV;
 }
 
@@ -381,7 +386,8 @@
 	int err;
 	struct snddev_icodec_drv_state *drv = &snddev_icodec_drv;
 
-	wake_lock(&drv->rx_idlelock);
+	pm_qos_update_request(&drv->rx_pm_qos_req,
+			      msm_cpuidle_get_deep_idle_latency());
 
 	/* Remove the vote for SMPS mode*/
 	err = pmapp_smps_mode_vote(SMPS_AUDIO_PLAYBACK_ID,
@@ -419,7 +425,7 @@
 
 	icodec->enabled = 0;
 
-	wake_unlock(&drv->rx_idlelock);
+	pm_qos_update_request(&drv->rx_pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	return 0;
 }
 
@@ -428,7 +434,8 @@
 	struct snddev_icodec_drv_state *drv = &snddev_icodec_drv;
 	int i, err;
 
-	wake_lock(&drv->tx_idlelock);
+	pm_qos_update_request(&drv->tx_pm_qos_req,
+			      msm_cpuidle_get_deep_idle_latency());
 
 	/* Remove the vote for SMPS mode*/
 	err = pmapp_smps_mode_vote(SMPS_AUDIO_RECORD_ID,
@@ -460,7 +467,7 @@
 
 	icodec->enabled = 0;
 
-	wake_unlock(&drv->tx_idlelock);
+	pm_qos_update_request(&drv->tx_pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	return 0;
 }
 
@@ -1156,10 +1163,10 @@
 	icodec_drv->rx_active = 0;
 	icodec_drv->tx_active = 0;
 	icodec_drv->lpa = NULL;
-	wake_lock_init(&icodec_drv->tx_idlelock, WAKE_LOCK_IDLE,
-			"snddev_tx_idle");
-	wake_lock_init(&icodec_drv->rx_idlelock, WAKE_LOCK_IDLE,
-			"snddev_rx_idle");
+	pm_qos_add_request(&icodec_drv->tx_pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+				PM_QOS_DEFAULT_VALUE);
+	pm_qos_add_request(&icodec_drv->rx_pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+				PM_QOS_DEFAULT_VALUE);
 	return 0;
 
 error_lpa_p_clk:
diff --git a/arch/arm/mach-msm/qdsp6/audiov2/q6audio.c b/arch/arm/mach-msm/qdsp6/audiov2/q6audio.c
index f713e3d..af411f1 100644
--- a/arch/arm/mach-msm/qdsp6/audiov2/q6audio.c
+++ b/arch/arm/mach-msm/qdsp6/audiov2/q6audio.c
@@ -21,12 +21,14 @@
 #include <linux/wait.h>
 #include <linux/dma-mapping.h>
 #include <linux/clk.h>
-
 #include <linux/delay.h>
 #include <linux/wakelock.h>
 #include <linux/android_pmem.h>
 #include <linux/gpio.h>
+#include <linux/pm_qos.h>
+
 #include <mach/msm_qdsp6_audiov2.h>
+#include <mach/cpuidle.h>
 
 #include "../dal.h"
 #include "dal_audio.h"
@@ -69,7 +71,7 @@
 	},
 };
 
-static struct wake_lock idlelock;
+static struct pm_qos_request pm_qos_req;
 static int idlecount;
 static DEFINE_MUTEX(idlecount_lock);
 
@@ -77,7 +79,8 @@
 {
 	mutex_lock(&idlecount_lock);
 	if (++idlecount == 1)
-		wake_lock(&idlelock);
+		pm_qos_update_request(&pm_qos_req,
+				      msm_cpuidle_get_deep_idle_latency());
 	mutex_unlock(&idlecount_lock);
 }
 
@@ -85,7 +88,7 @@
 {
 	mutex_lock(&idlecount_lock);
 	if (--idlecount == 0)
-		wake_unlock(&idlelock);
+		pm_qos_update_request(&pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	mutex_unlock(&idlecount_lock);
 }
 
@@ -616,7 +619,8 @@
 	res = 0;
 	ac_control = ac;
 
-	wake_lock_init(&idlelock, WAKE_LOCK_IDLE, "audio_pcm_idle");
+	pm_qos_add_request(&pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+				PM_QOS_DEFAULT_VALUE);
 done:
 	if ((res < 0) && ac)
 		audio_client_free(ac);
diff --git a/arch/arm/mach-msm/qdsp6/msm_q6vdec.c b/arch/arm/mach-msm/qdsp6/msm_q6vdec.c
index c79f0c4..f285536 100644
--- a/arch/arm/mach-msm/qdsp6/msm_q6vdec.c
+++ b/arch/arm/mach-msm/qdsp6/msm_q6vdec.c
@@ -30,10 +30,13 @@
 #include <linux/spinlock.h>
 #include <linux/uaccess.h>
 #include <linux/wakelock.h>
+#include <linux/pm_qos.h>
 
 #include <linux/android_pmem.h>
 #include <linux/msm_q6vdec.h>
 
+#include <mach/cpuidle.h>
+
 #include "dal.h"
 
 #define DALDEVICEID_VDEC_DEVICE		0x02000026
@@ -257,13 +260,14 @@
 
 static int idlecount;
 static struct wake_lock wakelock;
-static struct wake_lock idlelock;
+static struct pm_qos_request pm_qos_req;
 
 static void prevent_sleep(void)
 {
 	mutex_lock(&idlecount_lock);
 	if (++idlecount == 1) {
-		wake_lock(&idlelock);
+		pm_qos_update_request(&pm_qos_req,
+				      msm_cpuidle_get_deep_idle_latency());
 		wake_lock(&wakelock);
 	}
 	mutex_unlock(&idlecount_lock);
@@ -273,8 +277,8 @@
 {
 	mutex_lock(&idlecount_lock);
 	if (--idlecount == 0) {
-		wake_unlock(&idlelock);
 		wake_unlock(&wakelock);
+		pm_qos_update_request(&pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	}
 	mutex_unlock(&idlecount_lock);
 }
@@ -1444,7 +1448,8 @@
 	struct device *class_dev;
 	int rc = 0;
 
-	wake_lock_init(&idlelock, WAKE_LOCK_IDLE, "vdec_idle");
+	pm_qos_add_request(&pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+				PM_QOS_DEFAULT_VALUE);
 	wake_lock_init(&wakelock, WAKE_LOCK_SUSPEND, "vdec_suspend");
 
 	rc = alloc_chrdev_region(&vdec_device_no, 0, 1, "vdec");
diff --git a/arch/arm/mach-msm/qdsp6/msm_q6venc.c b/arch/arm/mach-msm/qdsp6/msm_q6venc.c
index bd5d3f6..0917c70 100644
--- a/arch/arm/mach-msm/qdsp6/msm_q6venc.c
+++ b/arch/arm/mach-msm/qdsp6/msm_q6venc.c
@@ -24,6 +24,10 @@
 #include <linux/wakelock.h>
 #include <linux/android_pmem.h>
 #include <linux/msm_q6venc.h>
+#include <linux/pm_qos.h>
+
+#include <mach/cpuidle.h>
+
 #include "dal.h"
 
 #define DALDEVICEID_VENC_DEVICE         0x0200002D
@@ -142,13 +146,14 @@
 static DEFINE_MUTEX(idlecount_lock);
 static int idlecount;
 static struct wake_lock wakelock;
-static struct wake_lock idlelock;
+static struct pm_qos_request pm_qos_req;
 
 static void prevent_sleep(void)
 {
 	mutex_lock(&idlecount_lock);
 	if (++idlecount == 1) {
-		wake_lock(&idlelock);
+		pm_qos_update_request(&pm_qos_req,
+				      msm_cpuidle_get_deep_idle_latency());
 		wake_lock(&wakelock);
 	}
 	mutex_unlock(&idlecount_lock);
@@ -158,8 +163,8 @@
 {
 	mutex_lock(&idlecount_lock);
 	if (--idlecount == 0) {
-		wake_unlock(&idlelock);
 		wake_unlock(&wakelock);
+		pm_qos_update_request(&pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	}
 	mutex_unlock(&idlecount_lock);
 }
@@ -1130,7 +1135,8 @@
 {
 	int ret = 0;
 
-	wake_lock_init(&idlelock, WAKE_LOCK_IDLE, "venc_idle");
+	pm_qos_add_request(&pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+				PM_QOS_DEFAULT_VALUE);
 	wake_lock_init(&wakelock, WAKE_LOCK_SUSPEND, "venc_suspend");
 
 	venc_device_p = kzalloc(sizeof(struct venc_dev), GFP_KERNEL);
diff --git a/arch/arm/mach-msm/qdsp6/q6audio.c b/arch/arm/mach-msm/qdsp6/q6audio.c
index bf6f115..2d015fc 100644
--- a/arch/arm/mach-msm/qdsp6/q6audio.c
+++ b/arch/arm/mach-msm/qdsp6/q6audio.c
@@ -20,12 +20,12 @@
 #include <linux/wait.h>
 #include <linux/dma-mapping.h>
 #include <linux/clk.h>
-
 #include <linux/delay.h>
 #include <linux/wakelock.h>
 #include <linux/android_pmem.h>
 #include <linux/firmware.h>
 #include <linux/miscdevice.h>
+#include <linux/pm_qos.h>
 
 #include "dal.h"
 #include "dal_audio.h"
@@ -33,6 +33,7 @@
 #include "dal_acdb.h"
 #include "dal_adie.h"
 #include <mach/msm_qdsp6_audio.h>
+#include <mach/cpuidle.h>
 
 #include <linux/msm_audio_aac.h>
 
@@ -77,7 +78,7 @@
 };
 
 static struct wake_lock wakelock;
-static struct wake_lock idlelock;
+static struct pm_qos_request pm_qos_req;
 static int idlecount;
 static DEFINE_MUTEX(idlecount_lock);
 
@@ -86,7 +87,8 @@
 	mutex_lock(&idlecount_lock);
 	if (++idlecount == 1) {
 		wake_lock(&wakelock);
-		wake_lock(&idlelock);
+		pm_qos_update_request(&pm_qos_req,
+				      msm_cpuidle_get_deep_idle_latency());
 	}
 	mutex_unlock(&idlecount_lock);
 }
@@ -95,7 +97,7 @@
 {
 	mutex_lock(&idlecount_lock);
 	if (--idlecount == 0) {
-		wake_unlock(&idlelock);
+		pm_qos_update_request(&pm_qos_req, PM_QOS_DEFAULT_VALUE);
 		wake_unlock(&wakelock);
 	}
 	mutex_unlock(&idlecount_lock);
@@ -959,7 +961,8 @@
 	res = 0;
 	ac_control = ac;
 
-	wake_lock_init(&idlelock, WAKE_LOCK_IDLE, "audio_pcm_idle");
+	pm_qos_add_request(&pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+				PM_QOS_DEFAULT_VALUE);
 	wake_lock_init(&wakelock, WAKE_LOCK_SUSPEND, "audio_pcm_suspend");
 done:
 	if ((res < 0) && ac)
diff --git a/arch/arm/mach-msm/qdsp6v2/audio_mvs.c b/arch/arm/mach-msm/qdsp6v2/audio_mvs.c
index 6e7961c..d748304 100644
--- a/arch/arm/mach-msm/qdsp6v2/audio_mvs.c
+++ b/arch/arm/mach-msm/qdsp6v2/audio_mvs.c
@@ -22,7 +22,10 @@
 #include <linux/sched.h>
 #include <linux/spinlock.h>
 #include <linux/msm_audio_mvs.h>
+#include <linux/pm_qos.h>
+
 #include <mach/qdsp6v2/q6voice.h>
+#include <mach/cpuidle.h>
 
 /* Each buffer is 20 ms, queue holds 200 ms of data. */
 #define MVS_MAX_Q_LEN 10
@@ -65,7 +68,7 @@
 	spinlock_t dsp_lock;
 
 	struct wake_lock suspend_lock;
-	struct wake_lock idle_lock;
+	struct pm_qos_request pm_qos_req;
 
 	void *memory_chunk;
 };
@@ -712,7 +715,8 @@
 
 	/* Prevent sleep. */
 	wake_lock(&audio->suspend_lock);
-	wake_lock(&audio->idle_lock);
+	pm_qos_update_request(&audio->pm_qos_req,
+			msm_cpuidle_get_deep_idle_latency());
 
 	rc = voice_set_voc_path_full(1);
 
@@ -747,8 +751,8 @@
 	audio->state = AUDIO_MVS_STOPPED;
 
 	/* Allow sleep. */
+	pm_qos_update_request(&audio->pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	wake_unlock(&audio->suspend_lock);
-	wake_unlock(&audio->idle_lock);
 
 	return rc;
 }
@@ -1145,9 +1149,8 @@
 	wake_lock_init(&audio_mvs_info.suspend_lock,
 		       WAKE_LOCK_SUSPEND,
 		       "audio_mvs_suspend");
-	wake_lock_init(&audio_mvs_info.idle_lock,
-		       WAKE_LOCK_IDLE,
-		       "audio_mvs_idle");
+	pm_qos_add_request(&audio_mvs_info.pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+				PM_QOS_DEFAULT_VALUE);
 
 	rc = misc_register(&audio_mvs_misc);
 
diff --git a/arch/arm/mach-msm/qdsp6v2/pcm_in.c b/arch/arm/mach-msm/qdsp6v2/pcm_in.c
index 667628c..620c1ee 100644
--- a/arch/arm/mach-msm/qdsp6v2/pcm_in.c
+++ b/arch/arm/mach-msm/qdsp6v2/pcm_in.c
@@ -24,12 +24,15 @@
 #include <linux/slab.h>
 #include <linux/wait.h>
 #include <linux/msm_audio.h>
+#include <linux/pm_qos.h>
+
 #include <asm/atomic.h>
 #include <mach/debug_mm.h>
 #include <mach/qdsp6v2/audio_dev_ctl.h>
 #include <sound/q6asm.h>
 #include <sound/apr_audio.h>
 #include <linux/wakelock.h>
+#include <mach/cpuidle.h>
 
 #define MAX_BUF 4
 #define BUFSZ (480 * 8)
@@ -55,7 +58,7 @@
 	atomic_t in_opened;
 	atomic_t in_stopped;
 	struct wake_lock wakelock;
-	struct wake_lock idlelock;
+	struct pm_qos_request pm_qos_req;
 };
 
 static void pcm_in_get_dsp_buffers(struct pcm*,
@@ -84,14 +87,15 @@
 {
 	pr_debug("%s:\n", __func__);
 	wake_lock(&audio->wakelock);
-	wake_lock(&audio->idlelock);
+	pm_qos_update_request(&audio->pm_qos_req,
+			      msm_cpuidle_get_deep_idle_latency());
 }
 
 static void pcm_in_allow_sleep(struct pcm *audio)
 {
 	pr_debug("%s:\n", __func__);
+	pm_qos_update_request(&audio->pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	wake_unlock(&audio->wakelock);
-	wake_unlock(&audio->idlelock);
 }
 
 static void pcm_in_get_dsp_buffers(struct pcm *pcm,
@@ -353,7 +357,8 @@
 	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);
+	pm_qos_add_request(&pcm->pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+				PM_QOS_DEFAULT_VALUE);
 
 	pcm->rec_mode = VOC_REC_NONE;
 
@@ -462,7 +467,7 @@
 	q6asm_audio_client_free(pcm->ac);
 	pcm_in_allow_sleep(pcm);
 	wake_lock_destroy(&pcm->wakelock);
-	wake_lock_destroy(&pcm->idlelock);
+	pm_qos_remove_request(&pcm->pm_qos_req);
 	kfree(pcm);
 	return rc;
 }
diff --git a/arch/arm/mach-msm/qdsp6v2/snddev_icodec.c b/arch/arm/mach-msm/qdsp6v2/snddev_icodec.c
index 5d10779..41ef88c 100644
--- a/arch/arm/mach-msm/qdsp6v2/snddev_icodec.c
+++ b/arch/arm/mach-msm/qdsp6v2/snddev_icodec.c
@@ -21,12 +21,16 @@
 #include <linux/slab.h>
 #include <linux/regulator/consumer.h>
 #include <linux/moduleparam.h>
+#include <linux/pm_qos.h>
+
 #include <asm/uaccess.h>
 #include <mach/qdsp6v2/audio_dev_ctl.h>
 #include <mach/qdsp6v2/audio_acdb.h>
 #include <mach/vreg.h>
 #include <mach/pmic.h>
 #include <mach/debug_mm.h>
+#include <mach/cpuidle.h>
+
 #include <sound/q6afe.h>
 #include <sound/apr_audio.h>
 #include "snddev_icodec.h"
@@ -66,8 +70,8 @@
 	struct clk *tx_osrclk;
 	struct clk *tx_bitclk;
 
-	struct wake_lock rx_idlelock;
-	struct wake_lock tx_idlelock;
+	struct pm_qos_request rx_pm_qos_req;
+	struct pm_qos_request tx_pm_qos_req;
 
 	/* handle to pmic8058 regulator smps4 */
 	struct regulator *snddev_vreg;
@@ -297,7 +301,8 @@
 	union afe_port_config afe_config;
 	struct snddev_icodec_drv_state *drv = &snddev_icodec_drv;
 
-	wake_lock(&drv->rx_idlelock);
+	pm_qos_update_request(&drv->rx_pm_qos_req,
+			      msm_cpuidle_get_deep_idle_latency());
 
 	if (drv->snddev_vreg) {
 		if (!strcmp(icodec->data->name, "headset_stereo_rx"))
@@ -402,7 +407,7 @@
 
 	icodec->enabled = 1;
 
-	wake_unlock(&drv->rx_idlelock);
+	pm_qos_update_request(&drv->rx_pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	return 0;
 
 error_pamp:
@@ -412,7 +417,7 @@
 
 	pr_err("%s: encounter error\n", __func__);
 
-	wake_unlock(&drv->rx_idlelock);
+	pm_qos_update_request(&drv->rx_pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	return -ENODEV;
 }
 
@@ -423,7 +428,8 @@
 	union afe_port_config afe_config;
 	struct snddev_icodec_drv_state *drv = &snddev_icodec_drv;;
 
-	wake_lock(&drv->tx_idlelock);
+	pm_qos_update_request(&drv->tx_pm_qos_req,
+			      msm_cpuidle_get_deep_idle_latency());
 
 	if (drv->snddev_vreg)
 		vreg_mode_vote(drv->snddev_vreg, 1, SNDDEV_HIGH_POWER_MODE);
@@ -509,7 +515,7 @@
 
 	icodec->enabled = 1;
 
-	wake_unlock(&drv->tx_idlelock);
+	pm_qos_update_request(&drv->tx_pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	return 0;
 
 error_invalid_freq:
@@ -519,7 +525,7 @@
 
 	pr_err("%s: encounter error\n", __func__);
 error_pamp:
-	wake_unlock(&drv->tx_idlelock);
+	pm_qos_update_request(&drv->tx_pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	return -ENODEV;
 }
 
@@ -551,7 +557,8 @@
 {
 	struct snddev_icodec_drv_state *drv = &snddev_icodec_drv;
 
-	wake_lock(&drv->rx_idlelock);
+	pm_qos_update_request(&drv->rx_pm_qos_req,
+			      msm_cpuidle_get_deep_idle_latency());
 
 	if (drv->snddev_vreg)
 		vreg_mode_vote(drv->snddev_vreg, 0, SNDDEV_HIGH_POWER_MODE);
@@ -580,7 +587,7 @@
 
 	icodec->enabled = 0;
 
-	wake_unlock(&drv->rx_idlelock);
+	pm_qos_update_request(&drv->rx_pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	return 0;
 }
 
@@ -588,7 +595,8 @@
 {
 	struct snddev_icodec_drv_state *drv = &snddev_icodec_drv;
 
-	wake_lock(&drv->tx_idlelock);
+	pm_qos_update_request(&drv->tx_pm_qos_req,
+			      msm_cpuidle_get_deep_idle_latency());
 
 	if (drv->snddev_vreg)
 		vreg_mode_vote(drv->snddev_vreg, 0, SNDDEV_HIGH_POWER_MODE);
@@ -614,7 +622,7 @@
 
 	icodec->enabled = 0;
 
-	wake_unlock(&drv->tx_idlelock);
+	pm_qos_update_request(&drv->tx_pm_qos_req, PM_QOS_DEFAULT_VALUE);
 	return 0;
 }
 
@@ -1075,10 +1083,10 @@
 	icodec_drv->tx_active = 0;
 	icodec_drv->snddev_vreg = vreg_init();
 
-	wake_lock_init(&icodec_drv->tx_idlelock, WAKE_LOCK_IDLE,
-			"snddev_tx_idle");
-	wake_lock_init(&icodec_drv->rx_idlelock, WAKE_LOCK_IDLE,
-			"snddev_rx_idle");
+	pm_qos_add_request(&icodec_drv->tx_pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+				PM_QOS_DEFAULT_VALUE);
+	pm_qos_add_request(&icodec_drv->rx_pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+				PM_QOS_DEFAULT_VALUE);
 	return 0;
 error_msm_icodec_gpio_driver:
 	platform_driver_unregister(&msm_cdcclk_ctl_driver);