ASoC: wcd934x: skip mutex lock for WDSP boot timeout debug dump

In the case of WDSP boot timeout, api_mutex and ssr_mutex have already
been acquired. There is no need to do mutex lock again during debug dump.
Check the signal enum to see if it's the internal WDSP boot timeout case.

Change-Id: I6fe5e77b1bff72ed5ad463bb1df76c6b02c84c92
Signed-off-by: Xiaojun Sang <xsang@codeaurora.org>
diff --git a/asoc/codecs/wcd-dsp-mgr.c b/asoc/codecs/wcd-dsp-mgr.c
index 9e65deb..50716e4 100644
--- a/asoc/codecs/wcd-dsp-mgr.c
+++ b/asoc/codecs/wcd-dsp-mgr.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-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
@@ -839,21 +839,20 @@
 }
 
 #ifdef CONFIG_DEBUG_FS
-static int wdsp_debug_dump_handler(struct wdsp_mgr_priv *wdsp, void *arg)
+static int __wdsp_dbg_dump_locked(struct wdsp_mgr_priv *wdsp, void *arg)
 {
 	struct wdsp_err_signal_arg *err_data;
 	int ret = 0;
 
-	WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex);
 	/* If there is no SSR, set the SSR type to collect ramdumps */
 	if (wdsp->ssr_type == WDSP_SSR_TYPE_NO_SSR) {
 		wdsp->ssr_type = WDSP_SSR_TYPE_WDSP_DOWN;
 	} else {
 		WDSP_DBG(wdsp, "SSR handling is running, skip debug ramdump");
 		ret = 0;
-		WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex);
 		goto done;
 	}
+
 	if (arg) {
 		err_data = (struct wdsp_err_signal_arg *) arg;
 		memcpy(&wdsp->dump_data.err_data, err_data,
@@ -861,16 +860,29 @@
 	} else {
 		WDSP_DBG(wdsp, "Invalid input, arg is NULL");
 		ret = -EINVAL;
-		WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex);
 		goto done;
 	}
 	wdsp_collect_ramdumps(wdsp);
 	wdsp->ssr_type = WDSP_SSR_TYPE_NO_SSR;
-	WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex);
 done:
 	return ret;
 }
+static int wdsp_debug_dump_handler(struct wdsp_mgr_priv *wdsp, void *arg)
+{
+	int ret = 0;
+
+	WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex);
+	ret = __wdsp_dbg_dump_locked(wdsp, arg);
+	WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex);
+
+	return ret;
+}
 #else
+static int __wdsp_dbg_dump_locked(struct wdsp_mgr_priv *wdsp, void *arg)
+{
+	return 0;
+}
+
 static int wdsp_debug_dump_handler(struct wdsp_mgr_priv *wdsp, void *arg)
 {
 	return 0;
@@ -887,7 +899,13 @@
 		return -EINVAL;
 
 	wdsp = dev_get_drvdata(wdsp_dev);
+
+#ifdef CONFIG_DEBUG_FS
+	if (signal != WDSP_DEBUG_DUMP_INTERNAL)
+		WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->api_mutex);
+#else
 	WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->api_mutex);
+#endif
 
 	WDSP_DBG(wdsp, "Raised signal %d", signal);
 
@@ -908,6 +926,9 @@
 	case WDSP_DEBUG_DUMP:
 		ret = wdsp_debug_dump_handler(wdsp, arg);
 		break;
+	case WDSP_DEBUG_DUMP_INTERNAL:
+		ret = __wdsp_dbg_dump_locked(wdsp, arg);
+		break;
 	default:
 		ret = -EINVAL;
 		break;
@@ -916,7 +937,13 @@
 	if (ret < 0)
 		WDSP_ERR(wdsp, "handling signal %d failed with error %d",
 			 signal, ret);
+
+#ifdef CONFIG_DEBUG_FS
+	if (signal != WDSP_DEBUG_DUMP_INTERNAL)
+		WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->api_mutex);
+#else
 	WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->api_mutex);
+#endif
 
 	return ret;
 }
diff --git a/asoc/codecs/wcd934x/wcd934x-dsp-cntl.c b/asoc/codecs/wcd934x/wcd934x-dsp-cntl.c
index 58987ad..662f484 100644
--- a/asoc/codecs/wcd934x/wcd934x-dsp-cntl.c
+++ b/asoc/codecs/wcd934x/wcd934x-dsp-cntl.c
@@ -101,6 +101,7 @@
 	WCD934X_CPE_SS_SOC_SW_COLLAPSE_CTL,
 	WCD934X_CPE_SS_MAD_CTL,
 	WCD934X_CPE_SS_CPAR_CTL,
+	WCD934X_CPE_SS_CPAR_CFG,
 	WCD934X_CPE_SS_WDOG_CFG,
 	WCD934X_CPE_SS_STATUS,
 	WCD934X_CPE_SS_SS_ERROR_INT_MASK_0A,
@@ -113,10 +114,12 @@
 	WCD934X_CPE_SS_SS_ERROR_INT_STATUS_1B,
 };
 
-static void wcd_cntl_collect_debug_dumps(struct wcd_dsp_cntl *cntl)
+static void wcd_cntl_collect_debug_dumps(struct wcd_dsp_cntl *cntl,
+					 bool internal)
 {
 	struct snd_soc_codec *codec = cntl->codec;
 	struct wdsp_err_signal_arg arg;
+	enum wdsp_signal signal;
 	int i;
 	u8 val;
 
@@ -146,8 +149,8 @@
 		arg.mem_dumps_enabled = cntl->ramdump_enable;
 		arg.remote_start_addr = WCD_934X_RAMDUMP_START_ADDR;
 		arg.dump_size = WCD_934X_RAMDUMP_SIZE;
-		cntl->m_ops->signal_handler(cntl->m_dev, WDSP_DEBUG_DUMP,
-					    &arg);
+		signal = internal ? WDSP_DEBUG_DUMP_INTERNAL : WDSP_DEBUG_DUMP;
+		cntl->m_ops->signal_handler(cntl->m_dev, signal, &arg);
 	}
 
 	/* Unmask the fatal irqs */
@@ -161,7 +164,8 @@
 #else
 #define WCD_CNTL_SET_ERR_IRQ_FLAG(cntl) 0
 #define WCD_CNTL_CLR_ERR_IRQ_FLAG(cntl) do {} while (0)
-static void wcd_cntl_collect_debug_dumps(struct wcd_dsp_cntl *cntl)
+static void wcd_cntl_collect_debug_dumps(struct wcd_dsp_cntl *cntl,
+					 bool internal)
 {
 }
 #endif
@@ -753,7 +757,7 @@
 	if (!ret) {
 		dev_err(codec->dev, "%s: WDSP boot timed out\n",
 			__func__);
-		wcd_cntl_collect_debug_dumps(cntl);
+		wcd_cntl_collect_debug_dumps(cntl, true);
 		ret = -ETIMEDOUT;
 		goto err_boot;
 	} else {
@@ -1041,7 +1045,7 @@
 	} else if (!strcmp(val, "DEBUG_DUMP")) {
 		dev_dbg(cntl->codec->dev,
 			"%s: Collect dumps for debug use\n", __func__);
-		wcd_cntl_collect_debug_dumps(cntl);
+		wcd_cntl_collect_debug_dumps(cntl, false);
 		goto done;
 	} else {
 		dev_err(cntl->codec->dev, "%s: Invalid value %s\n",