diff --git a/asoc/codecs/lpass-cdc/lpass-cdc-va-macro.c b/asoc/codecs/lpass-cdc/lpass-cdc-va-macro.c index 226218846a..5c465f47c4 100644 --- a/asoc/codecs/lpass-cdc/lpass-cdc-va-macro.c +++ b/asoc/codecs/lpass-cdc/lpass-cdc-va-macro.c @@ -173,6 +173,8 @@ struct lpass_cdc_va_macro_priv { int dec_mode[LPASS_CDC_VA_MACRO_NUM_DECIMATORS]; int pcm_rate[LPASS_CDC_VA_MACRO_NUM_DECIMATORS]; bool wcd_dmic_enabled; + int dapm_tx_clk_status; + u16 current_clk_id; }; static bool lpass_cdc_va_macro_get_data(struct snd_soc_component *component, @@ -421,7 +423,14 @@ static int lpass_cdc_va_macro_swr_pwr_event(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMU: - if (va_priv->default_clk_id != VA_CORE_CLK) { + dev_dbg(component->dev, + "%s: va_swr_clk_cnt %d, tx_swr_clk_cnt %d, tx_clk_status %d\n", + __func__, va_priv->va_swr_clk_cnt, + va_priv->tx_swr_clk_cnt, va_priv->tx_clk_status); + if (va_priv->current_clk_id == VA_CORE_CLK) { + return 0; + } else if ( va_priv->va_swr_clk_cnt != 0 && + va_priv->tx_clk_status) { ret = lpass_cdc_va_macro_core_vote(va_priv, true); if (ret < 0) { dev_err(va_priv->dev, @@ -454,10 +463,13 @@ static int lpass_cdc_va_macro_swr_pwr_event(struct snd_soc_dapm_widget *w, false); break; } + va_priv->current_clk_id = VA_CORE_CLK; } break; case SND_SOC_DAPM_POST_PMD: - if (va_priv->default_clk_id == TX_CORE_CLK) { + if (va_priv->current_clk_id == VA_CORE_CLK && + va_priv->va_swr_clk_cnt != 0 && + va_priv->tx_clk_status) { ret = lpass_cdc_clk_rsc_request_clock(va_priv->dev, va_priv->default_clk_id, TX_CORE_CLK, @@ -490,6 +502,7 @@ static int lpass_cdc_va_macro_swr_pwr_event(struct snd_soc_dapm_widget *w, false); break; } + va_priv->current_clk_id = TX_CORE_CLK; } break; default: @@ -541,7 +554,7 @@ static int lpass_cdc_va_macro_mclk_event(struct snd_soc_dapm_widget *w, TX_CORE_CLK, true); if (!ret) - va_priv->tx_clk_status++; + va_priv->dapm_tx_clk_status++; if (va_priv->lpi_enable) ret = lpass_cdc_va_macro_mclk_enable(va_priv, 1, true); @@ -554,12 +567,12 @@ static int lpass_cdc_va_macro_mclk_event(struct snd_soc_dapm_widget *w, else lpass_cdc_tx_mclk_enable(component, 0); - if (va_priv->tx_clk_status > 0) { + if (va_priv->dapm_tx_clk_status > 0) { lpass_cdc_clk_rsc_request_clock(va_priv->dev, va_priv->default_clk_id, TX_CORE_CLK, false); - va_priv->tx_clk_status--; + va_priv->dapm_tx_clk_status--; } break; default: @@ -1309,12 +1322,12 @@ static int lpass_cdc_va_macro_enable_tx(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_POST_PMU: - if (va_priv->tx_clk_status > 0) { + if (va_priv->dapm_tx_clk_status > 0) { ret = lpass_cdc_clk_rsc_request_clock(va_priv->dev, va_priv->default_clk_id, TX_CORE_CLK, false); - va_priv->tx_clk_status--; + va_priv->dapm_tx_clk_status--; } break; case SND_SOC_DAPM_PRE_PMD: @@ -1323,7 +1336,7 @@ static int lpass_cdc_va_macro_enable_tx(struct snd_soc_dapm_widget *w, TX_CORE_CLK, true); if (!ret) - va_priv->tx_clk_status++; + va_priv->dapm_tx_clk_status++; break; default: dev_err(va_priv->dev, @@ -1971,9 +1984,7 @@ static const struct snd_soc_dapm_route va_audio_map[] = { {"VA SWR_INPUT", NULL, "VA_SWR_PWR"}, - {"VA_AIF1 CAP", NULL, "VA_SWR_CLK"}, - {"VA_AIF2 CAP", NULL, "VA_SWR_CLK"}, - {"VA_AIF3 CAP", NULL, "VA_SWR_CLK"}, + {"VA SWR_INPUT", NULL, "VA_SWR_CLK"}, }; static const char * const dec_mode_mux_text[] = { @@ -2464,6 +2475,7 @@ static int lpass_cdc_va_macro_probe(struct platform_device *pdev) } va_priv->clk_id = VA_CORE_CLK; va_priv->default_clk_id = default_clk_id; + va_priv->current_clk_id = TX_CORE_CLK; if (is_used_va_swr_gpio) { va_priv->reset_swr = true;