Date: Wed, 27 Mar 2013 07:30:08 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r248786 - head/sys/dev/sound/pci/hda Message-ID: <201303270730.r2R7U8pg002916@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mav Date: Wed Mar 27 07:30:08 2013 New Revision: 248786 URL: http://svnweb.freebsd.org/changeset/base/248786 Log: Add Subsystem ID field to the quirk table. Use it to identify Mac Pro 1,1, which requires OVREF to be set to get proper playback volume, but which has all zeroes in HDA controller subdevice IDs on PCI. MFC after: 1 month Sponsored by: Modified: head/sys/dev/sound/pci/hda/hdaa_patches.c Modified: head/sys/dev/sound/pci/hda/hdaa_patches.c ============================================================================== --- head/sys/dev/sound/pci/hda/hdaa_patches.c Wed Mar 27 07:16:14 2013 (r248785) +++ head/sys/dev/sound/pci/hda/hdaa_patches.c Wed Mar 27 07:30:08 2013 (r248786) @@ -47,6 +47,7 @@ SND_DECLARE_FILE("$FreeBSD$"); static const struct { uint32_t model; uint32_t id; + uint32_t subsystemid; uint32_t set, unset; uint32_t gpio; } hdac_quirks[] = { @@ -55,77 +56,81 @@ static const struct { * on few codecs (especially ALC880) seems broken or * perhaps unsupported. */ - { HDA_MATCH_ALL, HDA_MATCH_ALL, + { HDA_MATCH_ALL, HDA_MATCH_ALL, HDA_MATCH_ALL, HDAA_QUIRK_FORCESTEREO | HDAA_QUIRK_IVREF, 0, 0 }, - { ACER_ALL_SUBVENDOR, HDA_MATCH_ALL, + { ACER_ALL_SUBVENDOR, HDA_MATCH_ALL, HDA_MATCH_ALL, 0, 0, HDAA_GPIO_SET(0) }, - { ASUS_G2K_SUBVENDOR, HDA_CODEC_ALC660, + { ASUS_G2K_SUBVENDOR, HDA_CODEC_ALC660, HDA_MATCH_ALL, 0, 0, HDAA_GPIO_SET(0) }, - { ASUS_M5200_SUBVENDOR, HDA_CODEC_ALC880, + { ASUS_M5200_SUBVENDOR, HDA_CODEC_ALC880, HDA_MATCH_ALL, 0, 0, HDAA_GPIO_SET(0) }, - { ASUS_A7M_SUBVENDOR, HDA_CODEC_ALC880, + { ASUS_A7M_SUBVENDOR, HDA_CODEC_ALC880, HDA_MATCH_ALL, 0, 0, HDAA_GPIO_SET(0) }, - { ASUS_A7T_SUBVENDOR, HDA_CODEC_ALC882, + { ASUS_A7T_SUBVENDOR, HDA_CODEC_ALC882, HDA_MATCH_ALL, 0, 0, HDAA_GPIO_SET(0) }, - { ASUS_W2J_SUBVENDOR, HDA_CODEC_ALC882, + { ASUS_W2J_SUBVENDOR, HDA_CODEC_ALC882, HDA_MATCH_ALL, 0, 0, HDAA_GPIO_SET(0) }, - { ASUS_U5F_SUBVENDOR, HDA_CODEC_AD1986A, + { ASUS_U5F_SUBVENDOR, HDA_CODEC_AD1986A, HDA_MATCH_ALL, HDAA_QUIRK_EAPDINV, 0, 0 }, - { ASUS_A8X_SUBVENDOR, HDA_CODEC_AD1986A, + { ASUS_A8X_SUBVENDOR, HDA_CODEC_AD1986A, HDA_MATCH_ALL, HDAA_QUIRK_EAPDINV, 0, 0 }, - { ASUS_F3JC_SUBVENDOR, HDA_CODEC_ALC861, + { ASUS_F3JC_SUBVENDOR, HDA_CODEC_ALC861, HDA_MATCH_ALL, HDAA_QUIRK_OVREF, 0, 0 }, - { UNIWILL_9075_SUBVENDOR, HDA_CODEC_ALC861, + { UNIWILL_9075_SUBVENDOR, HDA_CODEC_ALC861, HDA_MATCH_ALL, HDAA_QUIRK_OVREF, 0, 0 }, - /*{ ASUS_M2N_SUBVENDOR, HDA_CODEC_AD1988, + /*{ ASUS_M2N_SUBVENDOR, HDA_CODEC_AD1988, HDA_MATCH_ALL, HDAA_QUIRK_IVREF80, HDAA_QUIRK_IVREF50 | HDAA_QUIRK_IVREF100, 0 },*/ - { MEDION_MD95257_SUBVENDOR, HDA_CODEC_ALC880, + { MEDION_MD95257_SUBVENDOR, HDA_CODEC_ALC880, HDA_MATCH_ALL, 0, 0, HDAA_GPIO_SET(1) }, - { LENOVO_3KN100_SUBVENDOR, HDA_CODEC_AD1986A, + { LENOVO_3KN100_SUBVENDOR, HDA_CODEC_AD1986A, HDA_MATCH_ALL, HDAA_QUIRK_EAPDINV | HDAA_QUIRK_SENSEINV, 0, 0 }, - { SAMSUNG_Q1_SUBVENDOR, HDA_CODEC_AD1986A, + { SAMSUNG_Q1_SUBVENDOR, HDA_CODEC_AD1986A, HDA_MATCH_ALL, HDAA_QUIRK_EAPDINV, 0, 0 }, - { APPLE_MB3_SUBVENDOR, HDA_CODEC_ALC885, + { APPLE_MB3_SUBVENDOR, HDA_CODEC_ALC885, HDA_MATCH_ALL, HDAA_QUIRK_OVREF50, 0, HDAA_GPIO_SET(0) }, - { APPLE_INTEL_MAC, HDA_CODEC_STAC9221, + { APPLE_INTEL_MAC, HDA_CODEC_STAC9221, HDA_MATCH_ALL, 0, 0, HDAA_GPIO_SET(0) | HDAA_GPIO_SET(1) }, - { APPLE_MACBOOKPRO55, HDA_CODEC_CS4206, + { APPLE_MACBOOKPRO55, HDA_CODEC_CS4206, HDA_MATCH_ALL, 0, 0, HDAA_GPIO_SET(1) | HDAA_GPIO_SET(3) }, - { DELL_D630_SUBVENDOR, HDA_CODEC_STAC9205X, + { DELL_D630_SUBVENDOR, HDA_CODEC_STAC9205X, HDA_MATCH_ALL, 0, 0, HDAA_GPIO_SET(0) }, - { DELL_V1400_SUBVENDOR, HDA_CODEC_STAC9228X, + { DELL_V1400_SUBVENDOR, HDA_CODEC_STAC9228X, HDA_MATCH_ALL, 0, 0, HDAA_GPIO_SET(2) }, - { DELL_V1500_SUBVENDOR, HDA_CODEC_STAC9205X, + { DELL_V1500_SUBVENDOR, HDA_CODEC_STAC9205X, HDA_MATCH_ALL, 0, 0, HDAA_GPIO_SET(0) }, - { HDA_MATCH_ALL, HDA_CODEC_AD1988, + { HDA_MATCH_ALL, HDA_CODEC_AD1988, HDA_MATCH_ALL, HDAA_QUIRK_IVREF80, HDAA_QUIRK_IVREF50 | HDAA_QUIRK_IVREF100, 0 }, - { HDA_MATCH_ALL, HDA_CODEC_AD1988B, + { HDA_MATCH_ALL, HDA_CODEC_AD1988B, HDA_MATCH_ALL, HDAA_QUIRK_IVREF80, HDAA_QUIRK_IVREF50 | HDAA_QUIRK_IVREF100, 0 }, - { HDA_MATCH_ALL, HDA_CODEC_CX20549, + { HDA_MATCH_ALL, HDA_CODEC_CX20549, HDA_MATCH_ALL, 0, HDAA_QUIRK_FORCESTEREO, + 0 }, + /* Mac Pro 1,1 requires ovref for proper volume level. */ + { 0x00000000, HDA_CODEC_ALC885, 0x106b0c00, + 0, HDAA_QUIRK_OVREF, 0 } }; #define HDAC_QUIRKS_LEN (sizeof(hdac_quirks) / sizeof(hdac_quirks[0])) @@ -425,18 +430,20 @@ void hdaa_patch(struct hdaa_devinfo *devinfo) { struct hdaa_widget *w; - uint32_t id, subid; + uint32_t id, subid, subsystemid; int i; id = hdaa_codec_id(devinfo); subid = hdaa_card_id(devinfo); + subsystemid = hda_get_subsystem_id(devinfo->dev); /* * Quirks */ for (i = 0; i < HDAC_QUIRKS_LEN; i++) { if (!(HDA_DEV_MATCH(hdac_quirks[i].model, subid) && - HDA_DEV_MATCH(hdac_quirks[i].id, id))) + HDA_DEV_MATCH(hdac_quirks[i].id, id) && + HDA_DEV_MATCH(hdac_quirks[i].subsystemid, subsystemid))) continue; devinfo->quirks |= hdac_quirks[i].set; devinfo->quirks &= ~(hdac_quirks[i].unset);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201303270730.r2R7U8pg002916>