|
@@ -517,8 +517,8 @@ static int soc_dapm_update_bits(struct snd_soc_dapm_context *dapm,
|
|
|
{
|
|
|
if (!dapm->component)
|
|
|
return -EIO;
|
|
|
- return snd_soc_component_update_bits_async(dapm->component, reg,
|
|
|
- mask, value);
|
|
|
+ return snd_soc_component_update_bits(dapm->component, reg,
|
|
|
+ mask, value);
|
|
|
}
|
|
|
|
|
|
static int soc_dapm_test_bits(struct snd_soc_dapm_context *dapm,
|
|
@@ -2274,6 +2274,9 @@ static void dapm_update_widget_flags(struct snd_soc_dapm_widget *w)
|
|
|
|
|
|
switch (w->id) {
|
|
|
case snd_soc_dapm_input:
|
|
|
+ /* On a fully routed card a input is never a source */
|
|
|
+ if (w->dapm->card->fully_routed)
|
|
|
+ break;
|
|
|
w->is_source = 1;
|
|
|
list_for_each_entry(p, &w->sources, list_sink) {
|
|
|
if (p->source->id == snd_soc_dapm_micbias ||
|
|
@@ -2286,6 +2289,9 @@ static void dapm_update_widget_flags(struct snd_soc_dapm_widget *w)
|
|
|
}
|
|
|
break;
|
|
|
case snd_soc_dapm_output:
|
|
|
+ /* On a fully routed card a output is never a sink */
|
|
|
+ if (w->dapm->card->fully_routed)
|
|
|
+ break;
|
|
|
w->is_sink = 1;
|
|
|
list_for_each_entry(p, &w->sinks, list_source) {
|
|
|
if (p->sink->id == snd_soc_dapm_spk ||
|
|
@@ -3080,16 +3086,24 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
|
|
|
|
|
|
switch (w->id) {
|
|
|
case snd_soc_dapm_mic:
|
|
|
- case snd_soc_dapm_input:
|
|
|
w->is_source = 1;
|
|
|
w->power_check = dapm_generic_check_power;
|
|
|
break;
|
|
|
+ case snd_soc_dapm_input:
|
|
|
+ if (!dapm->card->fully_routed)
|
|
|
+ w->is_source = 1;
|
|
|
+ w->power_check = dapm_generic_check_power;
|
|
|
+ break;
|
|
|
case snd_soc_dapm_spk:
|
|
|
case snd_soc_dapm_hp:
|
|
|
- case snd_soc_dapm_output:
|
|
|
w->is_sink = 1;
|
|
|
w->power_check = dapm_generic_check_power;
|
|
|
break;
|
|
|
+ case snd_soc_dapm_output:
|
|
|
+ if (!dapm->card->fully_routed)
|
|
|
+ w->is_sink = 1;
|
|
|
+ w->power_check = dapm_generic_check_power;
|
|
|
+ break;
|
|
|
case snd_soc_dapm_vmid:
|
|
|
case snd_soc_dapm_siggen:
|
|
|
w->is_source = 1;
|
|
@@ -3803,93 +3817,6 @@ int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend);
|
|
|
|
|
|
-/**
|
|
|
- * dapm_is_external_path() - Checks if a path is a external path
|
|
|
- * @card: The card the path belongs to
|
|
|
- * @path: The path to check
|
|
|
- *
|
|
|
- * Returns true if the path is either between two different DAPM contexts or
|
|
|
- * between two external pins of the same DAPM context. Otherwise returns
|
|
|
- * false.
|
|
|
- */
|
|
|
-static bool dapm_is_external_path(struct snd_soc_card *card,
|
|
|
- struct snd_soc_dapm_path *path)
|
|
|
-{
|
|
|
- dev_dbg(card->dev,
|
|
|
- "... Path %s(id:%d dapm:%p) - %s(id:%d dapm:%p)\n",
|
|
|
- path->source->name, path->source->id, path->source->dapm,
|
|
|
- path->sink->name, path->sink->id, path->sink->dapm);
|
|
|
-
|
|
|
- /* Connection between two different DAPM contexts */
|
|
|
- if (path->source->dapm != path->sink->dapm)
|
|
|
- return true;
|
|
|
-
|
|
|
- /* Loopback connection from external pin to external pin */
|
|
|
- if (path->sink->id == snd_soc_dapm_input) {
|
|
|
- switch (path->source->id) {
|
|
|
- case snd_soc_dapm_output:
|
|
|
- case snd_soc_dapm_micbias:
|
|
|
- return true;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
-static bool snd_soc_dapm_widget_in_card_paths(struct snd_soc_card *card,
|
|
|
- struct snd_soc_dapm_widget *w)
|
|
|
-{
|
|
|
- struct snd_soc_dapm_path *p;
|
|
|
-
|
|
|
- list_for_each_entry(p, &w->sources, list_sink) {
|
|
|
- if (dapm_is_external_path(card, p))
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- list_for_each_entry(p, &w->sinks, list_source) {
|
|
|
- if (dapm_is_external_path(card, p))
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * snd_soc_dapm_auto_nc_pins - call snd_soc_dapm_nc_pin for unused pins
|
|
|
- * @card: The card whose pins should be processed
|
|
|
- *
|
|
|
- * Automatically call snd_soc_dapm_nc_pin() for any external pins in the card
|
|
|
- * which are unused. Pins are used if they are connected externally to a
|
|
|
- * component, whether that be to some other device, or a loop-back connection to
|
|
|
- * the component itself.
|
|
|
- */
|
|
|
-void snd_soc_dapm_auto_nc_pins(struct snd_soc_card *card)
|
|
|
-{
|
|
|
- struct snd_soc_dapm_widget *w;
|
|
|
-
|
|
|
- dev_dbg(card->dev, "ASoC: Auto NC: DAPMs: card:%p\n", &card->dapm);
|
|
|
-
|
|
|
- list_for_each_entry(w, &card->widgets, list) {
|
|
|
- switch (w->id) {
|
|
|
- case snd_soc_dapm_input:
|
|
|
- case snd_soc_dapm_output:
|
|
|
- case snd_soc_dapm_micbias:
|
|
|
- dev_dbg(card->dev, "ASoC: Auto NC: Checking widget %s\n",
|
|
|
- w->name);
|
|
|
- if (!snd_soc_dapm_widget_in_card_paths(card, w)) {
|
|
|
- dev_dbg(card->dev,
|
|
|
- "... Not in map; disabling\n");
|
|
|
- snd_soc_dapm_nc_pin(w->dapm, w->name);
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* snd_soc_dapm_free - free dapm resources
|
|
|
* @dapm: DAPM context
|