aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/soc-dapm.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2010-05-07 16:11:40 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2010-05-10 05:36:48 -0400
commit1547aba993c990e5a316751431328145b38e1fea (patch)
treed9e549fa2d6bb67a632a0cfeefd39e3a077cac5d /sound/soc/soc-dapm.c
parent9949788b793826f2d19e929ac0219ad0e0891e2d (diff)
ASoC: Support leaving paths enabled over system suspend
Some devices can usefully run audio while the Linux system is suspended. One of the most common examples is smartphone systems, which are normally designed to allow audio to be run between the baseband and the CODEC without passing through the CPU and so can suspend the CPU when on a voice call for additional power savings. Support such systems by providing an API snd_soc_dapm_ignore_suspend(). This can be used to mark DAPM endpoints as not being sensitive to system suspend. When the system is being suspended paths between endpoints which are marked as ignoring suspend will be kept active. Both source and sink must be marked, and there must already be an active path between the two endpoints prior to suspend. When paths are active over suspend the bias management will hold the device bias in the ON state. This is used to avoid suspending the CODEC while it is still in use. Tested-by: Peter Ujfalusi <peter.ujfalusi@nokia.com> Acked-by: Liam Girdwood <lrg@slimlogic.co.uk> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/soc-dapm.c')
-rw-r--r--sound/soc/soc-dapm.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 8c8b291320a8..fefb6c44fc81 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -441,7 +441,9 @@ static int snd_soc_dapm_suspend_check(struct snd_soc_dapm_widget *widget)
441 switch (snd_power_get_state(codec->card)) { 441 switch (snd_power_get_state(codec->card)) {
442 case SNDRV_CTL_POWER_D3hot: 442 case SNDRV_CTL_POWER_D3hot:
443 case SNDRV_CTL_POWER_D3cold: 443 case SNDRV_CTL_POWER_D3cold:
444 return 0; 444 if (widget->ignore_suspend)
445 pr_debug("%s ignoring suspend\n", widget->name);
446 return widget->ignore_suspend;
445 default: 447 default:
446 return 1; 448 return 1;
447 } 449 }
@@ -2137,6 +2139,33 @@ int snd_soc_dapm_get_pin_status(struct snd_soc_codec *codec, const char *pin)
2137EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_status); 2139EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_status);
2138 2140
2139/** 2141/**
2142 * snd_soc_dapm_ignore_suspend - ignore suspend status for DAPM endpoint
2143 * @codec: audio codec
2144 * @pin: audio signal pin endpoint (or start point)
2145 *
2146 * Mark the given endpoint or pin as ignoring suspend. When the
2147 * system is disabled a path between two endpoints flagged as ignoring
2148 * suspend will not be disabled. The path must already be enabled via
2149 * normal means at suspend time, it will not be turned on if it was not
2150 * already enabled.
2151 */
2152int snd_soc_dapm_ignore_suspend(struct snd_soc_codec *codec, const char *pin)
2153{
2154 struct snd_soc_dapm_widget *w;
2155
2156 list_for_each_entry(w, &codec->dapm_widgets, list) {
2157 if (!strcmp(w->name, pin)) {
2158 w->ignore_suspend = 1;
2159 return 0;
2160 }
2161 }
2162
2163 pr_err("Unknown DAPM pin: %s\n", pin);
2164 return -EINVAL;
2165}
2166EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend);
2167
2168/**
2140 * snd_soc_dapm_free - free dapm resources 2169 * snd_soc_dapm_free - free dapm resources
2141 * @socdev: SoC device 2170 * @socdev: SoC device
2142 * 2171 *