asoc: bolero: Fix AMIC TX pop on bolero 2.1

For bolero 2.1, amic connect on any SWR input.
Update API to check amic usecase.

Change-Id: Iced7df39b0dbaf83e77a72536e55223d3bda2289
Signed-off-by: Laxminath Kasam <lkasam@codeaurora.org>
This commit is contained in:
Laxminath Kasam
2020-02-26 00:35:33 +05:30
committed by Gerrit - the friendly Code Review server
父節點 93afa626ed
當前提交 942fe13e42
共有 2 個文件被更改,包括 43 次插入23 次删除

查看文件

@@ -437,23 +437,31 @@ static int tx_macro_reg_wake_irq(struct snd_soc_component *component,
return ret; return ret;
} }
static int is_amic_enabled(struct snd_soc_component *component, int decimator) static bool is_amic_enabled(struct snd_soc_component *component, int decimator)
{ {
u16 adc_mux_reg = 0, adc_reg = 0; u16 adc_mux_reg = 0, adc_reg = 0;
u16 adc_n = BOLERO_ADC_MAX; u16 adc_n = BOLERO_ADC_MAX;
bool ret = false;
struct device *tx_dev = NULL;
struct tx_macro_priv *tx_priv = NULL;
if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
return ret;
adc_mux_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 + adc_mux_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 +
TX_MACRO_ADC_MUX_CFG_OFFSET * decimator; TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
if (snd_soc_component_read32(component, adc_mux_reg) & SWR_MIC) { if (snd_soc_component_read32(component, adc_mux_reg) & SWR_MIC) {
if (tx_priv->version == BOLERO_VERSION_2_1)
return true;
adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
TX_MACRO_ADC_MUX_CFG_OFFSET * decimator; TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
adc_n = snd_soc_component_read32(component, adc_reg) & adc_n = snd_soc_component_read32(component, adc_reg) &
TX_MACRO_SWR_MIC_MUX_SEL_MASK; TX_MACRO_SWR_MIC_MUX_SEL_MASK;
if (adc_n >= BOLERO_ADC_MAX) if (adc_n < BOLERO_ADC_MAX)
adc_n = BOLERO_ADC_MAX; return true;
} }
return adc_n; return ret;
} }
static void tx_macro_tx_hpf_corner_freq_callback(struct work_struct *work) static void tx_macro_tx_hpf_corner_freq_callback(struct work_struct *work)
@@ -464,7 +472,7 @@ static void tx_macro_tx_hpf_corner_freq_callback(struct work_struct *work)
struct snd_soc_component *component = NULL; struct snd_soc_component *component = NULL;
u16 dec_cfg_reg = 0, hpf_gate_reg = 0; u16 dec_cfg_reg = 0, hpf_gate_reg = 0;
u8 hpf_cut_off_freq = 0; u8 hpf_cut_off_freq = 0;
u16 adc_n = 0; u16 adc_reg = 0, adc_n = 0;
hpf_delayed_work = to_delayed_work(work); hpf_delayed_work = to_delayed_work(work);
hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork); hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork);
@@ -480,8 +488,11 @@ static void tx_macro_tx_hpf_corner_freq_callback(struct work_struct *work)
dev_dbg(component->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n", dev_dbg(component->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n",
__func__, hpf_work->decimator, hpf_cut_off_freq); __func__, hpf_work->decimator, hpf_cut_off_freq);
adc_n = is_amic_enabled(component, hpf_work->decimator); if (is_amic_enabled(component, hpf_work->decimator)) {
if (adc_n < BOLERO_ADC_MAX) { adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
TX_MACRO_ADC_MUX_CFG_OFFSET * hpf_work->decimator;
adc_n = snd_soc_component_read32(component, adc_reg) &
TX_MACRO_SWR_MIC_MUX_SEL_MASK;
/* analog mic clear TX hold */ /* analog mic clear TX hold */
bolero_clear_amic_tx_hold(component->dev, adc_n); bolero_clear_amic_tx_hold(component->dev, adc_n);
snd_soc_component_update_bits(component, snd_soc_component_update_bits(component,
@@ -904,7 +915,7 @@ static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,
case SND_SOC_DAPM_POST_PMU: case SND_SOC_DAPM_POST_PMU:
snd_soc_component_update_bits(component, snd_soc_component_update_bits(component,
tx_vol_ctl_reg, 0x20, 0x20); tx_vol_ctl_reg, 0x20, 0x20);
if (!(is_amic_enabled(component, decimator) < BOLERO_ADC_MAX)) { if (!is_amic_enabled(component, decimator)) {
snd_soc_component_update_bits(component, snd_soc_component_update_bits(component,
hpf_gate_reg, 0x01, 0x00); hpf_gate_reg, 0x01, 0x00);
/* /*
@@ -924,7 +935,7 @@ static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,
TX_HPF_CUT_OFF_FREQ_MASK, TX_HPF_CUT_OFF_FREQ_MASK,
CF_MIN_3DB_150HZ << 5); CF_MIN_3DB_150HZ << 5);
if (is_amic_enabled(component, decimator) < BOLERO_ADC_MAX) { if (is_amic_enabled(component, decimator)) {
hpf_delay = TX_MACRO_AMIC_HPF_DELAY_MS; hpf_delay = TX_MACRO_AMIC_HPF_DELAY_MS;
unmute_delay = TX_MACRO_AMIC_UNMUTE_DELAY_MS; unmute_delay = TX_MACRO_AMIC_UNMUTE_DELAY_MS;
} }
@@ -941,8 +952,7 @@ static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,
msecs_to_jiffies(hpf_delay)); msecs_to_jiffies(hpf_delay));
snd_soc_component_update_bits(component, snd_soc_component_update_bits(component,
hpf_gate_reg, 0x03, 0x02); hpf_gate_reg, 0x03, 0x02);
if (!(is_amic_enabled(component, decimator) if (!is_amic_enabled(component, decimator))
< BOLERO_ADC_MAX))
snd_soc_component_update_bits(component, snd_soc_component_update_bits(component,
hpf_gate_reg, 0x03, 0x00); hpf_gate_reg, 0x03, 0x00);
/* /*
@@ -1017,7 +1027,7 @@ static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,
component, dec_cfg_reg, component, dec_cfg_reg,
TX_HPF_CUT_OFF_FREQ_MASK, TX_HPF_CUT_OFF_FREQ_MASK,
hpf_cut_off_freq << 5); hpf_cut_off_freq << 5);
if (is_amic_enabled(component, decimator) < BOLERO_ADC_MAX) if (is_amic_enabled(component, decimator))
snd_soc_component_update_bits(component, snd_soc_component_update_bits(component,
hpf_gate_reg, hpf_gate_reg,
0x03, 0x02); 0x03, 0x02);

查看文件

@@ -790,23 +790,31 @@ done:
return ret; return ret;
} }
static int is_amic_enabled(struct snd_soc_component *component, int decimator) static bool is_amic_enabled(struct snd_soc_component *component, int decimator)
{ {
u16 adc_mux_reg = 0, adc_reg = 0; u16 adc_mux_reg = 0, adc_reg = 0;
u16 adc_n = BOLERO_ADC_MAX; u16 adc_n = BOLERO_ADC_MAX;
bool ret = false;
struct device *va_dev = NULL;
struct va_macro_priv *va_priv = NULL;
if (!va_macro_get_data(component, &va_dev, &va_priv, __func__))
return ret;
adc_mux_reg = BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG1 + adc_mux_reg = BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG1 +
VA_MACRO_ADC_MUX_CFG_OFFSET * decimator; VA_MACRO_ADC_MUX_CFG_OFFSET * decimator;
if (snd_soc_component_read32(component, adc_mux_reg) & SWR_MIC) { if (snd_soc_component_read32(component, adc_mux_reg) & SWR_MIC) {
if (va_priv->version == BOLERO_VERSION_2_1)
return true;
adc_reg = BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0 + adc_reg = BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0 +
VA_MACRO_ADC_MUX_CFG_OFFSET * decimator; VA_MACRO_ADC_MUX_CFG_OFFSET * decimator;
adc_n = snd_soc_component_read32(component, adc_reg) & adc_n = snd_soc_component_read32(component, adc_reg) &
VA_MACRO_SWR_MIC_MUX_SEL_MASK; VA_MACRO_SWR_MIC_MUX_SEL_MASK;
if (adc_n >= BOLERO_ADC_MAX) if (adc_n < BOLERO_ADC_MAX)
adc_n = BOLERO_ADC_MAX; return true;
} }
return adc_n; return ret;
} }
static void va_macro_tx_hpf_corner_freq_callback(struct work_struct *work) static void va_macro_tx_hpf_corner_freq_callback(struct work_struct *work)
@@ -817,7 +825,7 @@ static void va_macro_tx_hpf_corner_freq_callback(struct work_struct *work)
struct snd_soc_component *component; struct snd_soc_component *component;
u16 dec_cfg_reg, hpf_gate_reg; u16 dec_cfg_reg, hpf_gate_reg;
u8 hpf_cut_off_freq; u8 hpf_cut_off_freq;
u16 adc_n = 0; u16 adc_reg = 0, adc_n = 0;
hpf_delayed_work = to_delayed_work(work); hpf_delayed_work = to_delayed_work(work);
hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork); hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork);
@@ -833,8 +841,11 @@ static void va_macro_tx_hpf_corner_freq_callback(struct work_struct *work)
dev_dbg(va_priv->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n", dev_dbg(va_priv->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n",
__func__, hpf_work->decimator, hpf_cut_off_freq); __func__, hpf_work->decimator, hpf_cut_off_freq);
adc_n = is_amic_enabled(component, hpf_work->decimator); if (is_amic_enabled(component, hpf_work->decimator)) {
if (adc_n < BOLERO_ADC_MAX) { adc_reg = BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0 +
VA_MACRO_ADC_MUX_CFG_OFFSET * hpf_work->decimator;
adc_n = snd_soc_component_read32(component, adc_reg) &
VA_MACRO_SWR_MIC_MUX_SEL_MASK;
/* analog mic clear TX hold */ /* analog mic clear TX hold */
bolero_clear_amic_tx_hold(component->dev, adc_n); bolero_clear_amic_tx_hold(component->dev, adc_n);
snd_soc_component_update_bits(component, snd_soc_component_update_bits(component,
@@ -1137,7 +1148,7 @@ static int va_macro_enable_dec(struct snd_soc_dapm_widget *w,
/* Enable TX CLK */ /* Enable TX CLK */
snd_soc_component_update_bits(component, snd_soc_component_update_bits(component,
tx_vol_ctl_reg, 0x20, 0x20); tx_vol_ctl_reg, 0x20, 0x20);
if (!(is_amic_enabled(component, decimator) < BOLERO_ADC_MAX)) { if (!is_amic_enabled(component, decimator)) {
snd_soc_component_update_bits(component, snd_soc_component_update_bits(component,
hpf_gate_reg, 0x01, 0x00); hpf_gate_reg, 0x01, 0x00);
/* /*
@@ -1164,7 +1175,7 @@ static int va_macro_enable_dec(struct snd_soc_dapm_widget *w,
} }
snd_soc_component_update_bits(component, snd_soc_component_update_bits(component,
hpf_gate_reg, 0x03, 0x02); hpf_gate_reg, 0x03, 0x02);
if (!(is_amic_enabled(component, decimator) < BOLERO_ADC_MAX)) if (!is_amic_enabled(component, decimator))
snd_soc_component_update_bits(component, snd_soc_component_update_bits(component,
hpf_gate_reg, 0x03, 0x00); hpf_gate_reg, 0x03, 0x00);
/* /*
@@ -1228,8 +1239,7 @@ static int va_macro_enable_dec(struct snd_soc_dapm_widget *w,
dec_cfg_reg, dec_cfg_reg,
TX_HPF_CUT_OFF_FREQ_MASK, TX_HPF_CUT_OFF_FREQ_MASK,
hpf_cut_off_freq << 5); hpf_cut_off_freq << 5);
if (is_amic_enabled(component, decimator) < if (is_amic_enabled(component, decimator))
BOLERO_ADC_MAX)
snd_soc_component_update_bits(component, snd_soc_component_update_bits(component,
hpf_gate_reg, hpf_gate_reg,
0x03, 0x02); 0x03, 0x02);