]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
ASoC: ops: Fix stereo change notifications in snd_soc_put_volsw()
authorMark Brown <broonie@kernel.org>
Tue, 1 Feb 2022 15:56:26 +0000 (15:56 +0000)
committerStefan Bader <stefan.bader@canonical.com>
Thu, 14 Apr 2022 09:32:22 +0000 (11:32 +0200)
BugLink: https://bugs.launchpad.net/bugs/1967582
commit 564778d7b1ea465f9487eedeece7527a033549c5 upstream.

When writing out a stereo control we discard the change notification from
the first channel, meaning that events are only generated based on changes
to the second channel. Ensure that we report a change if either channel
has changed.

Signed-off-by: Mark Brown <broonie@kernel.org>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20220201155629.120510-2-broonie@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
sound/soc/soc-ops.c

index ef8fd331526b0f1f88da4a39d1506bddda276136..aaec9b3f244a4b103325f1a3fded826090e9b1cb 100644 (file)
@@ -314,7 +314,7 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
        unsigned int sign_bit = mc->sign_bit;
        unsigned int mask = (1 << fls(max)) - 1;
        unsigned int invert = mc->invert;
-       int err;
+       int err, ret;
        bool type_2r = false;
        unsigned int val2 = 0;
        unsigned int val, val_mask;
@@ -356,12 +356,18 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
        err = snd_soc_component_update_bits(component, reg, val_mask, val);
        if (err < 0)
                return err;
+       ret = err;
 
-       if (type_2r)
+       if (type_2r) {
                err = snd_soc_component_update_bits(component, reg2, val_mask,
-                       val2);
+                                                   val2);
+               /* Don't discard any error code or drop change flag */
+               if (ret == 0 || err < 0) {
+                       ret = err;
+               }
+       }
 
-       return err;
+       return ret;
 }
 EXPORT_SYMBOL_GPL(snd_soc_put_volsw);