Эх сурвалжийг харах

Merge de2c1d0cf9b2464337a39967c2882affea50b049 on remote branch

Change-Id: I89c6fedbc62fb91a3391311425bb7ea65035f551
Linux Build Service Account 2 жил өмнө
parent
commit
f7cc1c6b4a

+ 15 - 5
asoc/codecs/lpass-cdc/lpass-cdc-tx-macro.c

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/module.h>
@@ -612,11 +612,21 @@ static int lpass_cdc_tx_macro_tx_mixer_put(struct snd_kcontrol *kcontrol,
 		return -EINVAL;
 
 	if (enable) {
-		set_bit(dec_id, &tx_priv->active_ch_mask[dai_id]);
-		tx_priv->active_ch_cnt[dai_id]++;
+		if (test_bit(dec_id, &tx_priv->active_ch_mask[dai_id])) {
+			dev_err(component->dev, "%s: channel is already enabled, dec_id = %d, dai_id = %d\n",
+					__func__, dec_id, dai_id);
+		} else {
+			set_bit(dec_id, &tx_priv->active_ch_mask[dai_id]);
+			tx_priv->active_ch_cnt[dai_id]++;
+		}
 	} else {
-		tx_priv->active_ch_cnt[dai_id]--;
-		clear_bit(dec_id, &tx_priv->active_ch_mask[dai_id]);
+		if (!test_bit(dec_id, &tx_priv->active_ch_mask[dai_id])) {
+			dev_err(component->dev, "%s: channel is already disabled, dec_id = %d, dai_id = %d\n",
+					__func__, dec_id, dai_id);
+		} else {
+			tx_priv->active_ch_cnt[dai_id]--;
+			clear_bit(dec_id, &tx_priv->active_ch_mask[dai_id]);
+		}
 	}
 	snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update);
 

+ 15 - 5
asoc/codecs/lpass-cdc/lpass-cdc-va-macro.c

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/module.h>
@@ -1186,11 +1186,21 @@ static int lpass_cdc_va_macro_tx_mixer_put(struct snd_kcontrol *kcontrol,
 		return -EINVAL;
 
 	if (enable) {
-		set_bit(dec_id, &va_priv->active_ch_mask[dai_id]);
-		va_priv->active_ch_cnt[dai_id]++;
+		if (test_bit(dec_id, &va_priv->active_ch_mask[dai_id])) {
+			dev_err_ratelimited(component->dev, "%s: channel is already enabled, dec_id = %d, dai_id = %d\n",
+					__func__, dec_id, dai_id);
+		} else {
+			set_bit(dec_id, &va_priv->active_ch_mask[dai_id]);
+			va_priv->active_ch_cnt[dai_id]++;
+		}
 	} else {
-		clear_bit(dec_id, &va_priv->active_ch_mask[dai_id]);
-		va_priv->active_ch_cnt[dai_id]--;
+		if (!test_bit(dec_id, &va_priv->active_ch_mask[dai_id])) {
+			dev_err_ratelimited(component->dev, "%s: channel is already disabled, dec_id = %d, dai_id = %d\n",
+					__func__, dec_id, dai_id);
+		} else {
+			va_priv->active_ch_cnt[dai_id]--;
+			clear_bit(dec_id, &va_priv->active_ch_mask[dai_id]);
+		}
 	}
 
 	snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update);

+ 7 - 0
asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c

@@ -959,6 +959,13 @@ static int lpass_cdc_wsa_macro_mclk_enable(
 			regmap_update_bits(regmap,
 				LPASS_CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL,
 				0x01, 0x01);
+			/* Toggle fs_cntr_clr bit*/
+			regmap_update_bits(regmap,
+				LPASS_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL,
+				0x02, 0x02);
+			regmap_update_bits(regmap,
+				LPASS_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL,
+				0x02, 0x0);
 			regmap_update_bits(regmap,
 				LPASS_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL,
 				0x01, 0x01);

+ 7 - 0
asoc/codecs/lpass-cdc/lpass-cdc-wsa2-macro.c

@@ -964,6 +964,13 @@ static int lpass_cdc_wsa2_macro_mclk_enable(
 			regmap_update_bits(regmap,
 				LPASS_CDC_WSA2_CLK_RST_CTRL_MCLK_CONTROL,
 				0x01, 0x01);
+			/* Toggle fs_cntr_clr bit*/
+			regmap_update_bits(regmap,
+				LPASS_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL,
+				0x02, 0x02);
+			regmap_update_bits(regmap,
+				LPASS_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL,
+				0x02, 0x0);
 			regmap_update_bits(regmap,
 				LPASS_CDC_WSA2_CLK_RST_CTRL_FS_CNT_CONTROL,
 				0x01, 0x01);

+ 3 - 3
asoc/codecs/wcd-mbhc-adc.c

@@ -469,9 +469,6 @@ static bool wcd_mbhc_adc_check_for_spl_headset(struct wcd_mbhc *mbhc,
 		usleep_range(10000, 10100);
 	}
 
-	if (spl_hs)
-		pr_debug("%s: Detected special HS (%d)\n", __func__, spl_hs);
-
 exit:
 	pr_debug("%s: leave\n", __func__);
 	return spl_hs;
@@ -762,6 +759,9 @@ correct_plug_type:
 		    (spl_hs_count < WCD_MBHC_SPL_HS_CNT)) {
 			spl_hs = wcd_mbhc_adc_check_for_spl_headset(mbhc,
 								&spl_hs_count);
+			if (spl_hs)
+				pr_debug("%s: Detected special HS (%d)\n",
+							__func__, spl_hs);
 			output_mv = wcd_measure_adc_once(mbhc, MUX_CTL_IN2P);
 
 			if (spl_hs_count == WCD_MBHC_SPL_HS_CNT) {

+ 10 - 1
asoc/codecs/wcd-mbhc-v2.c

@@ -1683,6 +1683,7 @@ static int wcd_mbhc_usbc_ana_event_handler(struct notifier_block *nb,
 	struct wcd_mbhc *mbhc = container_of(nb, struct wcd_mbhc, aatc_dev_nb);
 #if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C)
 	int l_det_en = 0, detection_type = 0;
+	bool *cable_status = (bool*) ptr;
 #endif
 
 	if (!mbhc)
@@ -1692,7 +1693,15 @@ static int wcd_mbhc_usbc_ana_event_handler(struct notifier_block *nb,
 	if (mode == TYPEC_ACCESSORY_AUDIO) {
 		dev_dbg(mbhc->component->dev, "enter, %s: mode = %lu\n", __func__, mode);
 #if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C)
-		wcd_usbss_switch_update(WCD_USBSS_AATC, WCD_USBSS_CABLE_CONNECT);
+		if (cable_status == NULL)
+			wcd_usbss_switch_update(WCD_USBSS_AATC, WCD_USBSS_CABLE_CONNECT);
+		else {
+			if (*cable_status == false)
+				wcd_usbss_switch_update(WCD_USBSS_AATC, WCD_USBSS_CABLE_CONNECT);
+			else
+				dev_dbg(mbhc->component->dev, "skip AATC switch settings, cable_status= %d",
+						*cable_status);
+		}
 #endif
 		if (mbhc->mbhc_cb->clk_setup)
 			mbhc->mbhc_cb->clk_setup(mbhc->component, true);

+ 3 - 3
asoc/codecs/wcd939x/wcd939x-registers.h

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef WCD939X_REGISTERS_H
@@ -659,7 +659,7 @@ enum {
 #define WCD939X_DSD_HPHR_CFG4                  (WCD939X_DSD_HPHR_BASE+0x05)
 #define WCD939X_DSD_HPHR_CFG5                  (WCD939X_DSD_HPHR_BASE+0x06)
 
-#define WCD939X_NUM_REGISTERS                  (WCD939X_DSD_HPHR_CFG5+1)
-#define WCD939X_MAX_REGISTER                   (WCD939X_NUM_REGISTERS-1)
+#define WCD939X_MAX_REGISTER                   (WCD939X_DSD_HPHR_CFG5)
+#define WCD939X_NUM_REGISTERS                  (WCD939X_REG(WCD939X_MAX_REGISTER+1))
 
 #endif /* WCD939X_REGISTERS_H */

+ 6 - 6
asoc/codecs/wcd939x/wcd939x-regmap.c

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
  * Copyright (c) 2018-2019, 2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/regmap.h>
@@ -63,12 +63,12 @@ static struct reg_default wcd939x_defaults[] = {
 	{WCD939X_MICB2_TEST_CTL_1,               0x1a},
 	{WCD939X_MICB2_TEST_CTL_2,               0x00},
 	{WCD939X_MICB2_TEST_CTL_3,               0x24},
-	{WCD939X_MICB3_TEST_CTL_1,               0x1a},
-	{WCD939X_MICB3_TEST_CTL_2,               0x00},
-	{WCD939X_MICB3_TEST_CTL_3,               0xa4},
+	{WCD939X_MICB3_TEST_CTL_1,               0x9a},
+	{WCD939X_MICB3_TEST_CTL_2,               0x80},
+	{WCD939X_MICB3_TEST_CTL_3,               0x24},
 	{WCD939X_MICB4_TEST_CTL_1,               0x1a},
-	{WCD939X_MICB4_TEST_CTL_2,               0x00},
-	{WCD939X_MICB4_TEST_CTL_3,               0xa4},
+	{WCD939X_MICB4_TEST_CTL_2,               0x80},
+	{WCD939X_MICB4_TEST_CTL_3,               0x24},
 	{WCD939X_ADC_VCM,                        0x39},
 	{WCD939X_BIAS_ATEST,                     0xe0},
 	{WCD939X_SPARE1,                         0x00},

+ 8 - 4
asoc/codecs/wcd939x/wcd939x.c

@@ -134,6 +134,9 @@ extern const u8 wcd939x_reg_access[WCD939X_NUM_REGISTERS];
 static const DECLARE_TLV_DB_SCALE(line_gain, 0, 7, 1);
 static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1);
 
+/* Will be set by reading the registers during bind()*/
+static int wcd939x_version = WCD939X_VERSION_2_0;
+
 static int wcd939x_handle_post_irq(void *data);
 static int wcd939x_reset(struct device *dev);
 static int wcd939x_reset_low(struct device *dev);
@@ -176,13 +179,11 @@ static struct regmap_irq_chip wcd939x_regmap_irq_chip = {
 
 static bool wcd939x_readable_register(struct device *dev, unsigned int reg)
 {
-	struct wcd939x_priv *wcd939x = dev_get_drvdata(dev);
-
 	if (reg <= WCD939X_BASE + 1)
 		return 0;
 
 	if (reg >= WCD939X_FLYBACK_NEW_CTRL_2 && reg <= WCD939X_FLYBACK_NEW_CTRL_4) {
-		if (wcd939x && wcd939x->version == WCD939X_VERSION_1_0)
+		if (wcd939x_version == WCD939X_VERSION_1_0)
 			return 0;
 	}
 	return wcd939x_reg_access[WCD939X_REG(reg)] & RD_REG;
@@ -380,6 +381,7 @@ static int wcd939x_set_swr_clk_rate(struct snd_soc_component *component,
 
 static int wcd939x_init_reg(struct snd_soc_component *component)
 {
+	struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
 
 	snd_soc_component_update_bits(component,
 					REG_FIELD_VALUE(BIAS, ANALOG_BIAS_EN, 0x01));
@@ -436,7 +438,8 @@ static int wcd939x_init_reg(struct snd_soc_component *component)
 	snd_soc_component_update_bits(component,
 		REG_FIELD_VALUE(HPH_OCP_CTL, SCD_OP_EN, 0x01));
 
-	snd_soc_component_write(component, WCD939X_CFG0, 0x05);
+	if (wcd939x->version != WCD939X_VERSION_2_0)
+		snd_soc_component_write(component, WCD939X_CFG0, 0x05);
 
 	return 0;
 }
@@ -5145,6 +5148,7 @@ static int wcd939x_bind(struct device *dev)
 		wcd939x->version = ((status1 & 0x3) ? WCD939X_VERSION_1_1 : WCD939X_VERSION_1_0);
 	else if (id1 == 1)
 		wcd939x->version = WCD939X_VERSION_2_0;
+	wcd939x_version = wcd939x->version;
 	dev_info(dev, "%s: wcd9395 version: %s\n", __func__,
 			version_to_str(wcd939x->version));
 	wcd939x_regmap_config.readable_reg = wcd939x_readable_register;

+ 4 - 0
asoc/codecs/wsa884x/wsa884x-regmap.c

@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/regmap.h>
@@ -526,6 +527,9 @@ static bool wsa884x_volatile_register(struct device *dev, unsigned int reg)
 	if (reg == WSA884X_ANA_WO_CTL_0 || reg == WSA884X_ANA_WO_CTL_1)
 		return 1;
 
+	if (reg == WSA884X_INTR_CLEAR0 || reg == WSA884X_INTR_CLEAR1)
+		return 1;
+
 	return ((wsa884x_reg_access[WSA884X_REG(reg)] & RD_REG) &&
 		!(wsa884x_reg_access[WSA884X_REG(reg)] & WR_REG));
 }

+ 2 - 2
asoc/msm_dailink.h

@@ -36,13 +36,13 @@ SND_SOC_DAILINK_DEFS(slimbus_7_tx,
 SND_SOC_DAILINK_DEFS(btfm_0_rx,
 	DAILINK_COMP_ARRAY(COMP_CPU("snd-soc-dummy-dai")),
 	DAILINK_COMP_ARRAY(COMP_CODEC("btfmcodec_dev",
-			"btfm_bt_sco_a2dp_slim_rx")),
+			"btaudio_rx")),
 	DAILINK_COMP_ARRAY(COMP_PLATFORM("snd-soc-dummy")));
 
 SND_SOC_DAILINK_DEFS(btfm_0_tx,
 	DAILINK_COMP_ARRAY(COMP_CPU("snd-soc-dummy-dai")),
 	DAILINK_COMP_ARRAY(COMP_CODEC("btfmcodec_dev",
-			"btfm_bt_sco_slim_tx")),
+			"btaudio_tx")),
 	DAILINK_COMP_ARRAY(COMP_PLATFORM("snd-soc-dummy")));
 
 SND_SOC_DAILINK_DEFS(display_port,