Unverified Commit e8446a4a authored by Cássio Gabriel's avatar Cássio Gabriel Committed by Mark Brown
Browse files

ASoC: fsl_xcvr: Fix event generation for cached controls



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: 28564486 ("ASoC: fsl_xcvr: Add XCVR ASoC CPU DAI driver")
Signed-off-by: default avatarCássio Gabriel <cassiogabrielcontato@gmail.com>
Link: https://patch.msgid.link/20260428-asoc-fsl-xcvr-event-generation-v1-1-f21cf0812c4f@gmail.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 56d5a9ea
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -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[] = {