Dne 16. 04. 21 v 10:12 Takashi Iwai napsal(a): > Lenovo Ideapad S740 requires quite a few COEF setups to make its > speakers working. The verb table was provided from Ryan Prescott as > the result of investigation via qemu: > https://github.com/ryanprescott/realtek-verb-tools/wiki/How-to-sniff-verbs-from-a-Windows-sound-driver [Cc: to Kailang / Realtek] I believe that this sequence contains I2C writes to amplifier chips. It would be really helpful, if Realtek can provide more information for the I2C master interface for their codecs (describe basic I2C I/O). Thank you, Jaroslav > > BugLink: https://github.com/thesofproject/linux/issues/2748 > Tested-by: Ryan Prescott <ryan@xxxxxxxxxxxxxxxxxxxx> > Signed-off-by: Takashi Iwai <tiwai@xxxxxxx> > --- > sound/pci/hda/ideapad_s740_helper.c | 492 ++++++++++++++++++++++++++++ > sound/pci/hda/patch_realtek.c | 11 + > 2 files changed, 503 insertions(+) > create mode 100644 sound/pci/hda/ideapad_s740_helper.c > > diff --git a/sound/pci/hda/ideapad_s740_helper.c b/sound/pci/hda/ideapad_s740_helper.c > new file mode 100644 > index 000000000000..564b9086e52d > --- /dev/null > +++ b/sound/pci/hda/ideapad_s740_helper.c > @@ -0,0 +1,492 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* Fixes for Lenovo Ideapad S740, to be included from codec driver */ > + > +static const struct hda_verb alc285_ideapad_s740_coefs[] = { > +{ 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 alc285_fixup_ideapad_s740_coef(struct hda_codec *codec, > + const struct hda_fixup *fix, > + int action) > +{ > + switch (action) { > + case HDA_FIXUP_ACT_PRE_PROBE: > + snd_hda_add_verbs(codec, alc285_ideapad_s740_coefs); > + break; > + } > +} > diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c > index 50437ec1b9af..1ef40f3ca259 100644 > --- a/sound/pci/hda/patch_realtek.c > +++ b/sound/pci/hda/patch_realtek.c > @@ -6239,6 +6239,9 @@ static void alc_fixup_thinkpad_acpi(struct hda_codec *codec, > /* for alc295_fixup_hp_top_speakers */ > #include "hp_x360_helper.c" > > +/* for alc285_fixup_ideapad_s740_coef() */ > +#include "ideapad_s740_helper.c" > + > enum { > ALC269_FIXUP_GPIO2, > ALC269_FIXUP_SONY_VAIO, > @@ -6436,6 +6439,7 @@ enum { > ALC282_FIXUP_ACER_DISABLE_LINEOUT, > ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST, > ALC256_FIXUP_ACER_HEADSET_MIC, > + ALC285_FIXUP_IDEAPAD_S740_COEF, > }; > > static const struct hda_fixup alc269_fixups[] = { > @@ -7920,6 +7924,12 @@ static const struct hda_fixup alc269_fixups[] = { > .chained = true, > .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC > }, > + [ALC285_FIXUP_IDEAPAD_S740_COEF] = { > + .type = HDA_FIXUP_FUNC, > + .v.func = alc285_fixup_ideapad_s740_coef, > + .chained = true, > + .chain_id = ALC269_FIXUP_THINKPAD_ACPI, > + }, > }; > > static const struct snd_pci_quirk alc269_fixup_tbl[] = { > @@ -8263,6 +8273,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { > SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC), > SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC), > 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, 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), > -- Jaroslav Kysela <perex@xxxxxxxx> Linux Sound Maintainer; ALSA Project; Red Hat, Inc.