Merge "ASoC: wcd9320: Fix DAPM timeout when accesing MAD calibration"
diff --git a/sound/soc/codecs/wcd9320.c b/sound/soc/codecs/wcd9320.c
index 5602dd1..e17925f 100644
--- a/sound/soc/codecs/wcd9320.c
+++ b/sound/soc/codecs/wcd9320.c
@@ -35,6 +35,9 @@
#include <linux/pm_runtime.h>
#include <linux/kernel.h>
#include <linux/gpio.h>
+#include <linux/pm_qos.h>
+#include <linux/pm.h>
+#include <mach/cpuidle.h>
#include "wcd9320.h"
#include "wcd9xxx-resmgr.h"
#include "wcd9xxx-common.h"
@@ -449,6 +452,7 @@
* end of impedance measurement
*/
struct list_head reg_save_restore;
+ struct pm_qos_request pm_qos_req;
};
static const u32 comp_shift[] = {
@@ -2675,8 +2679,15 @@
const struct firmware *fw;
struct mad_audio_cal *mad_cal;
const char *filename = TAIKO_MAD_AUDIO_FIRMWARE_PATH;
+ struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
pr_debug("%s: enter\n", __func__);
+ /* wakeup for codec calibration access */
+ pm_qos_add_request(&taiko->pm_qos_req,
+ PM_QOS_CPU_DMA_LATENCY,
+ PM_QOS_DEFAULT_VALUE);
+ pm_qos_update_request(&taiko->pm_qos_req,
+ msm_cpuidle_get_deep_idle_latency());
ret = request_firmware(&fw, filename, codec->dev);
if (ret != 0) {
pr_err("Failed to acquire MAD firwmare data %s: %d\n", filename,
@@ -2746,7 +2757,9 @@
release_firmware(fw);
pr_debug("%s: leave ret %d\n", __func__, ret);
-
+ pm_qos_update_request(&taiko->pm_qos_req,
+ PM_QOS_DEFAULT_VALUE);
+ pm_qos_remove_request(&taiko->pm_qos_req);
return ret;
}