[alsa-devel] [PATCH 1/4] ASoC: codecs: adau1701: factor out firmware reset

Lars-Peter Clausen lars at metafoo.de
Mon Jun 10 15:08:24 CEST 2013


On 06/07/2013 01:53 PM, Daniel Mack wrote:
> Some runtime-determined constraints might need to be satisfied prior to
> firmware loading, so the actual download and releasing the device from
> reset has to be postponed. Factor it out first, so we have everything at
> one place.
> 
> This also changes the behaviour in a way that adau1701_i2c_probe() will
> assert the reset line, and wait for the codec probe to release it.
> 
> Signed-off-by: Daniel Mack <zonque at gmail.com>

Acked-by: Lars-Peter Clausen <lars at metafoo.de>

Thanks.

> ---
>  sound/soc/codecs/adau1701.c | 49 +++++++++++++++++++++++++++++++++------------
>  1 file changed, 36 insertions(+), 13 deletions(-)
> 
> diff --git a/sound/soc/codecs/adau1701.c b/sound/soc/codecs/adau1701.c
> index 3fc1763..b6b1a77 100644
> --- a/sound/soc/codecs/adau1701.c
> +++ b/sound/soc/codecs/adau1701.c
> @@ -90,6 +90,7 @@
>  #define ADAU1701_FIRMWARE "adau1701.bin"
>  
>  struct adau1701 {
> +	int gpio_nreset;
>  	unsigned int dai_fmt;
>  };
>  
> @@ -183,9 +184,37 @@ static unsigned int adau1701_read(struct snd_soc_codec *codec, unsigned int reg)
>  	return value;
>  }
>  
> -static int adau1701_load_firmware(struct i2c_client *client)
> +static void adau1701_reset(struct snd_soc_codec *codec)
>  {
> -	return process_sigma_firmware(client, ADAU1701_FIRMWARE);
> +	struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec);
> +
> +	if (!gpio_is_valid(adau1701->gpio_nreset))
> +		return;
> +
> +	gpio_set_value(adau1701->gpio_nreset, 0);
> +	/* minimum reset time is 20ns */
> +	udelay(1);
> +	gpio_set_value(adau1701->gpio_nreset, 1);
> +	/* power-up time may be as long as 85ms */
> +	mdelay(85);
> +}
> +
> +static int adau1701_init(struct snd_soc_codec *codec)
> +{
> +	int ret;
> +	struct i2c_client *client = to_i2c_client(codec->dev);
> +
> +	adau1701_reset(codec);
> +
> +	ret = process_sigma_firmware(client, ADAU1701_FIRMWARE);
> +	if (ret) {
> +		dev_warn(codec->dev, "Failed to load firmware\n");
> +		return ret;
> +	}
> +
> +	snd_soc_write(codec, ADAU1701_DACSET, ADAU1701_DACSET_DACINIT);
> +
> +	return 0;
>  }
>  
>  static int adau1701_set_capture_pcm_format(struct snd_soc_codec *codec,
> @@ -466,15 +495,13 @@ MODULE_DEVICE_TABLE(of, adau1701_dt_ids);
>  static int adau1701_probe(struct snd_soc_codec *codec)
>  {
>  	int ret;
> -	struct i2c_client *client = to_i2c_client(codec->dev);
>  
> -	codec->control_data = client;
> +	codec->control_data = to_i2c_client(codec->dev);
>  
> -	ret = adau1701_load_firmware(client);
> +	ret = adau1701_init(codec);
>  	if (ret)
> -		dev_warn(codec->dev, "Failed to load firmware\n");
> +		return ret;
>  
> -	snd_soc_write(codec, ADAU1701_DACSET, ADAU1701_DACSET_DACINIT);
>  	snd_soc_write(codec, ADAU1701_DSPCTRL, ADAU1701_DSPCTRL_CR);
>  
>  	return 0;
> @@ -524,14 +551,10 @@ static int adau1701_i2c_probe(struct i2c_client *client,
>  					    "ADAU1701 Reset");
>  		if (ret < 0)
>  			return ret;
> -
> -		/* minimum reset time is 20ns */
> -		udelay(1);
> -		gpio_set_value(gpio_nreset, 1);
> -		/* power-up time may be as long as 85ms */
> -		mdelay(85);
>  	}
>  
> +	adau1701->gpio_nreset = gpio_nreset;
> +
>  	i2c_set_clientdata(client, adau1701);
>  	ret = snd_soc_register_codec(&client->dev, &adau1701_codec_drv,
>  			&adau1701_dai, 1);



More information about the Alsa-devel mailing list