diff --git a/sound/pci/hda/legion_15imhg05_speakers.c b/sound/pci/hda/legion_15imhg05_speakers.c new file mode 100644 index 000000000000..2a0f2d32af01 --- /dev/null +++ b/sound/pci/hda/legion_15imhg05_speakers.c @@ -0,0 +1,491 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Fixes for Lenovo Legion 15IMHg05 speaker output. */ + +static const struct hda_verb alc287_legion_init_verbs[] = { + { 0x20, AC_VERB_SET_COEF_INDEX, 0x10 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0320 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0041 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0041 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x007f }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x007f }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0001 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0001 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0001 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0001 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x003c }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0011 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x003c }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0011 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x000c }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x001a }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x000c }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x001a }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x000f }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0042 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x000f }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0042 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0010 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0040 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0010 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0040 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0009 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0009 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x001c }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x004c }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x001c }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x004c }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x001d }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x004e }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x001d }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x004e }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x001b }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0001 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x001b }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0001 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0019 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0025 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0019 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0025 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0018 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0037 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0018 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0037 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x001a }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0040 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x001a }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0040 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0016 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0076 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0016 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0076 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0017 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0010 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0017 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0010 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0015 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0015 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0015 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0015 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0007 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0086 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0007 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0086 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0002 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0001 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0002 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0001 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0002 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0002 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0042 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0042 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x007f }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x007f }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0001 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0001 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0001 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0001 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x003c }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0011 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x003c }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0011 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x000c }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x002a }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x000c }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x002a }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x000f }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0046 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x000f }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0046 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0010 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0044 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0010 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0044 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0009 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0009 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x001c }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x004c }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x001c }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x004c }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x001b }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0001 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x001b }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0001 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0019 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0025 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0019 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0025 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0018 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0037 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0018 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0037 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x001a }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0040 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x001a }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0040 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0016 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0076 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0016 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0076 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0017 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0010 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0017 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0010 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0015 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0015 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0015 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0015 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0007 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0086 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0007 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0086 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0002 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0001 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0002 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0001 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x29 }, + { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0002 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, + {} +}; + +static void alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec, + const struct hda_fixup *fix, + int action) { + switch (action) { + case HDA_FIXUP_ACT_INIT: + snd_hda_add_verbs(codec, alc287_legion_init_verbs); + break; + } +} diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index e46e43dac6bf..06259fcbf8cf 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -6352,6 +6352,9 @@ static void alc_fixup_thinkpad_acpi(struct hda_codec *codec, /* for alc285_fixup_ideapad_s740_coef() */ #include "ideapad_s740_helper.c" +/* For alc287_fixup_legion_15imhg05_speakers() */ +#include "legion_15imhg05_speakers.c" + enum { ALC269_FIXUP_GPIO2, ALC269_FIXUP_SONY_VAIO, @@ -6561,6 +6564,7 @@ enum { ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, ALC623_FIXUP_LENOVO_THINKSTATION_P340, ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, + ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS, }; static const struct hda_fixup alc269_fixups[] = { @@ -8088,6 +8092,13 @@ static const struct hda_fixup alc269_fixups[] = { .chained = true, .chain_id = ALC269_FIXUP_THINKPAD_ACPI, }, + [ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc287_fixup_legion_15imhg05_speakers, + .chained = true, + /* TODO: figure this out. Is it needed? */ + /* .chain_id = ALC269_FIXUP_THINKPAD_ACPI, */ + }, [ALC295_FIXUP_ASUS_DACS] = { .type = HDA_FIXUP_FUNC, .v.func = alc295_fixup_asus_dacs, @@ -8520,6 +8531,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940", ALC298_FIXUP_LENOVO_SPK_VOLUME), SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF), SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP), + SND_PCI_QUIRK(0x17aa, 0x3813, "Lenovo Legion 7", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS), SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI), SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),