mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-08 15:04:45 +00:00
ASoC: Auto disconnect pins from all DAPM contexts
Currently only pins in CODEC DAPM contexts are automatically marked as non-connected if the card has the fully_routed flag set. This makes sense since widgets which qualify for auto-disconnection are only found in CODEC DAPM contexts. But with componentisation this is going to change, so consider all widgets for auto-disconnection. Also it is probably faster to walk the widgets list only once rather than once for each CODEC. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
parent
bb13109d85
commit
7df3788410
@ -431,7 +431,7 @@ int snd_soc_dapm_force_enable_pin_unlocked(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin);
|
||||
int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin);
|
||||
void snd_soc_dapm_auto_nc_codec_pins(struct snd_soc_codec *codec);
|
||||
void snd_soc_dapm_auto_nc_pins(struct snd_soc_card *card);
|
||||
|
||||
/* Mostly internal - should not normally be used */
|
||||
void dapm_mark_io_dirty(struct snd_soc_dapm_context *dapm);
|
||||
|
@ -1928,8 +1928,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
|
||||
}
|
||||
|
||||
if (card->fully_routed)
|
||||
list_for_each_entry(codec, &card->codec_dev_list, card_list)
|
||||
snd_soc_dapm_auto_nc_codec_pins(codec);
|
||||
snd_soc_dapm_auto_nc_pins(card);
|
||||
|
||||
snd_soc_dapm_new_widgets(card);
|
||||
|
||||
|
@ -3763,36 +3763,31 @@ static bool snd_soc_dapm_widget_in_card_paths(struct snd_soc_card *card,
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_dapm_auto_nc_codec_pins - call snd_soc_dapm_nc_pin for unused pins
|
||||
* @codec: The codec whose pins should be processed
|
||||
* 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 codec
|
||||
* which are unused. Pins are used if they are connected externally to the
|
||||
* codec, whether that be to some other device, or a loop-back connection to
|
||||
* the codec itself.
|
||||
* 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_codec_pins(struct snd_soc_codec *codec)
|
||||
void snd_soc_dapm_auto_nc_pins(struct snd_soc_card *card)
|
||||
{
|
||||
struct snd_soc_card *card = codec->card;
|
||||
struct snd_soc_dapm_context *dapm = &codec->dapm;
|
||||
struct snd_soc_dapm_widget *w;
|
||||
|
||||
dev_dbg(codec->dev, "ASoC: Auto NC: DAPMs: card:%p codec:%p\n",
|
||||
&card->dapm, &codec->dapm);
|
||||
dev_dbg(card->dev, "ASoC: Auto NC: DAPMs: card:%p\n", &card->dapm);
|
||||
|
||||
list_for_each_entry(w, &card->widgets, list) {
|
||||
if (w->dapm != dapm)
|
||||
continue;
|
||||
switch (w->id) {
|
||||
case snd_soc_dapm_input:
|
||||
case snd_soc_dapm_output:
|
||||
case snd_soc_dapm_micbias:
|
||||
dev_dbg(codec->dev, "ASoC: Auto NC: Checking widget %s\n",
|
||||
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(codec->dev,
|
||||
dev_dbg(card->dev,
|
||||
"... Not in map; disabling\n");
|
||||
snd_soc_dapm_nc_pin(dapm, w->name);
|
||||
snd_soc_dapm_nc_pin(w->dapm, w->name);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
Loading…
Reference in New Issue
Block a user