ASoC: snd_soc_new_{mixer,mux,pga} make sure to use right DAPM context
Currently it is possible that snd_soc_new_{mixer,mux,pga} is called with a DAPM context not matching the widgets context. This can lead to a wrong prefix_len calculation, which will result in undefined behaviour. To avoid this always use the DAPM context from the widget itself. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Acked-by: Liam Girdwood <lrg@ti.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Cc: stable@kernel.org
This commit is contained in:
Родитель
0cd114fff9
Коммит
4b80b8c2ee
|
@ -350,9 +350,9 @@ static int dapm_is_shared_kcontrol(struct snd_soc_dapm_context *dapm,
|
|||
}
|
||||
|
||||
/* create new dapm mixer control */
|
||||
static int dapm_new_mixer(struct snd_soc_dapm_context *dapm,
|
||||
struct snd_soc_dapm_widget *w)
|
||||
static int dapm_new_mixer(struct snd_soc_dapm_widget *w)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm = w->dapm;
|
||||
int i, ret = 0;
|
||||
size_t name_len, prefix_len;
|
||||
struct snd_soc_dapm_path *path;
|
||||
|
@ -450,9 +450,9 @@ static int dapm_new_mixer(struct snd_soc_dapm_context *dapm,
|
|||
}
|
||||
|
||||
/* create new dapm mux control */
|
||||
static int dapm_new_mux(struct snd_soc_dapm_context *dapm,
|
||||
struct snd_soc_dapm_widget *w)
|
||||
static int dapm_new_mux(struct snd_soc_dapm_widget *w)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm = w->dapm;
|
||||
struct snd_soc_dapm_path *path = NULL;
|
||||
struct snd_kcontrol *kcontrol;
|
||||
struct snd_card *card = dapm->card->snd_card;
|
||||
|
@ -535,8 +535,7 @@ static int dapm_new_mux(struct snd_soc_dapm_context *dapm,
|
|||
}
|
||||
|
||||
/* create new dapm volume control */
|
||||
static int dapm_new_pga(struct snd_soc_dapm_context *dapm,
|
||||
struct snd_soc_dapm_widget *w)
|
||||
static int dapm_new_pga(struct snd_soc_dapm_widget *w)
|
||||
{
|
||||
if (w->num_kcontrols)
|
||||
dev_err(w->dapm->dev,
|
||||
|
@ -1826,13 +1825,13 @@ int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm)
|
|||
case snd_soc_dapm_mixer:
|
||||
case snd_soc_dapm_mixer_named_ctl:
|
||||
w->power_check = dapm_generic_check_power;
|
||||
dapm_new_mixer(dapm, w);
|
||||
dapm_new_mixer(w);
|
||||
break;
|
||||
case snd_soc_dapm_mux:
|
||||
case snd_soc_dapm_virt_mux:
|
||||
case snd_soc_dapm_value_mux:
|
||||
w->power_check = dapm_generic_check_power;
|
||||
dapm_new_mux(dapm, w);
|
||||
dapm_new_mux(w);
|
||||
break;
|
||||
case snd_soc_dapm_adc:
|
||||
case snd_soc_dapm_aif_out:
|
||||
|
@ -1845,7 +1844,7 @@ int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm)
|
|||
case snd_soc_dapm_pga:
|
||||
case snd_soc_dapm_out_drv:
|
||||
w->power_check = dapm_generic_check_power;
|
||||
dapm_new_pga(dapm, w);
|
||||
dapm_new_pga(w);
|
||||
break;
|
||||
case snd_soc_dapm_input:
|
||||
case snd_soc_dapm_output:
|
||||
|
|
Загрузка…
Ссылка в новой задаче