|
@@ -201,6 +201,7 @@ static int lpass_cdc_wsa_macro_mute_stream(struct snd_soc_dai *dai, int mute, in
|
|
|
struct lpass_cdc_wsa_macro_swr_ctrl_data {
|
|
|
struct platform_device *wsa_swr_pdev;
|
|
|
};
|
|
|
+static int lpass_cdc_wsa_macro_enable_vi_decimator(struct snd_soc_component *component);
|
|
|
|
|
|
#define LPASS_CDC_WSA_MACRO_SET_VOLUME_TLV(xname, xreg, xmin, xmax, tlv_array) \
|
|
|
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
|
|
@@ -904,6 +905,7 @@ static int lpass_cdc_wsa_macro_mute_stream(struct snd_soc_dai *dai, int mute, in
|
|
|
}
|
|
|
}
|
|
|
lpass_cdc_wsa_pa_on(wsa_dev, adie_lb);
|
|
|
+ lpass_cdc_wsa_macro_enable_vi_decimator(component);
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
@@ -1066,12 +1068,8 @@ static int lpass_cdc_wsa_macro_event_handler(struct snd_soc_component *component
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int lpass_cdc_wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w,
|
|
|
- struct snd_kcontrol *kcontrol,
|
|
|
- int event)
|
|
|
+static int lpass_cdc_wsa_macro_enable_vi_decimator(struct snd_soc_component *component)
|
|
|
{
|
|
|
- struct snd_soc_component *component =
|
|
|
- snd_soc_dapm_to_component(w->dapm);
|
|
|
struct device *wsa_dev = NULL;
|
|
|
struct lpass_cdc_wsa_macro_priv *wsa_priv = NULL;
|
|
|
u8 val = 0x0;
|
|
@@ -1079,6 +1077,8 @@ static int lpass_cdc_wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w,
|
|
|
if (!lpass_cdc_wsa_macro_get_data(component, &wsa_dev, &wsa_priv, __func__))
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ usleep_range(5000, 5500);
|
|
|
+ dev_dbg(wsa_dev, "%s: wsa_priv->pcm_rate_vi %d\n", __func__, wsa_priv->pcm_rate_vi);
|
|
|
switch (wsa_priv->pcm_rate_vi) {
|
|
|
case 48000:
|
|
|
val = 0x04;
|
|
@@ -1092,67 +1092,80 @@ static int lpass_cdc_wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w,
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
+ if (test_bit(LPASS_CDC_WSA_MACRO_TX0,
|
|
|
+ &wsa_priv->active_ch_mask[LPASS_CDC_WSA_MACRO_AIF_VI])) {
|
|
|
+ dev_dbg(wsa_dev, "%s: spkr1 enabled\n", __func__);
|
|
|
+ /* Enable V&I sensing */
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ LPASS_CDC_WSA_TX0_SPKR_PROT_PATH_CTL,
|
|
|
+ 0x20, 0x20);
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ LPASS_CDC_WSA_TX1_SPKR_PROT_PATH_CTL,
|
|
|
+ 0x20, 0x20);
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ LPASS_CDC_WSA_TX0_SPKR_PROT_PATH_CTL,
|
|
|
+ 0x0F, val);
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ LPASS_CDC_WSA_TX1_SPKR_PROT_PATH_CTL,
|
|
|
+ 0x0F, val);
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ LPASS_CDC_WSA_TX0_SPKR_PROT_PATH_CTL,
|
|
|
+ 0x10, 0x10);
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ LPASS_CDC_WSA_TX1_SPKR_PROT_PATH_CTL,
|
|
|
+ 0x10, 0x10);
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ LPASS_CDC_WSA_TX0_SPKR_PROT_PATH_CTL,
|
|
|
+ 0x20, 0x00);
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ LPASS_CDC_WSA_TX1_SPKR_PROT_PATH_CTL,
|
|
|
+ 0x20, 0x00);
|
|
|
+ }
|
|
|
+ if (test_bit(LPASS_CDC_WSA_MACRO_TX1,
|
|
|
+ &wsa_priv->active_ch_mask[LPASS_CDC_WSA_MACRO_AIF_VI])) {
|
|
|
+ dev_dbg(wsa_dev, "%s: spkr2 enabled\n", __func__);
|
|
|
+ /* Enable V&I sensing */
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ LPASS_CDC_WSA_TX2_SPKR_PROT_PATH_CTL,
|
|
|
+ 0x20, 0x20);
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ LPASS_CDC_WSA_TX3_SPKR_PROT_PATH_CTL,
|
|
|
+ 0x20, 0x20);
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ LPASS_CDC_WSA_TX2_SPKR_PROT_PATH_CTL,
|
|
|
+ 0x0F, val);
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ LPASS_CDC_WSA_TX3_SPKR_PROT_PATH_CTL,
|
|
|
+ 0x0F, val);
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ LPASS_CDC_WSA_TX2_SPKR_PROT_PATH_CTL,
|
|
|
+ 0x10, 0x10);
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ LPASS_CDC_WSA_TX3_SPKR_PROT_PATH_CTL,
|
|
|
+ 0x10, 0x10);
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ LPASS_CDC_WSA_TX2_SPKR_PROT_PATH_CTL,
|
|
|
+ 0x20, 0x00);
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ LPASS_CDC_WSA_TX3_SPKR_PROT_PATH_CTL,
|
|
|
+ 0x20, 0x00);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int lpass_cdc_wsa_macro_disable_vi_feedback(struct snd_soc_dapm_widget *w,
|
|
|
+ struct snd_kcontrol *kcontrol,
|
|
|
+ int event)
|
|
|
+{
|
|
|
+ struct snd_soc_component *component =
|
|
|
+ snd_soc_dapm_to_component(w->dapm);
|
|
|
+ struct device *wsa_dev = NULL;
|
|
|
+ struct lpass_cdc_wsa_macro_priv *wsa_priv = NULL;
|
|
|
+
|
|
|
+ if (!lpass_cdc_wsa_macro_get_data(component, &wsa_dev, &wsa_priv, __func__))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
switch (event) {
|
|
|
- case SND_SOC_DAPM_POST_PMU:
|
|
|
- if (test_bit(LPASS_CDC_WSA_MACRO_TX0,
|
|
|
- &wsa_priv->active_ch_mask[LPASS_CDC_WSA_MACRO_AIF_VI])) {
|
|
|
- dev_dbg(wsa_dev, "%s: spkr1 enabled\n", __func__);
|
|
|
- /* Enable V&I sensing */
|
|
|
- snd_soc_component_update_bits(component,
|
|
|
- LPASS_CDC_WSA_TX0_SPKR_PROT_PATH_CTL,
|
|
|
- 0x20, 0x20);
|
|
|
- snd_soc_component_update_bits(component,
|
|
|
- LPASS_CDC_WSA_TX1_SPKR_PROT_PATH_CTL,
|
|
|
- 0x20, 0x20);
|
|
|
- snd_soc_component_update_bits(component,
|
|
|
- LPASS_CDC_WSA_TX0_SPKR_PROT_PATH_CTL,
|
|
|
- 0x0F, val);
|
|
|
- snd_soc_component_update_bits(component,
|
|
|
- LPASS_CDC_WSA_TX1_SPKR_PROT_PATH_CTL,
|
|
|
- 0x0F, val);
|
|
|
- snd_soc_component_update_bits(component,
|
|
|
- LPASS_CDC_WSA_TX0_SPKR_PROT_PATH_CTL,
|
|
|
- 0x10, 0x10);
|
|
|
- snd_soc_component_update_bits(component,
|
|
|
- LPASS_CDC_WSA_TX1_SPKR_PROT_PATH_CTL,
|
|
|
- 0x10, 0x10);
|
|
|
- snd_soc_component_update_bits(component,
|
|
|
- LPASS_CDC_WSA_TX0_SPKR_PROT_PATH_CTL,
|
|
|
- 0x20, 0x00);
|
|
|
- snd_soc_component_update_bits(component,
|
|
|
- LPASS_CDC_WSA_TX1_SPKR_PROT_PATH_CTL,
|
|
|
- 0x20, 0x00);
|
|
|
- }
|
|
|
- if (test_bit(LPASS_CDC_WSA_MACRO_TX1,
|
|
|
- &wsa_priv->active_ch_mask[LPASS_CDC_WSA_MACRO_AIF_VI])) {
|
|
|
- dev_dbg(wsa_dev, "%s: spkr2 enabled\n", __func__);
|
|
|
- /* Enable V&I sensing */
|
|
|
- snd_soc_component_update_bits(component,
|
|
|
- LPASS_CDC_WSA_TX2_SPKR_PROT_PATH_CTL,
|
|
|
- 0x20, 0x20);
|
|
|
- snd_soc_component_update_bits(component,
|
|
|
- LPASS_CDC_WSA_TX3_SPKR_PROT_PATH_CTL,
|
|
|
- 0x20, 0x20);
|
|
|
- snd_soc_component_update_bits(component,
|
|
|
- LPASS_CDC_WSA_TX2_SPKR_PROT_PATH_CTL,
|
|
|
- 0x0F, val);
|
|
|
- snd_soc_component_update_bits(component,
|
|
|
- LPASS_CDC_WSA_TX3_SPKR_PROT_PATH_CTL,
|
|
|
- 0x0F, val);
|
|
|
- snd_soc_component_update_bits(component,
|
|
|
- LPASS_CDC_WSA_TX2_SPKR_PROT_PATH_CTL,
|
|
|
- 0x10, 0x10);
|
|
|
- snd_soc_component_update_bits(component,
|
|
|
- LPASS_CDC_WSA_TX3_SPKR_PROT_PATH_CTL,
|
|
|
- 0x10, 0x10);
|
|
|
- snd_soc_component_update_bits(component,
|
|
|
- LPASS_CDC_WSA_TX2_SPKR_PROT_PATH_CTL,
|
|
|
- 0x20, 0x00);
|
|
|
- snd_soc_component_update_bits(component,
|
|
|
- LPASS_CDC_WSA_TX3_SPKR_PROT_PATH_CTL,
|
|
|
- 0x20, 0x00);
|
|
|
- }
|
|
|
- break;
|
|
|
case SND_SOC_DAPM_POST_PMD:
|
|
|
if (test_bit(LPASS_CDC_WSA_MACRO_TX0,
|
|
|
&wsa_priv->active_ch_mask[LPASS_CDC_WSA_MACRO_AIF_VI])) {
|
|
@@ -2833,8 +2846,8 @@ static const struct snd_soc_dapm_widget lpass_cdc_wsa_macro_dapm_widgets[] = {
|
|
|
|
|
|
SND_SOC_DAPM_AIF_OUT_E("WSA AIF_VI", "WSA_AIF_VI Capture", 0,
|
|
|
SND_SOC_NOPM, LPASS_CDC_WSA_MACRO_AIF_VI, 0,
|
|
|
- lpass_cdc_wsa_macro_enable_vi_feedback,
|
|
|
- SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
|
|
|
+ lpass_cdc_wsa_macro_disable_vi_feedback,
|
|
|
+ SND_SOC_DAPM_POST_PMD),
|
|
|
|
|
|
SND_SOC_DAPM_AIF_OUT("WSA AIF_ECHO", "WSA_AIF_ECHO Capture", 0,
|
|
|
SND_SOC_NOPM, 0, 0),
|