asoc: codecs: Change LPASS DRE to use WSA sys_gain and bat_cfg

Can now set these registers during init once these values are
acquired.
Method called again before playback in case there are
speaker/recv changes.

Change-Id: I1b544633a660e98acadf94b9589b7656edebdd56
Signed-off-by: Matthew Rice <quic_mrice@quicinc.com>
This commit is contained in:
Matthew Rice
2022-02-07 10:26:35 -08:00
committed by Gerrit - the friendly Code Review server
parent 448e5c5a77
commit f97140fce0

View File

@@ -130,19 +130,6 @@ enum {
INTn_2_INP_SEL_RX8,
};
enum {
WSA_MODE_21DB,
WSA_MODE_19P5DB,
WSA_MODE_18DB,
WSA_MODE_16P5DB,
WSA_MODE_15DB,
WSA_MODE_13P5DB,
WSA_MODE_12DB,
WSA_MODE_10P5DB,
WSA_MODE_9DB,
WSA_MODE_MAX
};
enum {
INTERP_RX0,
INTERP_RX1
@@ -160,7 +147,7 @@ enum {
INTERP_MIX_PATH,
};
static struct lpass_cdc_comp_setting comp_setting_table[WSA_MODE_MAX] = {
static struct lpass_cdc_comp_setting comp_setting_table[G_MAX_DB] = {
{42, 0, 42},
{39, 0, 42},
{36, 0, 42},
@@ -1454,7 +1441,9 @@ static int lpass_cdc_wsa_macro_config_compander(struct snd_soc_component *compon
u16 comp_ctl0_reg, comp_ctl8_reg, rx_path_cfg0_reg;
struct device *wsa_dev = NULL;
struct lpass_cdc_wsa_macro_priv *wsa_priv = NULL;
struct lpass_cdc_comp_setting *comp_settings = NULL;
u16 mode = 0;
int sys_gain, bat_cfg, sys_gain_int, upper_gain, lower_gain;
if (!lpass_cdc_wsa_macro_get_data(component, &wsa_dev, &wsa_priv, __func__))
return -EINVAL;
@@ -1472,11 +1461,49 @@ static int lpass_cdc_wsa_macro_config_compander(struct snd_soc_component *compon
(comp * LPASS_CDC_WSA_MACRO_RX_COMP_OFFSET);
rx_path_cfg0_reg = LPASS_CDC_WSA_RX0_RX_PATH_CFG0 +
(comp * LPASS_CDC_WSA_MACRO_RX_PATH_OFFSET);
comp_settings = &comp_setting_table[mode];
/* If System has battery configuration */
if (wsa_priv->wsa_bat_cfg[comp]) {
sys_gain = wsa_priv->wsa_sys_gain[comp * 2 + wsa_priv->wsa_spkrrecv];
bat_cfg = wsa_priv->wsa_bat_cfg[comp];
/* Convert enum to value and
* multiply all values by 10 to avoid float
*/
sys_gain_int = -15 * sys_gain + 210;
switch (bat_cfg) {
case CONFIG_1S:
case EXT_1S:
if (sys_gain > G_13P5_DB) {
upper_gain = sys_gain_int + 60;
lower_gain = 0;
} else {
upper_gain = 210;
lower_gain = 0;
}
break;
case CONFIG_3S:
case EXT_3S:
upper_gain = sys_gain_int;
lower_gain = 75;
case EXT_ABOVE_3S:
upper_gain = sys_gain_int;
lower_gain = 120;
break;
default:
upper_gain = sys_gain_int;
lower_gain = 0;
break;
}
/* Truncate after calculation */
comp_settings->lower_gain_int = (lower_gain * 2) / 10;
comp_settings->upper_gain_int = (upper_gain * 2) / 10;
}
if (SND_SOC_DAPM_EVENT_ON(event)) {
lpass_cdc_update_compander_setting(component,
comp_ctl8_reg,
&comp_setting_table[mode]);
comp_settings);
/* Enable Compander Clock */
snd_soc_component_update_bits(component, comp_ctl0_reg,
0x01, 0x01);