Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5ec99c4a authored by Meng Wang's avatar Meng Wang Committed by Gerrit - the friendly Code Review server
Browse files

asoc: wcd938x: adjust swr sequence for wcd mic recording



SND_SOC_DAPM_MIXER_E widget is powered up before SND_SOC_DAPM_ADC_E
which causes mute on wcd mic recording. Adjust wcd938x_tx_connect_port
and swr_slvdev_datapath_control sequence to fix it.

Change-Id: I3dbfb239dcfbd65102d0d98be40326be71cf8479
Signed-off-by: default avatarMeng Wang <mengw@codeaurora.org>
parent d155d7f5
Loading
Loading
Loading
Loading
+49 −43
Original line number Diff line number Diff line
@@ -1328,6 +1328,7 @@ static int wcd938x_codec_enable_dmic(struct snd_soc_dapm_widget *w,
	u8 dmic_clk_shift = 0;
	u8 dmic_clk_mask = 0;
	u16 dmic2_left_en = 0;
	int ret = 0;

	dev_dbg(component->dev, "%s wname: %s event: %d\n", __func__,
		w->name, event);
@@ -1397,11 +1398,13 @@ static int wcd938x_codec_enable_dmic(struct snd_soc_dapm_widget *w,
		/* enable clock scaling */
		snd_soc_component_update_bits(component,
				WCD938X_DIGITAL_CDC_DMIC_CTL, 0x06, 0x06);
		wcd938x_tx_connect_port(component, DMIC0 + (w->shift),
					SWR_CLK_RATE_2P4MHZ, true);
		ret = swr_slvdev_datapath_control(wcd938x->tx_swr_dev,
				wcd938x->tx_swr_dev->dev_num,
				true);
		break;
	case SND_SOC_DAPM_POST_PMD:
		wcd938x_tx_connect_port(component, DMIC0 + (w->shift), 0,
		ret = swr_slvdev_datapath_control(wcd938x->tx_swr_dev,
				wcd938x->tx_swr_dev->dev_num,
				false);
		snd_soc_component_update_bits(component,
				WCD938X_DIGITAL_CDC_AMIC_CTL,
@@ -1414,7 +1417,7 @@ static int wcd938x_codec_enable_dmic(struct snd_soc_dapm_widget *w,
					      dmic_clk_en_reg, 0x08, 0x00);
		break;
	};
	return 0;
	return ret;
}

/*
@@ -1553,12 +1556,21 @@ static int wcd938x_tx_swr_ctrl(struct snd_soc_dapm_widget *w,
			rate = wcd938x_get_clk_rate(i);
			wcd938x_set_swr_clk_rate(component, rate, bank);
		}
		ret = swr_slvdev_datapath_control(wcd938x->tx_swr_dev,
		    wcd938x->tx_swr_dev->dev_num,
		    true);
		if (w->shift == ADC2 && !(snd_soc_component_read32(component,
			WCD938X_TX_NEW_AMIC_MUX_CFG) & 0x80)) {
			if (!wcd938x->bcs_dis)
				wcd938x_tx_connect_port(component, MBHC,
					SWR_CLK_RATE_4P8MHZ, true);
			set_bit(AMIC2_BCS_ENABLE, &wcd938x->status_mask);
		}
		if (strnstr(w->name, "ADC", sizeof("ADC"))) {
			wcd938x_tx_connect_port(component, w->shift, rate,
					true);
			/* Copy clk settings to active bank */
			wcd938x_set_swr_clk_rate(component, rate, !bank);
		} else {
			wcd938x_tx_connect_port(component, w->shift,
					SWR_CLK_RATE_2P4MHZ, true);
		}
		break;
	case SND_SOC_DAPM_POST_PMD:
@@ -1566,9 +1578,15 @@ static int wcd938x_tx_swr_ctrl(struct snd_soc_dapm_widget *w,
			rate = wcd938x_get_clk_rate(ADC_MODE_INVALID);
			wcd938x_set_swr_clk_rate(component, rate, !bank);
		}
		ret = swr_slvdev_datapath_control(wcd938x->tx_swr_dev,
		    wcd938x->tx_swr_dev->dev_num,
		wcd938x_tx_connect_port(component, w->shift, 0, false);
		if (w->shift == ADC2 &&
			test_bit(AMIC2_BCS_ENABLE, &wcd938x->status_mask)) {
			if (!wcd938x->bcs_dis)
				wcd938x_tx_connect_port(component, MBHC, 0,
					false);
			clear_bit(AMIC2_BCS_ENABLE, &wcd938x->status_mask);
		}

		if (strnstr(w->name, "ADC", sizeof("ADC")))
			wcd938x_set_swr_clk_rate(component, rate, bank);
		break;
@@ -1617,7 +1635,7 @@ static int wcd938x_codec_enable_adc(struct snd_soc_dapm_widget *w,
	struct snd_soc_component *component =
					snd_soc_dapm_to_component(w->dapm);
	struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
	int clk_rate = 0;
	int clk_rate = 0, ret = 0;

	dev_dbg(component->dev, "%s wname: %s event: %d\n", __func__,
		w->name, event);
@@ -1630,33 +1648,21 @@ static int wcd938x_codec_enable_adc(struct snd_soc_dapm_widget *w,
				WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x10);
		set_bit(w->shift, &wcd938x->status_mask);
		clk_rate = wcd938x_get_clk_rate(wcd938x->tx_mode[w->shift]);
		/* Enable BCS for Headset mic */
		if (w->shift == 1 && !(snd_soc_component_read32(component,
				WCD938X_TX_NEW_AMIC_MUX_CFG) & 0x80)) {
			if (!wcd938x->bcs_dis)
				wcd938x_tx_connect_port(component, MBHC,
						SWR_CLK_RATE_4P8MHZ, true);
			set_bit(AMIC2_BCS_ENABLE, &wcd938x->status_mask);
		}
		wcd938x_tx_connect_port(component, ADC1 + (w->shift), clk_rate,
		ret = swr_slvdev_datapath_control(wcd938x->tx_swr_dev,
				 wcd938x->tx_swr_dev->dev_num,
				 true);
		break;
	case SND_SOC_DAPM_POST_PMD:
		wcd938x_tx_connect_port(component, ADC1 + (w->shift), 0, false);
		if (w->shift == 1 &&
			test_bit(AMIC2_BCS_ENABLE, &wcd938x->status_mask)) {
			if (!wcd938x->bcs_dis)
				wcd938x_tx_connect_port(component, MBHC, 0,
		ret = swr_slvdev_datapath_control(wcd938x->tx_swr_dev,
				wcd938x->tx_swr_dev->dev_num,
				false);
			clear_bit(AMIC2_BCS_ENABLE, &wcd938x->status_mask);
		}
		snd_soc_component_update_bits(component,
				WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x08, 0x00);
		clear_bit(w->shift, &wcd938x->status_mask);
		break;
	};

	return 0;
	return ret;
}

void wcd938x_disable_bcs_before_slow_insert(struct snd_soc_component *component,
@@ -3030,49 +3036,49 @@ static const struct snd_soc_dapm_widget wcd938x_dapm_widgets[] = {
	SND_SOC_DAPM_MUX("HDR34 MUX", SND_SOC_NOPM, 0, 0,
				&tx_hdr34_mux),
	/*tx mixers*/
	SND_SOC_DAPM_MIXER_E("ADC1_MIXER", SND_SOC_NOPM, 0, 0,
	SND_SOC_DAPM_MIXER_E("ADC1_MIXER", SND_SOC_NOPM, ADC1, 0,
				adc1_switch, ARRAY_SIZE(adc1_switch),
				wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
				SND_SOC_DAPM_POST_PMD),
	SND_SOC_DAPM_MIXER_E("ADC2_MIXER", SND_SOC_NOPM, 0, 0,
	SND_SOC_DAPM_MIXER_E("ADC2_MIXER", SND_SOC_NOPM, ADC2, 0,
				adc2_switch, ARRAY_SIZE(adc2_switch),
				wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
				SND_SOC_DAPM_POST_PMD),
	SND_SOC_DAPM_MIXER_E("ADC3_MIXER", SND_SOC_NOPM, 0, 0, adc3_switch,
	SND_SOC_DAPM_MIXER_E("ADC3_MIXER", SND_SOC_NOPM, ADC3, 0, adc3_switch,
				ARRAY_SIZE(adc3_switch), wcd938x_tx_swr_ctrl,
				SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
	SND_SOC_DAPM_MIXER_E("ADC4_MIXER", SND_SOC_NOPM, 0, 0, adc4_switch,
	SND_SOC_DAPM_MIXER_E("ADC4_MIXER", SND_SOC_NOPM, ADC4, 0, adc4_switch,
				ARRAY_SIZE(adc4_switch), wcd938x_tx_swr_ctrl,
				SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
	SND_SOC_DAPM_MIXER_E("DMIC1_MIXER", SND_SOC_NOPM, 0,
	SND_SOC_DAPM_MIXER_E("DMIC1_MIXER", SND_SOC_NOPM, DMIC1,
				0, dmic1_switch, ARRAY_SIZE(dmic1_switch),
				wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
				SND_SOC_DAPM_POST_PMD),
	SND_SOC_DAPM_MIXER_E("DMIC2_MIXER", SND_SOC_NOPM, 0,
	SND_SOC_DAPM_MIXER_E("DMIC2_MIXER", SND_SOC_NOPM, DMIC2,
				0, dmic2_switch, ARRAY_SIZE(dmic2_switch),
				wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
				SND_SOC_DAPM_POST_PMD),
	SND_SOC_DAPM_MIXER_E("DMIC3_MIXER", SND_SOC_NOPM, 0,
	SND_SOC_DAPM_MIXER_E("DMIC3_MIXER", SND_SOC_NOPM, DMIC3,
				0, dmic3_switch, ARRAY_SIZE(dmic3_switch),
				wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
				SND_SOC_DAPM_POST_PMD),
	SND_SOC_DAPM_MIXER_E("DMIC4_MIXER", SND_SOC_NOPM, 0,
	SND_SOC_DAPM_MIXER_E("DMIC4_MIXER", SND_SOC_NOPM, DMIC4,
				0, dmic4_switch, ARRAY_SIZE(dmic4_switch),
				wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
				SND_SOC_DAPM_POST_PMD),
	SND_SOC_DAPM_MIXER_E("DMIC5_MIXER", SND_SOC_NOPM, 0,
	SND_SOC_DAPM_MIXER_E("DMIC5_MIXER", SND_SOC_NOPM, DMIC5,
				0, dmic5_switch, ARRAY_SIZE(dmic5_switch),
				wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
				SND_SOC_DAPM_POST_PMD),
	SND_SOC_DAPM_MIXER_E("DMIC6_MIXER", SND_SOC_NOPM, 0,
	SND_SOC_DAPM_MIXER_E("DMIC6_MIXER", SND_SOC_NOPM, DMIC6,
				0, dmic6_switch, ARRAY_SIZE(dmic6_switch),
				wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
				SND_SOC_DAPM_POST_PMD),
	SND_SOC_DAPM_MIXER_E("DMIC7_MIXER", SND_SOC_NOPM, 0,
	SND_SOC_DAPM_MIXER_E("DMIC7_MIXER", SND_SOC_NOPM, DMIC7,
				0, dmic7_switch, ARRAY_SIZE(dmic7_switch),
				wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
				SND_SOC_DAPM_POST_PMD),
	SND_SOC_DAPM_MIXER_E("DMIC8_MIXER", SND_SOC_NOPM, 0,
	SND_SOC_DAPM_MIXER_E("DMIC8_MIXER", SND_SOC_NOPM, DMIC8,
				0, dmic8_switch, ARRAY_SIZE(dmic8_switch),
				wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
				SND_SOC_DAPM_POST_PMD),