[alsa-devel] [PATCH v4 1/3] ASoC: uda1380: make driver more powersave-friendly

Vasily Khoruzhick anarsoul at gmail.com
Sun Aug 29 20:13:07 CEST 2010


В сообщении от 29 августа 2010 20:37:03 автор Marek Vasut написал:
 > > +	void *control_data;
> 
> It's already in codec->control_data, isn't it ?
>

I'm using priv->control_data as temporary storage to initialize codec-
>control_data later, as there's no snd_soc_codec in i2c_probe
 
> > @@ -145,7 +185,6 @@ static void uda1380_flush_work(struct work_struct
> > *work) uda1380_read_reg_cache(uda1380_codec, reg));
> > 
> >  		clear_bit(bit, &uda1380_cache_dirty);
> >  	
> >  	}
> > 
> > -
> 
> Remove

It improves code formatting.
 
> > @@ -560,18 +599,40 @@ static int uda1380_set_bias_level(struct
> > snd_soc_codec *codec, enum snd_soc_bias_level level)
> > 
> >  {
> >  
> >  	int pm = uda1380_read_reg_cache(codec, UDA1380_PM);
> > 
> > +	struct uda1380_platform_data *pdata = codec->dev->platform_data;
> > +
> > +	if (codec->bias_level == level)
> > +		return 0;
> > 
> >  	switch (level) {
> >  	case SND_SOC_BIAS_ON:
> > 
> >  	case SND_SOC_BIAS_PREPARE:
> > +		/* ADC, DAC on */
> > 
> >  		uda1380_write(codec, UDA1380_PM, R02_PON_BIAS | pm);
> >  		break;
> >  	
> >  	case SND_SOC_BIAS_STANDBY:
> > -		uda1380_write(codec, UDA1380_PM, R02_PON_BIAS);
> > -		break;
> > -	case SND_SOC_BIAS_OFF:
> > +		if (codec->bias_level == SND_SOC_BIAS_OFF) {
> > +			if (pdata->gpio_power != -EINVAL) {
> > +				gpio_set_value(pdata->gpio_power, 1);
> > +				uda1380_reset(codec);
> > +			}
> > +
> > +			uda1380_sync_cache(codec);
> > +		}
> > 
> >  		uda1380_write(codec, UDA1380_PM, 0x0);
> 
> Maybe some comment won't hurt here about what that 0x0 does.

Well, code explain it pretty well, it puts codec into stand-by mode :)
 
> >  		break;
> > 
> > +	case SND_SOC_BIAS_OFF:
> if (pdata->gpio_power == -EINVAL)
> 	break;
> ...code...
> 
> might help your alignment below.

Ok
 
> > +		if (pdata->gpio_power != -EINVAL) {
> > +			int reg;
> > +			gpio_set_value(pdata->gpio_power, 0);
> > +
> > +			/* Mark mixer regs cache dirty to sync them with
> > +			 * codec regs on power on.
> > +			 */
> > +			for (reg = UDA1380_MVOL; reg < UDA1380_CACHEREGNUM;
> > +				reg++)
> > +				set_bit(reg - 0x10, &uda1380_cache_dirty);
> > +		}
> > 
> >  	}
> >  	codec->bias_level = level;
> >  	return 0;
> > 
> > @@ -651,16 +712,6 @@ static int uda1380_suspend(struct snd_soc_codec
> > *codec, pm_message_t state)
> > 
> >  static int uda1380_resume(struct snd_soc_codec *codec)
> >  {
> > 
> > -	int i;
> > -	u8 data[2];
> > -	u16 *cache = codec->reg_cache;
> > -
> > -	/* Sync reg_cache with the hardware */
> > -	for (i = 0; i < ARRAY_SIZE(uda1380_reg); i++) {
> > -		data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001);
> > -		data[1] = cache[i] & 0x00ff;
> > -		codec->hw_write(codec->control_data, data, 2);
> > -	}
> > 
> >  	uda1380_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
> >  	return 0;
> >  
> >  }
> > 
> > @@ -671,29 +722,32 @@ static int uda1380_probe(struct snd_soc_codec
> > *codec)
> > 
> >  	struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec);
> >  	int ret;
> > 
> > +	uda1380->codec = codec;
> > +
> > 
> >  	codec->hw_write = (hw_write_t)i2c_master_send;
> > 
> > +	codec->control_data = uda1380->control_data;
> > 
> > -	if (!pdata || !pdata->gpio_power || !pdata->gpio_reset)
> > +	if (!pdata)
> > 
> >  		return -EINVAL;
> > 
> > -	ret = gpio_request(pdata->gpio_power, "uda1380 power");
> > -	if (ret)
> > -		return ret;
> > -	ret = gpio_request(pdata->gpio_reset, "uda1380 reset");
> > -	if (ret)
> > -		goto err_gpio;
> > -
> > -	gpio_direction_output(pdata->gpio_power, 1);
> > -
> > -	/* we may need to have the clock running here - pH5 */
> > -	gpio_direction_output(pdata->gpio_reset, 1);
> > -	udelay(5);
> > -	gpio_set_value(pdata->gpio_reset, 0);
> 
> if (gpio_is_valid(...gpio...)) {
> 
> }

Will not work for s3c24xx:

static inline int gpio_is_valid(int number)                                                                                         
{                                                                                                                                   
        /* only some non-negative numbers are valid */                                                                              
        return ((unsigned)number) < ARCH_NR_GPIOS;                                                                                  
}

> > +	if (pdata->gpio_reset != -EINVAL) {
> > +		ret = gpio_request(pdata->gpio_reset, "uda1380 reset");
> > +		if (ret)
> > +			goto err_out;
> > +		gpio_direction_output(pdata->gpio_reset, 0);

> Handle return value and dont depend on this setting the GPIO value, use
> gpio_set_value() too please.

This code handles reset-less machines (for example, h1940). 
gpio_direction_output is neccessary here to ensure that pin is in output mode.

> > +	}
> > 
> > -	ret = uda1380_reset(codec);
> > -	if (ret < 0) {
> > -		dev_err(codec->dev, "Failed to issue reset\n");
> > -		goto err_reset;
> > +	if (pdata->gpio_power != -EINVAL) {
> > +		ret = gpio_request(pdata->gpio_power, "uda1380 power");
> > +		if (ret)
> > +			goto err_gpio;
> > +		gpio_direction_output(pdata->gpio_power, 0);
> > +	} else {
> > +		ret = uda1380_reset(codec);
> > +		if (ret) {
> > +			dev_err(codec->dev, "Failed to issue reset\n");
> > +			goto err_reset;
> > +		}
> > 
> >  	}
> 
> Ditto.

Handling here machine which lacks power pin.
 
> > +	uda1380->control_data = i2c;
> 
> So is this needed ? Can't you access codec->control_data ?

See comment above.

> >  		kfree(uda1380);
> > 
> > +
> 
> Remove

It improves formatting.
 
> >  	return ret;
> >  
> >  }
> 
> Cheers

thanks,

Regards
Vasily
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part.
Url : http://mailman.alsa-project.org/pipermail/alsa-devel/attachments/20100829/2c31122a/attachment-0001.sig 


More information about the Alsa-devel mailing list