Skip to content

Commit 1cae21e

Browse files
Stefan Bindingsmb49
authored andcommitted
ALSA: hda: cs35l41: Ensure amp is only unmuted during playback
BugLink: https://bugs.launchpad.net/bugs/2029199 Currently we only mute after playback has finished, and unmute prior to setting global enable. To prevent any possible pops and clicks, mute at probe, and then only unmute after global enable is set. Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com> Link: https://lore.kernel.org/r/20230721151816.2080453-12-sbinding@opensource.cirrus.com Signed-off-by: Takashi Iwai <tiwai@suse.de> (cherry picked from commit 2d816d4f92086ca0a7b79198794012076b4cab0b linux-next) Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
1 parent 0d4b3cd commit 1cae21e

1 file changed

Lines changed: 20 additions & 2 deletions

File tree

sound/pci/hda/cs35l41_hda.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,6 @@ static const struct reg_sequence cs35l41_hda_config[] = {
5858
{ CS35L41_DSP1_RX3_SRC, 0x00000018 }, // DSP1RX3 SRC = VMON
5959
{ CS35L41_DSP1_RX4_SRC, 0x00000019 }, // DSP1RX4 SRC = IMON
6060
{ CS35L41_DSP1_RX5_SRC, 0x00000020 }, // DSP1RX5 SRC = ERRVOL
61-
{ CS35L41_AMP_DIG_VOL_CTRL, 0x00008000 }, // AMP_HPF_PCM_EN = 1, AMP_VOL_PCM 0.0 dB
62-
{ CS35L41_AMP_GAIN_CTRL, 0x00000084 }, // AMP_GAIN_PCM 4.5 dB
6361
};
6462

6563
static const struct reg_sequence cs35l41_hda_config_dsp[] = {
@@ -82,6 +80,14 @@ static const struct reg_sequence cs35l41_hda_config_dsp[] = {
8280
{ CS35L41_DSP1_RX3_SRC, 0x00000018 }, // DSP1RX3 SRC = VMON
8381
{ CS35L41_DSP1_RX4_SRC, 0x00000019 }, // DSP1RX4 SRC = IMON
8482
{ CS35L41_DSP1_RX5_SRC, 0x00000029 }, // DSP1RX5 SRC = VBSTMON
83+
};
84+
85+
static const struct reg_sequence cs35l41_hda_unmute[] = {
86+
{ CS35L41_AMP_DIG_VOL_CTRL, 0x00008000 }, // AMP_HPF_PCM_EN = 1, AMP_VOL_PCM 0.0 dB
87+
{ CS35L41_AMP_GAIN_CTRL, 0x00000084 }, // AMP_GAIN_PCM 4.5 dB
88+
};
89+
90+
static const struct reg_sequence cs35l41_hda_unmute_dsp[] = {
8591
{ CS35L41_AMP_DIG_VOL_CTRL, 0x00008000 }, // AMP_HPF_PCM_EN = 1, AMP_VOL_PCM 0.0 dB
8692
{ CS35L41_AMP_GAIN_CTRL, 0x00000233 }, // AMP_GAIN_PCM = 17.5dB AMP_GAIN_PDM = 19.5dB
8793
};
@@ -522,6 +528,13 @@ static void cs35l41_hda_play_done(struct device *dev)
522528

523529
cs35l41_global_enable(dev, reg, cs35l41->hw_cfg.bst_type, 1, NULL,
524530
cs35l41->firmware_running);
531+
if (cs35l41->firmware_running) {
532+
regmap_multi_reg_write(reg, cs35l41_hda_unmute_dsp,
533+
ARRAY_SIZE(cs35l41_hda_unmute_dsp));
534+
} else {
535+
regmap_multi_reg_write(reg, cs35l41_hda_unmute,
536+
ARRAY_SIZE(cs35l41_hda_unmute));
537+
}
525538
}
526539

527540
static void cs35l41_hda_pause_start(struct device *dev)
@@ -1620,6 +1633,11 @@ int cs35l41_hda_probe(struct device *dev, const char *device_name, int id, int i
16201633
if (ret)
16211634
goto err;
16221635

1636+
ret = regmap_multi_reg_write(cs35l41->regmap, cs35l41_hda_mute,
1637+
ARRAY_SIZE(cs35l41_hda_mute));
1638+
if (ret)
1639+
goto err;
1640+
16231641
INIT_WORK(&cs35l41->fw_load_work, cs35l41_fw_load_work);
16241642
mutex_init(&cs35l41->fw_mutex);
16251643

0 commit comments

Comments
 (0)