]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
ALSA: hda/cirrus: Use CS8409 filter to fix abnormal sounds on Bullseye
authorStefan Binding <sbinding@opensource.cirrus.com>
Mon, 26 Apr 2021 03:54:00 +0000 (05:54 +0200)
committerStefan Bader <stefan.bader@canonical.com>
Fri, 7 May 2021 07:54:08 +0000 (09:54 +0200)
BugLink: https://bugs.launchpad.net/bugs/1924997
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 <sbinding@opensource.cirrus.com>
Signed-off-by: Vitaly Rodionov <vitalyr@opensource.cirrus.com>
BugLink: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1924997
Reported-and-tested-by: You-Sheng Yang <vicamo.yang@canonical.com>
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20210426163749.196153-3-vitalyr@opensource.cirrus.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
(backported from 45b14fe200ba0611b6c3874aa5bba584dc979fb9)
Signed-off-by: You-Sheng Yang <vicamo.yang@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Acked-by: Tim Gardner <tim.gardner@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
sound/pci/hda/patch_cirrus.c

index 075a2454b83bebab85eb9755483361e329688bf0..6054f6a193f6c97037d9bd13668b3c346a6a5a40 100644 (file)
@@ -1493,6 +1493,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 */
+};
+
 /* Enable I2C clocks */
 static void cs8409_enable_i2c_clock(struct hda_codec *codec, unsigned int flag)
 {
@@ -2040,6 +2068,7 @@ static void cs8409_enable_ur(struct hda_codec *codec, int flag)
 static int 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) {
@@ -2054,6 +2083,10 @@ static int 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);