diff options
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/hda/hda_codec.c | 16 | ||||
-rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 21 |
2 files changed, 34 insertions, 3 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 239cdd855dfe..187533e477c6 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -1630,10 +1630,24 @@ static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg, | |||
1630 | 1630 | ||
1631 | nid = codec->start_nid; | 1631 | nid = codec->start_nid; |
1632 | for (i = 0; i < codec->num_nodes; i++, nid++) { | 1632 | for (i = 0; i < codec->num_nodes; i++, nid++) { |
1633 | if (get_wcaps(codec, nid) & AC_WCAP_POWER) | 1633 | if (get_wcaps(codec, nid) & AC_WCAP_POWER) { |
1634 | unsigned int pincap; | ||
1635 | /* | ||
1636 | * don't power down the widget if it controls eapd | ||
1637 | * and EAPD_BTLENABLE is set. | ||
1638 | */ | ||
1639 | pincap = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP); | ||
1640 | if (pincap & AC_PINCAP_EAPD) { | ||
1641 | int eapd = snd_hda_codec_read(codec, nid, | ||
1642 | 0, AC_VERB_GET_EAPD_BTLENABLE, 0); | ||
1643 | eapd &= 0x02; | ||
1644 | if (power_state == AC_PWRST_D3 && eapd) | ||
1645 | continue; | ||
1646 | } | ||
1634 | snd_hda_codec_write(codec, nid, 0, | 1647 | snd_hda_codec_write(codec, nid, 0, |
1635 | AC_VERB_SET_POWER_STATE, | 1648 | AC_VERB_SET_POWER_STATE, |
1636 | power_state); | 1649 | power_state); |
1650 | } | ||
1637 | } | 1651 | } |
1638 | 1652 | ||
1639 | if (power_state == AC_PWRST_D0) { | 1653 | if (power_state == AC_PWRST_D0) { |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 27360d278bcf..fe91b9b46b61 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -49,6 +49,7 @@ enum { | |||
49 | STAC_9200_DELL_M25, | 49 | STAC_9200_DELL_M25, |
50 | STAC_9200_DELL_M26, | 50 | STAC_9200_DELL_M26, |
51 | STAC_9200_DELL_M27, | 51 | STAC_9200_DELL_M27, |
52 | STAC_9200_GATEWAY, | ||
52 | STAC_9200_MODELS | 53 | STAC_9200_MODELS |
53 | }; | 54 | }; |
54 | 55 | ||
@@ -378,6 +379,13 @@ static struct hda_verb stac9200_core_init[] = { | |||
378 | {} | 379 | {} |
379 | }; | 380 | }; |
380 | 381 | ||
382 | static struct hda_verb stac9200_eapd_init[] = { | ||
383 | /* set dac0mux for dac converter */ | ||
384 | {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
385 | {0x08, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, | ||
386 | {} | ||
387 | }; | ||
388 | |||
381 | static struct hda_verb stac925x_core_init[] = { | 389 | static struct hda_verb stac925x_core_init[] = { |
382 | /* set dac0mux for dac converter */ | 390 | /* set dac0mux for dac converter */ |
383 | { 0x06, AC_VERB_SET_CONNECT_SEL, 0x00}, | 391 | { 0x06, AC_VERB_SET_CONNECT_SEL, 0x00}, |
@@ -693,6 +701,7 @@ static const char *stac9200_models[STAC_9200_MODELS] = { | |||
693 | [STAC_9200_DELL_M25] = "dell-m25", | 701 | [STAC_9200_DELL_M25] = "dell-m25", |
694 | [STAC_9200_DELL_M26] = "dell-m26", | 702 | [STAC_9200_DELL_M26] = "dell-m26", |
695 | [STAC_9200_DELL_M27] = "dell-m27", | 703 | [STAC_9200_DELL_M27] = "dell-m27", |
704 | [STAC_9200_GATEWAY] = "gateway", | ||
696 | }; | 705 | }; |
697 | 706 | ||
698 | static struct snd_pci_quirk stac9200_cfg_tbl[] = { | 707 | static struct snd_pci_quirk stac9200_cfg_tbl[] = { |
@@ -760,7 +769,12 @@ static struct snd_pci_quirk stac9200_cfg_tbl[] = { | |||
760 | "unknown Dell", STAC_9200_DELL_M26), | 769 | "unknown Dell", STAC_9200_DELL_M26), |
761 | /* Panasonic */ | 770 | /* Panasonic */ |
762 | SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_REF), | 771 | SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_REF), |
763 | 772 | /* Gateway machines needs EAPD to be set on resume */ | |
773 | SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_GATEWAY), | ||
774 | SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*", | ||
775 | STAC_9200_GATEWAY), | ||
776 | SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707", | ||
777 | STAC_9200_GATEWAY), | ||
764 | {} /* terminator */ | 778 | {} /* terminator */ |
765 | }; | 779 | }; |
766 | 780 | ||
@@ -2492,7 +2506,10 @@ static int patch_stac9200(struct hda_codec *codec) | |||
2492 | spec->num_dmics = 0; | 2506 | spec->num_dmics = 0; |
2493 | spec->num_adcs = 1; | 2507 | spec->num_adcs = 1; |
2494 | 2508 | ||
2495 | spec->init = stac9200_core_init; | 2509 | if (spec->board_config == STAC_9200_GATEWAY) |
2510 | spec->init = stac9200_eapd_init; | ||
2511 | else | ||
2512 | spec->init = stac9200_core_init; | ||
2496 | spec->mixer = stac9200_mixer; | 2513 | spec->mixer = stac9200_mixer; |
2497 | 2514 | ||
2498 | err = stac9200_parse_auto_config(codec); | 2515 | err = stac9200_parse_auto_config(codec); |