[alsa-devel] [PATCH] asoc, codec: Add SGTL5000 codec support to asoc

Zeng Zhaoming zhaoming.zeng at freescale.com
Wed Dec 8 20:22:35 CET 2010


On Wed 2010-12-08 05:11:55, Mark Brown wrote:
> On Wed, Dec 08, 2010 at 10:06:29AM +0800, zhaoming.zeng at freescale.com
> wrote:
> > From: Zeng Zhaoming <zhaoming.zeng at freescale.com>
> 
> Broadly speaking this is OK - there's quite a few comments below but
> they're mostly fairly small and local things rather than major
> structural issues.  The one thing that needs real work is the power
> management which is fairly non standard and seems to follow a mix of
> hard coding and DAPM.  A lot of the issues here seem to be due to some
> rather nasty hardware issues so there's likely to be limits on how nice
> the software can be.
> 
> For the subject line, please use a prefix such as "ASoC: " like other
> patches do - in general check the changelogs for the area you're
> submitting against for things like this.

hi, Mark, thanks for so carefully review, and so many suggestion.

> 
> >  config SND_SOC_WM9090
> >  	tristate
> > +
> > +config SND_SOC_SGTL5000
> > +	tristate
> 
> Keep both Kconfig and Makefile sorted, and remember to add your CODEC to
> SND_SOC_ALL_CODECS.
> 
> > +	struct regulator *supplies[SGTL5000_SUPPLY_NUM];
> > +	int regulator_volt[SGTL5000_SUPPLY_NUM];
> > +	struct regulator *reg_vddio;
> > +	struct regulator *reg_vdda;
> > +	struct regulator *reg_vddd;
> > +	int vddio;		/* voltage of VDDIO (mv) */
> > +	int vdda;		/* voltage of vdda (mv) */
> > +	int vddd;		/* voltage of vddd (mv), 0 if not
> connected */
> 
> You appear to be keeping two copies of the regulators and their
> voltages.  TBH I'm not clear why you're caching the voltages - you may
> as well just read them when you need them, you only refer to them at
> probe time anyway.

Sorry, I forget to clean up this code.

> > +static int sgtl5000_pcm_hw_params(struct snd_pcm_substream
> *substream,
> > +				  struct snd_pcm_hw_params *params,
> > +				  struct snd_soc_dai *dai)
> > +{
> 
> > +	switch (sgtl5000->lrclk) {
> > +	case 8000:
> > +	case 16000:
> > +		sys_fs = 32000;
> > +		break;
> > +	case 11025:
> > +	case 22050:
> > +		sys_fs = 44100;
> > +		break;
> > +	default:
> > +		sys_fs = sgtl5000->lrclk;
> > +		break;
> 
> A comment explaining what's going on here would be helpful - it
> looks like the device is running internally at 32kHz or higher and
> downsampling somehow to present lower output frequencies?

Right, we need to downsampling for low frequencies.

> pop/clicks */
> > +	sgtl5000_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
> > +	if (codec->suspend_bias_level == SND_SOC_BIAS_ON)
> > +		sgtl5000_set_bias_level(codec, SND_SOC_BIAS_PREPARE);
> > +	sgtl5000_set_bias_level(codec, codec->suspend_bias_level);
> 
> The CODEC will never be in any state above STANDBY at suspend.

Is there any documentation describe the state machine? 

> 
> > +	for (i = 0; i < SGTL5000_SUPPLY_NUM; i++) {
> > +		struct regulator *reg;
> > +		reg = regulator_get(&client->dev, supply_names[i]);
> > +		if (IS_ERR(reg))
> > +			continue;
> > +
> > +		sgtl5000->regulator_volt[i] = regulator_get_voltage(reg)
> / 1000;
> > +		regulator_enable(reg);
> > +
> > +		sgtl5000->supplies[i] = reg;
> > +	}
> 
> > +	sgtl5000->regulator_volt[VDDA] = 3300;
> > +	sgtl5000->regulator_volt[VDDIO] = 3300;
> 
Sorry again, forget to cleanup.

> 
> > +	msleep(1);
> 
> This delay looks like it's in the wrong place?

The SGTL5000 has an internal reset that is deasserted 8 SYS_MCLK cycles after 
all power rails have been brought up. After this time communication can start.

So I think delay 1ms is safe for the next operations.



More information about the Alsa-devel mailing list