[PATCH] ALSA: hda/realtek: Add quirk for Lenovo Ideapad S740

Jaroslav Kysela perex at perex.cz
Fri Apr 16 10:47:32 CEST 2021


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 at cousinscomputers.net>
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> ---
>  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 at perex.cz>
Linux Sound Maintainer; ALSA Project; Red Hat, Inc.


More information about the Alsa-devel mailing list