From: Charles Keepax <ckeepax@opensource.cirrus.com>
To: broonie@kernel.org
Cc: lgirdwood@gmail.com, linux-sound@vger.kernel.org,
linux-kernel@vger.kernel.org, patches@opensource.cirrus.com
Subject: [PATCH v2 3/3] ASoC: cs42l43: Improve pop performance of the input power up
Date: Tue, 3 Nov 2026 14:18:57 +0000 [thread overview]
Message-ID: <20261103141857.672537-4-ckeepax@opensource.cirrus.com> (raw)
In-Reply-To: <20261103141857.672537-1-ckeepax@opensource.cirrus.com>
cs42l43's decimator is particularly susceptible to discontinuities
during startup. To help reduce the pop noises adjust the high
pass filter settings whilst powering up the microphones and add
a sizable delay to let that filter settle, then restore the user
settings.
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
---
Changes since v1:
- Added DAPM lock to affected control handlers
- Corrected order on new registers in the decim_info array
sound/soc/codecs/cs42l43.c | 69 ++++++++++++++++++++++++++++++--------
sound/soc/codecs/cs42l43.h | 3 +-
2 files changed, 57 insertions(+), 15 deletions(-)
diff --git a/sound/soc/codecs/cs42l43.c b/sound/soc/codecs/cs42l43.c
index 8fccddf7a1b22..43758f790cb0f 100644
--- a/sound/soc/codecs/cs42l43.c
+++ b/sound/soc/codecs/cs42l43.c
@@ -1345,19 +1345,27 @@ static const struct snd_kcontrol_new cs42l43_controls[] = {
SOC_ENUM("Decimator 3 WNF Corner Frequency", cs42l43_dec3_wnf_corner),
SOC_ENUM("Decimator 4 WNF Corner Frequency", cs42l43_dec4_wnf_corner),
- SOC_SINGLE("Decimator 1 HPF Switch", CS42L43_DECIM_HPF_WNF_CTRL1,
- CS42L43_DECIM_HPF_EN_SHIFT, 1, 0),
- SOC_SINGLE("Decimator 2 HPF Switch", CS42L43_DECIM_HPF_WNF_CTRL2,
- CS42L43_DECIM_HPF_EN_SHIFT, 1, 0),
- SOC_SINGLE("Decimator 3 HPF Switch", CS42L43_DECIM_HPF_WNF_CTRL3,
- CS42L43_DECIM_HPF_EN_SHIFT, 1, 0),
- SOC_SINGLE("Decimator 4 HPF Switch", CS42L43_DECIM_HPF_WNF_CTRL4,
- CS42L43_DECIM_HPF_EN_SHIFT, 1, 0),
+ SOC_SINGLE_EXT("Decimator 1 HPF Switch", CS42L43_DECIM_HPF_WNF_CTRL1,
+ CS42L43_DECIM_HPF_EN_SHIFT, 1, 0,
+ cs42l43_dapm_get_volsw, cs42l43_dapm_put_volsw),
+ SOC_SINGLE_EXT("Decimator 2 HPF Switch", CS42L43_DECIM_HPF_WNF_CTRL2,
+ CS42L43_DECIM_HPF_EN_SHIFT, 1, 0,
+ cs42l43_dapm_get_volsw, cs42l43_dapm_put_volsw),
+ SOC_SINGLE_EXT("Decimator 3 HPF Switch", CS42L43_DECIM_HPF_WNF_CTRL3,
+ CS42L43_DECIM_HPF_EN_SHIFT, 1, 0,
+ cs42l43_dapm_get_volsw, cs42l43_dapm_put_volsw),
+ SOC_SINGLE_EXT("Decimator 4 HPF Switch", CS42L43_DECIM_HPF_WNF_CTRL4,
+ CS42L43_DECIM_HPF_EN_SHIFT, 1, 0,
+ cs42l43_dapm_get_volsw, cs42l43_dapm_put_volsw),
- SOC_ENUM("Decimator 1 HPF Corner Frequency", cs42l43_dec1_hpf_corner),
- SOC_ENUM("Decimator 2 HPF Corner Frequency", cs42l43_dec2_hpf_corner),
- SOC_ENUM("Decimator 3 HPF Corner Frequency", cs42l43_dec3_hpf_corner),
- SOC_ENUM("Decimator 4 HPF Corner Frequency", cs42l43_dec4_hpf_corner),
+ SOC_ENUM_EXT("Decimator 1 HPF Corner Frequency", cs42l43_dec1_hpf_corner,
+ cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
+ SOC_ENUM_EXT("Decimator 2 HPF Corner Frequency", cs42l43_dec2_hpf_corner,
+ cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
+ SOC_ENUM_EXT("Decimator 3 HPF Corner Frequency", cs42l43_dec3_hpf_corner,
+ cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
+ SOC_ENUM_EXT("Decimator 4 HPF Corner Frequency", cs42l43_dec4_hpf_corner,
+ cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_DOUBLE_R_EXT("Speaker Digital Switch",
CS42L43_INTP_VOLUME_CTRL1, CS42L43_INTP_VOLUME_CTRL2,
@@ -1737,32 +1745,39 @@ static int cs42l43_hp_ev(struct snd_soc_dapm_widget *w,
}
struct decim_info {
+ unsigned int freg;
unsigned int vreg;
unsigned int vmask;
};
static const struct decim_info cs42l43_decim_info[] = {
{
+ .freg = CS42L43_DECIM_HPF_WNF_CTRL1,
.vreg = CS42L43_DECIM_VOL_CTRL_CH1_CH2,
.vmask = CS42L43_DECIM1_VD_RAMP_MASK | CS42L43_DECIM1_MUTE_MASK,
},
{
+ .freg = CS42L43_DECIM_HPF_WNF_CTRL2,
.vreg = CS42L43_DECIM_VOL_CTRL_CH1_CH2,
.vmask = CS42L43_DECIM2_VD_RAMP_MASK | CS42L43_DECIM2_MUTE_MASK,
},
{
+ .freg = CS42L43_DECIM_HPF_WNF_CTRL1,
.vreg = CS42L43_DECIM_VOL_CTRL_CH1_CH2,
.vmask = CS42L43_DECIM1_VD_RAMP_MASK | CS42L43_DECIM1_MUTE_MASK,
},
{
+ .freg = CS42L43_DECIM_HPF_WNF_CTRL2,
.vreg = CS42L43_DECIM_VOL_CTRL_CH1_CH2,
.vmask = CS42L43_DECIM2_VD_RAMP_MASK | CS42L43_DECIM2_MUTE_MASK,
},
{
+ .freg = CS42L43_DECIM_HPF_WNF_CTRL3,
.vreg = CS42L43_DECIM_VOL_CTRL_CH3_CH4,
.vmask = CS42L43_DECIM3_VD_RAMP_MASK | CS42L43_DECIM3_MUTE_MASK,
},
{
+ .freg = CS42L43_DECIM_HPF_WNF_CTRL4,
.vreg = CS42L43_DECIM_VOL_CTRL_CH3_CH4,
.vmask = CS42L43_DECIM4_VD_RAMP_MASK | CS42L43_DECIM4_MUTE_MASK,
}
@@ -1770,26 +1785,32 @@ static const struct decim_info cs42l43_decim_info[] = {
static const struct decim_info cs42l43b_decim_info[] = {
{
+ .freg = CS42L43_DECIM_HPF_WNF_CTRL1,
.vreg = CS42L43B_DECIM_VOL_CTRL_CH1_CH2,
.vmask = CS42L43_DECIM1_VD_RAMP_MASK | CS42L43_DECIM1_MUTE_MASK,
},
{
+ .freg = CS42L43_DECIM_HPF_WNF_CTRL2,
.vreg = CS42L43B_DECIM_VOL_CTRL_CH1_CH2,
.vmask = CS42L43_DECIM2_VD_RAMP_MASK | CS42L43_DECIM2_MUTE_MASK,
},
{
+ .freg = CS42L43_DECIM_HPF_WNF_CTRL3,
.vreg = CS42L43B_DECIM_VOL_CTRL_CH3_CH4,
.vmask = CS42L43_DECIM3_VD_RAMP_MASK | CS42L43_DECIM3_MUTE_MASK,
},
{
+ .freg = CS42L43_DECIM_HPF_WNF_CTRL4,
.vreg = CS42L43B_DECIM_VOL_CTRL_CH3_CH4,
.vmask = CS42L43_DECIM4_VD_RAMP_MASK | CS42L43_DECIM4_MUTE_MASK,
},
{
+ .freg = CS42L43B_DECIM_HPF_WNF_CTRL5,
.vreg = CS42L43B_DECIM_VOL_CTRL_CH5_CH6,
.vmask = CS42L43B_DECIM5_PATH1_VOL_FALL_RATE_MASK | CS42L43B_DECIM5_MUTE_MASK,
},
{
+ .freg = CS42L43B_DECIM_HPF_WNF_CTRL6,
.vreg = CS42L43B_DECIM_VOL_CTRL_CH5_CH6,
.vmask = CS42L43B_DECIM6_PATH1_VOL_FALL_RATE_MASK | CS42L43B_DECIM6_MUTE_MASK,
}
@@ -1802,6 +1823,8 @@ static int cs42l43_mic_ev(struct snd_soc_dapm_widget *w,
struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
const struct decim_info *info = &cs42l43_decim_info[w->shift];
struct cs42l43 *cs42l43 = priv->core;
+ unsigned int fmask = CS42L43_DECIM_HPF_EN_MASK | CS42L43_DECIM_HPF_CF_MASK;
+ unsigned int fval = CS42L43_DECIM_HPF_EN_MASK | 3 << CS42L43_DECIM_HPF_CF_SHIFT;
unsigned int vval = CS42L43_DECIM1_MUTE_MASK | CS42L43_DECIM2_MUTE_MASK;
int ret;
@@ -1810,8 +1833,10 @@ static int cs42l43_mic_ev(struct snd_soc_dapm_widget *w,
switch (event) {
case SND_SOC_DAPM_PRE_PMU:
+ priv->decim_pre_pmu = true;
+
ret = regmap_read(cs42l43->regmap, info->vreg,
- &priv->decim_cache[w->shift]);
+ &priv->decim_cache[w->shift][0]);
if (ret) {
dev_err(priv->dev,
"Failed to cache decimator settings: %d\n",
@@ -1819,11 +1844,27 @@ static int cs42l43_mic_ev(struct snd_soc_dapm_widget *w,
return ret;
}
+ ret = regmap_read(cs42l43->regmap, info->freg,
+ &priv->decim_cache[w->shift][1]);
+ if (ret) {
+ dev_err(priv->dev,
+ "Failed to cache decimator filter settings: %d\n", ret);
+ return ret;
+ }
+
regmap_update_bits(cs42l43->regmap, info->vreg, info->vmask, vval);
+ regmap_update_bits(cs42l43->regmap, info->freg, fmask, fval);
break;
case SND_SOC_DAPM_POST_PMU:
+ if (priv->decim_pre_pmu) {
+ msleep(150);
+ priv->decim_pre_pmu = false;
+ }
+
+ regmap_update_bits(cs42l43->regmap, info->freg, fmask,
+ priv->decim_cache[w->shift][1]);
regmap_update_bits(cs42l43->regmap, info->vreg, info->vmask,
- priv->decim_cache[w->shift]);
+ priv->decim_cache[w->shift][0]);
break;
default:
break;
diff --git a/sound/soc/codecs/cs42l43.h b/sound/soc/codecs/cs42l43.h
index fd50feb26ae99..2dc8d530a1fc0 100644
--- a/sound/soc/codecs/cs42l43.h
+++ b/sound/soc/codecs/cs42l43.h
@@ -61,7 +61,8 @@ struct cs42l43_codec {
unsigned int refclk_freq;
struct completion pll_ready;
- unsigned int decim_cache[6];
+ bool decim_pre_pmu;
+ unsigned int decim_cache[6][2];
unsigned int adc_ena;
unsigned int hp_ena;
--
2.47.3
prev parent reply other threads:[~2026-11-03 14:19 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-03 14:18 [PATCH v2 0/3] Improve pop performance of cs42l43 input path Charles Keepax
2026-11-03 14:18 ` [PATCH v2 1/3] ASoC: cs42l43: Improve analogue mic pop performance Charles Keepax
2026-11-03 14:18 ` [PATCH v2 2/3] ASoC: cs42l43: Factor out decimator startup data to an array Charles Keepax
2026-11-03 14:18 ` Charles Keepax [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261103141857.672537-4-ckeepax@opensource.cirrus.com \
--to=ckeepax@opensource.cirrus.com \
--cc=broonie@kernel.org \
--cc=lgirdwood@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=patches@opensource.cirrus.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®