diff --git a/sys/dev/sound/pci/hda/hdaa_patches.c b/sys/dev/sound/pci/hda/hdaa_patches.c --- a/sys/dev/sound/pci/hda/hdaa_patches.c +++ b/sys/dev/sound/pci/hda/hdaa_patches.c @@ -39,6 +39,7 @@ #include #include +#include #include #include @@ -317,15 +318,16 @@ break; } } else if (id == HDA_CODEC_ALC257 && - (subid == LENOVO_L5AMD_SUBVENDOR || - subid == LENOVO_L5INTEL_SUBVENDOR || - subid == LENOVO_IDEAPAD3_SUBVENDOR)) { + HDA_DEV_MATCH(LENOVO_ALL_SUBVENDOR, subid)) { switch (nid) { case 20: patch_str = "as=1 seq=0"; break; + case 25: + patch_str = "loc=Left"; + break; case 33: - patch_str = "as=1 seq=15"; + patch_str = "as=1 seq=15 loc=Left"; break; } } else if (id == HDA_CODEC_IDT92HD95B && @@ -705,6 +707,21 @@ return (hda_command(dev, HDA_CMD_SET_PROCESSING_COEFF(0, nid, val))); } +static uint32_t +hdaa_update_coef(device_t dev, nid_t nid, uint16_t idx, uint16_t mask, uint16_t val) +{ + uint16_t curr; + + hda_command(dev, HDA_CMD_SET_COEFF_INDEX(0, nid, idx)); + curr = (hda_command(dev, HDA_CMD_GET_PROCESSING_COEFF(0, nid))); + if (curr != USHRT_MAX ) { + val = (curr & ~mask) | val; + hda_command(dev, HDA_CMD_SET_COEFF_INDEX(0, nid, idx)); + val = (hda_command(dev, HDA_CMD_SET_PROCESSING_COEFF(0, nid, val))); + } + return val; +} + void hdaa_patch_direct(struct hdaa_devinfo *devinfo) { @@ -738,10 +755,19 @@ hdaa_write_coef(dev, 0x20, 0x07, 0x7cb); } break; - } - if (id == HDA_CODEC_ALC255 || id == HDA_CODEC_ALC256) { - val = hdaa_read_coef(dev, 0x20, 0x46); - hdaa_write_coef(dev, 0x20, 0x46, val|0x3000); + case HDA_CODEC_ALC255: + case HDA_CODEC_ALC256: + case HDA_CODEC_ALC257: + hdaa_update_coef(dev, 0x57, 0x04, 0x0007, 0x01); + hdaa_write_coef(dev, 0x21, 0x300, 0xb080); + hdaa_write_coef(dev, 0x21, 0x707, 1 << 6); + hdaa_update_coef(dev, 0x20, 0x46, 3 << 12, 0); + hdaa_update_coef(dev, 0x57, 0x04, 0x0007, 0x4); + hdaa_update_coef(dev, 0x53, 0x02, 0x8000, 1 << 15); + hdaa_update_coef(dev, 0x53, 0x02, 0x8000, 0 << 15); + /* Enable Mic / Line In instead of PC Beep on 1Ah. */ + hdaa_write_coef(dev, 0x20, 0x36, 0x5757); + break; } if (subid == APPLE_INTEL_MAC) hda_command(dev, HDA_CMD_12BIT(0, devinfo->nid, diff --git a/sys/dev/sound/pci/hda/hdac.h b/sys/dev/sound/pci/hda/hdac.h --- a/sys/dev/sound/pci/hda/hdac.h +++ b/sys/dev/sound/pci/hda/hdac.h @@ -332,6 +332,7 @@ #define ASUS_G2K_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1339) #define ASUS_Z550SA_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x13b0) #define ASUS_A7T_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x13c2) +#define ASUS_FA507XI_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x14b3) #define ASUS_UX331_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x14de) #define ASUS_UX31A_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1517) #define ASUS_GL553VE_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x15e0) @@ -386,6 +387,8 @@ #define LENOVO_3000_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x384e) #define LENOVO_IDEAPAD330_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x3808) #define LENOVO_IDEAPAD3_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x3881) +#define LENOVO_LEGION_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x385a) +#define LENOVO_THINKBOOK_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x386a) #define LENOVO_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0xffff) /* Samsung */ diff --git a/sys/dev/sound/pci/hda/pin_patch_realtek.h b/sys/dev/sound/pci/hda/pin_patch_realtek.h --- a/sys/dev/sound/pci/hda/pin_patch_realtek.h +++ b/sys/dev/sound/pci/hda/pin_patch_realtek.h @@ -235,6 +235,16 @@ PIN_PATCH_STRING(25, "as=2 misc=1 color=Black ctype=1/8 device=Mic loc=Right"), { } } + }, { + .models = (struct pin_machine_model_t[]){ + PIN_SUBVENDOR(ASUS_FA507XI_SUBVENDOR), + { } + }, + .pin_patches = (struct pin_patch_t[]){ + PIN_PATCH_STRING(25, "as=3 seq=15 misc=0 color=Black ctype=1/8 device=Mic loc=Left conn=Jack"), + PIN_PATCH_STRING(33, "as=1 seq=15"), + { } + } }, { } } }, { /**** CODEC: HDA_CODEC_ALC260 ****/