Commit a2befe93 authored by Jaroslav Kysela's avatar Jaroslav Kysela Committed by Takashi Iwai

ALSA: hda - fix the 'Capture Switch' value change notifications

The original code in the cap_put_caller() function does not
handle correctly the positive values returned from the passed
function for multiple iterations. It means that the change
notifications may be lost.

Fixes: 352f7f91 ("ALSA: hda - Merge Realtek parser code to generic parser")
BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=213851
Cc: <stable@kernel.org>
Signed-off-by: default avatarJaroslav Kysela <perex@perex.cz>
Link: https://lore.kernel.org/r/20210811161441.1325250-1-perex@perex.czSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent d07149ab
...@@ -3460,7 +3460,7 @@ static int cap_put_caller(struct snd_kcontrol *kcontrol, ...@@ -3460,7 +3460,7 @@ static int cap_put_caller(struct snd_kcontrol *kcontrol,
struct hda_gen_spec *spec = codec->spec; struct hda_gen_spec *spec = codec->spec;
const struct hda_input_mux *imux; const struct hda_input_mux *imux;
struct nid_path *path; struct nid_path *path;
int i, adc_idx, err = 0; int i, adc_idx, ret, err = 0;
imux = &spec->input_mux; imux = &spec->input_mux;
adc_idx = kcontrol->id.index; adc_idx = kcontrol->id.index;
...@@ -3470,9 +3470,13 @@ static int cap_put_caller(struct snd_kcontrol *kcontrol, ...@@ -3470,9 +3470,13 @@ static int cap_put_caller(struct snd_kcontrol *kcontrol,
if (!path || !path->ctls[type]) if (!path || !path->ctls[type])
continue; continue;
kcontrol->private_value = path->ctls[type]; kcontrol->private_value = path->ctls[type];
err = func(kcontrol, ucontrol); ret = func(kcontrol, ucontrol);
if (err < 0) if (ret < 0) {
err = ret;
break; break;
}
if (ret > 0)
err = 1;
} }
mutex_unlock(&codec->control_mutex); mutex_unlock(&codec->control_mutex);
if (err >= 0 && spec->cap_sync_hook) if (err >= 0 && spec->cap_sync_hook)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment