forked from luck/tmp_suning_uos_patched
ASoC: DAPM: Cover regression by kctl change notification fix
commit 827b0913a9d9d07a0c3e559dbb20ca4d6d285a54 upstream. The recent fix for DAPM to correct the kctl change notification by the commit 5af82c81b2c4 ("ASoC: DAPM: Fix missing kctl change notifications") caused other regressions since it changed the behavior of snd_soc_dapm_set_pin() that is called from several API functions. Formerly it returned always 0 for success, but now it returns 0 or 1. This patch addresses it, restoring the old behavior of snd_soc_dapm_set_pin() while keeping the fix in snd_soc_dapm_put_pin_switch(). Fixes: 5af82c81b2c4 ("ASoC: DAPM: Fix missing kctl change notifications") Reported-by: Yu-Hsuan Hsu <yuhsuan@chromium.org> Cc: <stable@vger.kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de> Link: https://lore.kernel.org/r/20211105090925.20575-1-tiwai@suse.de Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
b17dd53cac
commit
6186c7b9bd
|
@ -2555,7 +2555,12 @@ static struct snd_soc_dapm_widget *dapm_find_widget(
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
|
/*
|
||||||
|
* set the DAPM pin status:
|
||||||
|
* returns 1 when the value has been updated, 0 when unchanged, or a negative
|
||||||
|
* error code; called from kcontrol put callback
|
||||||
|
*/
|
||||||
|
static int __snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
|
||||||
const char *pin, int status)
|
const char *pin, int status)
|
||||||
{
|
{
|
||||||
struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
|
struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
|
||||||
|
@ -2582,6 +2587,18 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* similar as __snd_soc_dapm_set_pin(), but returns 0 when successful;
|
||||||
|
* called from several API functions below
|
||||||
|
*/
|
||||||
|
static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
|
||||||
|
const char *pin, int status)
|
||||||
|
{
|
||||||
|
int ret = __snd_soc_dapm_set_pin(dapm, pin, status);
|
||||||
|
|
||||||
|
return ret < 0 ? ret : 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* snd_soc_dapm_sync_unlocked - scan and power dapm paths
|
* snd_soc_dapm_sync_unlocked - scan and power dapm paths
|
||||||
* @dapm: DAPM context
|
* @dapm: DAPM context
|
||||||
|
@ -3586,10 +3603,10 @@ int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
|
||||||
const char *pin = (const char *)kcontrol->private_value;
|
const char *pin = (const char *)kcontrol->private_value;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (ucontrol->value.integer.value[0])
|
mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
||||||
ret = snd_soc_dapm_enable_pin(&card->dapm, pin);
|
ret = __snd_soc_dapm_set_pin(&card->dapm, pin,
|
||||||
else
|
!!ucontrol->value.integer.value[0]);
|
||||||
ret = snd_soc_dapm_disable_pin(&card->dapm, pin);
|
mutex_unlock(&card->dapm_mutex);
|
||||||
|
|
||||||
snd_soc_dapm_sync(&card->dapm);
|
snd_soc_dapm_sync(&card->dapm);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user