ASoC: dapm: Make sure register value is in sync with DAPM kcontrol state
Commit c9e065c27fe9 ("ASoC: dapm: Make sure to always update the DAPM graph in _put_volsw()") stopped updating register values in those cases where initial after boot state of kcontrol appears to not change but where register value still needs update because it is not in sync with the kcontrol state. Fix this by doing snd_soc_test_bits() unconditionally as it was before but by using separate flags for kcontrol and register state changes. This allow both DAPM graph to be updated when disabling auto-muted control and update register if it is out-of-sync in respect of kcontrol state. Signed-off-by: Jarkko Nikula <jarkko.nikula@linux.intel.com> Acked-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
parent
e1d4d3c854
commit
18626c7ebc
@ -2755,7 +2755,7 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
|
||||
unsigned int mask = (1 << fls(max)) - 1;
|
||||
unsigned int invert = mc->invert;
|
||||
unsigned int val;
|
||||
int connect, change;
|
||||
int connect, change, reg_change = 0;
|
||||
struct snd_soc_dapm_update update;
|
||||
int ret = 0;
|
||||
|
||||
@ -2773,20 +2773,23 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
|
||||
mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
||||
|
||||
change = dapm_kcontrol_set_value(kcontrol, val);
|
||||
if (change) {
|
||||
if (reg != SND_SOC_NOPM) {
|
||||
mask = mask << shift;
|
||||
val = val << shift;
|
||||
|
||||
if (snd_soc_test_bits(codec, reg, mask, val)) {
|
||||
update.kcontrol = kcontrol;
|
||||
update.reg = reg;
|
||||
update.mask = mask;
|
||||
update.val = val;
|
||||
card->update = &update;
|
||||
}
|
||||
if (reg != SND_SOC_NOPM) {
|
||||
mask = mask << shift;
|
||||
val = val << shift;
|
||||
|
||||
reg_change = snd_soc_test_bits(codec, reg, mask, val);
|
||||
}
|
||||
|
||||
if (change || reg_change) {
|
||||
if (reg_change) {
|
||||
update.kcontrol = kcontrol;
|
||||
update.reg = reg;
|
||||
update.mask = mask;
|
||||
update.val = val;
|
||||
card->update = &update;
|
||||
}
|
||||
change |= reg_change;
|
||||
|
||||
ret = soc_dapm_mixer_update_power(card, kcontrol, connect);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user