asoc: lpass-cdc: update logic for va clk switch
SVA switch is not retain at VA_CLK when switch between handset and headset mic sva. Update the clock release logic during swr power event. Change-Id: I52c5f7576426af2ff385a862da872e8d86959ecb Signed-off-by: Meng Wang <mengw@codeaurora.org>
This commit is contained in:
@@ -173,6 +173,8 @@ struct lpass_cdc_va_macro_priv {
|
|||||||
int dec_mode[LPASS_CDC_VA_MACRO_NUM_DECIMATORS];
|
int dec_mode[LPASS_CDC_VA_MACRO_NUM_DECIMATORS];
|
||||||
int pcm_rate[LPASS_CDC_VA_MACRO_NUM_DECIMATORS];
|
int pcm_rate[LPASS_CDC_VA_MACRO_NUM_DECIMATORS];
|
||||||
bool wcd_dmic_enabled;
|
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,
|
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) {
|
switch (event) {
|
||||||
case SND_SOC_DAPM_PRE_PMU:
|
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);
|
ret = lpass_cdc_va_macro_core_vote(va_priv, true);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(va_priv->dev,
|
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);
|
false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
va_priv->current_clk_id = VA_CORE_CLK;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SND_SOC_DAPM_POST_PMD:
|
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,
|
ret = lpass_cdc_clk_rsc_request_clock(va_priv->dev,
|
||||||
va_priv->default_clk_id,
|
va_priv->default_clk_id,
|
||||||
TX_CORE_CLK,
|
TX_CORE_CLK,
|
||||||
@@ -490,6 +502,7 @@ static int lpass_cdc_va_macro_swr_pwr_event(struct snd_soc_dapm_widget *w,
|
|||||||
false);
|
false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
va_priv->current_clk_id = TX_CORE_CLK;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -541,7 +554,7 @@ static int lpass_cdc_va_macro_mclk_event(struct snd_soc_dapm_widget *w,
|
|||||||
TX_CORE_CLK,
|
TX_CORE_CLK,
|
||||||
true);
|
true);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
va_priv->tx_clk_status++;
|
va_priv->dapm_tx_clk_status++;
|
||||||
|
|
||||||
if (va_priv->lpi_enable)
|
if (va_priv->lpi_enable)
|
||||||
ret = lpass_cdc_va_macro_mclk_enable(va_priv, 1, true);
|
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
|
else
|
||||||
lpass_cdc_tx_mclk_enable(component, 0);
|
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,
|
lpass_cdc_clk_rsc_request_clock(va_priv->dev,
|
||||||
va_priv->default_clk_id,
|
va_priv->default_clk_id,
|
||||||
TX_CORE_CLK,
|
TX_CORE_CLK,
|
||||||
false);
|
false);
|
||||||
va_priv->tx_clk_status--;
|
va_priv->dapm_tx_clk_status--;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -1309,12 +1322,12 @@ static int lpass_cdc_va_macro_enable_tx(struct snd_soc_dapm_widget *w,
|
|||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case SND_SOC_DAPM_POST_PMU:
|
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,
|
ret = lpass_cdc_clk_rsc_request_clock(va_priv->dev,
|
||||||
va_priv->default_clk_id,
|
va_priv->default_clk_id,
|
||||||
TX_CORE_CLK,
|
TX_CORE_CLK,
|
||||||
false);
|
false);
|
||||||
va_priv->tx_clk_status--;
|
va_priv->dapm_tx_clk_status--;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SND_SOC_DAPM_PRE_PMD:
|
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,
|
TX_CORE_CLK,
|
||||||
true);
|
true);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
va_priv->tx_clk_status++;
|
va_priv->dapm_tx_clk_status++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
dev_err(va_priv->dev,
|
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 SWR_INPUT", NULL, "VA_SWR_PWR"},
|
||||||
|
|
||||||
{"VA_AIF1 CAP", NULL, "VA_SWR_CLK"},
|
{"VA SWR_INPUT", NULL, "VA_SWR_CLK"},
|
||||||
{"VA_AIF2 CAP", NULL, "VA_SWR_CLK"},
|
|
||||||
{"VA_AIF3 CAP", NULL, "VA_SWR_CLK"},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char * const dec_mode_mux_text[] = {
|
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->clk_id = VA_CORE_CLK;
|
||||||
va_priv->default_clk_id = default_clk_id;
|
va_priv->default_clk_id = default_clk_id;
|
||||||
|
va_priv->current_clk_id = TX_CORE_CLK;
|
||||||
|
|
||||||
if (is_used_va_swr_gpio) {
|
if (is_used_va_swr_gpio) {
|
||||||
va_priv->reset_swr = true;
|
va_priv->reset_swr = true;
|
||||||
|
Reference in New Issue
Block a user