diff options
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 317 |
1 files changed, 193 insertions, 124 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 98b4b2e1b930..a06c9437cdeb 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -303,6 +303,8 @@ struct alc_customize_define { | |||
| 303 | unsigned int fixup:1; /* Means that this sku is set by driver, not read from hw */ | 303 | unsigned int fixup:1; /* Means that this sku is set by driver, not read from hw */ |
| 304 | }; | 304 | }; |
| 305 | 305 | ||
| 306 | struct alc_fixup; | ||
| 307 | |||
| 306 | struct alc_spec { | 308 | struct alc_spec { |
| 307 | /* codec parameterization */ | 309 | /* codec parameterization */ |
| 308 | struct snd_kcontrol_new *mixers[5]; /* mixer arrays */ | 310 | struct snd_kcontrol_new *mixers[5]; /* mixer arrays */ |
| @@ -404,6 +406,11 @@ struct alc_spec { | |||
| 404 | /* for PLL fix */ | 406 | /* for PLL fix */ |
| 405 | hda_nid_t pll_nid; | 407 | hda_nid_t pll_nid; |
| 406 | unsigned int pll_coef_idx, pll_coef_bit; | 408 | unsigned int pll_coef_idx, pll_coef_bit; |
| 409 | |||
| 410 | /* fix-up list */ | ||
| 411 | int fixup_id; | ||
| 412 | const struct alc_fixup *fixup_list; | ||
| 413 | const char *fixup_name; | ||
| 407 | }; | 414 | }; |
| 408 | 415 | ||
| 409 | /* | 416 | /* |
| @@ -1683,88 +1690,130 @@ struct alc_model_fixup { | |||
| 1683 | }; | 1690 | }; |
| 1684 | 1691 | ||
| 1685 | struct alc_fixup { | 1692 | struct alc_fixup { |
| 1686 | unsigned int sku; | 1693 | int type; |
| 1687 | const struct alc_pincfg *pins; | 1694 | union { |
| 1688 | const struct hda_verb *verbs; | 1695 | unsigned int sku; |
| 1689 | void (*func)(struct hda_codec *codec, const struct alc_fixup *fix, | 1696 | const struct alc_pincfg *pins; |
| 1690 | int pre_init); | 1697 | const struct hda_verb *verbs; |
| 1698 | void (*func)(struct hda_codec *codec, | ||
| 1699 | const struct alc_fixup *fix, | ||
| 1700 | int action); | ||
| 1701 | } v; | ||
| 1702 | bool chained; | ||
| 1703 | int chain_id; | ||
| 1691 | }; | 1704 | }; |
| 1692 | 1705 | ||
| 1693 | static void __alc_pick_fixup(struct hda_codec *codec, | 1706 | enum { |
| 1694 | const struct alc_fixup *fix, | 1707 | ALC_FIXUP_INVALID, |
| 1695 | const char *modelname, | 1708 | ALC_FIXUP_SKU, |
| 1696 | int pre_init) | 1709 | ALC_FIXUP_PINS, |
| 1710 | ALC_FIXUP_VERBS, | ||
| 1711 | ALC_FIXUP_FUNC, | ||
| 1712 | }; | ||
| 1713 | |||
| 1714 | enum { | ||
| 1715 | ALC_FIXUP_ACT_PRE_PROBE, | ||
| 1716 | ALC_FIXUP_ACT_PROBE, | ||
| 1717 | }; | ||
| 1718 | |||
| 1719 | static void alc_apply_fixup(struct hda_codec *codec, int action) | ||
| 1697 | { | 1720 | { |
| 1698 | const struct alc_pincfg *cfg; | 1721 | struct alc_spec *spec = codec->spec; |
| 1699 | struct alc_spec *spec; | 1722 | int id = spec->fixup_id; |
| 1723 | const char *modelname = spec->fixup_name; | ||
| 1724 | int depth = 0; | ||
| 1700 | 1725 | ||
| 1701 | cfg = fix->pins; | 1726 | if (!spec->fixup_list) |
| 1702 | if (pre_init && fix->sku) { | 1727 | return; |
| 1703 | #ifdef CONFIG_SND_DEBUG_VERBOSE | 1728 | |
| 1704 | snd_printdd(KERN_INFO "hda_codec: %s: Apply sku override for %s\n", | 1729 | while (id >= 0) { |
| 1705 | codec->chip_name, modelname); | 1730 | const struct alc_fixup *fix = spec->fixup_list + id; |
| 1706 | #endif | 1731 | const struct alc_pincfg *cfg; |
| 1707 | spec = codec->spec; | 1732 | |
| 1708 | spec->cdefine.sku_cfg = fix->sku; | 1733 | switch (fix->type) { |
| 1709 | spec->cdefine.fixup = 1; | 1734 | case ALC_FIXUP_SKU: |
| 1710 | } | 1735 | if (action != ALC_FIXUP_ACT_PRE_PROBE || !fix->v.sku) |
| 1711 | if (pre_init && cfg) { | 1736 | break;; |
| 1712 | #ifdef CONFIG_SND_DEBUG_VERBOSE | 1737 | snd_printdd(KERN_INFO "hda_codec: %s: " |
| 1713 | snd_printdd(KERN_INFO "hda_codec: %s: Apply pincfg for %s\n", | 1738 | "Apply sku override for %s\n", |
| 1714 | codec->chip_name, modelname); | 1739 | codec->chip_name, modelname); |
| 1715 | #endif | 1740 | spec->cdefine.sku_cfg = fix->v.sku; |
| 1716 | for (; cfg->nid; cfg++) | 1741 | spec->cdefine.fixup = 1; |
| 1717 | snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val); | 1742 | break; |
| 1718 | } | 1743 | case ALC_FIXUP_PINS: |
| 1719 | if (!pre_init && fix->verbs) { | 1744 | cfg = fix->v.pins; |
| 1720 | #ifdef CONFIG_SND_DEBUG_VERBOSE | 1745 | if (action != ALC_FIXUP_ACT_PRE_PROBE || !cfg) |
| 1721 | snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-verbs for %s\n", | 1746 | break; |
| 1722 | codec->chip_name, modelname); | 1747 | snd_printdd(KERN_INFO "hda_codec: %s: " |
| 1723 | #endif | 1748 | "Apply pincfg for %s\n", |
| 1724 | add_verb(codec->spec, fix->verbs); | 1749 | codec->chip_name, modelname); |
| 1725 | } | 1750 | for (; cfg->nid; cfg++) |
| 1726 | if (fix->func) { | 1751 | snd_hda_codec_set_pincfg(codec, cfg->nid, |
| 1727 | #ifdef CONFIG_SND_DEBUG_VERBOSE | 1752 | cfg->val); |
| 1728 | snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-func for %s\n", | 1753 | break; |
| 1729 | codec->chip_name, modelname); | 1754 | case ALC_FIXUP_VERBS: |
| 1730 | #endif | 1755 | if (action != ALC_FIXUP_ACT_PROBE || !fix->v.verbs) |
| 1731 | fix->func(codec, fix, pre_init); | 1756 | break; |
| 1757 | snd_printdd(KERN_INFO "hda_codec: %s: " | ||
| 1758 | "Apply fix-verbs for %s\n", | ||
| 1759 | codec->chip_name, modelname); | ||
| 1760 | add_verb(codec->spec, fix->v.verbs); | ||
| 1761 | break; | ||
| 1762 | case ALC_FIXUP_FUNC: | ||
| 1763 | if (!fix->v.func) | ||
| 1764 | break; | ||
| 1765 | snd_printdd(KERN_INFO "hda_codec: %s: " | ||
| 1766 | "Apply fix-func for %s\n", | ||
| 1767 | codec->chip_name, modelname); | ||
| 1768 | fix->v.func(codec, fix, action); | ||
| 1769 | break; | ||
| 1770 | default: | ||
| 1771 | snd_printk(KERN_ERR "hda_codec: %s: " | ||
| 1772 | "Invalid fixup type %d\n", | ||
| 1773 | codec->chip_name, fix->type); | ||
| 1774 | break; | ||
| 1775 | } | ||
| 1776 | if (!fix[id].chained) | ||
| 1777 | break; | ||
| 1778 | if (++depth > 10) | ||
| 1779 | break; | ||
| 1780 | id = fix[id].chain_id; | ||
| 1732 | } | 1781 | } |
| 1733 | } | 1782 | } |
| 1734 | 1783 | ||
| 1735 | static void alc_pick_fixup(struct hda_codec *codec, | 1784 | static void alc_pick_fixup(struct hda_codec *codec, |
| 1736 | const struct snd_pci_quirk *quirk, | 1785 | const struct alc_model_fixup *models, |
| 1737 | const struct alc_fixup *fix, | 1786 | const struct snd_pci_quirk *quirk, |
| 1738 | int pre_init) | 1787 | const struct alc_fixup *fixlist) |
| 1739 | { | 1788 | { |
| 1740 | quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk); | 1789 | struct alc_spec *spec = codec->spec; |
| 1741 | if (quirk) { | 1790 | int id = -1; |
| 1742 | fix += quirk->value; | 1791 | const char *name = NULL; |
| 1743 | #ifdef CONFIG_SND_DEBUG_VERBOSE | ||
| 1744 | __alc_pick_fixup(codec, fix, quirk->name, pre_init); | ||
| 1745 | #else | ||
| 1746 | __alc_pick_fixup(codec, fix, NULL, pre_init); | ||
| 1747 | #endif | ||
| 1748 | } | ||
| 1749 | } | ||
| 1750 | 1792 | ||
| 1751 | static void alc_pick_fixup_model(struct hda_codec *codec, | ||
| 1752 | const struct alc_model_fixup *models, | ||
| 1753 | const struct snd_pci_quirk *quirk, | ||
| 1754 | const struct alc_fixup *fix, | ||
| 1755 | int pre_init) | ||
| 1756 | { | ||
| 1757 | if (codec->modelname && models) { | 1793 | if (codec->modelname && models) { |
| 1758 | while (models->name) { | 1794 | while (models->name) { |
| 1759 | if (!strcmp(codec->modelname, models->name)) { | 1795 | if (!strcmp(codec->modelname, models->name)) { |
| 1760 | fix += models->id; | 1796 | id = models->id; |
| 1797 | name = models->name; | ||
| 1761 | break; | 1798 | break; |
| 1762 | } | 1799 | } |
| 1763 | models++; | 1800 | models++; |
| 1764 | } | 1801 | } |
| 1765 | __alc_pick_fixup(codec, fix, codec->modelname, pre_init); | 1802 | } |
| 1766 | } else { | 1803 | if (id < 0) { |
| 1767 | alc_pick_fixup(codec, quirk, fix, pre_init); | 1804 | quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk); |
| 1805 | if (quirk) { | ||
| 1806 | id = quirk->value; | ||
| 1807 | #ifdef CONFIG_SND_DEBUG_VERBOSE | ||
| 1808 | name = quirk->name; | ||
| 1809 | #endif | ||
| 1810 | } | ||
| 1811 | } | ||
| 1812 | |||
| 1813 | spec->fixup_id = id; | ||
| 1814 | if (id >= 0) { | ||
| 1815 | spec->fixup_list = fixlist; | ||
| 1816 | spec->fixup_name = name; | ||
| 1768 | } | 1817 | } |
| 1769 | } | 1818 | } |
| 1770 | 1819 | ||
| @@ -7090,7 +7139,8 @@ enum { | |||
| 7090 | 7139 | ||
| 7091 | static const struct alc_fixup alc260_fixups[] = { | 7140 | static const struct alc_fixup alc260_fixups[] = { |
| 7092 | [PINFIX_HP_DC5750] = { | 7141 | [PINFIX_HP_DC5750] = { |
| 7093 | .pins = (const struct alc_pincfg[]) { | 7142 | .type = ALC_FIXUP_PINS, |
| 7143 | .v.pins = (const struct alc_pincfg[]) { | ||
| 7094 | { 0x11, 0x90130110 }, /* speaker */ | 7144 | { 0x11, 0x90130110 }, /* speaker */ |
| 7095 | { } | 7145 | { } |
| 7096 | } | 7146 | } |
| @@ -7301,8 +7351,10 @@ static int patch_alc260(struct hda_codec *codec) | |||
| 7301 | board_config = ALC260_AUTO; | 7351 | board_config = ALC260_AUTO; |
| 7302 | } | 7352 | } |
| 7303 | 7353 | ||
| 7304 | if (board_config == ALC260_AUTO) | 7354 | if (board_config == ALC260_AUTO) { |
| 7305 | alc_pick_fixup(codec, alc260_fixup_tbl, alc260_fixups, 1); | 7355 | alc_pick_fixup(codec, NULL, alc260_fixup_tbl, alc260_fixups); |
| 7356 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
| 7357 | } | ||
| 7306 | 7358 | ||
| 7307 | if (board_config == ALC260_AUTO) { | 7359 | if (board_config == ALC260_AUTO) { |
| 7308 | /* automatic parse from the BIOS config */ | 7360 | /* automatic parse from the BIOS config */ |
| @@ -7350,8 +7402,7 @@ static int patch_alc260(struct hda_codec *codec) | |||
| 7350 | set_capture_mixer(codec); | 7402 | set_capture_mixer(codec); |
| 7351 | set_beep_amp(spec, 0x07, 0x05, HDA_INPUT); | 7403 | set_beep_amp(spec, 0x07, 0x05, HDA_INPUT); |
| 7352 | 7404 | ||
| 7353 | if (board_config == ALC260_AUTO) | 7405 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
| 7354 | alc_pick_fixup(codec, alc260_fixup_tbl, alc260_fixups, 0); | ||
| 7355 | 7406 | ||
| 7356 | spec->vmaster_nid = 0x08; | 7407 | spec->vmaster_nid = 0x08; |
| 7357 | 7408 | ||
| @@ -10678,7 +10729,8 @@ enum { | |||
| 10678 | 10729 | ||
| 10679 | static const struct alc_fixup alc882_fixups[] = { | 10730 | static const struct alc_fixup alc882_fixups[] = { |
| 10680 | [PINFIX_ABIT_AW9D_MAX] = { | 10731 | [PINFIX_ABIT_AW9D_MAX] = { |
| 10681 | .pins = (const struct alc_pincfg[]) { | 10732 | .type = ALC_FIXUP_PINS, |
| 10733 | .v.pins = (const struct alc_pincfg[]) { | ||
| 10682 | { 0x15, 0x01080104 }, /* side */ | 10734 | { 0x15, 0x01080104 }, /* side */ |
| 10683 | { 0x16, 0x01011012 }, /* rear */ | 10735 | { 0x16, 0x01011012 }, /* rear */ |
| 10684 | { 0x17, 0x01016011 }, /* clfe */ | 10736 | { 0x17, 0x01016011 }, /* clfe */ |
| @@ -10686,13 +10738,15 @@ static const struct alc_fixup alc882_fixups[] = { | |||
| 10686 | } | 10738 | } |
| 10687 | }, | 10739 | }, |
| 10688 | [PINFIX_PB_M5210] = { | 10740 | [PINFIX_PB_M5210] = { |
| 10689 | .verbs = (const struct hda_verb[]) { | 10741 | .type = ALC_FIXUP_VERBS, |
| 10742 | .v.verbs = (const struct hda_verb[]) { | ||
| 10690 | { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, | 10743 | { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, |
| 10691 | {} | 10744 | {} |
| 10692 | } | 10745 | } |
| 10693 | }, | 10746 | }, |
| 10694 | [PINFIX_ACER_ASPIRE_7736] = { | 10747 | [PINFIX_ACER_ASPIRE_7736] = { |
| 10695 | .sku = ALC_FIXUP_SKU_IGNORE, | 10748 | .type = ALC_FIXUP_SKU, |
| 10749 | .v.sku = ALC_FIXUP_SKU_IGNORE, | ||
| 10696 | }, | 10750 | }, |
| 10697 | }; | 10751 | }; |
| 10698 | 10752 | ||
| @@ -10978,8 +11032,10 @@ static int patch_alc882(struct hda_codec *codec) | |||
| 10978 | board_config = ALC882_AUTO; | 11032 | board_config = ALC882_AUTO; |
| 10979 | } | 11033 | } |
| 10980 | 11034 | ||
| 10981 | if (board_config == ALC882_AUTO) | 11035 | if (board_config == ALC882_AUTO) { |
| 10982 | alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 1); | 11036 | alc_pick_fixup(codec, NULL, alc882_fixup_tbl, alc882_fixups); |
| 11037 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
| 11038 | } | ||
| 10983 | 11039 | ||
| 10984 | alc_auto_parse_customize_define(codec); | 11040 | alc_auto_parse_customize_define(codec); |
| 10985 | 11041 | ||
| @@ -11055,8 +11111,7 @@ static int patch_alc882(struct hda_codec *codec) | |||
| 11055 | if (has_cdefine_beep(codec)) | 11111 | if (has_cdefine_beep(codec)) |
| 11056 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | 11112 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); |
| 11057 | 11113 | ||
| 11058 | if (board_config == ALC882_AUTO) | 11114 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
| 11059 | alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 0); | ||
| 11060 | 11115 | ||
| 11061 | spec->vmaster_nid = 0x0c; | 11116 | spec->vmaster_nid = 0x0c; |
| 11062 | 11117 | ||
| @@ -12446,7 +12501,8 @@ enum { | |||
| 12446 | 12501 | ||
| 12447 | static const struct alc_fixup alc262_fixups[] = { | 12502 | static const struct alc_fixup alc262_fixups[] = { |
| 12448 | [PINFIX_FSC_H270] = { | 12503 | [PINFIX_FSC_H270] = { |
| 12449 | .pins = (const struct alc_pincfg[]) { | 12504 | .type = ALC_FIXUP_PINS, |
| 12505 | .v.pins = (const struct alc_pincfg[]) { | ||
| 12450 | { 0x14, 0x99130110 }, /* speaker */ | 12506 | { 0x14, 0x99130110 }, /* speaker */ |
| 12451 | { 0x15, 0x0221142f }, /* front HP */ | 12507 | { 0x15, 0x0221142f }, /* front HP */ |
| 12452 | { 0x1b, 0x0121141f }, /* rear HP */ | 12508 | { 0x1b, 0x0121141f }, /* rear HP */ |
| @@ -12883,8 +12939,10 @@ static int patch_alc262(struct hda_codec *codec) | |||
| 12883 | board_config = ALC262_AUTO; | 12939 | board_config = ALC262_AUTO; |
| 12884 | } | 12940 | } |
| 12885 | 12941 | ||
| 12886 | if (board_config == ALC262_AUTO) | 12942 | if (board_config == ALC262_AUTO) { |
| 12887 | alc_pick_fixup(codec, alc262_fixup_tbl, alc262_fixups, 1); | 12943 | alc_pick_fixup(codec, NULL, alc262_fixup_tbl, alc262_fixups); |
| 12944 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
| 12945 | } | ||
| 12888 | 12946 | ||
| 12889 | if (board_config == ALC262_AUTO) { | 12947 | if (board_config == ALC262_AUTO) { |
| 12890 | /* automatic parse from the BIOS config */ | 12948 | /* automatic parse from the BIOS config */ |
| @@ -12954,8 +13012,7 @@ static int patch_alc262(struct hda_codec *codec) | |||
| 12954 | if (!spec->no_analog && has_cdefine_beep(codec)) | 13012 | if (!spec->no_analog && has_cdefine_beep(codec)) |
| 12955 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | 13013 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); |
| 12956 | 13014 | ||
| 12957 | if (board_config == ALC262_AUTO) | 13015 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
| 12958 | alc_pick_fixup(codec, alc262_fixup_tbl, alc262_fixups, 0); | ||
| 12959 | 13016 | ||
| 12960 | spec->vmaster_nid = 0x0c; | 13017 | spec->vmaster_nid = 0x0c; |
| 12961 | 13018 | ||
| @@ -14810,11 +14867,11 @@ static int alc269_resume(struct hda_codec *codec) | |||
| 14810 | #endif /* SND_HDA_NEEDS_RESUME */ | 14867 | #endif /* SND_HDA_NEEDS_RESUME */ |
| 14811 | 14868 | ||
| 14812 | static void alc269_fixup_hweq(struct hda_codec *codec, | 14869 | static void alc269_fixup_hweq(struct hda_codec *codec, |
| 14813 | const struct alc_fixup *fix, int pre_init) | 14870 | const struct alc_fixup *fix, int action) |
| 14814 | { | 14871 | { |
| 14815 | int coef; | 14872 | int coef; |
| 14816 | 14873 | ||
| 14817 | if (pre_init) | 14874 | if (action != ALC_FIXUP_ACT_PROBE) |
| 14818 | return; | 14875 | return; |
| 14819 | coef = alc_read_coef_idx(codec, 0x1e); | 14876 | coef = alc_read_coef_idx(codec, 0x1e); |
| 14820 | alc_write_coef_idx(codec, 0x1e, coef | 0x80); | 14877 | alc_write_coef_idx(codec, 0x1e, coef | 0x80); |
| @@ -14832,22 +14889,26 @@ enum { | |||
| 14832 | 14889 | ||
| 14833 | static const struct alc_fixup alc269_fixups[] = { | 14890 | static const struct alc_fixup alc269_fixups[] = { |
| 14834 | [ALC269_FIXUP_SONY_VAIO] = { | 14891 | [ALC269_FIXUP_SONY_VAIO] = { |
| 14835 | .verbs = (const struct hda_verb[]) { | 14892 | .type = ALC_FIXUP_VERBS, |
| 14893 | .v.verbs = (const struct hda_verb[]) { | ||
| 14836 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD}, | 14894 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD}, |
| 14837 | {} | 14895 | {} |
| 14838 | } | 14896 | } |
| 14839 | }, | 14897 | }, |
| 14840 | [ALC275_FIXUP_SONY_VAIO_GPIO2] = { | 14898 | [ALC275_FIXUP_SONY_VAIO_GPIO2] = { |
| 14841 | .verbs = (const struct hda_verb[]) { | 14899 | .type = ALC_FIXUP_VERBS, |
| 14900 | .v.verbs = (const struct hda_verb[]) { | ||
| 14842 | {0x01, AC_VERB_SET_GPIO_MASK, 0x04}, | 14901 | {0x01, AC_VERB_SET_GPIO_MASK, 0x04}, |
| 14843 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04}, | 14902 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04}, |
| 14844 | {0x01, AC_VERB_SET_GPIO_DATA, 0x00}, | 14903 | {0x01, AC_VERB_SET_GPIO_DATA, 0x00}, |
| 14845 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD}, | ||
| 14846 | { } | 14904 | { } |
| 14847 | } | 14905 | }, |
| 14906 | .chained = true, | ||
| 14907 | .chain_id = ALC269_FIXUP_SONY_VAIO | ||
| 14848 | }, | 14908 | }, |
| 14849 | [ALC269_FIXUP_DELL_M101Z] = { | 14909 | [ALC269_FIXUP_DELL_M101Z] = { |
| 14850 | .verbs = (const struct hda_verb[]) { | 14910 | .type = ALC_FIXUP_VERBS, |
| 14911 | .v.verbs = (const struct hda_verb[]) { | ||
| 14851 | /* Enables internal speaker */ | 14912 | /* Enables internal speaker */ |
| 14852 | {0x20, AC_VERB_SET_COEF_INDEX, 13}, | 14913 | {0x20, AC_VERB_SET_COEF_INDEX, 13}, |
| 14853 | {0x20, AC_VERB_SET_PROC_COEF, 0x4040}, | 14914 | {0x20, AC_VERB_SET_PROC_COEF, 0x4040}, |
| @@ -14855,29 +14916,28 @@ static const struct alc_fixup alc269_fixups[] = { | |||
| 14855 | } | 14916 | } |
| 14856 | }, | 14917 | }, |
| 14857 | [ALC269_FIXUP_SKU_IGNORE] = { | 14918 | [ALC269_FIXUP_SKU_IGNORE] = { |
| 14858 | .sku = ALC_FIXUP_SKU_IGNORE, | 14919 | .type = ALC_FIXUP_SKU, |
| 14920 | .v.sku = ALC_FIXUP_SKU_IGNORE, | ||
| 14859 | }, | 14921 | }, |
| 14860 | [ALC269_FIXUP_ASUS_G73JW] = { | 14922 | [ALC269_FIXUP_ASUS_G73JW] = { |
| 14861 | .pins = (const struct alc_pincfg[]) { | 14923 | .type = ALC_FIXUP_PINS, |
| 14924 | .v.pins = (const struct alc_pincfg[]) { | ||
| 14862 | { 0x17, 0x99130111 }, /* subwoofer */ | 14925 | { 0x17, 0x99130111 }, /* subwoofer */ |
| 14863 | { } | 14926 | { } |
| 14864 | } | 14927 | } |
| 14865 | }, | 14928 | }, |
| 14866 | [ALC269_FIXUP_LENOVO_EAPD] = { | 14929 | [ALC269_FIXUP_LENOVO_EAPD] = { |
| 14867 | .verbs = (const struct hda_verb[]) { | 14930 | .type = ALC_FIXUP_VERBS, |
| 14931 | .v.verbs = (const struct hda_verb[]) { | ||
| 14868 | {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0}, | 14932 | {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0}, |
| 14869 | {} | 14933 | {} |
| 14870 | } | 14934 | } |
| 14871 | }, | 14935 | }, |
| 14872 | [ALC275_FIXUP_SONY_HWEQ] = { | 14936 | [ALC275_FIXUP_SONY_HWEQ] = { |
| 14873 | .func = alc269_fixup_hweq, | 14937 | .type = ALC_FIXUP_FUNC, |
| 14874 | .verbs = (const struct hda_verb[]) { | 14938 | .v.func = alc269_fixup_hweq, |
| 14875 | {0x01, AC_VERB_SET_GPIO_MASK, 0x04}, | 14939 | .chained = true, |
| 14876 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04}, | 14940 | .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2 |
| 14877 | {0x01, AC_VERB_SET_GPIO_DATA, 0x00}, | ||
| 14878 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD}, | ||
| 14879 | { } | ||
| 14880 | } | ||
| 14881 | } | 14941 | } |
| 14882 | }; | 14942 | }; |
| 14883 | 14943 | ||
| @@ -15174,8 +15234,10 @@ static int patch_alc269(struct hda_codec *codec) | |||
| 15174 | board_config = ALC269_AUTO; | 15234 | board_config = ALC269_AUTO; |
| 15175 | } | 15235 | } |
| 15176 | 15236 | ||
| 15177 | if (board_config == ALC269_AUTO) | 15237 | if (board_config == ALC269_AUTO) { |
| 15178 | alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 1); | 15238 | alc_pick_fixup(codec, NULL, alc269_fixup_tbl, alc269_fixups); |
| 15239 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
| 15240 | } | ||
| 15179 | 15241 | ||
| 15180 | if (board_config == ALC269_AUTO) { | 15242 | if (board_config == ALC269_AUTO) { |
| 15181 | /* automatic parse from the BIOS config */ | 15243 | /* automatic parse from the BIOS config */ |
| @@ -15236,8 +15298,7 @@ static int patch_alc269(struct hda_codec *codec) | |||
| 15236 | if (has_cdefine_beep(codec)) | 15298 | if (has_cdefine_beep(codec)) |
| 15237 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); | 15299 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); |
| 15238 | 15300 | ||
| 15239 | if (board_config == ALC269_AUTO) | 15301 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
| 15240 | alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 0); | ||
| 15241 | 15302 | ||
| 15242 | spec->vmaster_nid = 0x02; | 15303 | spec->vmaster_nid = 0x02; |
| 15243 | 15304 | ||
| @@ -16296,7 +16357,8 @@ enum { | |||
| 16296 | 16357 | ||
| 16297 | static const struct alc_fixup alc861_fixups[] = { | 16358 | static const struct alc_fixup alc861_fixups[] = { |
| 16298 | [PINFIX_FSC_AMILO_PI1505] = { | 16359 | [PINFIX_FSC_AMILO_PI1505] = { |
| 16299 | .pins = (const struct alc_pincfg[]) { | 16360 | .type = ALC_FIXUP_PINS, |
| 16361 | .v.pins = (const struct alc_pincfg[]) { | ||
| 16300 | { 0x0b, 0x0221101f }, /* HP */ | 16362 | { 0x0b, 0x0221101f }, /* HP */ |
| 16301 | { 0x0f, 0x90170310 }, /* speaker */ | 16363 | { 0x0f, 0x90170310 }, /* speaker */ |
| 16302 | { } | 16364 | { } |
| @@ -16331,8 +16393,10 @@ static int patch_alc861(struct hda_codec *codec) | |||
| 16331 | board_config = ALC861_AUTO; | 16393 | board_config = ALC861_AUTO; |
| 16332 | } | 16394 | } |
| 16333 | 16395 | ||
| 16334 | if (board_config == ALC861_AUTO) | 16396 | if (board_config == ALC861_AUTO) { |
| 16335 | alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 1); | 16397 | alc_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups); |
| 16398 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
| 16399 | } | ||
| 16336 | 16400 | ||
| 16337 | if (board_config == ALC861_AUTO) { | 16401 | if (board_config == ALC861_AUTO) { |
| 16338 | /* automatic parse from the BIOS config */ | 16402 | /* automatic parse from the BIOS config */ |
| @@ -16369,8 +16433,7 @@ static int patch_alc861(struct hda_codec *codec) | |||
| 16369 | 16433 | ||
| 16370 | spec->vmaster_nid = 0x03; | 16434 | spec->vmaster_nid = 0x03; |
| 16371 | 16435 | ||
| 16372 | if (board_config == ALC861_AUTO) | 16436 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
| 16373 | alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 0); | ||
| 16374 | 16437 | ||
| 16375 | codec->patch_ops = alc_patch_ops; | 16438 | codec->patch_ops = alc_patch_ops; |
| 16376 | if (board_config == ALC861_AUTO) { | 16439 | if (board_config == ALC861_AUTO) { |
| @@ -17252,7 +17315,8 @@ enum { | |||
| 17252 | /* reset GPIO1 */ | 17315 | /* reset GPIO1 */ |
| 17253 | static const struct alc_fixup alc861vd_fixups[] = { | 17316 | static const struct alc_fixup alc861vd_fixups[] = { |
| 17254 | [ALC660VD_FIX_ASUS_GPIO1] = { | 17317 | [ALC660VD_FIX_ASUS_GPIO1] = { |
| 17255 | .verbs = (const struct hda_verb[]) { | 17318 | .type = ALC_FIXUP_VERBS, |
| 17319 | .v.verbs = (const struct hda_verb[]) { | ||
| 17256 | {0x01, AC_VERB_SET_GPIO_MASK, 0x03}, | 17320 | {0x01, AC_VERB_SET_GPIO_MASK, 0x03}, |
| 17257 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, | 17321 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, |
| 17258 | {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, | 17322 | {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, |
| @@ -17287,8 +17351,10 @@ static int patch_alc861vd(struct hda_codec *codec) | |||
| 17287 | board_config = ALC861VD_AUTO; | 17351 | board_config = ALC861VD_AUTO; |
| 17288 | } | 17352 | } |
| 17289 | 17353 | ||
| 17290 | if (board_config == ALC861VD_AUTO) | 17354 | if (board_config == ALC861VD_AUTO) { |
| 17291 | alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 1); | 17355 | alc_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups); |
| 17356 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
| 17357 | } | ||
| 17292 | 17358 | ||
| 17293 | if (board_config == ALC861VD_AUTO) { | 17359 | if (board_config == ALC861VD_AUTO) { |
| 17294 | /* automatic parse from the BIOS config */ | 17360 | /* automatic parse from the BIOS config */ |
| @@ -17336,8 +17402,7 @@ static int patch_alc861vd(struct hda_codec *codec) | |||
| 17336 | 17402 | ||
| 17337 | spec->vmaster_nid = 0x02; | 17403 | spec->vmaster_nid = 0x02; |
| 17338 | 17404 | ||
| 17339 | if (board_config == ALC861VD_AUTO) | 17405 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
| 17340 | alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 0); | ||
| 17341 | 17406 | ||
| 17342 | codec->patch_ops = alc_patch_ops; | 17407 | codec->patch_ops = alc_patch_ops; |
| 17343 | 17408 | ||
| @@ -19368,9 +19433,9 @@ static void alc662_auto_init(struct hda_codec *codec) | |||
| 19368 | } | 19433 | } |
| 19369 | 19434 | ||
| 19370 | static void alc272_fixup_mario(struct hda_codec *codec, | 19435 | static void alc272_fixup_mario(struct hda_codec *codec, |
| 19371 | const struct alc_fixup *fix, int pre_init) | 19436 | const struct alc_fixup *fix, int action) |
| 19372 | { | 19437 | { |
| 19373 | if (!pre_init) | 19438 | if (action != ALC_FIXUP_ACT_PROBE) |
| 19374 | return; | 19439 | return; |
| 19375 | if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT, | 19440 | if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT, |
| 19376 | (0x3b << AC_AMPCAP_OFFSET_SHIFT) | | 19441 | (0x3b << AC_AMPCAP_OFFSET_SHIFT) | |
| @@ -19389,19 +19454,22 @@ enum { | |||
| 19389 | 19454 | ||
| 19390 | static const struct alc_fixup alc662_fixups[] = { | 19455 | static const struct alc_fixup alc662_fixups[] = { |
| 19391 | [ALC662_FIXUP_ASPIRE] = { | 19456 | [ALC662_FIXUP_ASPIRE] = { |
| 19392 | .pins = (const struct alc_pincfg[]) { | 19457 | .type = ALC_FIXUP_PINS, |
| 19458 | .v.pins = (const struct alc_pincfg[]) { | ||
| 19393 | { 0x15, 0x99130112 }, /* subwoofer */ | 19459 | { 0x15, 0x99130112 }, /* subwoofer */ |
| 19394 | { } | 19460 | { } |
| 19395 | } | 19461 | } |
| 19396 | }, | 19462 | }, |
| 19397 | [ALC662_FIXUP_IDEAPAD] = { | 19463 | [ALC662_FIXUP_IDEAPAD] = { |
| 19398 | .pins = (const struct alc_pincfg[]) { | 19464 | .type = ALC_FIXUP_PINS, |
| 19465 | .v.pins = (const struct alc_pincfg[]) { | ||
| 19399 | { 0x17, 0x99130112 }, /* subwoofer */ | 19466 | { 0x17, 0x99130112 }, /* subwoofer */ |
| 19400 | { } | 19467 | { } |
| 19401 | } | 19468 | } |
| 19402 | }, | 19469 | }, |
| 19403 | [ALC272_FIXUP_MARIO] = { | 19470 | [ALC272_FIXUP_MARIO] = { |
| 19404 | .func = alc272_fixup_mario, | 19471 | .type = ALC_FIXUP_FUNC, |
| 19472 | .v.func = alc272_fixup_mario, | ||
| 19405 | } | 19473 | } |
| 19406 | }; | 19474 | }; |
| 19407 | 19475 | ||
| @@ -19455,7 +19523,9 @@ static int patch_alc662(struct hda_codec *codec) | |||
| 19455 | } | 19523 | } |
| 19456 | 19524 | ||
| 19457 | if (board_config == ALC662_AUTO) { | 19525 | if (board_config == ALC662_AUTO) { |
| 19458 | alc_pick_fixup(codec, alc662_fixup_tbl, alc662_fixups, 1); | 19526 | alc_pick_fixup(codec, alc662_fixup_models, |
| 19527 | alc662_fixup_tbl, alc662_fixups); | ||
| 19528 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
| 19459 | /* automatic parse from the BIOS config */ | 19529 | /* automatic parse from the BIOS config */ |
| 19460 | err = alc662_parse_auto_config(codec); | 19530 | err = alc662_parse_auto_config(codec); |
| 19461 | if (err < 0) { | 19531 | if (err < 0) { |
| @@ -19513,12 +19583,11 @@ static int patch_alc662(struct hda_codec *codec) | |||
| 19513 | } | 19583 | } |
| 19514 | spec->vmaster_nid = 0x02; | 19584 | spec->vmaster_nid = 0x02; |
| 19515 | 19585 | ||
| 19586 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); | ||
| 19587 | |||
| 19516 | codec->patch_ops = alc_patch_ops; | 19588 | codec->patch_ops = alc_patch_ops; |
| 19517 | if (board_config == ALC662_AUTO) { | 19589 | if (board_config == ALC662_AUTO) |
| 19518 | spec->init_hook = alc662_auto_init; | 19590 | spec->init_hook = alc662_auto_init; |
| 19519 | alc_pick_fixup_model(codec, alc662_fixup_models, | ||
| 19520 | alc662_fixup_tbl, alc662_fixups, 0); | ||
| 19521 | } | ||
| 19522 | 19591 | ||
| 19523 | alc_init_jacks(codec); | 19592 | alc_init_jacks(codec); |
| 19524 | 19593 | ||
