diff mbox series

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

Message ID 20210811161441.1325250-1-perex@perex.cz (mailing list archive)
State Accepted
Commit a2befe9380dd04ee76c871568deca00eedf89134
Headers show
Series ALSA: hda - fix the 'Capture Switch' value change notifications | expand

Commit Message

Jaroslav Kysela Aug. 11, 2021, 4:14 p.m. UTC
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: 352f7f914ebb ("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: Jaroslav Kysela <perex@perex.cz>
---
 sound/pci/hda/hda_generic.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

Comments

Takashi Iwai Aug. 12, 2021, 11:39 a.m. UTC | #1
On Wed, 11 Aug 2021 18:14:41 +0200,
Jaroslav Kysela wrote:
> 
> 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: 352f7f914ebb ("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: Jaroslav Kysela <perex@perex.cz>

Thanks, applied.


Takashi
diff mbox series

Patch

diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
index e97d00585e8e..481d8f8d3396 100644
--- a/sound/pci/hda/hda_generic.c
+++ b/sound/pci/hda/hda_generic.c
@@ -3460,7 +3460,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;
@@ -3470,9 +3470,13 @@  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)