aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/soc-dapm.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2011-09-21 16:29:47 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2011-09-23 12:04:36 -0400
commit85a843c50ffb3597928968250a3f552a45b1b9de (patch)
treed028bc5427dbe710a62bf17b845945f2a1abb16c /sound/soc/soc-dapm.c
parent8c756158343029c046ade6e7076f25f99774e72f (diff)
ASoC: Don't force bias on ground referenced devices
Currently we force all devices in the system to be at the same bias level. This is due to concerns about power or pop/click impacts from either ramping VMID or mismatching VMID on the analogue I/O lines between connected devices but does mean we power devices up more often than we really need to. If a device flags idle_bias_off this will usually mean that it's either all digital or ground referenced (in which case the idle and powered bias levels are identical) so this concern does not apply and we can save some power by leaving it off when not needed itself. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/soc-dapm.c')
-rw-r--r--sound/soc/soc-dapm.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 6cac04595ccd..2bde6b0c038b 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -1319,13 +1319,16 @@ static int dapm_power_widgets(struct snd_soc_dapm_context *dapm, int event)
1319 } 1319 }
1320 } 1320 }
1321 1321
1322 /* Force all contexts in the card to the same bias state */ 1322 /* Force all contexts in the card to the same bias state if
1323 * they're not ground referenced.
1324 */
1323 bias = SND_SOC_BIAS_OFF; 1325 bias = SND_SOC_BIAS_OFF;
1324 list_for_each_entry(d, &card->dapm_list, list) 1326 list_for_each_entry(d, &card->dapm_list, list)
1325 if (d->target_bias_level > bias) 1327 if (d->target_bias_level > bias)
1326 bias = d->target_bias_level; 1328 bias = d->target_bias_level;
1327 list_for_each_entry(d, &card->dapm_list, list) 1329 list_for_each_entry(d, &card->dapm_list, list)
1328 d->target_bias_level = bias; 1330 if (!d->idle_bias_off)
1331 d->target_bias_level = bias;
1329 1332
1330 trace_snd_soc_dapm_walk_done(card); 1333 trace_snd_soc_dapm_walk_done(card);
1331 1334