mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 06:34:12 +08:00
ASoC: qcom: volume fixes and codec cleanups
Merge series from Johan Hovold <johan+linaro@kernel.org>: To reduce the risk of speaker damage the PA gain needs to be limited on machines like the Lenovo Thinkpad X13s until we have active speaker protection in place. Limit the gain to the current default setting provided by the UCM configuration which most user have so far been using (due to a bug in the configuration files which prevented hardware volume control [1]). The wsa883x PA volume control also turned out to be broken, which meant that the default setting used by UCM configuration is actually the lowest level (-3 dB). With the codec driver fixed, hardware volume control also works as expected. Note that the new wsa884x driver most likely suffers from a similar bug, I'll send a fix for that once I've got that confirmed. Included is also a related fix for the LPASS WSA macro driver, which was changing the digital gain setting behind the back of user space and which can result in excessive (or too low) digital gain. There are further Qualcomm codec drivers that similarly appear to manipulate various gain settings, but on closer inspection it turns out that they only write back the current settings. Tests reveal that these writes are indeed needed for any prior updates to take effect (at least for the WSA and RX macros). [1] https://github.com/alsa-project/alsa-ucm-conf/pull/382
This commit is contained in:
commit
7c70825d16
@ -1584,7 +1584,6 @@ static int wsa_macro_enable_interpolator(struct snd_soc_dapm_widget *w,
|
||||
u16 gain_reg;
|
||||
u16 reg;
|
||||
int val;
|
||||
int offset_val = 0;
|
||||
struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
|
||||
|
||||
if (w->shift == WSA_MACRO_COMP1) {
|
||||
@ -1623,10 +1622,8 @@ static int wsa_macro_enable_interpolator(struct snd_soc_dapm_widget *w,
|
||||
CDC_WSA_RX1_RX_PATH_MIX_SEC0,
|
||||
CDC_WSA_RX_PGA_HALF_DB_MASK,
|
||||
CDC_WSA_RX_PGA_HALF_DB_ENABLE);
|
||||
offset_val = -2;
|
||||
}
|
||||
val = snd_soc_component_read(component, gain_reg);
|
||||
val += offset_val;
|
||||
snd_soc_component_write(component, gain_reg, val);
|
||||
wsa_macro_config_ear_spkr_gain(component, wsa,
|
||||
event, gain_reg);
|
||||
@ -1654,10 +1651,6 @@ static int wsa_macro_enable_interpolator(struct snd_soc_dapm_widget *w,
|
||||
CDC_WSA_RX1_RX_PATH_MIX_SEC0,
|
||||
CDC_WSA_RX_PGA_HALF_DB_MASK,
|
||||
CDC_WSA_RX_PGA_HALF_DB_DISABLE);
|
||||
offset_val = 2;
|
||||
val = snd_soc_component_read(component, gain_reg);
|
||||
val += offset_val;
|
||||
snd_soc_component_write(component, gain_reg, val);
|
||||
}
|
||||
wsa_macro_config_ear_spkr_gain(component, wsa,
|
||||
event, gain_reg);
|
||||
|
@ -3033,7 +3033,6 @@ static int wcd9335_codec_enable_mix_path(struct snd_soc_dapm_widget *w,
|
||||
{
|
||||
struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
|
||||
u16 gain_reg;
|
||||
int offset_val = 0;
|
||||
int val = 0;
|
||||
|
||||
switch (w->reg) {
|
||||
@ -3073,7 +3072,6 @@ static int wcd9335_codec_enable_mix_path(struct snd_soc_dapm_widget *w,
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
val = snd_soc_component_read(comp, gain_reg);
|
||||
val += offset_val;
|
||||
snd_soc_component_write(comp, gain_reg, val);
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
@ -3294,7 +3292,6 @@ static int wcd9335_codec_enable_interpolator(struct snd_soc_dapm_widget *w,
|
||||
u16 gain_reg;
|
||||
u16 reg;
|
||||
int val;
|
||||
int offset_val = 0;
|
||||
|
||||
if (!(snd_soc_dapm_widget_name_cmp(w, "RX INT0 INTERP"))) {
|
||||
reg = WCD9335_CDC_RX0_RX_PATH_CTL;
|
||||
@ -3337,7 +3334,6 @@ static int wcd9335_codec_enable_interpolator(struct snd_soc_dapm_widget *w,
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
wcd9335_config_compander(comp, w->shift, event);
|
||||
val = snd_soc_component_read(comp, gain_reg);
|
||||
val += offset_val;
|
||||
snd_soc_component_write(comp, gain_reg, val);
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
|
@ -1098,7 +1098,11 @@ static int wsa_dev_mode_put(struct snd_kcontrol *kcontrol,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const DECLARE_TLV_DB_SCALE(pa_gain, -300, 150, -300);
|
||||
static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(pa_gain,
|
||||
0, 14, TLV_DB_SCALE_ITEM(-300, 0, 0),
|
||||
15, 29, TLV_DB_SCALE_ITEM(-300, 150, 0),
|
||||
30, 31, TLV_DB_SCALE_ITEM(1800, 0, 0),
|
||||
);
|
||||
|
||||
static int wsa883x_get_swr_port(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
|
Loading…
Reference in New Issue
Block a user