asoc: Support compressed capture from AFE interfaces

Support compressed IEC61937 audio capture from AFE interfaces
with variable data packet lengths.

Change-Id: Iffd5a06ed5fe1a96f34e225d54fab660b21d2a48
Signed-off-by: Ralf Herz <rherz@codeaurora.org>
diff --git a/asoc/msm-compress-q6-v2.c b/asoc/msm-compress-q6-v2.c
index c0d8614..6fb61da 100644
--- a/asoc/msm-compress-q6-v2.c
+++ b/asoc/msm-compress-q6-v2.c
@@ -540,7 +540,7 @@
 			__func__, ret);
 		return ret;
 	}
-	prtd->bytes_read += buffer_length;
+	prtd->bytes_read += buffer_length + prtd->ts_header_offset;
 	prtd->bytes_read_offset += buffer_length + prtd->ts_header_offset;
 	if (prtd->bytes_read_offset >= prtd->buffer_size)
 		prtd->bytes_read_offset -= prtd->buffer_size;
@@ -676,9 +676,8 @@
 		if (prtd->ts_header_offset) {
 			/* Update the header for received buffer */
 			buff_addr = prtd->buffer + prtd->byte_offset;
-			/* Write the length of the buffer */
-			*buff_addr = prtd->codec_param.buffer.fragment_size
-						 - prtd->ts_header_offset;
+			/* Write the actual length of the received buffer */
+			*buff_addr = payload[4];
 			buff_addr++;
 			/* Write the offset */
 			*buff_addr = prtd->ts_header_offset;
@@ -1457,28 +1456,54 @@
 		break;
 	}
 
-	pr_debug("%s: stream_id %d bits_per_sample %d\n",
-			__func__, ac->stream_id, bits_per_sample);
+	pr_debug("%s: stream_id %d bits_per_sample %d compr_passthr %d\n",
+			__func__, ac->stream_id, bits_per_sample,
+			prtd->compr_passthr);
 
-	if (prtd->codec_param.codec.flags & COMPRESSED_TIMESTAMP_FLAG) {
-		ret = q6asm_open_read_v4(prtd->audio_client, prtd->codec,
-			bits_per_sample, true, enc_cfg_id);
+	if (prtd->compr_passthr != LEGACY_PCM) {
+		ret = q6asm_open_read_compressed(prtd->audio_client,
+                                prtd->codec, prtd->compr_passthr);
+		if (ret < 0) {
+			pr_err("%s:ASM open read err[%d] for compr_type[%d]\n",
+					__func__, ret, prtd->compr_passthr);
+			return ret;
+		}
+
+		ret = msm_pcm_routing_reg_phy_compr_stream(
+				soc_prtd->dai_link->id,
+				ac->perf_mode,
+				prtd->session_id,
+				SNDRV_PCM_STREAM_CAPTURE,
+				prtd->compr_passthr);
+		if (ret) {
+			pr_err("%s: compr stream reg failed:%d\n",
+					__func__, ret);
+			return ret;
+		}
 	} else {
-		ret = q6asm_open_read_v4(prtd->audio_client, prtd->codec,
-			bits_per_sample, false, enc_cfg_id);
-	}
-	if (ret < 0) {
-		pr_err("%s: q6asm_open_read failed:%d\n", __func__, ret);
-		return ret;
-	}
+		if (prtd->codec_param.codec.flags & COMPRESSED_TIMESTAMP_FLAG) {
+			ret = q6asm_open_read_v4(prtd->audio_client,
+					prtd->codec,
+					bits_per_sample, true, enc_cfg_id);
+		} else {
+			ret = q6asm_open_read_v4(prtd->audio_client,
+					prtd->codec,
+					bits_per_sample, false, enc_cfg_id);
+		}
+		if (ret < 0) {
+			pr_err("%s: q6asm_open_read failed:%d\n",
+					__func__, ret);
+			return ret;
+		}
 
-	ret = msm_pcm_routing_reg_phy_stream(soc_prtd->dai_link->id,
-			ac->perf_mode,
-			prtd->session_id,
-			SNDRV_PCM_STREAM_CAPTURE);
-	if (ret) {
-		pr_err("%s: stream reg failed:%d\n", __func__, ret);
-		return ret;
+		ret = msm_pcm_routing_reg_phy_stream(soc_prtd->dai_link->id,
+				ac->perf_mode,
+				prtd->session_id,
+				SNDRV_PCM_STREAM_CAPTURE);
+		if (ret) {
+			pr_err("%s: stream reg failed:%d\n", __func__, ret);
+			return ret;
+		}
 	}
 
 	ret = q6asm_set_io_mode(ac, (COMPRESSED_STREAM_IO | ASYNC_IO_MODE));
@@ -1533,7 +1558,7 @@
 		ret = q6asm_enc_cfg_blk_custom(prtd->audio_client, prtd->sample_rate,
 			prtd->num_channels, prtd->codec,
 			(void *)&prtd->codec_param.codec.options.generic);
-	} else {
+	} else if (prtd->compr_passthr == LEGACY_PCM) {
 		ret = q6asm_enc_cfg_blk_pcm_format_support_v4(prtd->audio_client,
 					prtd->sample_rate, prtd->num_channels,
 					bits_per_sample, sample_word_size,