[alsa-devel] [PATCH] ASoC: Add power down of widget powered up for suspend
Joonyoung Shim
jy0922.shim at samsung.com
Mon Nov 23 13:48:36 CET 2009
On 11/23/2009 9:22 PM, Mark Brown wrote:
> On Mon, Nov 23, 2009 at 02:45:16PM +0900, Joonyoung Shim wrote:
>> If the widget was powered up when the device enters to the suspend, it
>> remains on because the power of the widget doesn't change, but we need
>> to power down the widget on suspend.
>
> Hrm, yes - good spot, this got missed in the refactoring to make the
> bais maintinence less dependant on stream state. However...
>
>> power = w->power_check(w);
>> - if (power)
>> + if (power) {
>> sys_power = 1;
>> + if (event == SND_SOC_DAPM_STREAM_SUSPEND)
>> + power = 0;
>> + }
>
> We don't want to set sys_power here (since we want to bring the bias
> down to standby in preparatio for suspend) and we can skip the power
> check so something like the patch below ought to do the trick. Could
> you test and let me know, please?
>
OK, i missed about sys_power. I tested and below patch solves this issue
too. I think your patch is better.
Thanks.
> That said, we probably want some more flexibility here for systems which
> want to suspend with bypass paths active. They'll want to pause streams
> being directly driven by the CPU but leave any other paths active. That
> would be a new feature, though.
>
Then, is it possible that the bypass path is alive on suspend?
> diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
> index eaadb4b..0d294ef 100644
> --- a/sound/soc/soc-dapm.c
> +++ b/sound/soc/soc-dapm.c
> @@ -977,9 +977,19 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
> if (!w->power_check)
> continue;
>
> - power = w->power_check(w);
> - if (power)
> - sys_power = 1;
> + /* If we're suspending then pull down all the
> + * power. */
> + switch (event) {
> + case SND_SOC_DAPM_STREAM_SUSPEND:
> + power = 0;
> + break;
> +
> + default:
> + power = w->power_check(w);
> + if (power)
> + sys_power = 1;
> + break;
> + }
>
> if (w->power == power)
> continue;
> @@ -1003,8 +1013,12 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
> case SND_SOC_DAPM_STREAM_RESUME:
> sys_power = 1;
> break;
> + case SND_SOC_DAPM_STREAM_SUSPEND:
> + sys_power = 0;
> + break;
> case SND_SOC_DAPM_STREAM_NOP:
> sys_power = codec->bias_level != SND_SOC_BIAS_STANDBY;
> + break;
> default:
> break;
> }
>
More information about the Alsa-devel
mailing list