Skip to content

Commit

Permalink
ALSA: hda/cirrus: Use CS8409 filter to fix abnormal sounds on Bullseye
Browse files Browse the repository at this point in the history
Cracking noises have been reported on the built-in speaker for certain
Bullseye platforms, when volume is > 80%.

This issue is caused by the specific combination of Codec and AMP in
this platform, and cannot be fixed by the AMP, so indead must be fixed
at codec level, by adding attenuation to the volume.

Tested on DELL Inspiron-3505, DELL Inspiron-3501, DELL Inspiron-3500

Signed-off-by: Stefan Binding <[email protected]>
Signed-off-by: Vitaly Rodionov <[email protected]>
BugLink: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1924997
Reported-and-tested-by: You-Sheng Yang <[email protected]>
Cc: <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
Stefan Binding authored and tiwai committed Apr 26, 2021
1 parent 0e853a9 commit 45b14fe
Showing 1 changed file with 33 additions and 0 deletions.
33 changes: 33 additions & 0 deletions sound/pci/hda/patch_cirrus.c
Original file line number Diff line number Diff line change
Expand Up @@ -1481,6 +1481,34 @@ static const struct cs8409_cir_param cs8409_cs42l42_hw_cfg[] = {
{} /* Terminator */
};

static const struct cs8409_cir_param cs8409_cs42l42_bullseye_atn[] = {
{ 0x47, 0x65, 0x4000 }, /* EQ_SEL=1, EQ1/2_EN=0 */
{ 0x47, 0x64, 0x4000 }, /* +EQ_ACC */
{ 0x47, 0x65, 0x4010 }, /* +EQ2_EN */
{ 0x47, 0x63, 0x0647 }, /* EQ_DATA_HI=0x0647 */
{ 0x47, 0x64, 0xc0c7 }, /* +EQ_WRT, +EQ_ACC, EQ_ADR=0, EQ_DATA_LO=0x67 */
{ 0x47, 0x63, 0x0647 }, /* EQ_DATA_HI=0x0647 */
{ 0x47, 0x64, 0xc1c7 }, /* +EQ_WRT, +EQ_ACC, EQ_ADR=1, EQ_DATA_LO=0x67 */
{ 0x47, 0x63, 0xf370 }, /* EQ_DATA_HI=0xf370 */
{ 0x47, 0x64, 0xc271 }, /* +EQ_WRT, +EQ_ACC, EQ_ADR=2, EQ_DATA_LO=0x71 */
{ 0x47, 0x63, 0x1ef8 }, /* EQ_DATA_HI=0x1ef8 */
{ 0x47, 0x64, 0xc348 }, /* +EQ_WRT, +EQ_ACC, EQ_ADR=3, EQ_DATA_LO=0x48 */
{ 0x47, 0x63, 0xc110 }, /* EQ_DATA_HI=0xc110 */
{ 0x47, 0x64, 0xc45a }, /* +EQ_WRT, +EQ_ACC, EQ_ADR=4, EQ_DATA_LO=0x5a */
{ 0x47, 0x63, 0x1f29 }, /* EQ_DATA_HI=0x1f29 */
{ 0x47, 0x64, 0xc574 }, /* +EQ_WRT, +EQ_ACC, EQ_ADR=5, EQ_DATA_LO=0x74 */
{ 0x47, 0x63, 0x1d7a }, /* EQ_DATA_HI=0x1d7a */
{ 0x47, 0x64, 0xc653 }, /* +EQ_WRT, +EQ_ACC, EQ_ADR=6, EQ_DATA_LO=0x53 */
{ 0x47, 0x63, 0xc38c }, /* EQ_DATA_HI=0xc38c */
{ 0x47, 0x64, 0xc714 }, /* +EQ_WRT, +EQ_ACC, EQ_ADR=7, EQ_DATA_LO=0x14 */
{ 0x47, 0x63, 0x1ca3 }, /* EQ_DATA_HI=0x1ca3 */
{ 0x47, 0x64, 0xc8c7 }, /* +EQ_WRT, +EQ_ACC, EQ_ADR=8, EQ_DATA_LO=0xc7 */
{ 0x47, 0x63, 0xc38c }, /* EQ_DATA_HI=0xc38c */
{ 0x47, 0x64, 0xc914 }, /* +EQ_WRT, +EQ_ACC, EQ_ADR=9, EQ_DATA_LO=0x14 */
{ 0x47, 0x64, 0x0000 }, /* -EQ_ACC, -EQ_WRT */
{} /* Terminator */
};

/**
* cs8409_enable_i2c_clock - Enable I2C clocks
* @codec: the codec instance
Expand Down Expand Up @@ -2029,6 +2057,7 @@ static void cs8409_enable_ur(struct hda_codec *codec, int flag)
static void cs8409_cs42l42_hw_init(struct hda_codec *codec)
{
const struct cs8409_cir_param *seq = cs8409_cs42l42_hw_cfg;
const struct cs8409_cir_param *seq_bullseye = cs8409_cs42l42_bullseye_atn;
struct cs_spec *spec = codec->spec;

if (spec->gpio_mask) {
Expand All @@ -2043,6 +2072,10 @@ static void cs8409_cs42l42_hw_init(struct hda_codec *codec)
for (; seq->nid; seq++)
cs_vendor_coef_set(codec, seq->cir, seq->coeff);

if (codec->fixup_id == CS8409_BULLSEYE)
for (; seq_bullseye->nid; seq_bullseye++)
cs_vendor_coef_set(codec, seq_bullseye->cir, seq_bullseye->coeff);

/* Disable Unsolicited Response during boot */
cs8409_enable_ur(codec, 0);

Expand Down

0 comments on commit 45b14fe

Please sign in to comment.