|
@@ -665,6 +665,9 @@ static int is_connected_output_ep(struct snd_soc_dapm_widget *widget)
|
|
|
struct snd_soc_dapm_path *path;
|
|
|
int con = 0;
|
|
|
|
|
|
+ if (widget->outputs >= 0)
|
|
|
+ return widget->outputs;
|
|
|
+
|
|
|
DAPM_UPDATE_STAT(widget, path_checks);
|
|
|
|
|
|
if (widget->id == snd_soc_dapm_supply)
|
|
@@ -673,21 +676,29 @@ static int is_connected_output_ep(struct snd_soc_dapm_widget *widget)
|
|
|
switch (widget->id) {
|
|
|
case snd_soc_dapm_adc:
|
|
|
case snd_soc_dapm_aif_out:
|
|
|
- if (widget->active)
|
|
|
- return snd_soc_dapm_suspend_check(widget);
|
|
|
+ if (widget->active) {
|
|
|
+ widget->outputs = snd_soc_dapm_suspend_check(widget);
|
|
|
+ return widget->outputs;
|
|
|
+ }
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
if (widget->connected) {
|
|
|
/* connected pin ? */
|
|
|
- if (widget->id == snd_soc_dapm_output && !widget->ext)
|
|
|
- return snd_soc_dapm_suspend_check(widget);
|
|
|
+ if (widget->id == snd_soc_dapm_output && !widget->ext) {
|
|
|
+ widget->outputs = snd_soc_dapm_suspend_check(widget);
|
|
|
+ return widget->outputs;
|
|
|
+ }
|
|
|
|
|
|
/* connected jack or spk ? */
|
|
|
- if (widget->id == snd_soc_dapm_hp || widget->id == snd_soc_dapm_spk ||
|
|
|
- (widget->id == snd_soc_dapm_line && !list_empty(&widget->sources)))
|
|
|
- return snd_soc_dapm_suspend_check(widget);
|
|
|
+ if (widget->id == snd_soc_dapm_hp ||
|
|
|
+ widget->id == snd_soc_dapm_spk ||
|
|
|
+ (widget->id == snd_soc_dapm_line &&
|
|
|
+ !list_empty(&widget->sources))) {
|
|
|
+ widget->outputs = snd_soc_dapm_suspend_check(widget);
|
|
|
+ return widget->outputs;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
list_for_each_entry(path, &widget->sinks, list_source) {
|
|
@@ -705,6 +716,8 @@ static int is_connected_output_ep(struct snd_soc_dapm_widget *widget)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ widget->outputs = con;
|
|
|
+
|
|
|
return con;
|
|
|
}
|
|
|
|
|
@@ -717,6 +730,9 @@ static int is_connected_input_ep(struct snd_soc_dapm_widget *widget)
|
|
|
struct snd_soc_dapm_path *path;
|
|
|
int con = 0;
|
|
|
|
|
|
+ if (widget->inputs >= 0)
|
|
|
+ return widget->inputs;
|
|
|
+
|
|
|
DAPM_UPDATE_STAT(widget, path_checks);
|
|
|
|
|
|
if (widget->id == snd_soc_dapm_supply)
|
|
@@ -726,25 +742,35 @@ static int is_connected_input_ep(struct snd_soc_dapm_widget *widget)
|
|
|
switch (widget->id) {
|
|
|
case snd_soc_dapm_dac:
|
|
|
case snd_soc_dapm_aif_in:
|
|
|
- if (widget->active)
|
|
|
- return snd_soc_dapm_suspend_check(widget);
|
|
|
+ if (widget->active) {
|
|
|
+ widget->inputs = snd_soc_dapm_suspend_check(widget);
|
|
|
+ return widget->inputs;
|
|
|
+ }
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
if (widget->connected) {
|
|
|
/* connected pin ? */
|
|
|
- if (widget->id == snd_soc_dapm_input && !widget->ext)
|
|
|
- return snd_soc_dapm_suspend_check(widget);
|
|
|
+ if (widget->id == snd_soc_dapm_input && !widget->ext) {
|
|
|
+ widget->inputs = snd_soc_dapm_suspend_check(widget);
|
|
|
+ return widget->inputs;
|
|
|
+ }
|
|
|
|
|
|
/* connected VMID/Bias for lower pops */
|
|
|
- if (widget->id == snd_soc_dapm_vmid)
|
|
|
- return snd_soc_dapm_suspend_check(widget);
|
|
|
+ if (widget->id == snd_soc_dapm_vmid) {
|
|
|
+ widget->inputs = snd_soc_dapm_suspend_check(widget);
|
|
|
+ return widget->inputs;
|
|
|
+ }
|
|
|
|
|
|
/* connected jack ? */
|
|
|
if (widget->id == snd_soc_dapm_mic ||
|
|
|
- (widget->id == snd_soc_dapm_line && !list_empty(&widget->sinks)))
|
|
|
- return snd_soc_dapm_suspend_check(widget);
|
|
|
+ (widget->id == snd_soc_dapm_line &&
|
|
|
+ !list_empty(&widget->sinks))) {
|
|
|
+ widget->inputs = snd_soc_dapm_suspend_check(widget);
|
|
|
+ return widget->inputs;
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
list_for_each_entry(path, &widget->sources, list_sink) {
|
|
@@ -762,6 +788,8 @@ static int is_connected_input_ep(struct snd_soc_dapm_widget *widget)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ widget->inputs = con;
|
|
|
+
|
|
|
return con;
|
|
|
}
|
|
|
|
|
@@ -1335,6 +1363,8 @@ static int dapm_power_widgets(struct snd_soc_dapm_context *dapm, int event)
|
|
|
|
|
|
list_for_each_entry(w, &card->widgets, list) {
|
|
|
w->power_checked = false;
|
|
|
+ w->inputs = -1;
|
|
|
+ w->outputs = -1;
|
|
|
}
|
|
|
|
|
|
/* Check which widgets we need to power and store them in
|