]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ALSA: usb-audio: Update Babyface Pro control caches only after successful writes
authorCássio Gabriel <cassiogabrielcontato@gmail.com>
Wed, 29 Apr 2026 13:20:02 +0000 (10:20 -0300)
committerTakashi Iwai <tiwai@suse.de>
Wed, 29 Apr 2026 15:16:16 +0000 (17:16 +0200)
snd_bbfpro_ctl_put() and snd_bbfpro_vol_put()
cache the requested packed control state in
kcontrol->private_value before issuing the USB write.

Their get and resume paths use that cached value directly,
so a failed write can leave the driver reporting and later
replaying a setting the hardware never accepted.

Update the cached state only after a successful USB write.

Fixes: 3e8f3bd04716 ("ALSA: usb-audio: RME Babyface Pro mixer patch")
Cc: stable@vger.kernel.org
Signed-off-by: Cássio Gabriel <cassiogabrielcontato@gmail.com>
Link: https://patch.msgid.link/20260429-alsa-usb-quirks-cache-rollback-v1-2-01b35c688b80@gmail.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/mixer_quirks.c

index 229be55e91580dcf26e57eb36d0218e4a4c1aacc..99975c3240a551f9a85cb10ee93f0d466295ff7a 100644 (file)
@@ -3027,12 +3027,14 @@ static int snd_bbfpro_ctl_put(struct snd_kcontrol *kcontrol,
        if (val == old_value)
                return 0;
 
+       err = snd_bbfpro_ctl_update(mixer, reg, idx, val);
+       if (err < 0)
+               return err;
+
        kcontrol->private_value = reg
                | ((idx & SND_BBFPRO_CTL_IDX_MASK) << SND_BBFPRO_CTL_IDX_SHIFT)
                | ((val & SND_BBFPRO_CTL_VAL_MASK) << SND_BBFPRO_CTL_VAL_SHIFT);
-
-       err = snd_bbfpro_ctl_update(mixer, reg, idx, val);
-       return err < 0 ? err : 1;
+       return 1;
 }
 
 static int snd_bbfpro_ctl_resume(struct usb_mixer_elem_list *list)
@@ -3217,11 +3219,13 @@ static int snd_bbfpro_vol_put(struct snd_kcontrol *kcontrol,
 
        new_val = uvalue & SND_BBFPRO_MIXER_VAL_MASK;
 
+       err = snd_bbfpro_vol_update(mixer, idx, new_val);
+       if (err < 0)
+               return err;
+
        kcontrol->private_value = idx
                | (new_val << SND_BBFPRO_MIXER_VAL_SHIFT);
-
-       err = snd_bbfpro_vol_update(mixer, idx, new_val);
-       return err < 0 ? err : 1;
+       return 1;
 }
 
 static int snd_bbfpro_vol_resume(struct usb_mixer_elem_list *list)