]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
ASoC: da7219: Fix change notifications for tone generator frequency
authorMark Brown <broonie@kernel.org>
Wed, 20 Apr 2022 13:34:37 +0000 (14:34 +0100)
committerStefan Bader <stefan.bader@canonical.com>
Wed, 22 Jun 2022 12:23:11 +0000 (14:23 +0200)
BugLink: https://bugs.launchpad.net/bugs/1978240
commit 08ef48404965cfef99343d6bbbcf75b88c74aa0e upstream.

The tone generator frequency control just returns 0 on successful write,
not a boolean value indicating if there was a change or not.  Compare
what was written with the value that was there previously so that
notifications are generated appropriately when the value changes.

Signed-off-by: Mark Brown <broonie@kernel.org>
Reviewed-by: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20220420133437.569229-1-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/codecs/da7219.c

index 13009d08b09ac5ed3271ffdc66b60d7d57cd1b41..c7493549a9a506a538c6575d7b620eaed7d0436a 100644 (file)
@@ -446,7 +446,7 @@ static int da7219_tonegen_freq_put(struct snd_kcontrol *kcontrol,
        struct soc_mixer_control *mixer_ctrl =
                (struct soc_mixer_control *) kcontrol->private_value;
        unsigned int reg = mixer_ctrl->reg;
-       __le16 val;
+       __le16 val_new, val_old;
        int ret;
 
        /*
@@ -454,13 +454,19 @@ static int da7219_tonegen_freq_put(struct snd_kcontrol *kcontrol,
         * Therefore we need to convert to little endian here to align with
         * HW registers.
         */
-       val = cpu_to_le16(ucontrol->value.integer.value[0]);
+       val_new = cpu_to_le16(ucontrol->value.integer.value[0]);
 
        mutex_lock(&da7219->ctrl_lock);
-       ret = regmap_raw_write(da7219->regmap, reg, &val, sizeof(val));
+       ret = regmap_raw_read(da7219->regmap, reg, &val_old, sizeof(val_old));
+       if (ret == 0 && (val_old != val_new))
+               ret = regmap_raw_write(da7219->regmap, reg,
+                               &val_new, sizeof(val_new));
        mutex_unlock(&da7219->ctrl_lock);
 
-       return ret;
+       if (ret < 0)
+               return ret;
+
+       return val_old != val_new;
 }