[alsa-devel] [PATCH 1/2] ASoC: cs43130: Add support for CS43130 codec
Li Xu
li.xu at cirrus.com
Fri Aug 18 17:30:17 CEST 2017
On Wed, Aug 09, 2017 at 05:11:01PM +0100, Mark Brown wrote:
> On Wed, Aug 09, 2017 at 10:00:21AM -0500, Li Xu wrote:
>
> > + if (cs43130->dev_id == CS43131_CHIP_ID ||
> > + cs43130->dev_id == CS43198_CHIP_ID) {
> > + if (val >= 2)
>
> Throughout the driver you're doing lots of ID checks like this with if
> statements, these are better written with switch statements so it's
> easier to add new cases in (eg, if a new chip variant gets made) and so
> that it's clear that the default case is being handled properly.
>
Agreed.
> > +static const char * const enum_texts[] = {
> > + "Off",
> > + "On",
> > +};
> > +
> > +static SOC_ENUM_SINGLE_DECL(pcm_phs_enum, CS43130_PCM_FILT_OPT, 6, enum_texts);
> > +
> > +static SOC_ENUM_SINGLE_DECL(pcm_nos_enum, CS43130_PCM_FILT_OPT, 5, enum_texts);
> > +
> > +static SOC_ENUM_SINGLE_DECL(pcm_high_enum, CS43130_PCM_FILT_OPT, 1, enum_texts);
> > +
> > +static SOC_ENUM_SINGLE_DECL(pcm_dmp_enum, CS43130_PCM_FILT_OPT, 0, enum_texts);
>
> These look like simple on/off switches, why are they enums?
>
You are right. Changing to SOC_SINGLE.
> > +static int cs43130_pcm_mute(struct snd_soc_dai *dai, int mute)
> > +{
> > + struct snd_soc_codec *codec = dai->codec;
> > + struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
> > +
> > + if (mute) {
> > + if (cs43130->dev_id == CS43130_CHIP_ID ||
> > + cs43130->dev_id == CS4399_CHIP_ID) {
> > + regmap_multi_reg_write(cs43130->regmap, mute_seq,
> > + ARRAY_SIZE(mute_seq));
> > + regmap_update_bits(cs43130->regmap,
> > + CS43130_PCM_PATH_CTL_1,
> > + CS43130_MUTE_MASK, CS43130_MUTE_EN);
> > + /*
> > + * PCM Power Down Sequence
> > + * According to Design, 130ms is preferred.
> > + */
> > + msleep(130);
>
> Powering down doesn't sound like muting, shouldn't this be DAPM stuff
> (especially with the very long 130ms delay)? What is this actually
> doing at the chip level, the register names do sound like muting might
> be part of it but it looks like there's more?
>
130ms delay is added to remove pop noise during stopping audio playback.
You are right that it is not just muting, but part of stopping audio playback.
I am moving this sequence as part of DAPM.
> > +static char *hpload_msgs[] = {
> > + "HPLOAD_DC_L:%u\n",
> > + "HPLOAD_DC_R:%u\n",
> > +};
> > +
> > +static char *hpload_ac_msgs[] = {
> > + "HPLOAD_AC_L:%u:%u\n",
> > + "HPLOAD_AC_R:%u:%u\n",
> > +};
>
> > + if (cs43130->ac_meas) {
> > + for (k = 0; k < CS43130_AC_FREQ; k++) {
> > + for (j = 0; j < ARRAY_SIZE(hpload_ac_msgs); j++) {
>
> The loops are wrapping their iterators in the order i, k, j not i, j, k.
>
Will fix.
> > + ret = scnprintf(buf + i, PAGE_SIZE - i,
> > + hpload_ac_msgs[j],
> > + cs43130->ac_freq[k],
> > + cs43130->hpload_ac[k][j]);
>
> We're not using ARRAY_SIZE() for the k iteration, this whole thing feels
> risky. In any case...
>
OK.
> > +static DEVICE_ATTR(hpload, S_IRUGO, cs43130_show_hpload, NULL);
>
> ...you're adding device attributes that aren't just single values (which
> is a requirement for all sysfs files). It'd be a lot simpler and
> compliant with the sysfs ABI to just make four appropriately named files
> with the individual values in them if they exist.
>
OK. Seperating into 4 individual files, with each containing impedance for DC
Left, Right, and AC Left, Right.
> > + cs43130->idle_bias_off = of_property_read_bool(np,
> > + "cirrus,idle-bias-off");
>
> This should not be in the DT - either the device can reasonably power
> down when idle or it can't but that's not machine specific configuration
> and is a Linux specific implementation detail anyway.
>
OK, removing from DT.
> > +static const struct i2c_device_id cs43130_i2c_id[] = {
> > + {"cs43130", 0},
> > + {}
> > +};
>
> Since the driver supports multiple parts I'd expect to see all the parts
> individually recognized as I2C IDs, and similarly for DT compatible
> strings. This makes it easier for people to do system integration and
> means that if it turns out we need the data it's there.
OK, adding additional IDs for I2C and DT.
More information about the Alsa-devel
mailing list