Commit 9af6d956 authored by Laim Girdwood's avatar Laim Girdwood Committed by Jaroslav Kysela

[ALSA] soc - Add support for passing kcontrols with events

Signed-off-by: default avatarLaim Girdwood <lg@opensource.wolfsonmicro.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarJaroslav Kysela <perex@perex.cz>
parent 6c59e6c4
...@@ -289,7 +289,7 @@ struct snd_soc_dapm_widget { ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment