ASoC: max9768: Fix event generation for playback mute
authorMark Brown <broonie@kernel.org>
Tue, 12 Nov 2024 13:09:50 +0000 (13:09 +0000)
committerMark Brown <broonie@kernel.org>
Tue, 12 Nov 2024 13:16:37 +0000 (13:16 +0000)
The max9768 has a custom control for playback mute which unconditionally
returns 0 from the put() operation, rather than returning 1 on change to
ensure notifications are generated to userspace. Check to see if the value
has changed and return appropriately.

Signed-off-by: Mark Brown <broonie@kernel.org>
Link: https://patch.msgid.link/20241112-asoc-max9768-event-v1-1-ba5d50599787@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/max9768.c

index e4793a5d179efced38c8f04de5e49f4cf67a17a1..8af3c7e5317fbb0c47baa40b90f8799b9b3d3e8a 100644 (file)
@@ -54,10 +54,17 @@ static int max9768_set_gpio(struct snd_kcontrol *kcontrol,
 {
        struct snd_soc_component *c = snd_soc_kcontrol_component(kcontrol);
        struct max9768 *max9768 = snd_soc_component_get_drvdata(c);
+       bool val = !ucontrol->value.integer.value[0];
+       int ret;
 
-       gpiod_set_value_cansleep(max9768->mute, !ucontrol->value.integer.value[0]);
+       if (val != gpiod_get_value_cansleep(max9768->mute))
+               ret = 1;
+       else
+               ret = 0;
 
-       return 0;
+       gpiod_set_value_cansleep(max9768->mute, val);
+
+       return ret;
 }
 
 static const DECLARE_TLV_DB_RANGE(volume_tlv,