Skip to content

Commit

Permalink
ASoC: tegra: Fix kcontrol put callback in MVC
Browse files Browse the repository at this point in the history
The kcontrol put callback is expected to return 1 when there is change
in HW or when the update is acknowledged by driver. This would ensure
that change notifications are sent to subscribed applications. Filter
out duplicate updates in MVC driver.

Fixes: e539891 ("ASoC: tegra: Add Tegra210 based MVC driver")
Signed-off-by: Sameer Pujar <[email protected]>
Suggested-by: Jaroslav Kysela <[email protected]>
Suggested-by: Mark Brown <[email protected]>
Reviewed-by: Takashi Iwai <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Mark Brown <[email protected]>
  • Loading branch information
pujars authored and broonie committed Nov 18, 2021
1 parent a4e3795 commit c7b34b5
Showing 1 changed file with 18 additions and 4 deletions.
22 changes: 18 additions & 4 deletions sound/soc/tegra/tegra210_mvc.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ static int tegra210_mvc_put_mute(struct snd_kcontrol *kcontrol,
struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
struct tegra210_mvc *mvc = snd_soc_component_get_drvdata(cmpnt);
unsigned int value;
u8 mute_mask;
u8 new_mask, old_mask;
int err;

pm_runtime_get_sync(cmpnt->dev);
Expand All @@ -148,11 +148,19 @@ static int tegra210_mvc_put_mute(struct snd_kcontrol *kcontrol,
if (err < 0)
goto end;

mute_mask = ucontrol->value.integer.value[0];
regmap_read(mvc->regmap, TEGRA210_MVC_CTRL, &value);

old_mask = (value >> TEGRA210_MVC_MUTE_SHIFT) & TEGRA210_MUTE_MASK_EN;
new_mask = ucontrol->value.integer.value[0];

if (new_mask == old_mask) {
err = 0;
goto end;
}

err = regmap_update_bits(mvc->regmap, mc->reg,
TEGRA210_MVC_MUTE_MASK,
mute_mask << TEGRA210_MVC_MUTE_SHIFT);
new_mask << TEGRA210_MVC_MUTE_SHIFT);
if (err < 0)
goto end;

Expand Down Expand Up @@ -195,7 +203,7 @@ static int tegra210_mvc_put_vol(struct snd_kcontrol *kcontrol,
unsigned int reg = mc->reg;
unsigned int value;
u8 chan;
int err;
int err, old_volume;

pm_runtime_get_sync(cmpnt->dev);

Expand All @@ -207,10 +215,16 @@ static int tegra210_mvc_put_vol(struct snd_kcontrol *kcontrol,
goto end;

chan = (reg - TEGRA210_MVC_TARGET_VOL) / REG_SIZE;
old_volume = mvc->volume[chan];

tegra210_mvc_conv_vol(mvc, chan,
ucontrol->value.integer.value[0]);

if (mvc->volume[chan] == old_volume) {
err = 0;
goto end;
}

/* Configure init volume same as target volume */
regmap_write(mvc->regmap,
TEGRA210_MVC_REG_OFFSET(TEGRA210_MVC_INIT_VOL, chan),
Expand Down

0 comments on commit c7b34b5

Please sign in to comment.