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