Browse Source

asoc: Talos-tanggu bringup fixes

Bringup fixes to enumerate tanggu codec on talos.

Change-Id: Ic9c43ec0b870f6fec3c6d21fd4d77606c7ed94b1
Signed-off-by: Ramprasad Katkam <[email protected]>
Ramprasad Katkam 6 years ago
parent
commit
9c2394a6e4

+ 18 - 1
asoc/codecs/bolero/rx-macro.c

@@ -769,6 +769,9 @@ static int rx_macro_mclk_enable(struct rx_macro_priv *rx_priv,
 			regmap_update_bits(regmap,
 				BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,
 				0x01, 0x01);
+			regmap_update_bits(regmap,
+				BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,
+				0x02, 0x02);
 			regmap_update_bits(regmap,
 				BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
 				0x01, 0x01);
@@ -1022,6 +1025,7 @@ static int rx_macro_enable_mix_path(struct snd_soc_dapm_widget *w,
 	case SND_SOC_DAPM_POST_PMU:
 		snd_soc_write(codec, gain_reg,
 			snd_soc_read(codec, gain_reg));
+		snd_soc_update_bits(codec, mix_reg, 0x10, 0x00);
 		break;
 	case SND_SOC_DAPM_POST_PMD:
 		/* Clk Disable */
@@ -1071,6 +1075,7 @@ static int rx_macro_enable_main_path(struct snd_soc_dapm_widget *w,
 	case SND_SOC_DAPM_POST_PMU:
 		snd_soc_write(codec, gain_reg,
 			snd_soc_read(codec, gain_reg));
+		snd_soc_update_bits(codec, reg, 0x10, 0x00);
 		break;
 	case SND_SOC_DAPM_POST_PMD:
 		rx_macro_enable_interp_clk(codec, event, w->shift);
@@ -2393,12 +2398,15 @@ static int rx_swrm_clock(void *handle, bool enable)
 					__func__);
 				goto exit;
 			}
+			regmap_update_bits(regmap,
+				BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
+				0x02, 0x02);
 			regmap_update_bits(regmap,
 				BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
 				0x01, 0x01);
 			regmap_update_bits(regmap,
 				BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
-				0x1C, 0x0C);
+				0x02, 0x00);
 			msm_cdc_pinctrl_select_active_state(
 						rx_priv->rx_swr_gpio_p);
 		}
@@ -2471,6 +2479,15 @@ static int rx_macro_init(struct snd_soc_codec *codec)
 		dev_err(rx_dev, "%s: failed to add snd_ctls\n", __func__);
 		return ret;
 	}
+	snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL, 0x01, 0x01);
+	snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_DSM_CTL, 0x01, 0x01);
+	snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_DSM_CTL, 0x01, 0x01);
+	snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_SEC7, 0x07, 0x02);
+	snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_SEC7, 0x07, 0x02);
+	snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_SEC7, 0x07, 0x02);
+	snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_CFG3, 0x03, 0x02);
+	snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_CFG3, 0x03, 0x02);
+	snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG3, 0x03, 0x02);
 
 	rx_priv->codec = codec;
 

+ 6 - 1
asoc/codecs/bolero/tx-macro.c

@@ -336,7 +336,7 @@ static void tx_macro_mute_update_callback(struct work_struct *work)
 	hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 +
 			TX_MACRO_TX_PATH_OFFSET * decimator;
 	snd_soc_update_bits(codec, hpf_gate_reg, 0x01, 0x01);
-	snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x01, 0x00);
+	snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00);
 	dev_dbg(tx_priv->dev, "%s: decimator %u unmute\n",
 		__func__, decimator);
 }
@@ -521,6 +521,9 @@ static int tx_macro_enable_dmic(struct snd_soc_dapm_widget *w,
 	case SND_SOC_DAPM_PRE_PMU:
 		(*dmic_clk_cnt)++;
 		if (*dmic_clk_cnt == 1) {
+			snd_soc_update_bits(codec, BOLERO_CDC_VA_TOP_CSR_DMIC_CFG,
+					0x80, 0x00);
+
 			snd_soc_update_bits(codec, dmic_clk_reg,
 					0x0E, tx_priv->dmic_clk_div << 0x1);
 			snd_soc_update_bits(codec, dmic_clk_reg,
@@ -583,6 +586,7 @@ static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,
 		snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10);
 		break;
 	case SND_SOC_DAPM_POST_PMU:
+		snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x20, 0x20);
 		snd_soc_update_bits(codec, hpf_gate_reg, 0x01, 0x00);
 
 		/* schedule work queue to Remove Mute */
@@ -613,6 +617,7 @@ static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,
 				&tx_priv->tx_mute_dwork[decimator].dwork);
 		break;
 	case SND_SOC_DAPM_POST_PMD:
+		snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x20, 0x00);
 		snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00);
 		break;
 	}

+ 1 - 1
asoc/codecs/wcd937x/internal.h

@@ -61,7 +61,7 @@ struct wcd937x_priv {
 	u32 hph_mode;
 
 	struct irq_domain *virq;
-	struct wcd_irq_info *irq_info;
+	struct wcd_irq_info irq_info;
 	u32 rx_clk_cnt;
 	int num_irq_regs;
 

+ 4 - 4
asoc/codecs/wcd937x/wcd937x-mbhc.c

@@ -169,7 +169,7 @@ static int wcd937x_mbhc_request_irq(struct snd_soc_codec *codec,
 {
 	struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev);
 
-	return wcd_request_irq(wcd937x->irq_info, irq, name, handler, data);
+	return wcd_request_irq(&wcd937x->irq_info, irq, name, handler, data);
 }
 
 static void wcd937x_mbhc_irq_control(struct snd_soc_codec *codec,
@@ -178,9 +178,9 @@ static void wcd937x_mbhc_irq_control(struct snd_soc_codec *codec,
 	struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev);
 
 	if (enable)
-		wcd_enable_irq(wcd937x->irq_info, irq);
+		wcd_enable_irq(&wcd937x->irq_info, irq);
 	else
-		wcd_disable_irq(wcd937x->irq_info, irq);
+		wcd_disable_irq(&wcd937x->irq_info, irq);
 }
 
 static int wcd937x_mbhc_free_irq(struct snd_soc_codec *codec,
@@ -188,7 +188,7 @@ static int wcd937x_mbhc_free_irq(struct snd_soc_codec *codec,
 {
 	struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev);
 
-	wcd_free_irq(wcd937x->irq_info, irq, data);
+	wcd_free_irq(&wcd937x->irq_info, irq, data);
 
 	return 0;
 }

+ 7 - 0
asoc/codecs/wcd937x/wcd937x-regmap.c

@@ -434,21 +434,28 @@ static const struct reg_default wcd937x_defaults[] = {
 
 static bool wcd937x_readable_register(struct device *dev, unsigned int reg)
 {
+	if(reg <= WCD937X_BASE_ADDRESS)
+		return 0;
 	return wcd937x_reg_access[WCD937X_REG(reg)] & RD_REG;
 }
 
 static bool wcd937x_writeable_register(struct device *dev, unsigned int reg)
 {
+	if(reg <= WCD937X_BASE_ADDRESS)
+		return 0;
 	return wcd937x_reg_access[WCD937X_REG(reg)] & WR_REG;
 }
 
 static bool wcd937x_volatile_register(struct device *dev, unsigned int reg)
 {
+	if(reg <= WCD937X_BASE_ADDRESS)
+		return 0;
 	return (wcd937x_reg_access[WCD937X_REG(reg)] & RD_REG)
 		& ~(wcd937x_reg_access[WCD937X_REG(reg)] & WR_REG);
 }
 
 struct regmap_config wcd937x_regmap_config = {
+	.name = "wcd937x_csr",
 	.reg_bits = 16,
 	.val_bits = 8,
 	.cache_type = REGCACHE_RBTREE,

+ 32 - 23
asoc/codecs/wcd937x/wcd937x.c

@@ -337,6 +337,10 @@ static int wcd937x_rx_clk_enable(struct snd_soc_codec *codec)
 		snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES, 0x01, 0x01);
 		snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_RX0_CTL,
 				    0x40, 0x00);
+		snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_RX1_CTL,
+				    0x40, 0x00);
+		snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_RX2_CTL,
+				    0x40, 0x00);
 		snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL,
 				    0x02, 0x02);
 	}
@@ -1026,9 +1030,10 @@ static int wcd937x_enable_req(struct snd_soc_dapm_widget *w,
 				    0x00);
 		snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x40, 0x40);
 		snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL,
-				    0x10, 0x10);
+				    0x30, 0x30);
 		snd_soc_update_bits(codec, WCD937X_ANA_TX_CH1, 0x80, 0x80);
 		snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x40, 0x00);
+		snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x80, 0x80);
 		break;
 	case SND_SOC_DAPM_POST_PMD:
 		snd_soc_update_bits(codec, WCD937X_ANA_TX_CH1, 0x80, 0x00);
@@ -1098,6 +1103,11 @@ int wcd937x_micbias_control(struct snd_soc_codec *codec,
 	case MICB_ENABLE:
 		wcd937x->micb_ref[micb_index]++;
 		if (wcd937x->micb_ref[micb_index] == 1) {
+			snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, 0xE0, 0xE0);
+			snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x10);
+			snd_soc_update_bits(codec, WCD937X_MICB1_TEST_CTL_2, 0x01, 0x01);
+			snd_soc_update_bits(codec, WCD937X_MICB2_TEST_CTL_2, 0x01, 0x01);
+			snd_soc_update_bits(codec, WCD937X_MICB3_TEST_CTL_2, 0x01, 0x01);
 			snd_soc_update_bits(codec, micb_reg, 0xC0, 0x40);
 			if (post_on_event)
 				blocking_notifier_call_chain(&wcd937x->notifier,
@@ -1324,7 +1334,7 @@ static const struct snd_soc_dapm_widget wcd937x_dapm_widgets[] = {
 	SND_SOC_DAPM_ADC_E("ADC1", NULL, SND_SOC_NOPM, 0, 0,
 				wcd937x_codec_enable_adc,
 				SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
-	SND_SOC_DAPM_ADC_E("ADC2", NULL, SND_SOC_NOPM, 0, 1,
+	SND_SOC_DAPM_ADC_E("ADC2", NULL, SND_SOC_NOPM, 1, 0,
 				wcd937x_codec_enable_adc,
 				SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
 
@@ -1439,7 +1449,7 @@ static const struct snd_soc_dapm_widget wcd9375_dapm_widgets[] = {
 	SND_SOC_DAPM_INPUT("AMIC4"),
 
 	/*tx widgets*/
-	SND_SOC_DAPM_ADC_E("ADC3", NULL, SND_SOC_NOPM, 0, 2,
+	SND_SOC_DAPM_ADC_E("ADC3", NULL, SND_SOC_NOPM, 2, 0,
 				wcd937x_codec_enable_adc,
 				SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
 
@@ -1450,19 +1460,19 @@ static const struct snd_soc_dapm_widget wcd9375_dapm_widgets[] = {
 	SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0,
 				wcd937x_codec_enable_dmic,
 				SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
-	SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 0, 1,
+	SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 1, 0,
 				wcd937x_codec_enable_dmic,
 				SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
-	SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 0, 2,
+	SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 2, 0,
 				wcd937x_codec_enable_dmic,
 				SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
-	SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 0, 3,
+	SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 3, 0,
 				wcd937x_codec_enable_dmic,
 				SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
-	SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 0, 4,
+	SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 4, 0,
 				wcd937x_codec_enable_dmic,
 				SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
-	SND_SOC_DAPM_ADC_E("DMIC6", NULL, SND_SOC_NOPM, 0, 5,
+	SND_SOC_DAPM_ADC_E("DMIC6", NULL, SND_SOC_NOPM, 5, 0,
 				wcd937x_codec_enable_dmic,
 				SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
 
@@ -1508,19 +1518,18 @@ static const struct snd_soc_dapm_widget wcd9375_dapm_widgets[] = {
 
 static const struct snd_soc_dapm_route wcd937x_audio_map[] = {
 
-	{"ADC2_OUTPUT", NULL, "ADC2_MIXER"},
-	{"ADC2_MIXER", "Switch", "ADC2 REQ"},
-	{"ADC2 REQ", "NULL", "ADC2"},
-	{"ADC2", "NULL", "ADC2 MUX"},
-	{"ADC2 MUX", "INP3", "AMIC3"},
-	{"ADC2 MUX", "INP2", "AMIC2"},
-
-
 	{"ADC1_OUTPUT", NULL, "ADC1_MIXER"},
 	{"ADC1_MIXER", "Switch", "ADC1 REQ"},
 	{"ADC1 REQ", NULL, "ADC1"},
 	{"ADC1", NULL, "AMIC1"},
 
+	{"ADC2_OUTPUT", NULL, "ADC2_MIXER"},
+	{"ADC2_MIXER", "Switch", "ADC2 REQ"},
+	{"ADC2 REQ", NULL, "ADC2"},
+	{"ADC2", NULL, "ADC2 MUX"},
+	{"ADC2 MUX", "INP3", "AMIC3"},
+	{"ADC2 MUX", "INP2", "AMIC2"},
+
 	{"RX1", NULL, "IN1_HPHL"},
 	{"RDAC1", NULL, "RX1"},
 	{"HPHL_RDAC", "Switch", "RDAC1"},
@@ -1847,11 +1856,11 @@ static int wcd937x_bind(struct device *dev)
 		regmap_write(wcd937x->regmap,
 			     (WCD937X_DIGITAL_INTR_LEVEL_0 + i), 0);
 
-	wcd937x->irq_info->wcd_regmap_irq_chip = &wcd937x_regmap_irq_chip;
-	wcd937x->irq_info->codec_name = "WCD937X";
-	wcd937x->irq_info->regmap = wcd937x->regmap;
-	wcd937x->irq_info->dev = dev;
-	ret = wcd_irq_init(wcd937x->irq_info, &wcd937x->virq);
+	wcd937x->irq_info.wcd_regmap_irq_chip = &wcd937x_regmap_irq_chip;
+	wcd937x->irq_info.codec_name = "WCD937X";
+	wcd937x->irq_info.regmap = wcd937x->regmap;
+	wcd937x->irq_info.dev = dev;
+	ret = wcd_irq_init(&wcd937x->irq_info, &wcd937x->virq);
 
 	if (ret) {
 		dev_err(wcd937x->dev, "%s: IRQ init failed: %d\n",
@@ -1870,7 +1879,7 @@ static int wcd937x_bind(struct device *dev)
 
 	return ret;
 err_irq:
-	wcd_irq_exit(wcd937x->irq_info, wcd937x->virq);
+	wcd_irq_exit(&wcd937x->irq_info, wcd937x->virq);
 err:
 	component_unbind_all(dev, wcd937x);
 	return ret;
@@ -1880,7 +1889,7 @@ static void wcd937x_unbind(struct device *dev)
 {
 	struct wcd937x_priv *wcd937x = dev_get_drvdata(dev);
 
-	wcd_irq_exit(wcd937x->irq_info, wcd937x->virq);
+	wcd_irq_exit(&wcd937x->irq_info, wcd937x->virq);
 	snd_soc_unregister_codec(dev);
 	component_unbind_all(dev, wcd937x);
 }