[alsa-devel] ASoC CODEC power management on reboot

Ben Dooks ben-alsa at fluff.org
Tue Jun 23 21:39:05 CEST 2009


On Mon, Jun 22, 2009 at 01:18:26PM +0100, Mark Brown wrote:
> On Mon, Jun 22, 2009 at 12:32:50PM +0100, Mark Brown wrote:
> > On Mon, Jun 22, 2009 at 12:13:23PM +0100, Ben Dooks wrote:
> 
> > > Should the ASoC (possibly DAPM) layer sort out powering down the CODEC
> > > before reboot, or should it be down to the codec or the mapping driver
> > > to do this?
> 
> > Core.
> 
> Please try this (completely untested) patch:
> 
> >From 506921be0ce5b96c3761c771a9356f2c53bd6628 Mon Sep 17 00:00:00 2001
> From: Mark Brown <broonie at opensource.wolfsonmicro.com>
> Date: Mon, 22 Jun 2009 13:16:51 +0100
> Subject: [PATCH] ASoC: Add a shutdown callback
> 
> Ensure that the audio subsystem is powered down cleanly when the system
> shuts down by providing a shutdown operation. This ensures that all the
> components have been returned to an off state cleanly which should avoid
> audio issues from partially charged capacitors or noise on digital inputs
> if the system is restarted quickly.

Right, so far this seems to have worked.
 
> Signed-off-by: Mark Brown <broonie at opensource.wolfsonmicro.com>
Tested-by: Ben Dooks <ben-linux at fluff.org>

> ---
>  include/sound/soc-dapm.h |    1 +
>  sound/soc/soc-core.c     |   16 ++++++++++++++++
>  sound/soc/soc-dapm.c     |   29 +++++++++++++++++++++++++++++
>  3 files changed, 46 insertions(+), 0 deletions(-)
> 
> diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h
> index ec8a45f..35814ce 100644
> --- a/include/sound/soc-dapm.h
> +++ b/include/sound/soc-dapm.h
> @@ -279,6 +279,7 @@ int snd_soc_dapm_add_routes(struct snd_soc_codec *codec,
>  /* dapm events */
>  int snd_soc_dapm_stream_event(struct snd_soc_codec *codec, char *stream,
>  	int event);
> +void snd_soc_dapm_shutdown(struct snd_soc_device *socdev);
>  
>  /* dapm sys fs - used by the core */
>  int snd_soc_dapm_sys_add(struct device *dev);
> diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> index 4414117..55d45c4 100644
> --- a/sound/soc/soc-core.c
> +++ b/sound/soc/soc-core.c
> @@ -1020,6 +1020,21 @@ static int soc_remove(struct platform_device *pdev)
>  	return 0;
>  }
>  
> +static void soc_shutdown(struct platform_device *pdev)
> +{
> +	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
> +	struct snd_soc_card *card = socdev->card;
> +
> +	if (!card->instantiated)
> +		return;
> +
> +	/* Flush out pmdown_time work - we actually do want to run it
> +	 * now, we're shutting down so no imminent restart. */
> +	run_delayed_work(&card->delayed_work);
> +
> +	snd_soc_dapm_shutdown(socdev);
> +}
> +
>  /* ASoC platform driver */
>  static struct platform_driver soc_driver = {
>  	.driver		= {
> @@ -1030,6 +1045,7 @@ static struct platform_driver soc_driver = {
>  	.remove		= soc_remove,
>  	.suspend	= soc_suspend,
>  	.resume		= soc_resume,
> +	.shutdown	= soc_shutdown,
>  };
>  
>  /* create a new pcm */
> diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
> index 6534359..b9129ef 100644
> --- a/sound/soc/soc-dapm.c
> +++ b/sound/soc/soc-dapm.c
> @@ -2032,6 +2032,35 @@ void snd_soc_dapm_free(struct snd_soc_device *socdev)
>  }
>  EXPORT_SYMBOL_GPL(snd_soc_dapm_free);
>  
> +/*
> + * snd_soc_dapm_shutdown - callback for system shutdown
> + */
> +void snd_soc_dapm_shutdown(struct snd_soc_device *socdev)
> +{
> +	struct snd_soc_codec *codec = socdev->card->codec;
> +	struct snd_soc_dapm_widget *w;
> +	LIST_HEAD(down_list);
> +	int powerdown = 0;
> +
> +	list_for_each_entry(w, &codec->dapm_widgets, list) {
> +		if (w->power) {
> +			dapm_seq_insert(w, &down_list, dapm_down_seq);
> +			powerdown = 1;
> +		}
> +	}
> +
> +	/* If there were no widgets to power down we're already in
> +	 * standby.
> +	 */
> +	if (powerdown) {
> +		snd_soc_dapm_set_bias_level(socdev, SND_SOC_BIAS_PREPARE);
> +		dapm_seq_run(codec, &down_list, 0, dapm_down_seq);
> +		snd_soc_dapm_set_bias_level(socdev, SND_SOC_BIAS_STANDBY);
> +	}
> +
> +	snd_soc_dapm_set_bias_level(socdev, SND_SOC_BIAS_OFF);
> +}
> +
>  /* Module information */
>  MODULE_AUTHOR("Liam Girdwood, lrg at slimlogic.co.uk");
>  MODULE_DESCRIPTION("Dynamic Audio Power Management core for ALSA SoC");
> -- 
> 1.6.3.1
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

-- 
-- 
Ben

Q:      What's a light-year?
A:      One-third less calories than a regular year.



More information about the Alsa-devel mailing list