[ALSA] soc - Add support for passing kcontrols with events
Signed-off-by: Laim Girdwood <lg@opensource.wolfsonmicro.com> Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
6c59e6c412
commit
9af6d95624
2 changed files with 28 additions and 14 deletions
|
@ -289,7 +289,7 @@ struct snd_soc_dapm_widget {
|
||||||
|
|
||||||
/* external events */
|
/* external events */
|
||||||
unsigned short event_flags; /* flags to specify event types */
|
unsigned short event_flags; /* flags to specify event types */
|
||||||
int (*event)(struct snd_soc_dapm_widget*, int);
|
int (*event)(struct snd_soc_dapm_widget*, struct snd_kcontrol *, int);
|
||||||
|
|
||||||
/* kcontrols that relate to this widget */
|
/* kcontrols that relate to this widget */
|
||||||
int num_kcontrols;
|
int num_kcontrols;
|
||||||
|
|
|
@ -523,11 +523,13 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (event == SND_SOC_DAPM_STREAM_START) {
|
if (event == SND_SOC_DAPM_STREAM_START) {
|
||||||
ret = w->event(w, SND_SOC_DAPM_PRE_PMU);
|
ret = w->event(w,
|
||||||
|
NULL, SND_SOC_DAPM_PRE_PMU);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
} else if (event == SND_SOC_DAPM_STREAM_STOP) {
|
} else if (event == SND_SOC_DAPM_STREAM_STOP) {
|
||||||
ret = w->event(w, SND_SOC_DAPM_PRE_PMD);
|
ret = w->event(w,
|
||||||
|
NULL, SND_SOC_DAPM_PRE_PMD);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -538,11 +540,13 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (event == SND_SOC_DAPM_STREAM_START) {
|
if (event == SND_SOC_DAPM_STREAM_START) {
|
||||||
ret = w->event(w, SND_SOC_DAPM_POST_PMU);
|
ret = w->event(w,
|
||||||
|
NULL, SND_SOC_DAPM_POST_PMU);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
} else if (event == SND_SOC_DAPM_STREAM_STOP) {
|
} else if (event == SND_SOC_DAPM_STREAM_STOP) {
|
||||||
ret = w->event(w, SND_SOC_DAPM_POST_PMD);
|
ret = w->event(w,
|
||||||
|
NULL, SND_SOC_DAPM_POST_PMD);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -566,26 +570,30 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
|
||||||
if (power) {
|
if (power) {
|
||||||
/* power up event */
|
/* power up event */
|
||||||
if (w->event_flags & SND_SOC_DAPM_PRE_PMU) {
|
if (w->event_flags & SND_SOC_DAPM_PRE_PMU) {
|
||||||
ret = w->event(w, SND_SOC_DAPM_PRE_PMU);
|
ret = w->event(w,
|
||||||
|
NULL, SND_SOC_DAPM_PRE_PMU);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
dapm_update_bits(w);
|
dapm_update_bits(w);
|
||||||
if (w->event_flags & SND_SOC_DAPM_POST_PMU){
|
if (w->event_flags & SND_SOC_DAPM_POST_PMU){
|
||||||
ret = w->event(w, SND_SOC_DAPM_POST_PMU);
|
ret = w->event(w,
|
||||||
|
NULL, SND_SOC_DAPM_POST_PMU);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* power down event */
|
/* power down event */
|
||||||
if (w->event_flags & SND_SOC_DAPM_PRE_PMD) {
|
if (w->event_flags & SND_SOC_DAPM_PRE_PMD) {
|
||||||
ret = w->event(w, SND_SOC_DAPM_PRE_PMD);
|
ret = w->event(w,
|
||||||
|
NULL, SND_SOC_DAPM_PRE_PMD);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
dapm_update_bits(w);
|
dapm_update_bits(w);
|
||||||
if (w->event_flags & SND_SOC_DAPM_POST_PMD) {
|
if (w->event_flags & SND_SOC_DAPM_POST_PMD) {
|
||||||
ret = w->event(w, SND_SOC_DAPM_POST_PMD);
|
ret = w->event(w,
|
||||||
|
NULL, SND_SOC_DAPM_POST_PMD);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1095,13 +1103,17 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
|
||||||
dapm_mixer_update_power(widget, kcontrol, reg, val_mask, val, invert);
|
dapm_mixer_update_power(widget, kcontrol, reg, val_mask, val, invert);
|
||||||
if (widget->event) {
|
if (widget->event) {
|
||||||
if (widget->event_flags & SND_SOC_DAPM_PRE_REG) {
|
if (widget->event_flags & SND_SOC_DAPM_PRE_REG) {
|
||||||
ret = widget->event(widget, SND_SOC_DAPM_PRE_REG);
|
ret = widget->event(widget, kcontrol,
|
||||||
if (ret < 0)
|
SND_SOC_DAPM_PRE_REG);
|
||||||
|
if (ret < 0) {
|
||||||
|
ret = 1;
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ret = snd_soc_update_bits(widget->codec, reg, val_mask, val);
|
ret = snd_soc_update_bits(widget->codec, reg, val_mask, val);
|
||||||
if (widget->event_flags & SND_SOC_DAPM_POST_REG)
|
if (widget->event_flags & SND_SOC_DAPM_POST_REG)
|
||||||
ret = widget->event(widget, SND_SOC_DAPM_POST_REG);
|
ret = widget->event(widget, kcontrol,
|
||||||
|
SND_SOC_DAPM_POST_REG);
|
||||||
} else
|
} else
|
||||||
ret = snd_soc_update_bits(widget->codec, reg, val_mask, val);
|
ret = snd_soc_update_bits(widget->codec, reg, val_mask, val);
|
||||||
|
|
||||||
|
@ -1176,13 +1188,15 @@ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
|
||||||
dapm_mux_update_power(widget, kcontrol, mask, mux, e);
|
dapm_mux_update_power(widget, kcontrol, mask, mux, e);
|
||||||
if (widget->event) {
|
if (widget->event) {
|
||||||
if (widget->event_flags & SND_SOC_DAPM_PRE_REG) {
|
if (widget->event_flags & SND_SOC_DAPM_PRE_REG) {
|
||||||
ret = widget->event(widget, SND_SOC_DAPM_PRE_REG);
|
ret = widget->event(widget,
|
||||||
|
kcontrol, SND_SOC_DAPM_PRE_REG);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
ret = snd_soc_update_bits(widget->codec, e->reg, mask, val);
|
ret = snd_soc_update_bits(widget->codec, e->reg, mask, val);
|
||||||
if (widget->event_flags & SND_SOC_DAPM_POST_REG)
|
if (widget->event_flags & SND_SOC_DAPM_POST_REG)
|
||||||
ret = widget->event(widget, SND_SOC_DAPM_POST_REG);
|
ret = widget->event(widget,
|
||||||
|
kcontrol, SND_SOC_DAPM_POST_REG);
|
||||||
} else
|
} else
|
||||||
ret = snd_soc_update_bits(widget->codec, e->reg, mask, val);
|
ret = snd_soc_update_bits(widget->codec, e->reg, mask, val);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue