ASoC: wcd: set analog gain mode to manual when compander is off

If compander DRE isn't turned on, ensure analog gain mode
is set to manual mode. This also resolves low volume
at one channel.

CRs-Fixed: 2102126
Change-Id: Id29b7055fe4f7fa7b3853c26770df38d10539d8c
Signed-off-by: Vatsal Bucha <vbucha@codeaurora.org>
diff --git a/asoc/codecs/sdm660_cdc/msm-analog-cdc.c b/asoc/codecs/sdm660_cdc/msm-analog-cdc.c
index 623303c..c292b91 100644
--- a/asoc/codecs/sdm660_cdc/msm-analog-cdc.c
+++ b/asoc/codecs/sdm660_cdc/msm-analog-cdc.c
@@ -2620,6 +2620,18 @@
 	return 0;
 }
 
+static void set_compander_mode(void *handle, int val)
+{
+	struct sdm660_cdc_priv *handle_cdc = handle;
+	struct snd_soc_codec *codec = handle_cdc->codec;
+
+	if (get_codec_version(handle_cdc) >= DIANGU) {
+		snd_soc_update_bits(codec,
+				    MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC,
+				    0x08, val);
+	};
+}
+
 static void update_clkdiv(void *handle, int val)
 {
 	struct sdm660_cdc_priv *handle_cdc = handle;
@@ -4653,6 +4665,7 @@
 	BLOCKING_INIT_NOTIFIER_HEAD(&sdm660_cdc->notifier_mbhc);
 
 	sdm660_cdc->dig_plat_data.handle = (void *) sdm660_cdc;
+	sdm660_cdc->dig_plat_data.set_compander_mode = set_compander_mode;
 	sdm660_cdc->dig_plat_data.update_clkdiv = update_clkdiv;
 	sdm660_cdc->dig_plat_data.get_cdc_version = get_cdc_version;
 	sdm660_cdc->dig_plat_data.register_notifier =
diff --git a/asoc/codecs/sdm660_cdc/msm-analog-cdc.h b/asoc/codecs/sdm660_cdc/msm-analog-cdc.h
index 9591487..3ee3dee 100644
--- a/asoc/codecs/sdm660_cdc/msm-analog-cdc.h
+++ b/asoc/codecs/sdm660_cdc/msm-analog-cdc.h
@@ -168,6 +168,7 @@
 
 struct msm_dig_ctrl_platform_data {
 	void *handle;
+	void (*set_compander_mode)(void *handle, int val);
 	void (*update_clkdiv)(void *handle, int val);
 	int (*get_cdc_version)(void *handle);
 	int (*register_notifier)(void *handle,
diff --git a/asoc/codecs/sdm660_cdc/msm-digital-cdc.c b/asoc/codecs/sdm660_cdc/msm-digital-cdc.c
index 4ab2037..00a9699 100644
--- a/asoc/codecs/sdm660_cdc/msm-digital-cdc.c
+++ b/asoc/codecs/sdm660_cdc/msm-digital-cdc.c
@@ -231,6 +231,12 @@
 	}
 
 	if (SND_SOC_DAPM_EVENT_ON(event)) {
+		/* compander is not enabled */
+		if (!dig_cdc->comp_enabled[interp_n]) {
+			dig_cdc->set_compander_mode(dig_cdc->handle, 0x00);
+			return 0;
+		};
+		dig_cdc->set_compander_mode(dig_cdc->handle, 0x08);
 		/* Enable Compander Clock */
 		snd_soc_update_bits(codec,
 			MSM89XX_CDC_CORE_COMP0_B2_CTL, 0x0F, 0x09);
@@ -2080,6 +2086,7 @@
 			msm_dig_cdc->dig_base, &msm_digital_regmap_config);
 
 	msm_dig_cdc->update_clkdiv = pdata->update_clkdiv;
+	msm_dig_cdc->set_compander_mode = pdata->set_compander_mode;
 	msm_dig_cdc->get_cdc_version = pdata->get_cdc_version;
 	msm_dig_cdc->handle = pdata->handle;
 	msm_dig_cdc->register_notifier = pdata->register_notifier;
diff --git a/asoc/codecs/sdm660_cdc/msm-digital-cdc.h b/asoc/codecs/sdm660_cdc/msm-digital-cdc.h
index cb6cfe2..7abb204 100644
--- a/asoc/codecs/sdm660_cdc/msm-digital-cdc.h
+++ b/asoc/codecs/sdm660_cdc/msm-digital-cdc.h
@@ -55,6 +55,7 @@
 	u32 mute_mask;
 	int dapm_bias_off;
 	void *handle;
+	void (*set_compander_mode)(void *handle, int val);
 	void (*update_clkdiv)(void *handle, int val);
 	int (*get_cdc_version)(void *handle);
 	int (*register_notifier)(void *handle,
@@ -65,6 +66,7 @@
 
 struct dig_ctrl_platform_data {
 	void *handle;
+	void (*set_compander_mode)(void *handle, int val);
 	void (*update_clkdiv)(void *handle, int val);
 	int (*get_cdc_version)(void *handle);
 	int (*register_notifier)(void *handle,