Merge "asoc: optimize the logic of aux/ear gain pa set"

This commit is contained in:
qctecmdr 2024-04-09 10:57:09 -07:00 committed by Gerrit - the friendly Code Review server
commit 055c2ae6fd

View File

@ -175,8 +175,6 @@ enum {
ADC_MODE_LP,
};
static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(ear_pa_gain, 600, -1800);
static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(aux_pa_gain, 600, -600);
static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(analog_gain, 0, 3000);
static int wcd9378_reset(struct device *dev);
@ -2820,6 +2818,96 @@ static int wcd9378_hph_get_gain(struct snd_kcontrol *kcontrol,
return 0;
}
static int wcd9378_ear_pa_gain_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *component =
snd_soc_kcontrol_component(kcontrol);
int ear_gain = 0;
if (component == NULL)
return -EINVAL;
ear_gain =
snd_soc_component_read(component, WCD9378_ANA_EAR_COMPANDER_CTL) &
WCD9378_ANA_EAR_COMPANDER_CTL_EAR_GAIN_MASK;
ucontrol->value.enumerated.item[0] = ear_gain;
dev_dbg(component->dev, "%s: get ear_gain val: 0x%x\n",
__func__, ear_gain);
return 0;
}
static int wcd9378_ear_pa_gain_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *component =
snd_soc_kcontrol_component(kcontrol);
int ear_gain = 0;
if (component == NULL)
return -EINVAL;
if (ucontrol->value.integer.value[0] < 0 ||
ucontrol->value.integer.value[0] > 0x10) {
dev_err(component->dev, "%s: Unsupported gain val %ld\n",
__func__, ucontrol->value.integer.value[0]);
return -EINVAL;
}
ear_gain = ucontrol->value.integer.value[0];
snd_soc_component_update_bits(component, WCD9378_ANA_EAR_COMPANDER_CTL,
WCD9378_ANA_EAR_COMPANDER_CTL_EAR_GAIN_MASK,
ear_gain);
dev_dbg(component->dev, "%s: set ear_gain val: 0x%x\n",
__func__, ear_gain);
return 0;
}
static int wcd9378_aux_pa_gain_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *component =
snd_soc_kcontrol_component(kcontrol);
int aux_gain = 0;
if (component == NULL)
return -EINVAL;
aux_gain = snd_soc_component_read(component, WCD9378_AUX_INT_MISC) &
WCD9378_AUX_INT_MISC_PA_GAIN_MASK;
ucontrol->value.enumerated.item[0] = aux_gain;
dev_dbg(component->dev, "%s: get aux_gain val: 0x%x\n",
__func__, aux_gain);
return 0;
}
static int wcd9378_aux_pa_gain_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *component =
snd_soc_kcontrol_component(kcontrol);
int aux_gain = 0;
if (component == NULL)
return -EINVAL;
if (ucontrol->value.integer.value[0] < 0 ||
ucontrol->value.integer.value[0] > 0x8) {
dev_err(component->dev, "%s: Unsupported gain val %ld\n",
__func__, ucontrol->value.integer.value[0]);
return -EINVAL;
}
aux_gain = ucontrol->value.integer.value[0];
snd_soc_component_update_bits(component, WCD9378_AUX_INT_MISC,
WCD9378_AUX_INT_MISC_PA_GAIN_MASK,
aux_gain);
dev_dbg(component->dev, "%s: set aux_gain val: 0x%x\n",
__func__, aux_gain);
return 0;
}
static int wcd9378_rx2_mode_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
@ -2883,46 +2971,6 @@ int wcd9378_codec_get_dev_num(struct snd_soc_component *component)
}
EXPORT_SYMBOL_GPL(wcd9378_codec_get_dev_num);
static int wcd9378_ear_pa_put_gain(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *component =
snd_soc_kcontrol_component(kcontrol);
struct wcd9378_priv *wcd9378 =
snd_soc_component_get_drvdata(component);
if (wcd9378->comp1_enable) {
dev_err(component->dev, "Can not set EAR PA Gain, compander1 is enabled\n");
return -EINVAL;
}
snd_soc_component_update_bits(component, WCD9378_AUX_INT_MISC,
WCD9378_ANA_EAR_COMPANDER_CTL_EAR_GAIN_MASK,
ucontrol->value.integer.value[0]);
return 1;
}
static int wcd9378_aux_pa_put_gain(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *component =
snd_soc_kcontrol_component(kcontrol);
struct wcd9378_priv *wcd9378 =
snd_soc_component_get_drvdata(component);
if (wcd9378->comp1_enable) {
dev_err(component->dev, "Can not set EAR PA Gain, compander1 is enabled\n");
return -EINVAL;
}
snd_soc_component_update_bits(component, WCD9378_ANA_EAR_COMPANDER_CTL,
WCD9378_AUX_INT_MISC_PA_GAIN_MASK,
ucontrol->value.integer.value[0]);
return 1;
}
static int wcd9378_get_compander(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
@ -3023,17 +3071,6 @@ static int wcd9378_codec_enable_vdd_buck(struct snd_soc_dapm_widget *w,
return 0;
}
const char * const tx_master_ch_text[] = {
"ZERO", "SWRM_TX1_CH1", "SWRM_TX1_CH2", "SWRM_TX1_CH3", "SWRM_TX1_CH4",
"SWRM_TX2_CH1", "SWRM_TX2_CH2", "SWRM_TX2_CH3", "SWRM_TX2_CH4",
"SWRM_TX3_CH1", "SWRM_TX3_CH2", "SWRM_TX3_CH3", "SWRM_TX3_CH4",
"SWRM_PCM_IN",
};
const struct soc_enum tx_master_ch_enum =
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tx_master_ch_text),
tx_master_ch_text);
static void wcd9378_tx_get_slave_ch_type_idx(const char *wname, int *ch_idx)
{
u8 ch_type = 0;
@ -3199,6 +3236,38 @@ static const struct soc_enum rx_hph_mode_mux_enum =
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text),
rx_hph_mode_mux_text);
static const char * const ear_pa_gain_text[] = {
"GAIN_6DB", "GAIN_4P5DB", "GAIN_3DB", "GAIN_1P5DB", "GAIN_0DB",
"GAIN_M1P5DB", "GAIN_M3DB", "GAIN_M4P5DB", "GAIN_M6DB",
"GAIN_M7P5DB", "GAIN_M9DB", "GAIN_M10P5DB", "GAIN_M12DB",
"GAIN_M13P5DB", "GAIN_M15DB", "GAIN_M16P5DB", "GAIN_M18DB",
};
static const struct soc_enum ear_pa_gain_enum =
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ear_pa_gain_text),
ear_pa_gain_text);
static const char * const aux_pa_gain_text[] = {
"GAIN_6DB", "GAIN_4P5DB", "GAIN_3DB", "GAIN_1P5DB", "GAIN_0DB",
"GAIN_M1P5DB", "GAIN_M3DB", "GAIN_M4P5DB", "GAIN_M6DB",
};
static const struct soc_enum aux_pa_gain_enum =
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(aux_pa_gain_text),
aux_pa_gain_text);
const char * const tx_master_ch_text[] = {
"ZERO", "SWRM_TX1_CH1", "SWRM_TX1_CH2", "SWRM_TX1_CH3", "SWRM_TX1_CH4",
"SWRM_TX2_CH1", "SWRM_TX2_CH2", "SWRM_TX2_CH3", "SWRM_TX2_CH4",
"SWRM_TX3_CH1", "SWRM_TX3_CH2", "SWRM_TX3_CH3", "SWRM_TX3_CH4",
"SWRM_PCM_IN",
};
const struct soc_enum tx_master_ch_enum =
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tx_master_ch_text),
tx_master_ch_text);
static const struct snd_kcontrol_new wcd9378_snd_controls[] = {
SOC_SINGLE_EXT("HPHL_COMP Switch", SND_SOC_NOPM, 0, 1, 0,
wcd9378_get_compander, wcd9378_set_compander),
@ -3222,15 +3291,15 @@ static const struct snd_kcontrol_new wcd9378_snd_controls[] = {
wcd9378_tx_mode_get, wcd9378_tx_mode_put),
SOC_ENUM_EXT("RX2 Mode", rx2_mode_enum,
NULL, wcd9378_rx2_mode_put),
NULL, wcd9378_rx2_mode_put),
SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum,
wcd9378_rx_hph_mode_get, wcd9378_rx_hph_mode_put),
wcd9378_rx_hph_mode_get, wcd9378_rx_hph_mode_put),
SOC_SINGLE_EXT("HPH Volume", SND_SOC_NOPM, 0, 0x14, 0,
wcd9378_hph_get_gain, wcd9378_hph_put_gain),
WCD9378_EAR_PA_GAIN_TLV("EAR_PA Volume", WCD9378_ANA_EAR_COMPANDER_CTL,
2, 0x10, 0, ear_pa_gain),
WCD9378_AUX_PA_GAIN_TLV("AUX_PA Volume", WCD9378_AUX_INT_MISC,
0, 0x8, 0, aux_pa_gain),
wcd9378_hph_get_gain, wcd9378_hph_put_gain),
SOC_ENUM_EXT("EAR_PA Gain", ear_pa_gain_enum,
wcd9378_ear_pa_gain_get, wcd9378_ear_pa_gain_put),
SOC_ENUM_EXT("AUX_PA Gain", aux_pa_gain_enum,
wcd9378_aux_pa_gain_get, wcd9378_aux_pa_gain_put),
SOC_SINGLE_TLV("ADC1 Volume", WCD9378_ANA_TX_CH1, 0, 20, 0,
analog_gain),
@ -3261,7 +3330,6 @@ static const struct snd_kcontrol_new wcd9378_snd_controls[] = {
wcd9378_tx_master_ch_get, wcd9378_tx_master_ch_put),
};
static const struct snd_kcontrol_new amic1_switch[] = {
SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0)
};