[PATCH v2 02/10] ASoC: tegra: Fix kcontrol put callback in I2S

Sameer Pujar
2021-11-03T13:53:18Z

that change notifications are sent to subscribed applications. Update
the I2S driver accordingly.

Fixes: c0bfa98349d1 ("ASoC: tegra: Add Tegra210 based I2S driver")
Suggested-by: Jaroslav Kysela <perex@perex.cz>
Suggested-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sameer Pujar <spujar@nvidia.com>
---
sound/soc/tegra/tegra210_i2s.c | 26 +++++++++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/sound/soc/tegra/tegra210_i2s.c b/sound/soc/tegra/tegra210_i2s.c
index 45f31cc..70505b5 100644
--- a/sound/soc/tegra/tegra210_i2s.c
+++ b/sound/soc/tegra/tegra210_i2s.c
@@ -347,6 +347,9 @@ static int tegra210_i2s_put_control(struct snd_kcontrol *kcontrol,
int value = ucontrol->value.integer.value[0];

if (strstr(kcontrol->id.name, "Loopback")) {
+ if (i2s->loopback == value)
+ return 0;
+
i2s->loopback = value;

regmap_update_bits(i2s->regmap, TEGRA210_I2S_CTRL,
@@ -362,6 +365,9 @@ static int tegra210_i2s_put_control(struct snd_kcontrol *kcontrol,
* cases mixer control is used to update custom values. A value
* of "N" here means, width is "N + 1" bit clock wide.
*/
+ if (i2s->fsync_width == value)
+ return 0;
+
i2s->fsync_width = value;

regmap_update_bits(i2s->regmap, TEGRA210_I2S_CTRL,
@@ -369,20 +375,38 @@ static int tegra210_i2s_put_control(struct snd_kcontrol *kcontrol,
i2s->fsync_width << I2S_FSYNC_WIDTH_SHIFT);

} else if (strstr(kcontrol->id.name, "Capture Stereo To Mono")) {
+ if (i2s->stereo_to_mono[I2S_TX_PATH] == value)
+ return 0;
+
i2s->stereo_to_mono[I2S_TX_PATH] = value;
} else if (strstr(kcontrol->id.name, "Capture Mono To Stereo")) {
+ if (i2s->mono_to_stereo[I2S_TX_PATH] == value)
+ return 0;
+
i2s->mono_to_stereo[I2S_TX_PATH] = value;
} else if (strstr(kcontrol->id.name, "Playback Stereo To Mono")) {
+ if (i2s->stereo_to_mono[I2S_RX_PATH] == value)
+ return 0;
+
i2s->stereo_to_mono[I2S_RX_PATH] = value;
} else if (strstr(kcontrol->id.name, "Playback Mono To Stereo")) {
+ if (i2s->mono_to_stereo[I2S_RX_PATH] == value)
+ return 0;
+
i2s->mono_to_stereo[I2S_RX_PATH] = value;
} else if (strstr(kcontrol->id.name, "Playback FIFO Threshold")) {
+ if (i2s->rx_fifo_th == value)
+ return 0;
+
i2s->rx_fifo_th = value;
} else if (strstr(kcontrol->id.name, "BCLK Ratio")) {
+ if (i2s->bclk_ratio == value)
+ return 0;
+
i2s->bclk_ratio = value;
}

- return 0;
+ return 1;
}

static int tegra210_i2s_set_timing_params(struct device *dev,
--
2.7.4