Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 193456
b: refs/heads/master
c: 9949788
h: refs/heads/master
v: v3
  • Loading branch information
Mark Brown committed May 10, 2010
1 parent 831b5ba commit cdc8d3b
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 24 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 50ae8384cde9a67714ff03010493c5052690624e
refs/heads/master: 9949788b793826f2d19e929ac0219ad0e0891e2d
3 changes: 3 additions & 0 deletions trunk/sound/soc/soc-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -963,6 +963,9 @@ static void soc_resume_deferred(struct work_struct *work)

dev_dbg(socdev->dev, "starting resume work\n");

/* Bring us up into D2 so that DAPM starts enabling things */
snd_power_change_state(codec->card, SNDRV_CTL_POWER_D2);

if (card->resume_pre)
card->resume_pre(pdev);

Expand Down
53 changes: 30 additions & 23 deletions trunk/sound/soc/soc-dapm.c
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,23 @@ static inline void dapm_clear_walk(struct snd_soc_codec *codec)
p->walked = 0;
}

/* We implement power down on suspend by checking the power state of
* the ALSA card - when we are suspending the ALSA state for the card
* is set to D3.
*/
static int snd_soc_dapm_suspend_check(struct snd_soc_dapm_widget *widget)
{
struct snd_soc_codec *codec = widget->codec;

switch (snd_power_get_state(codec->card)) {
case SNDRV_CTL_POWER_D3hot:
case SNDRV_CTL_POWER_D3cold:
return 0;
default:
return 1;
}
}

/*
* Recursively check for a completed path to an active or physically connected
* output widget. Returns number of complete paths.
Expand All @@ -446,20 +463,20 @@ static int is_connected_output_ep(struct snd_soc_dapm_widget *widget)
case snd_soc_dapm_adc:
case snd_soc_dapm_aif_out:
if (widget->active)
return 1;
return snd_soc_dapm_suspend_check(widget);
default:
break;
}

if (widget->connected) {
/* connected pin ? */
if (widget->id == snd_soc_dapm_output && !widget->ext)
return 1;
return snd_soc_dapm_suspend_check(widget);

/* 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 1;
return snd_soc_dapm_suspend_check(widget);
}

list_for_each_entry(path, &widget->sinks, list_source) {
Expand Down Expand Up @@ -492,24 +509,24 @@ static int is_connected_input_ep(struct snd_soc_dapm_widget *widget)
case snd_soc_dapm_dac:
case snd_soc_dapm_aif_in:
if (widget->active)
return 1;
return snd_soc_dapm_suspend_check(widget);
default:
break;
}

if (widget->connected) {
/* connected pin ? */
if (widget->id == snd_soc_dapm_input && !widget->ext)
return 1;
return snd_soc_dapm_suspend_check(widget);

/* connected VMID/Bias for lower pops */
if (widget->id == snd_soc_dapm_vmid)
return 1;
return snd_soc_dapm_suspend_check(widget);

/* connected jack ? */
if (widget->id == snd_soc_dapm_mic ||
(widget->id == snd_soc_dapm_line && !list_empty(&widget->sinks)))
return 1;
return snd_soc_dapm_suspend_check(widget);
}

list_for_each_entry(path, &widget->sources, list_sink) {
Expand Down Expand Up @@ -897,22 +914,12 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
if (!w->power_check)
continue;

/* If we're suspending then pull down all the
* power. */
switch (event) {
case SND_SOC_DAPM_STREAM_SUSPEND:
power = 0;
break;

default:
if (!w->force)
power = w->power_check(w);
else
power = 1;
if (power)
sys_power = 1;
break;
}
if (!w->force)
power = w->power_check(w);
else
power = 1;
if (power)
sys_power = 1;

if (w->power == power)
continue;
Expand Down

0 comments on commit cdc8d3b

Please sign in to comment.