Merge "asoc: Fix error in finding default routing topology by path"
diff --git a/asoc/Android.mk b/asoc/Android.mk
index b2e3fa8..867379b 100644
--- a/asoc/Android.mk
+++ b/asoc/Android.mk
@@ -56,7 +56,7 @@
 LOCAL_MODULE_PATH         := $(KERNEL_MODULES_OUT)
 include $(DLKM_DIR)/AndroidKernelModule.mk
 ###########################################################
-ifeq ($(call is-board-platform-in-list,sdm670 qcs605),true)
+ifeq ($(call is-board-platform-in-list,msm8953 msm8937 sdm670 qcs605),true)
 include $(CLEAR_VARS)
 LOCAL_MODULE              := $(AUDIO_CHIPSET)_cpe_lsm.ko
 LOCAL_MODULE_KBUILD_NAME  := cpe_lsm_dlkm.ko
@@ -74,7 +74,7 @@
 LOCAL_MODULE_PATH         := $(KERNEL_MODULES_OUT)
 include $(DLKM_DIR)/AndroidKernelModule.mk
 ###########################################################
-ifeq ($(call is-board-platform-in-list,msm8953),true)
+ifeq ($(call is-board-platform-in-list,msm8953 msm8937),true)
 include $(CLEAR_VARS)
 LOCAL_MODULE              := $(AUDIO_CHIPSET)_machine_ext_$(TARGET).ko
 LOCAL_MODULE_KBUILD_NAME  := machine_ext_dlkm.ko
diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c
index c877c3e..cf4b5c0 100644
--- a/asoc/msm-pcm-routing-v2.c
+++ b/asoc/msm-pcm-routing-v2.c
@@ -1622,7 +1622,7 @@
 			path_type = ADM_PATH_PLAYBACK;
 	} else {
 		session_type = SESSION_TYPE_TX;
-		if (passthr_mode != LEGACY_PCM)
+		if ((passthr_mode != LEGACY_PCM) && (passthr_mode != LISTEN))
 			path_type = ADM_PATH_COMPRESSED_TX;
 		else
 			path_type = ADM_PATH_LIVE_REC;
diff --git a/config/sdm450auto.conf b/config/sdm450auto.conf
index 6d1734f..0d367ae 100644
--- a/config/sdm450auto.conf
+++ b/config/sdm450auto.conf
@@ -5,6 +5,7 @@
 CONFIG_SND_SOC_WSA881X=m
 CONFIG_SND_SOC_WSA881X_ANALOG=m
 CONFIG_SND_SOC_WCD_CPE=m
+CONFIG_SND_SOC_CPE=m
 CONFIG_SND_SOC_WCD9335=m
 CONFIG_MSM_QDSP6V2_CODECS=m
 CONFIG_MSM_ULTRASOUND=m
@@ -32,6 +33,7 @@
 CONFIG_DTS_SRS_TM=m
 CONFIG_SND_SOC_MSM_STUB=m
 CONFIG_MSM_AVTIMER=m
+CONFIG_AVTIMER_LEGACY=m
 CONFIG_SND_SOC_SDM660_CDC=m
 CONFIG_SND_SOC_ANALOG_CDC=m
 CONFIG_SND_SOC_DIGITAL_CDC_LEGACY=m
diff --git a/config/sdm450autoconf.h b/config/sdm450autoconf.h
index 59a96f0..1aca114 100644
--- a/config/sdm450autoconf.h
+++ b/config/sdm450autoconf.h
@@ -15,6 +15,7 @@
 #define CONFIG_AUDIO_EXT_CLK 1
 #define CONFIG_SND_SOC_WCD9XXX_V2 1
 #define CONFIG_SND_SOC_WCD_CPE 1
+#define CONFIG_SND_SOC_CPE 1
 #define CONFIG_SND_SOC_WCD_MBHC 1
 #define CONFIG_SND_SOC_WSA881X 1
 #define CONFIG_SND_SOC_WSA881X_ANALOG 1
@@ -45,6 +46,7 @@
 #define CONFIG_MSM_CDC_PINCTRL 1
 #define CONFIG_SND_SOC_MSM_STUB 1
 #define CONFIG_MSM_AVTIMER 1
+#define CONFIG_AVTIMER_LEGACY 1
 #define CONFIG_SND_SOC_EXT_CODEC 1
 #define CONFIG_SND_SOC_INT_CODEC 1
 #define CONFIG_SND_SOC_SDM660_CDC 1
diff --git a/dsp/avtimer.c b/dsp/avtimer.c
index b6833ed..db9eb9a 100644
--- a/dsp/avtimer.c
+++ b/dsp/avtimer.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2015, 2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2015, 2017-2018 The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -25,6 +25,9 @@
 #include <linux/of.h>
 #include <linux/wait.h>
 #include <linux/sched.h>
+#if IS_ENABLED(CONFIG_AVTIMER_LEGACY)
+#include <media/msmb_isp.h>
+#endif
 #include <ipc/apr.h>
 #include <dsp/q6core.h>
 
@@ -70,6 +73,7 @@
 };
 
 static struct avtimer_t avtimer;
+static void avcs_set_isp_fptr(bool enable);
 
 static int32_t aprv2_core_fn_q(struct apr_client_data *data, void *priv)
 {
@@ -313,6 +317,29 @@
 }
 EXPORT_SYMBOL(avcs_core_query_timer);
 
+#if IS_ENABLED(CONFIG_AVTIMER_LEGACY)
+static void avcs_set_isp_fptr(bool enable)
+{
+	struct avtimer_fptr_t av_fptr;
+
+	if (enable) {
+		av_fptr.fptr_avtimer_open = avcs_core_open;
+		av_fptr.fptr_avtimer_enable = avcs_core_disable_power_collapse;
+		av_fptr.fptr_avtimer_get_time = avcs_core_query_timer;
+		msm_isp_set_avtimer_fptr(av_fptr);
+	} else {
+		av_fptr.fptr_avtimer_open = NULL;
+		av_fptr.fptr_avtimer_enable = NULL;
+		av_fptr.fptr_avtimer_get_time = NULL;
+		msm_isp_set_avtimer_fptr(av_fptr);
+	}
+}
+#else
+static void avcs_set_isp_fptr(bool enable)
+{
+}
+#endif
+
 static int avtimer_open(struct inode *inode, struct file *file)
 {
 	return avcs_core_disable_power_collapse(1);
@@ -469,6 +496,8 @@
 	else
 		avtimer.clk_mult = clk_mult_val;
 
+	avcs_set_isp_fptr(true);
+
 	pr_debug("%s: avtimer.clk_div = %d, avtimer.clk_mult = %d\n",
 		 __func__, avtimer.clk_div, avtimer.clk_mult);
 	return 0;
@@ -500,6 +529,7 @@
 	cdev_del(&avtimer.myc);
 	class_destroy(avtimer.avtimer_class);
 	unregister_chrdev_region(MKDEV(major, 0), 1);
+	avcs_set_isp_fptr(false);
 
 	return 0;
 }
diff --git a/dsp/q6asm.c b/dsp/q6asm.c
index 911a2dd..9fb5d6b 100644
--- a/dsp/q6asm.c
+++ b/dsp/q6asm.c
@@ -284,6 +284,11 @@
 		pr_err("%s: out_buffer is null\n", __func__);
 		return 0;
 	}
+	if (count < OUT_BUFFER_SIZE) {
+		pr_err("%s: read size %d exceeds buf size %zd\n", __func__,
+						OUT_BUFFER_SIZE, count);
+		return 0;
+	}
 	snprintf(out_buffer, OUT_BUFFER_SIZE, "%ld,%ld,%ld,%ld,%ld,%ld,",
 		out_cold_tv.tv_sec, out_cold_tv.tv_usec, out_warm_tv.tv_sec,
 		out_warm_tv.tv_usec, out_cont_tv.tv_sec, out_cont_tv.tv_usec);
@@ -336,6 +341,11 @@
 		pr_err("%s: in_buffer is null\n", __func__);
 		return 0;
 	}
+	if (count < IN_BUFFER_SIZE) {
+		pr_err("%s: read size %d exceeds buf size %zd\n", __func__,
+						IN_BUFFER_SIZE, count);
+		return 0;
+	}
 	snprintf(in_buffer, IN_BUFFER_SIZE, "%ld,%ld,",
 				in_cont_tv.tv_sec, in_cont_tv.tv_usec);
 	return  simple_read_from_buffer(buf, IN_BUFFER_SIZE, ppos,
@@ -8300,8 +8310,10 @@
 		list_for_each_safe(ptr, next, &ac->port[OUT].mem_map_handle) {
 			buf_node = list_entry(ptr, struct asm_buffer_node,
 					list);
-			if (buf_node->buf_phys_addr == ab->phys)
+			if (buf_node->buf_phys_addr == ab->phys) {
 				read.mem_map_handle = buf_node->mmap_hdl;
+				break;
+			}
 		}
 		dev_vdbg(ac->dev, "memory_map handle in q6asm_read: [%0x]:",
 				read.mem_map_handle);