Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 591bf123 authored by Jaroslav Kysela's avatar Jaroslav Kysela Committed by Sasha Levin
Browse files

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

[ Upstream commit a2befe9380dd04ee76c871568deca00eedf89134 ]

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.cz


Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 61eb2ee2
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -3442,7 +3442,7 @@ static int cap_put_caller(struct snd_kcontrol *kcontrol,
	struct hda_gen_spec *spec = codec->spec;
	const struct hda_input_mux *imux;
	struct nid_path *path;
	int i, adc_idx, err = 0;
	int i, adc_idx, ret, err = 0;

	imux = &spec->input_mux;
	adc_idx = kcontrol->id.index;
@@ -3452,10 +3452,14 @@ static int cap_put_caller(struct snd_kcontrol *kcontrol,
		if (!path || !path->ctls[type])
			continue;
		kcontrol->private_value = path->ctls[type];
		err = func(kcontrol, ucontrol);
		if (err < 0)
		ret = func(kcontrol, ucontrol);
		if (ret < 0) {
			err = ret;
			break;
		}
		if (ret > 0)
			err = 1;
	}
	mutex_unlock(&codec->control_mutex);
	if (err >= 0 && spec->cap_sync_hook)
		spec->cap_sync_hook(codec, kcontrol, ucontrol);