ASoC: dapm: lock mixer & mux update power with DAPM mutex
Both snd_soc_dapm_mux_update_power() and snd_soc_dapm_mixer_update_power() can be called internally within DAPM core (with DAPM mutex held) and externally. Provide some wrappers so that external users of both functions do not have to remember to hold the DAPM mutex. Signed-off-by: Liam Girdwood <lrg@ti.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
Родитель
a73fb2df01
Коммит
4edbb34577
|
@ -1719,7 +1719,7 @@ static inline void dapm_debugfs_cleanup(struct snd_soc_dapm_context *dapm)
|
|||
#endif
|
||||
|
||||
/* test and update the power status of a mux widget */
|
||||
int snd_soc_dapm_mux_update_power(struct snd_soc_dapm_widget *widget,
|
||||
static int soc_dapm_mux_update_power(struct snd_soc_dapm_widget *widget,
|
||||
struct snd_kcontrol *kcontrol, int mux, struct soc_enum *e)
|
||||
{
|
||||
struct snd_soc_dapm_path *path;
|
||||
|
@ -1758,10 +1758,22 @@ int snd_soc_dapm_mux_update_power(struct snd_soc_dapm_widget *widget,
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int snd_soc_dapm_mux_update_power(struct snd_soc_dapm_widget *widget,
|
||||
struct snd_kcontrol *kcontrol, int mux, struct soc_enum *e)
|
||||
{
|
||||
struct snd_soc_card *card = widget->dapm->card;
|
||||
int ret;
|
||||
|
||||
mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_PCM);
|
||||
ret = soc_dapm_mux_update_power(widget, kcontrol, mux, e);
|
||||
mutex_unlock(&card->dapm_mutex);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_dapm_mux_update_power);
|
||||
|
||||
/* test and update the power status of a mixer or switch widget */
|
||||
int snd_soc_dapm_mixer_update_power(struct snd_soc_dapm_widget *widget,
|
||||
static int soc_dapm_mixer_update_power(struct snd_soc_dapm_widget *widget,
|
||||
struct snd_kcontrol *kcontrol, int connect)
|
||||
{
|
||||
struct snd_soc_dapm_path *path;
|
||||
|
@ -1790,6 +1802,18 @@ int snd_soc_dapm_mixer_update_power(struct snd_soc_dapm_widget *widget,
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int snd_soc_dapm_mixer_update_power(struct snd_soc_dapm_widget *widget,
|
||||
struct snd_kcontrol *kcontrol, int connect)
|
||||
{
|
||||
struct snd_soc_card *card = widget->dapm->card;
|
||||
int ret;
|
||||
|
||||
mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_PCM);
|
||||
ret = soc_dapm_mixer_update_power(widget, kcontrol, connect);
|
||||
mutex_unlock(&card->dapm_mutex);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_dapm_mixer_update_power);
|
||||
|
||||
/* show dapm widget status in sys fs */
|
||||
|
@ -2393,7 +2417,7 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
|
|||
update.val = val;
|
||||
widget->dapm->update = &update;
|
||||
|
||||
snd_soc_dapm_mixer_update_power(widget, kcontrol, connect);
|
||||
soc_dapm_mixer_update_power(widget, kcontrol, connect);
|
||||
|
||||
widget->dapm->update = NULL;
|
||||
}
|
||||
|
@ -2485,7 +2509,7 @@ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
|
|||
update.val = val;
|
||||
widget->dapm->update = &update;
|
||||
|
||||
snd_soc_dapm_mux_update_power(widget, kcontrol, mux, e);
|
||||
soc_dapm_mux_update_power(widget, kcontrol, mux, e);
|
||||
|
||||
widget->dapm->update = NULL;
|
||||
}
|
||||
|
@ -2547,7 +2571,7 @@ int snd_soc_dapm_put_enum_virt(struct snd_kcontrol *kcontrol,
|
|||
|
||||
widget->value = ucontrol->value.enumerated.item[0];
|
||||
|
||||
snd_soc_dapm_mux_update_power(widget, kcontrol, widget->value, e);
|
||||
soc_dapm_mux_update_power(widget, kcontrol, widget->value, e);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2651,7 +2675,7 @@ int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol,
|
|||
update.val = val;
|
||||
widget->dapm->update = &update;
|
||||
|
||||
snd_soc_dapm_mux_update_power(widget, kcontrol, mux, e);
|
||||
soc_dapm_mux_update_power(widget, kcontrol, mux, e);
|
||||
|
||||
widget->dapm->update = NULL;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче