]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ASoC: fsl_xcvr: Fix event generation for cached controls
authorCássio Gabriel <cassiogabrielcontato@gmail.com>
Tue, 28 Apr 2026 03:07:08 +0000 (00:07 -0300)
committerMark Brown <broonie@kernel.org>
Mon, 4 May 2026 13:21:24 +0000 (22:21 +0900)
ALSA controls should return 1 from a put callback when the control
value changes. fsl_xcvr_capds_put() and fsl_xcvr_tx_cs_put() both
update cached control data but always return 0, so ALSA suppresses
change notifications for the Capabilities Data Structure and playback
IEC958 channel status controls.

Compare the old and new cached values before copying the new data,
and return whether the control value changed.

Fixes: 28564486866f ("ASoC: fsl_xcvr: Add XCVR ASoC CPU DAI driver")
Signed-off-by: Cássio Gabriel <cassiogabrielcontato@gmail.com>
Link: https://patch.msgid.link/20260428-asoc-fsl-xcvr-event-generation-v1-1-f21cf0812c4f@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/fsl/fsl_xcvr.c

index ee16cf681488c7eae5285a19d44212b3e97da350..6677d3bf36ec270684ced59ba78450f710e9e4ae 100644 (file)
@@ -228,10 +228,14 @@ static int fsl_xcvr_capds_put(struct snd_kcontrol *kcontrol,
 {
        struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
        struct fsl_xcvr *xcvr = snd_soc_dai_get_drvdata(dai);
+       int changed;
 
-       memcpy(xcvr->cap_ds, ucontrol->value.bytes.data, FSL_XCVR_CAPDS_SIZE);
+       changed = memcmp(xcvr->cap_ds, ucontrol->value.bytes.data,
+                        sizeof(xcvr->cap_ds)) != 0;
+       memcpy(xcvr->cap_ds, ucontrol->value.bytes.data,
+              sizeof(xcvr->cap_ds));
 
-       return 0;
+       return changed;
 }
 
 static struct snd_kcontrol_new fsl_xcvr_earc_capds_kctl = {
@@ -1040,10 +1044,15 @@ static int fsl_xcvr_tx_cs_put(struct snd_kcontrol *kcontrol,
 {
        struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
        struct fsl_xcvr *xcvr = snd_soc_dai_get_drvdata(dai);
+       int changed;
 
-       memcpy(xcvr->tx_iec958.status, ucontrol->value.iec958.status, 24);
+       changed = memcmp(xcvr->tx_iec958.status,
+                        ucontrol->value.iec958.status,
+                        sizeof(xcvr->tx_iec958.status)) != 0;
+       memcpy(xcvr->tx_iec958.status, ucontrol->value.iec958.status,
+              sizeof(xcvr->tx_iec958.status));
 
-       return 0;
+       return changed;
 }
 
 static struct snd_kcontrol_new fsl_xcvr_rx_ctls[] = {