On Tue, Jul 15, 2014 at 09:41:33AM +0800, Sean Cross wrote:
Add a codec driver for the Everest ES8328. It supports two separate audio outputs and two separate audio inputs.
This looks mostly fine so I've applied it, there are some issues below - please send followups fixing them.
- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
reg = ES8328_DACCONTROL2;
- else
reg = ES8328_ADCCONTROL5;
Coding style, extra blank line in the middle of the if ().
- switch (params_rate(params)) {
- case 8000:
val = es8328_sample_ratios[ES8328_RATE_8019];
break;
- case 11025:
val = es8328_sample_ratios[ES8328_RATE_11025];
break;
- case 22050:
val = es8328_sample_ratios[ES8328_RATE_22050];
break;
- case 44100:
val = es8328_sample_ratios[ES8328_RATE_44100];
break;
- default:
dev_err(codec->dev, "%s: unknown rate %d\n",
__func__, params_rate(params));
return -EINVAL;
- }
The array serves no function given that you're never iterating over it or anything - either have the array be a lookup table or just put the constants in the switch statement directly. You're also calling the array "_sample_ratios" but it actually appears to be sample rates.
- snd_soc_write(codec, ES8328_MASTERMODE, ES8328_MASTERMODE_MSC);
- clk_rate = clk_get_rate(es8328->clk);
- if (clk_rate == ES8328_SYSCLK_RATE_1X)
snd_soc_write(codec, ES8328_MASTERMODE,
ES8328_MASTERMODE_MSC);
- else
snd_soc_write(codec, ES8328_MASTERMODE,
ES8328_MASTERMODE_MCLKDIV2 |
ES8328_MASTERMODE_MSC);
update_bits().
snd_soc_write(codec, ES8328_CHIPPOWER,
ES8328_CHIPPOWER_ADCDIG_OFF |
ES8328_CHIPPOWER_DACDIG_OFF |
ES8328_CHIPPOWER_ADCSTM_RESET |
ES8328_CHIPPOWER_DACSTM_RESET |
ES8328_CHIPPOWER_ADCPLL_OFF |
ES8328_CHIPPOWER_DACPLL_OFF |
ES8328_CHIPPOWER_ADCVREF_OFF |
ES8328_CHIPPOWER_DACVREF_OFF);
break;
This looks like most if not all of it should be in DAPM, especially the DAC and ADC power - the device is wasting power on the ADC during playback for example. Looking at the code I suspect that some of these should be done as supply widgets.
+static int es8328_suspend(struct snd_soc_codec *codec) +{
- es8328_set_bias_level(codec, SND_SOC_BIAS_OFF);
- return 0;
+}
+static int es8328_resume(struct snd_soc_codec *codec) +{
- struct regmap *regmap = dev_get_regmap(codec->dev, NULL);
- regcache_mark_dirty(regmap);
- regcache_sync(regmap);
- es8328_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
- return 0;
+}
But leave the regulators and clocks enabled?