ASoC: dapm: Fix snd_soc_dapm_put_volsw() connect
snd_soc_dapm_put_volsw() sets connect incorrectly in the case max > 1 with invert. In that case, the raw disconnect value should be max, which corresponds to the userspace value 0. This use case currently does not appear upstream, but it could break SOC_DAPM_SINGLE() or SOC_DAPM_SINGLE_TLV() elsewhere or in the future. Signed-off-by: Benoît Thébaudeau <benoit.thebaudeau@advansee.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
Родитель
adf643aba8
Коммит
8a720718b3
|
@ -2515,19 +2515,13 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
|
||||||
int wi;
|
int wi;
|
||||||
|
|
||||||
val = (ucontrol->value.integer.value[0] & mask);
|
val = (ucontrol->value.integer.value[0] & mask);
|
||||||
|
connect = !!val;
|
||||||
|
|
||||||
if (invert)
|
if (invert)
|
||||||
val = max - val;
|
val = max - val;
|
||||||
mask = mask << shift;
|
mask = mask << shift;
|
||||||
val = val << shift;
|
val = val << shift;
|
||||||
|
|
||||||
if (val)
|
|
||||||
/* new connection */
|
|
||||||
connect = invert ? 0 : 1;
|
|
||||||
else
|
|
||||||
/* old connection must be powered down */
|
|
||||||
connect = invert ? 1 : 0;
|
|
||||||
|
|
||||||
mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
||||||
|
|
||||||
change = snd_soc_test_bits(widget->codec, reg, mask, val);
|
change = snd_soc_test_bits(widget->codec, reg, mask, val);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче