msm: audio: qdsp6v2: Fix for enabling dolby aac decoder.

Previously, dolby aac decoder was enabled by disabling
legacy aac decoder. This change should correct it.

Change-Id: I0b46a444701585921c546c6668a0bc0c8e63ec50
Signed-off-by: Bharath Ramachandramurthy <bramacha@codeaurora.org>
diff --git a/arch/arm/mach-msm/qdsp6v2/audio_multi_aac.c b/arch/arm/mach-msm/qdsp6v2/audio_multi_aac.c
index 169e348..75af881 100644
--- a/arch/arm/mach-msm/qdsp6v2/audio_multi_aac.c
+++ b/arch/arm/mach-msm/qdsp6v2/audio_multi_aac.c
@@ -117,7 +117,7 @@
 			aac_cfg.sample_rate);
 
 		/* Configure Media format block */
-		rc = q6asm_media_format_block_aac(audio->ac, &aac_cfg);
+		rc = q6asm_media_format_block_multi_aac(audio->ac, &aac_cfg);
 		if (rc < 0) {
 			pr_err("cmd media format block failed\n");
 			break;
@@ -249,7 +249,7 @@
 	/* open in T/NT mode */
 	if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) {
 		rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM,
-					   FORMAT_MPEG4_AAC);
+					   FORMAT_MPEG4_MULTI_AAC);
 		if (rc < 0) {
 			pr_err("NT mode Open failed rc=%d\n", rc);
 			rc = -ENODEV;
@@ -261,7 +261,7 @@
 		audio->buf_cfg.meta_info_enable = 0x01;
 	} else if ((file->f_mode & FMODE_WRITE) &&
 			!(file->f_mode & FMODE_READ)) {
-		rc = q6asm_open_write(audio->ac, FORMAT_MPEG4_AAC);
+		rc = q6asm_open_write(audio->ac, FORMAT_MPEG4_MULTI_AAC);
 		if (rc < 0) {
 			pr_err("T mode Open failed rc=%d\n", rc);
 			rc = -ENODEV;
diff --git a/include/sound/apr_audio.h b/include/sound/apr_audio.h
index 0c109ae..d2a7dba 100644
--- a/include/sound/apr_audio.h
+++ b/include/sound/apr_audio.h
@@ -847,7 +847,7 @@
 #define ADPCM        0x00010BE7
 #define YADPCM       0x00010BE8
 #define MP3          0x00010BE9
-#define MPEG4_AAC    0x00010D86
+#define MPEG4_AAC    0x00010BEA
 #define AMRNB_FS     0x00010BEB
 #define V13K_FS      0x00010BED
 #define EVRC_FS      0x00010BEE
@@ -862,6 +862,7 @@
 #define G711_ALAW_FS 0x00010BF7
 #define G711_MLAW_FS 0x00010BF8
 #define G711_PCM_FS  0x00010BF9
+#define MPEG4_MULTI_AAC 0x00010D86
 
 #define ASM_ENCDEC_SBCRATE         0x00010C13
 #define ASM_ENCDEC_IMMDIATE_DECODE 0x00010C14
diff --git a/include/sound/q6asm.h b/include/sound/q6asm.h
index bad9be7..fc7e521 100644
--- a/include/sound/q6asm.h
+++ b/include/sound/q6asm.h
@@ -38,6 +38,7 @@
 #define FORMAT_WMA_V10PRO   0x000e
 #define FORMAT_WMA_V9	    0x000f
 #define FORMAT_AMR_WB_PLUS  0x0010
+#define FORMAT_MPEG4_MULTI_AAC 0x0011
 
 #define ENCDEC_SBCBITRATE   0x0001
 #define ENCDEC_IMMEDIATE_DECODE 0x0002
@@ -241,6 +242,9 @@
 int q6asm_media_format_block_aac(struct audio_client *ac,
 			struct asm_aac_cfg *cfg);
 
+int q6asm_media_format_block_multi_aac(struct audio_client *ac,
+			struct asm_aac_cfg *cfg);
+
 int q6asm_media_format_block_wma(struct audio_client *ac,
 			void *cfg);
 
diff --git a/sound/soc/msm/qdsp6/q6asm.c b/sound/soc/msm/qdsp6/q6asm.c
index 052286b..1272949 100644
--- a/sound/soc/msm/qdsp6/q6asm.c
+++ b/sound/soc/msm/qdsp6/q6asm.c
@@ -1133,6 +1133,9 @@
 	case FORMAT_MPEG4_AAC:
 		open.format = MPEG4_AAC;
 		break;
+	case FORMAT_MPEG4_MULTI_AAC:
+		open.format = MPEG4_MULTI_AAC;
+		break;
 	case FORMAT_WMA_V9:
 		open.format = WMA_V9;
 		break;
@@ -1192,6 +1195,9 @@
 	case FORMAT_MPEG4_AAC:
 		open.write_format = MPEG4_AAC;
 		break;
+	case FORMAT_MPEG4_MULTI_AAC:
+		open.write_format = MPEG4_MULTI_AAC;
+		break;
 	case FORMAT_WMA_V9:
 		open.write_format = WMA_V9;
 		break;
@@ -1675,6 +1681,56 @@
 	return -EINVAL;
 }
 
+
+int q6asm_media_format_block_multi_aac(struct audio_client *ac,
+				struct asm_aac_cfg *cfg)
+{
+	struct asm_stream_media_format_update fmt;
+	int rc = 0;
+
+	pr_debug("%s:session[%d]rate[%d]ch[%d]\n", __func__, ac->session,
+		cfg->sample_rate, cfg->ch_cfg);
+
+	q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE);
+
+	fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FORMAT_UPDATE;
+
+	fmt.format = MPEG4_MULTI_AAC;
+	fmt.cfg_size = sizeof(struct asm_aac_cfg);
+	fmt.write_cfg.aac_cfg.format = cfg->format;
+	fmt.write_cfg.aac_cfg.aot = cfg->aot;
+	fmt.write_cfg.aac_cfg.ep_config = cfg->ep_config;
+	fmt.write_cfg.aac_cfg.section_data_resilience =
+					cfg->section_data_resilience;
+	fmt.write_cfg.aac_cfg.scalefactor_data_resilience =
+					cfg->scalefactor_data_resilience;
+	fmt.write_cfg.aac_cfg.spectral_data_resilience =
+					cfg->spectral_data_resilience;
+	fmt.write_cfg.aac_cfg.ch_cfg = cfg->ch_cfg;
+	fmt.write_cfg.aac_cfg.sample_rate = cfg->sample_rate;
+	pr_info("%s:format=%x cfg_size=%d aac-cfg=%x aot=%d ch=%d sr=%d\n",
+			__func__, fmt.format, fmt.cfg_size,
+			fmt.write_cfg.aac_cfg.format,
+			fmt.write_cfg.aac_cfg.aot,
+			fmt.write_cfg.aac_cfg.ch_cfg,
+			fmt.write_cfg.aac_cfg.sample_rate);
+	rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt);
+	if (rc < 0) {
+		pr_err("%s:Comamnd open failed\n", __func__);
+		goto fail_cmd;
+	}
+	rc = wait_event_timeout(ac->cmd_wait,
+			(atomic_read(&ac->cmd_state) == 0), 5*HZ);
+	if (!rc) {
+		pr_err("%s:timeout. waited for FORMAT_UPDATE\n", __func__);
+		goto fail_cmd;
+	}
+	return 0;
+fail_cmd:
+	return -EINVAL;
+}
+
+
 int q6asm_media_format_block_wma(struct audio_client *ac,
 				void *cfg)
 {