asoc: codecs: Add noise gating register writes

Read noise gate mode from device tree,
set NG2 based on the register read or
set to idle detect mode

Change-Id: Id1e478ad230125d1e35229493cb0fbd6867c6a3b
Signed-off-by: Shazmaan Ali <quic_shazmaan@quicinc.com>
This commit is contained in:
Shazmaan Ali
2022-01-14 17:25:33 -08:00
committed by Gerrit - the friendly Code Review server
parent 823dd9bab9
commit 152f664978
2 changed files with 48 additions and 1 deletions

View File

@@ -41,6 +41,7 @@
#define WSA884X_TEMP_RETRY 3
#define PBR_MAX_VOLTAGE 20
#define PBR_MAX_CODE 255
#define WSA884X_IDLE_DETECT_NG_BLOCK_MASK 0x38
#define MAX_NAME_LEN 40
#define WSA884X_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\
@@ -58,6 +59,13 @@
WSA884X_##register_name, FIELD_MASK(register_name, field_name), \
value << FIELD_SHIFT(register_name, field_name)
enum {
IDLE_DETECT,
NG1,
NG2,
NG3,
};
struct wsa_temp_register {
u8 d1_msb;
u8 d1_lsb;
@@ -693,6 +701,29 @@ static int wsa884x_set_pbr_parameters(struct snd_soc_component *component)
return 0;
}
static void wsa_noise_gate_write(struct snd_soc_component *component,
int imode)
{
switch (imode) {
case NG1:
snd_soc_component_update_bits(component, WSA884X_PA_FSM_CTL1,
WSA884X_IDLE_DETECT_NG_BLOCK_MASK, 0x30);
break;
case NG2:
snd_soc_component_update_bits(component, WSA884X_PA_FSM_CTL1,
WSA884X_IDLE_DETECT_NG_BLOCK_MASK, 0x28);
break;
case NG3:
snd_soc_component_update_bits(component, WSA884X_PA_FSM_CTL1,
WSA884X_IDLE_DETECT_NG_BLOCK_MASK, 0x18);
break;
default:
snd_soc_component_update_bits(component, WSA884X_PA_FSM_CTL1,
WSA884X_IDLE_DETECT_NG_BLOCK_MASK, 0x8);
break;
}
}
static const char * const wsa_dev_mode_text[] = {
"speaker", "receiver"
};
@@ -1491,6 +1522,7 @@ static void wsa884x_codec_init(struct snd_soc_component *component)
if (wsa884x->variant == WSA8845H)
snd_soc_component_update_bits(wsa884x->component,
REG_FIELD_VALUE(DRE_CTL_1, CSR_GAIN_EN, 0x01));
wsa_noise_gate_write(component, wsa884x->noise_gate_mode);
}
@@ -1877,6 +1909,7 @@ static int wsa884x_swr_probe(struct swr_device *pdev)
bool pin_state_current = false;
struct wsa_ctrl_platform_data *plat_data = NULL;
struct snd_soc_component *component;
u32 noise_gate_mode;
char buffer[MAX_NAME_LEN];
int dev_index = 0;
struct regmap_irq_chip *wsa884x_sub_regmap_irq_chip = NULL;
@@ -2092,6 +2125,20 @@ static int wsa884x_swr_probe(struct swr_device *pdev)
goto err_mem;
}
ret = of_property_read_u32(wsa884x->macro_dev->dev.of_node,
"qcom,noise-gate-mode", &noise_gate_mode);
if (ret) {
dev_info(&pdev->dev,
"%s: Failed to read wsa noise gate mode\n",
__func__);
wsa884x->noise_gate_mode = IDLE_DETECT;
} else {
if(IDLE_DETECT <= noise_gate_mode && noise_gate_mode <= NG3)
wsa884x->noise_gate_mode = noise_gate_mode;
else
wsa884x->noise_gate_mode = IDLE_DETECT;
}
if (!of_find_property(wsa884x->macro_dev->dev.of_node,
"qcom,wsa-system-gains", &sys_gain_size)) {
dev_err(&pdev->dev,
@@ -2114,7 +2161,6 @@ static int wsa884x_swr_probe(struct swr_device *pdev)
}
wsa884x->system_gain = wsa884x->sys_gains[
wsa884x->dev_mode + (dev_index - 1) * 2];
} else {
dev_err(&pdev->dev, "%s: parent dev not found\n",
__func__);