[alsa-devel] [PATCH 7/8] ASoC: tlv320aic3x: add initial usage of regulator framework to control avdd_dac

Eero Nurkkala ext-eero.nurkkala at nokia.com
Thu Oct 8 14:17:07 CEST 2009


On Thu, 2009-10-08 at 13:58 +0200, Valentin Eduardo (Nokia-D/Helsinki)
wrote:
> From: Eduardo Valentin <eduardo.valentin at nokia.com>
> 
> This patch adds initial usage of regulator framework to control avdd_dac
> inside tlv320aic3x ASoC codec driver.
> 
> The  refcount to avdd_dac is increased / decreased
> only during probe and remove. Here it is still needed to implement
> proper enable/disable regulator depending on chip usage. Now if driver
> can get regulator for avdd_dac, then it will just let it on on probe
> and then leave it off on remove.
> 
> Signed-off-by: Eduardo Valentin <eduardo.valentin at nokia.com>
> ---
>  sound/soc/codecs/tlv320aic3x.c |   26 ++++++++++++++++++++++++++
>  1 files changed, 26 insertions(+), 0 deletions(-)
> 
> diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c
> index 3395cf9..82e0a64 100644
> --- a/sound/soc/codecs/tlv320aic3x.c
> +++ b/sound/soc/codecs/tlv320aic3x.c
> @@ -38,6 +38,7 @@
>  #include <linux/delay.h>
>  #include <linux/pm.h>
>  #include <linux/i2c.h>
> +#include <linux/regulator/consumer.h>
>  #include <linux/platform_device.h>
>  #include <sound/core.h>
>  #include <sound/pcm.h>
> @@ -56,6 +57,7 @@ struct aic3x_priv {
>  	struct snd_soc_codec codec;
>  	unsigned int sysclk;
>  	int master;
> +	struct regulator *regulator;
>  };
>  
>  /*
> @@ -1286,6 +1288,11 @@ static int aic3x_unregister(struct aic3x_priv *aic3x)
>  	snd_soc_unregister_dai(&aic3x_dai);
>  	snd_soc_unregister_codec(&aic3x->codec);
>  
> +	if (aic3x->regulator) {
> +		regulator_disable(aic3x->regulator);
> +		regulator_put(aic3x->regulator);
> +	}
> +
>  	kfree(aic3x);
>  	aic3x_codec = NULL;
>  
> @@ -1320,6 +1327,25 @@ static int aic3x_i2c_probe(struct i2c_client *i2c,
>  	codec->control_data = i2c;
>  	codec->hw_write = (hw_write_t) i2c_master_send;
>  
> +	aic3x->regulator = regulator_get(&i2c->dev, "avdd_dac");
> +	if (IS_ERR(aic3x->regulator)) {
> +		dev_warn(&i2c->dev, "No regulator to supply avdd_dac."
> +					" Assuming always on.\n");
> +		aic3x->regulator = NULL;
> +	}
> +
> +	/*
> +	 * REVISIT: Need to add proper code to put into sleep mode
> +	 * avdd_dac regulator. For now, just leave it on.
> +	 */

Will this ever be revisited =) ? If so, I think there's going to be a
jungle in finding the right spots - you need to remember the bypass
paths also (bias is not on necessarily). Also, this is regulator thing
is highly platform dependent, not aic3x related really at all, so is
this the correct place... Just a thought, dont take it too seriously ;) 

> +	if (aic3x->regulator) {
> +		int err;
> +
> +		err = regulator_enable(aic3x->regulator);
> +		if (err < 0)
> +			return err;
> +	}
> +
>  	i2c_set_clientdata(i2c, aic3x);
>  
>  	return aic3x_register(codec);

--
To unsubscribe from this list: send the line "unsubscribe alsa-devel" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the Alsa-devel mailing list