diff options
Diffstat (limited to 'sound/pci/hda')
-rw-r--r-- | sound/pci/hda/hda_intel.c | 1 | ||||
-rw-r--r-- | sound/pci/hda/patch_cirrus.c | 89 | ||||
-rw-r--r-- | sound/pci/hda/patch_hdmi.c | 50 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 56 |
4 files changed, 156 insertions, 40 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index e54ebd530849..6e61a019aa5e 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -3428,6 +3428,7 @@ static struct snd_pci_quirk msi_black_list[] = { | |||
3428 | SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */ | 3428 | SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */ |
3429 | SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */ | 3429 | SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */ |
3430 | SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */ | 3430 | SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */ |
3431 | SND_PCI_QUIRK(0x1179, 0xfb44, "Toshiba Satellite C870", 0), /* AMD Hudson */ | ||
3431 | SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */ | 3432 | SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */ |
3432 | SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */ | 3433 | SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */ |
3433 | {} | 3434 | {} |
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index cccaf9c7a7bb..b524f89a1f13 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c | |||
@@ -169,7 +169,7 @@ static void cs_automute(struct hda_codec *codec) | |||
169 | 169 | ||
170 | snd_hda_gen_update_outputs(codec); | 170 | snd_hda_gen_update_outputs(codec); |
171 | 171 | ||
172 | if (spec->gpio_eapd_hp) { | 172 | if (spec->gpio_eapd_hp || spec->gpio_eapd_speaker) { |
173 | spec->gpio_data = spec->gen.hp_jack_present ? | 173 | spec->gpio_data = spec->gen.hp_jack_present ? |
174 | spec->gpio_eapd_hp : spec->gpio_eapd_speaker; | 174 | spec->gpio_eapd_hp : spec->gpio_eapd_speaker; |
175 | snd_hda_codec_write(codec, 0x01, 0, | 175 | snd_hda_codec_write(codec, 0x01, 0, |
@@ -291,10 +291,11 @@ static int cs_init(struct hda_codec *codec) | |||
291 | { | 291 | { |
292 | struct cs_spec *spec = codec->spec; | 292 | struct cs_spec *spec = codec->spec; |
293 | 293 | ||
294 | /* init_verb sequence for C0/C1/C2 errata*/ | 294 | if (spec->vendor_nid == CS420X_VENDOR_NID) { |
295 | snd_hda_sequence_write(codec, cs_errata_init_verbs); | 295 | /* init_verb sequence for C0/C1/C2 errata*/ |
296 | 296 | snd_hda_sequence_write(codec, cs_errata_init_verbs); | |
297 | snd_hda_sequence_write(codec, cs_coef_init_verbs); | 297 | snd_hda_sequence_write(codec, cs_coef_init_verbs); |
298 | } | ||
298 | 299 | ||
299 | snd_hda_gen_init(codec); | 300 | snd_hda_gen_init(codec); |
300 | 301 | ||
@@ -307,8 +308,10 @@ static int cs_init(struct hda_codec *codec) | |||
307 | spec->gpio_data); | 308 | spec->gpio_data); |
308 | } | 309 | } |
309 | 310 | ||
310 | init_input_coef(codec); | 311 | if (spec->vendor_nid == CS420X_VENDOR_NID) { |
311 | init_digital_coef(codec); | 312 | init_input_coef(codec); |
313 | init_digital_coef(codec); | ||
314 | } | ||
312 | 315 | ||
313 | return 0; | 316 | return 0; |
314 | } | 317 | } |
@@ -552,6 +555,76 @@ static int patch_cs420x(struct hda_codec *codec) | |||
552 | } | 555 | } |
553 | 556 | ||
554 | /* | 557 | /* |
558 | * CS4208 support: | ||
559 | * Its layout is no longer compatible with CS4206/CS4207, and the generic | ||
560 | * parser seems working fairly well, except for trivial fixups. | ||
561 | */ | ||
562 | enum { | ||
563 | CS4208_GPIO0, | ||
564 | }; | ||
565 | |||
566 | static const struct hda_model_fixup cs4208_models[] = { | ||
567 | { .id = CS4208_GPIO0, .name = "gpio0" }, | ||
568 | {} | ||
569 | }; | ||
570 | |||
571 | static const struct snd_pci_quirk cs4208_fixup_tbl[] = { | ||
572 | /* codec SSID */ | ||
573 | SND_PCI_QUIRK(0x106b, 0x7100, "MacBookPro 6,1", CS4208_GPIO0), | ||
574 | SND_PCI_QUIRK(0x106b, 0x7200, "MacBookPro 6,2", CS4208_GPIO0), | ||
575 | {} /* terminator */ | ||
576 | }; | ||
577 | |||
578 | static void cs4208_fixup_gpio0(struct hda_codec *codec, | ||
579 | const struct hda_fixup *fix, int action) | ||
580 | { | ||
581 | if (action == HDA_FIXUP_ACT_PRE_PROBE) { | ||
582 | struct cs_spec *spec = codec->spec; | ||
583 | spec->gpio_eapd_hp = 0; | ||
584 | spec->gpio_eapd_speaker = 1; | ||
585 | spec->gpio_mask = spec->gpio_dir = | ||
586 | spec->gpio_eapd_hp | spec->gpio_eapd_speaker; | ||
587 | } | ||
588 | } | ||
589 | |||
590 | static const struct hda_fixup cs4208_fixups[] = { | ||
591 | [CS4208_GPIO0] = { | ||
592 | .type = HDA_FIXUP_FUNC, | ||
593 | .v.func = cs4208_fixup_gpio0, | ||
594 | }, | ||
595 | }; | ||
596 | |||
597 | static int patch_cs4208(struct hda_codec *codec) | ||
598 | { | ||
599 | struct cs_spec *spec; | ||
600 | int err; | ||
601 | |||
602 | spec = cs_alloc_spec(codec, 0); /* no specific w/a */ | ||
603 | if (!spec) | ||
604 | return -ENOMEM; | ||
605 | |||
606 | spec->gen.automute_hook = cs_automute; | ||
607 | |||
608 | snd_hda_pick_fixup(codec, cs4208_models, cs4208_fixup_tbl, | ||
609 | cs4208_fixups); | ||
610 | snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); | ||
611 | |||
612 | err = cs_parse_auto_config(codec); | ||
613 | if (err < 0) | ||
614 | goto error; | ||
615 | |||
616 | codec->patch_ops = cs_patch_ops; | ||
617 | |||
618 | snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); | ||
619 | |||
620 | return 0; | ||
621 | |||
622 | error: | ||
623 | cs_free(codec); | ||
624 | return err; | ||
625 | } | ||
626 | |||
627 | /* | ||
555 | * Cirrus Logic CS4210 | 628 | * Cirrus Logic CS4210 |
556 | * | 629 | * |
557 | * 1 DAC => HP(sense) / Speakers, | 630 | * 1 DAC => HP(sense) / Speakers, |
@@ -991,6 +1064,7 @@ static int patch_cs4213(struct hda_codec *codec) | |||
991 | static const struct hda_codec_preset snd_hda_preset_cirrus[] = { | 1064 | static const struct hda_codec_preset snd_hda_preset_cirrus[] = { |
992 | { .id = 0x10134206, .name = "CS4206", .patch = patch_cs420x }, | 1065 | { .id = 0x10134206, .name = "CS4206", .patch = patch_cs420x }, |
993 | { .id = 0x10134207, .name = "CS4207", .patch = patch_cs420x }, | 1066 | { .id = 0x10134207, .name = "CS4207", .patch = patch_cs420x }, |
1067 | { .id = 0x10134208, .name = "CS4208", .patch = patch_cs4208 }, | ||
994 | { .id = 0x10134210, .name = "CS4210", .patch = patch_cs4210 }, | 1068 | { .id = 0x10134210, .name = "CS4210", .patch = patch_cs4210 }, |
995 | { .id = 0x10134213, .name = "CS4213", .patch = patch_cs4213 }, | 1069 | { .id = 0x10134213, .name = "CS4213", .patch = patch_cs4213 }, |
996 | {} /* terminator */ | 1070 | {} /* terminator */ |
@@ -998,6 +1072,7 @@ static const struct hda_codec_preset snd_hda_preset_cirrus[] = { | |||
998 | 1072 | ||
999 | MODULE_ALIAS("snd-hda-codec-id:10134206"); | 1073 | MODULE_ALIAS("snd-hda-codec-id:10134206"); |
1000 | MODULE_ALIAS("snd-hda-codec-id:10134207"); | 1074 | MODULE_ALIAS("snd-hda-codec-id:10134207"); |
1075 | MODULE_ALIAS("snd-hda-codec-id:10134208"); | ||
1001 | MODULE_ALIAS("snd-hda-codec-id:10134210"); | 1076 | MODULE_ALIAS("snd-hda-codec-id:10134210"); |
1002 | MODULE_ALIAS("snd-hda-codec-id:10134213"); | 1077 | MODULE_ALIAS("snd-hda-codec-id:10134213"); |
1003 | 1078 | ||
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 9a58893d52a7..3d8cd04455a6 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
@@ -44,6 +44,8 @@ static bool static_hdmi_pcm; | |||
44 | module_param(static_hdmi_pcm, bool, 0644); | 44 | module_param(static_hdmi_pcm, bool, 0644); |
45 | MODULE_PARM_DESC(static_hdmi_pcm, "Don't restrict PCM parameters per ELD info"); | 45 | MODULE_PARM_DESC(static_hdmi_pcm, "Don't restrict PCM parameters per ELD info"); |
46 | 46 | ||
47 | #define is_haswell(codec) ((codec)->vendor_id == 0x80862807) | ||
48 | |||
47 | struct hdmi_spec_per_cvt { | 49 | struct hdmi_spec_per_cvt { |
48 | hda_nid_t cvt_nid; | 50 | hda_nid_t cvt_nid; |
49 | int assigned; | 51 | int assigned; |
@@ -894,6 +896,11 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, | |||
894 | if (!channels) | 896 | if (!channels) |
895 | return; | 897 | return; |
896 | 898 | ||
899 | if (is_haswell(codec)) | ||
900 | snd_hda_codec_write(codec, pin_nid, 0, | ||
901 | AC_VERB_SET_AMP_GAIN_MUTE, | ||
902 | AMP_OUT_UNMUTE); | ||
903 | |||
897 | eld = &per_pin->sink_eld; | 904 | eld = &per_pin->sink_eld; |
898 | if (!eld->monitor_present) | 905 | if (!eld->monitor_present) |
899 | return; | 906 | return; |
@@ -1033,10 +1040,10 @@ static void hdmi_unsol_event(struct hda_codec *codec, unsigned int res) | |||
1033 | hdmi_non_intrinsic_event(codec, res); | 1040 | hdmi_non_intrinsic_event(codec, res); |
1034 | } | 1041 | } |
1035 | 1042 | ||
1036 | static void haswell_verify_pin_D0(struct hda_codec *codec, | 1043 | static void haswell_verify_D0(struct hda_codec *codec, |
1037 | hda_nid_t cvt_nid, hda_nid_t nid) | 1044 | hda_nid_t cvt_nid, hda_nid_t nid) |
1038 | { | 1045 | { |
1039 | int pwr, lamp, ramp; | 1046 | int pwr; |
1040 | 1047 | ||
1041 | /* For Haswell, the converter 1/2 may keep in D3 state after bootup, | 1048 | /* For Haswell, the converter 1/2 may keep in D3 state after bootup, |
1042 | * thus pins could only choose converter 0 for use. Make sure the | 1049 | * thus pins could only choose converter 0 for use. Make sure the |
@@ -1052,25 +1059,6 @@ static void haswell_verify_pin_D0(struct hda_codec *codec, | |||
1052 | pwr = (pwr & AC_PWRST_ACTUAL) >> AC_PWRST_ACTUAL_SHIFT; | 1059 | pwr = (pwr & AC_PWRST_ACTUAL) >> AC_PWRST_ACTUAL_SHIFT; |
1053 | snd_printd("Haswell HDMI audio: Power for pin 0x%x is now D%d\n", nid, pwr); | 1060 | snd_printd("Haswell HDMI audio: Power for pin 0x%x is now D%d\n", nid, pwr); |
1054 | } | 1061 | } |
1055 | |||
1056 | lamp = snd_hda_codec_read(codec, nid, 0, | ||
1057 | AC_VERB_GET_AMP_GAIN_MUTE, | ||
1058 | AC_AMP_GET_LEFT | AC_AMP_GET_OUTPUT); | ||
1059 | ramp = snd_hda_codec_read(codec, nid, 0, | ||
1060 | AC_VERB_GET_AMP_GAIN_MUTE, | ||
1061 | AC_AMP_GET_RIGHT | AC_AMP_GET_OUTPUT); | ||
1062 | if (lamp != ramp) { | ||
1063 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, | ||
1064 | AC_AMP_SET_RIGHT | AC_AMP_SET_OUTPUT | lamp); | ||
1065 | |||
1066 | lamp = snd_hda_codec_read(codec, nid, 0, | ||
1067 | AC_VERB_GET_AMP_GAIN_MUTE, | ||
1068 | AC_AMP_GET_LEFT | AC_AMP_GET_OUTPUT); | ||
1069 | ramp = snd_hda_codec_read(codec, nid, 0, | ||
1070 | AC_VERB_GET_AMP_GAIN_MUTE, | ||
1071 | AC_AMP_GET_RIGHT | AC_AMP_GET_OUTPUT); | ||
1072 | snd_printd("Haswell HDMI audio: Mute after set on pin 0x%x: [0x%x 0x%x]\n", nid, lamp, ramp); | ||
1073 | } | ||
1074 | } | 1062 | } |
1075 | 1063 | ||
1076 | /* | 1064 | /* |
@@ -1087,8 +1075,8 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t cvt_nid, | |||
1087 | int pinctl; | 1075 | int pinctl; |
1088 | int new_pinctl = 0; | 1076 | int new_pinctl = 0; |
1089 | 1077 | ||
1090 | if (codec->vendor_id == 0x80862807) | 1078 | if (is_haswell(codec)) |
1091 | haswell_verify_pin_D0(codec, cvt_nid, pin_nid); | 1079 | haswell_verify_D0(codec, cvt_nid, pin_nid); |
1092 | 1080 | ||
1093 | if (snd_hda_query_pin_caps(codec, pin_nid) & AC_PINCAP_HBR) { | 1081 | if (snd_hda_query_pin_caps(codec, pin_nid) & AC_PINCAP_HBR) { |
1094 | pinctl = snd_hda_codec_read(codec, pin_nid, 0, | 1082 | pinctl = snd_hda_codec_read(codec, pin_nid, 0, |
@@ -1227,7 +1215,7 @@ static int hdmi_pcm_open(struct hda_pcm_stream *hinfo, | |||
1227 | mux_idx); | 1215 | mux_idx); |
1228 | 1216 | ||
1229 | /* configure unused pins to choose other converters */ | 1217 | /* configure unused pins to choose other converters */ |
1230 | if (codec->vendor_id == 0x80862807) | 1218 | if (is_haswell(codec)) |
1231 | haswell_config_cvts(codec, pin_idx, mux_idx); | 1219 | haswell_config_cvts(codec, pin_idx, mux_idx); |
1232 | 1220 | ||
1233 | snd_hda_spdif_ctls_assign(codec, pin_idx, per_cvt->cvt_nid); | 1221 | snd_hda_spdif_ctls_assign(codec, pin_idx, per_cvt->cvt_nid); |
@@ -1358,14 +1346,10 @@ static void hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll) | |||
1358 | /* Haswell-specific workaround: re-setup when the transcoder is | 1346 | /* Haswell-specific workaround: re-setup when the transcoder is |
1359 | * changed during the stream playback | 1347 | * changed during the stream playback |
1360 | */ | 1348 | */ |
1361 | if (codec->vendor_id == 0x80862807 && | 1349 | if (is_haswell(codec) && |
1362 | eld->eld_valid && !old_eld_valid && per_pin->setup) { | 1350 | eld->eld_valid && !old_eld_valid && per_pin->setup) |
1363 | snd_hda_codec_write(codec, pin_nid, 0, | ||
1364 | AC_VERB_SET_AMP_GAIN_MUTE, | ||
1365 | AMP_OUT_UNMUTE); | ||
1366 | hdmi_setup_audio_infoframe(codec, per_pin, | 1351 | hdmi_setup_audio_infoframe(codec, per_pin, |
1367 | per_pin->non_pcm); | 1352 | per_pin->non_pcm); |
1368 | } | ||
1369 | } | 1353 | } |
1370 | mutex_unlock(&pin_eld->lock); | 1354 | mutex_unlock(&pin_eld->lock); |
1371 | 1355 | ||
@@ -1405,7 +1389,7 @@ static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid) | |||
1405 | if (get_defcfg_connect(config) == AC_JACK_PORT_NONE) | 1389 | if (get_defcfg_connect(config) == AC_JACK_PORT_NONE) |
1406 | return 0; | 1390 | return 0; |
1407 | 1391 | ||
1408 | if (codec->vendor_id == 0x80862807) | 1392 | if (is_haswell(codec)) |
1409 | intel_haswell_fixup_connect_list(codec, pin_nid); | 1393 | intel_haswell_fixup_connect_list(codec, pin_nid); |
1410 | 1394 | ||
1411 | pin_idx = spec->num_pins; | 1395 | pin_idx = spec->num_pins; |
@@ -2014,7 +1998,7 @@ static int patch_generic_hdmi(struct hda_codec *codec) | |||
2014 | codec->spec = spec; | 1998 | codec->spec = spec; |
2015 | hdmi_array_init(spec, 4); | 1999 | hdmi_array_init(spec, 4); |
2016 | 2000 | ||
2017 | if (codec->vendor_id == 0x80862807) { | 2001 | if (is_haswell(codec)) { |
2018 | intel_haswell_enable_all_pins(codec, true); | 2002 | intel_haswell_enable_all_pins(codec, true); |
2019 | intel_haswell_fixup_enable_dp12(codec); | 2003 | intel_haswell_fixup_enable_dp12(codec); |
2020 | } | 2004 | } |
@@ -2025,7 +2009,7 @@ static int patch_generic_hdmi(struct hda_codec *codec) | |||
2025 | return -EINVAL; | 2009 | return -EINVAL; |
2026 | } | 2010 | } |
2027 | codec->patch_ops = generic_hdmi_patch_ops; | 2011 | codec->patch_ops = generic_hdmi_patch_ops; |
2028 | if (codec->vendor_id == 0x80862807) { | 2012 | if (is_haswell(codec)) { |
2029 | codec->patch_ops.set_power_state = haswell_set_power_state; | 2013 | codec->patch_ops.set_power_state = haswell_set_power_state; |
2030 | codec->dp_mst = true; | 2014 | codec->dp_mst = true; |
2031 | } | 2015 | } |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 9e9378cde8fa..bc07d369fac4 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -3443,6 +3443,56 @@ static void alc283_fixup_chromebook(struct hda_codec *codec, | |||
3443 | } | 3443 | } |
3444 | } | 3444 | } |
3445 | 3445 | ||
3446 | /* mute tablet speaker pin (0x14) via dock plugging in addition */ | ||
3447 | static void asus_tx300_automute(struct hda_codec *codec) | ||
3448 | { | ||
3449 | struct alc_spec *spec = codec->spec; | ||
3450 | snd_hda_gen_update_outputs(codec); | ||
3451 | if (snd_hda_jack_detect(codec, 0x1b)) | ||
3452 | spec->gen.mute_bits |= (1ULL << 0x14); | ||
3453 | } | ||
3454 | |||
3455 | static void alc282_fixup_asus_tx300(struct hda_codec *codec, | ||
3456 | const struct hda_fixup *fix, int action) | ||
3457 | { | ||
3458 | struct alc_spec *spec = codec->spec; | ||
3459 | /* TX300 needs to set up GPIO2 for the speaker amp */ | ||
3460 | static const struct hda_verb gpio2_verbs[] = { | ||
3461 | { 0x01, AC_VERB_SET_GPIO_MASK, 0x04 }, | ||
3462 | { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04 }, | ||
3463 | { 0x01, AC_VERB_SET_GPIO_DATA, 0x04 }, | ||
3464 | {} | ||
3465 | }; | ||
3466 | static const struct hda_pintbl dock_pins[] = { | ||
3467 | { 0x1b, 0x21114000 }, /* dock speaker pin */ | ||
3468 | {} | ||
3469 | }; | ||
3470 | struct snd_kcontrol *kctl; | ||
3471 | |||
3472 | switch (action) { | ||
3473 | case HDA_FIXUP_ACT_PRE_PROBE: | ||
3474 | snd_hda_add_verbs(codec, gpio2_verbs); | ||
3475 | snd_hda_apply_pincfgs(codec, dock_pins); | ||
3476 | spec->gen.auto_mute_via_amp = 1; | ||
3477 | spec->gen.automute_hook = asus_tx300_automute; | ||
3478 | snd_hda_jack_detect_enable_callback(codec, 0x1b, | ||
3479 | HDA_GEN_HP_EVENT, | ||
3480 | snd_hda_gen_hp_automute); | ||
3481 | break; | ||
3482 | case HDA_FIXUP_ACT_BUILD: | ||
3483 | /* this is a bit tricky; give more sane names for the main | ||
3484 | * (tablet) speaker and the dock speaker, respectively | ||
3485 | */ | ||
3486 | kctl = snd_hda_find_mixer_ctl(codec, "Speaker Playback Switch"); | ||
3487 | if (kctl) | ||
3488 | strcpy(kctl->id.name, "Dock Speaker Playback Switch"); | ||
3489 | kctl = snd_hda_find_mixer_ctl(codec, "Bass Speaker Playback Switch"); | ||
3490 | if (kctl) | ||
3491 | strcpy(kctl->id.name, "Speaker Playback Switch"); | ||
3492 | break; | ||
3493 | } | ||
3494 | } | ||
3495 | |||
3446 | enum { | 3496 | enum { |
3447 | ALC269_FIXUP_SONY_VAIO, | 3497 | ALC269_FIXUP_SONY_VAIO, |
3448 | ALC275_FIXUP_SONY_VAIO_GPIO2, | 3498 | ALC275_FIXUP_SONY_VAIO_GPIO2, |
@@ -3480,6 +3530,7 @@ enum { | |||
3480 | ALC269_FIXUP_LIMIT_INT_MIC_BOOST, | 3530 | ALC269_FIXUP_LIMIT_INT_MIC_BOOST, |
3481 | ALC269VB_FIXUP_ORDISSIMO_EVE2, | 3531 | ALC269VB_FIXUP_ORDISSIMO_EVE2, |
3482 | ALC283_FIXUP_CHROME_BOOK, | 3532 | ALC283_FIXUP_CHROME_BOOK, |
3533 | ALC282_FIXUP_ASUS_TX300, | ||
3483 | }; | 3534 | }; |
3484 | 3535 | ||
3485 | static const struct hda_fixup alc269_fixups[] = { | 3536 | static const struct hda_fixup alc269_fixups[] = { |
@@ -3735,6 +3786,10 @@ static const struct hda_fixup alc269_fixups[] = { | |||
3735 | .type = HDA_FIXUP_FUNC, | 3786 | .type = HDA_FIXUP_FUNC, |
3736 | .v.func = alc283_fixup_chromebook, | 3787 | .v.func = alc283_fixup_chromebook, |
3737 | }, | 3788 | }, |
3789 | [ALC282_FIXUP_ASUS_TX300] = { | ||
3790 | .type = HDA_FIXUP_FUNC, | ||
3791 | .v.func = alc282_fixup_asus_tx300, | ||
3792 | }, | ||
3738 | }; | 3793 | }; |
3739 | 3794 | ||
3740 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { | 3795 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
@@ -3784,6 +3839,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
3784 | SND_PCI_QUIRK(0x103c, 0x1983, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 3839 | SND_PCI_QUIRK(0x103c, 0x1983, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
3785 | SND_PCI_QUIRK(0x103c, 0x21ed, "HP Falco Chromebook", ALC283_FIXUP_CHROME_BOOK), | 3840 | SND_PCI_QUIRK(0x103c, 0x21ed, "HP Falco Chromebook", ALC283_FIXUP_CHROME_BOOK), |
3786 | SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED), | 3841 | SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED), |
3842 | SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300), | ||
3787 | SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | 3843 | SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), |
3788 | SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | 3844 | SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), |
3789 | SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_DMIC), | 3845 | SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_DMIC), |