diff options
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/echoaudio/echoaudio.c | 5 | ||||
-rw-r--r-- | sound/pci/hda/hda_intel.c | 3 | ||||
-rw-r--r-- | sound/pci/hda/patch_analog.c | 17 | ||||
-rw-r--r-- | sound/pci/hda/patch_cirrus.c | 2 | ||||
-rw-r--r-- | sound/pci/hda/patch_conexant.c | 8 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 336 | ||||
-rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 4 | ||||
-rw-r--r-- | sound/pci/hda/patch_via.c | 41 | ||||
-rw-r--r-- | sound/pci/maestro3.c | 9 | ||||
-rw-r--r-- | sound/pci/mixart/mixart.c | 24 |
10 files changed, 343 insertions, 106 deletions
diff --git a/sound/pci/echoaudio/echoaudio.c b/sound/pci/echoaudio/echoaudio.c index 8dab82d7d19d..668a5ec04499 100644 --- a/sound/pci/echoaudio/echoaudio.c +++ b/sound/pci/echoaudio/echoaudio.c | |||
@@ -2184,10 +2184,9 @@ static int __devinit snd_echo_probe(struct pci_dev *pci, | |||
2184 | goto ctl_error; | 2184 | goto ctl_error; |
2185 | #endif | 2185 | #endif |
2186 | 2186 | ||
2187 | if ((err = snd_card_register(card)) < 0) { | 2187 | err = snd_card_register(card); |
2188 | snd_card_free(card); | 2188 | if (err < 0) |
2189 | goto ctl_error; | 2189 | goto ctl_error; |
2190 | } | ||
2191 | snd_printk(KERN_INFO "Card registered: %s\n", card->longname); | 2190 | snd_printk(KERN_INFO "Card registered: %s\n", card->longname); |
2192 | 2191 | ||
2193 | pci_set_drvdata(pci, chip); | 2192 | pci_set_drvdata(pci, chip); |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 4bb90675f70f..cec68152dcb1 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -2272,6 +2272,8 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = { | |||
2272 | SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB), | 2272 | SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB), |
2273 | SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB), | 2273 | SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB), |
2274 | SND_PCI_QUIRK(0x1565, 0x820f, "Biostar Microtech", POS_FIX_LPIB), | 2274 | SND_PCI_QUIRK(0x1565, 0x820f, "Biostar Microtech", POS_FIX_LPIB), |
2275 | SND_PCI_QUIRK(0x1565, 0x8218, "Biostar Microtech", POS_FIX_LPIB), | ||
2276 | SND_PCI_QUIRK(0x8086, 0x2503, "DG965OT AAD63733-203", POS_FIX_LPIB), | ||
2275 | SND_PCI_QUIRK(0x8086, 0xd601, "eMachines T5212", POS_FIX_LPIB), | 2277 | SND_PCI_QUIRK(0x8086, 0xd601, "eMachines T5212", POS_FIX_LPIB), |
2276 | {} | 2278 | {} |
2277 | }; | 2279 | }; |
@@ -2362,6 +2364,7 @@ static struct snd_pci_quirk msi_black_list[] __devinitdata = { | |||
2362 | SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */ | 2364 | SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */ |
2363 | SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */ | 2365 | SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */ |
2364 | SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */ | 2366 | SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */ |
2367 | SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */ | ||
2365 | {} | 2368 | {} |
2366 | }; | 2369 | }; |
2367 | 2370 | ||
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index e6d1bdff1b6e..e9fdfc4b1c57 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
@@ -519,14 +519,6 @@ static int ad198x_suspend(struct hda_codec *codec, pm_message_t state) | |||
519 | ad198x_power_eapd(codec); | 519 | ad198x_power_eapd(codec); |
520 | return 0; | 520 | return 0; |
521 | } | 521 | } |
522 | |||
523 | static int ad198x_resume(struct hda_codec *codec) | ||
524 | { | ||
525 | ad198x_init(codec); | ||
526 | snd_hda_codec_resume_amp(codec); | ||
527 | snd_hda_codec_resume_cache(codec); | ||
528 | return 0; | ||
529 | } | ||
530 | #endif | 522 | #endif |
531 | 523 | ||
532 | static struct hda_codec_ops ad198x_patch_ops = { | 524 | static struct hda_codec_ops ad198x_patch_ops = { |
@@ -539,7 +531,6 @@ static struct hda_codec_ops ad198x_patch_ops = { | |||
539 | #endif | 531 | #endif |
540 | #ifdef SND_HDA_NEEDS_RESUME | 532 | #ifdef SND_HDA_NEEDS_RESUME |
541 | .suspend = ad198x_suspend, | 533 | .suspend = ad198x_suspend, |
542 | .resume = ad198x_resume, | ||
543 | #endif | 534 | #endif |
544 | .reboot_notify = ad198x_shutup, | 535 | .reboot_notify = ad198x_shutup, |
545 | }; | 536 | }; |
@@ -1896,6 +1887,14 @@ static int patch_ad1981(struct hda_codec *codec) | |||
1896 | case AD1981_THINKPAD: | 1887 | case AD1981_THINKPAD: |
1897 | spec->mixers[0] = ad1981_thinkpad_mixers; | 1888 | spec->mixers[0] = ad1981_thinkpad_mixers; |
1898 | spec->input_mux = &ad1981_thinkpad_capture_source; | 1889 | spec->input_mux = &ad1981_thinkpad_capture_source; |
1890 | /* set the upper-limit for mixer amp to 0dB for avoiding the | ||
1891 | * possible damage by overloading | ||
1892 | */ | ||
1893 | snd_hda_override_amp_caps(codec, 0x11, HDA_INPUT, | ||
1894 | (0x17 << AC_AMPCAP_OFFSET_SHIFT) | | ||
1895 | (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) | | ||
1896 | (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) | | ||
1897 | (1 << AC_AMPCAP_MUTE_SHIFT)); | ||
1899 | break; | 1898 | break; |
1900 | case AD1981_TOSHIBA: | 1899 | case AD1981_TOSHIBA: |
1901 | spec->mixers[0] = ad1981_hp_mixers; | 1900 | spec->mixers[0] = ad1981_hp_mixers; |
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index 7de782a5b8f4..350ee8ac4153 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c | |||
@@ -766,7 +766,7 @@ static int build_input(struct hda_codec *codec) | |||
766 | for (n = 0; n < AUTO_PIN_LAST; n++) { | 766 | for (n = 0; n < AUTO_PIN_LAST; n++) { |
767 | if (!spec->adc_nid[n]) | 767 | if (!spec->adc_nid[n]) |
768 | continue; | 768 | continue; |
769 | err = snd_hda_add_nid(codec, kctl, 0, spec->adc_nid[i]); | 769 | err = snd_hda_add_nid(codec, kctl, 0, spec->adc_nid[n]); |
770 | if (err < 0) | 770 | if (err < 0) |
771 | return err; | 771 | return err; |
772 | } | 772 | } |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 61682e1d09da..56e52071c769 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
@@ -1195,9 +1195,10 @@ static int patch_cxt5045(struct hda_codec *codec) | |||
1195 | 1195 | ||
1196 | switch (codec->subsystem_id >> 16) { | 1196 | switch (codec->subsystem_id >> 16) { |
1197 | case 0x103c: | 1197 | case 0x103c: |
1198 | case 0x1631: | ||
1198 | case 0x1734: | 1199 | case 0x1734: |
1199 | /* HP & Fujitsu-Siemens laptops have really bad sound over 0dB | 1200 | /* HP, Packard Bell, & Fujitsu-Siemens laptops have really bad |
1200 | * on NID 0x17. Fix max PCM level to 0 dB | 1201 | * sound over 0dB on NID 0x17. Fix max PCM level to 0 dB |
1201 | * (originally it has 0x2b steps with 0dB offset 0x14) | 1202 | * (originally it has 0x2b steps with 0dB offset 0x14) |
1202 | */ | 1203 | */ |
1203 | snd_hda_override_amp_caps(codec, 0x17, HDA_INPUT, | 1204 | snd_hda_override_amp_caps(codec, 0x17, HDA_INPUT, |
@@ -2842,6 +2843,9 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = { | |||
2842 | CXT5066_DELL_LAPTOP), | 2843 | CXT5066_DELL_LAPTOP), |
2843 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), | 2844 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), |
2844 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), | 2845 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), |
2846 | SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), | ||
2847 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), | ||
2848 | SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), | ||
2845 | SND_PCI_QUIRK(0x17aa, 0x3a0d, "ideapad", CXT5066_IDEAPAD), | 2849 | SND_PCI_QUIRK(0x17aa, 0x3a0d, "ideapad", CXT5066_IDEAPAD), |
2846 | {} | 2850 | {} |
2847 | }; | 2851 | }; |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 9a23444e9e7a..7404dba16f83 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -230,6 +230,7 @@ enum { | |||
230 | ALC888_ACER_ASPIRE_7730G, | 230 | ALC888_ACER_ASPIRE_7730G, |
231 | ALC883_MEDION, | 231 | ALC883_MEDION, |
232 | ALC883_MEDION_MD2, | 232 | ALC883_MEDION_MD2, |
233 | ALC883_MEDION_WIM2160, | ||
233 | ALC883_LAPTOP_EAPD, | 234 | ALC883_LAPTOP_EAPD, |
234 | ALC883_LENOVO_101E_2ch, | 235 | ALC883_LENOVO_101E_2ch, |
235 | ALC883_LENOVO_NB0763, | 236 | ALC883_LENOVO_NB0763, |
@@ -1389,22 +1390,31 @@ struct alc_fixup { | |||
1389 | 1390 | ||
1390 | static void alc_pick_fixup(struct hda_codec *codec, | 1391 | static void alc_pick_fixup(struct hda_codec *codec, |
1391 | const struct snd_pci_quirk *quirk, | 1392 | const struct snd_pci_quirk *quirk, |
1392 | const struct alc_fixup *fix) | 1393 | const struct alc_fixup *fix, |
1394 | int pre_init) | ||
1393 | { | 1395 | { |
1394 | const struct alc_pincfg *cfg; | 1396 | const struct alc_pincfg *cfg; |
1395 | 1397 | ||
1396 | quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk); | 1398 | quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk); |
1397 | if (!quirk) | 1399 | if (!quirk) |
1398 | return; | 1400 | return; |
1399 | |||
1400 | fix += quirk->value; | 1401 | fix += quirk->value; |
1401 | cfg = fix->pins; | 1402 | cfg = fix->pins; |
1402 | if (cfg) { | 1403 | if (pre_init && cfg) { |
1404 | #ifdef CONFIG_SND_DEBUG_VERBOSE | ||
1405 | snd_printdd(KERN_INFO "hda_codec: %s: Apply pincfg for %s\n", | ||
1406 | codec->chip_name, quirk->name); | ||
1407 | #endif | ||
1403 | for (; cfg->nid; cfg++) | 1408 | for (; cfg->nid; cfg++) |
1404 | snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val); | 1409 | snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val); |
1405 | } | 1410 | } |
1406 | if (fix->verbs) | 1411 | if (!pre_init && fix->verbs) { |
1412 | #ifdef CONFIG_SND_DEBUG_VERBOSE | ||
1413 | snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-verbs for %s\n", | ||
1414 | codec->chip_name, quirk->name); | ||
1415 | #endif | ||
1407 | add_verb(codec->spec, fix->verbs); | 1416 | add_verb(codec->spec, fix->verbs); |
1417 | } | ||
1408 | } | 1418 | } |
1409 | 1419 | ||
1410 | static int alc_read_coef_idx(struct hda_codec *codec, | 1420 | static int alc_read_coef_idx(struct hda_codec *codec, |
@@ -1621,6 +1631,11 @@ static struct hda_verb alc888_acer_aspire_4930g_verbs[] = { | |||
1621 | */ | 1631 | */ |
1622 | 1632 | ||
1623 | static struct hda_verb alc888_acer_aspire_6530g_verbs[] = { | 1633 | static struct hda_verb alc888_acer_aspire_6530g_verbs[] = { |
1634 | /* Route to built-in subwoofer as well as speakers */ | ||
1635 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
1636 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
1637 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
1638 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
1624 | /* Bias voltage on for external mic port */ | 1639 | /* Bias voltage on for external mic port */ |
1625 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80}, | 1640 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80}, |
1626 | /* Front Mic: set to PIN_IN (empty by default) */ | 1641 | /* Front Mic: set to PIN_IN (empty by default) */ |
@@ -1632,10 +1647,12 @@ static struct hda_verb alc888_acer_aspire_6530g_verbs[] = { | |||
1632 | /* Enable speaker output */ | 1647 | /* Enable speaker output */ |
1633 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | 1648 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
1634 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 1649 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
1650 | {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, | ||
1635 | /* Enable headphone output */ | 1651 | /* Enable headphone output */ |
1636 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP}, | 1652 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP}, |
1637 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 1653 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
1638 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, | 1654 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, |
1655 | {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, | ||
1639 | { } | 1656 | { } |
1640 | }; | 1657 | }; |
1641 | 1658 | ||
@@ -4126,7 +4143,7 @@ static struct snd_pci_quirk alc880_cfg_tbl[] = { | |||
4126 | SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG), | 4143 | SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG), |
4127 | SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734), | 4144 | SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734), |
4128 | SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU), | 4145 | SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU), |
4129 | SND_PCI_QUIRK(0x1734, 0x10ac, "FSC", ALC880_UNIWILL), | 4146 | SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_F1734), |
4130 | SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU), | 4147 | SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU), |
4131 | SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW), | 4148 | SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW), |
4132 | SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG), | 4149 | SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG), |
@@ -4801,6 +4818,25 @@ static void alc880_auto_init_analog_input(struct hda_codec *codec) | |||
4801 | } | 4818 | } |
4802 | } | 4819 | } |
4803 | 4820 | ||
4821 | static void alc880_auto_init_input_src(struct hda_codec *codec) | ||
4822 | { | ||
4823 | struct alc_spec *spec = codec->spec; | ||
4824 | int c; | ||
4825 | |||
4826 | for (c = 0; c < spec->num_adc_nids; c++) { | ||
4827 | unsigned int mux_idx; | ||
4828 | const struct hda_input_mux *imux; | ||
4829 | mux_idx = c >= spec->num_mux_defs ? 0 : c; | ||
4830 | imux = &spec->input_mux[mux_idx]; | ||
4831 | if (!imux->num_items && mux_idx > 0) | ||
4832 | imux = &spec->input_mux[0]; | ||
4833 | if (imux) | ||
4834 | snd_hda_codec_write(codec, spec->adc_nids[c], 0, | ||
4835 | AC_VERB_SET_CONNECT_SEL, | ||
4836 | imux->items[0].index); | ||
4837 | } | ||
4838 | } | ||
4839 | |||
4804 | /* parse the BIOS configuration and set up the alc_spec */ | 4840 | /* parse the BIOS configuration and set up the alc_spec */ |
4805 | /* return 1 if successful, 0 if the proper config is not found, | 4841 | /* return 1 if successful, 0 if the proper config is not found, |
4806 | * or a negative error code | 4842 | * or a negative error code |
@@ -4879,6 +4915,7 @@ static void alc880_auto_init(struct hda_codec *codec) | |||
4879 | alc880_auto_init_multi_out(codec); | 4915 | alc880_auto_init_multi_out(codec); |
4880 | alc880_auto_init_extra_out(codec); | 4916 | alc880_auto_init_extra_out(codec); |
4881 | alc880_auto_init_analog_input(codec); | 4917 | alc880_auto_init_analog_input(codec); |
4918 | alc880_auto_init_input_src(codec); | ||
4882 | if (spec->unsol_event) | 4919 | if (spec->unsol_event) |
4883 | alc_inithook(codec); | 4920 | alc_inithook(codec); |
4884 | } | 4921 | } |
@@ -4984,6 +5021,70 @@ static void set_capture_mixer(struct hda_codec *codec) | |||
4984 | } | 5021 | } |
4985 | } | 5022 | } |
4986 | 5023 | ||
5024 | /* fill adc_nids (and capsrc_nids) containing all active input pins */ | ||
5025 | static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids, | ||
5026 | int num_nids) | ||
5027 | { | ||
5028 | struct alc_spec *spec = codec->spec; | ||
5029 | int n; | ||
5030 | hda_nid_t fallback_adc = 0, fallback_cap = 0; | ||
5031 | |||
5032 | for (n = 0; n < num_nids; n++) { | ||
5033 | hda_nid_t adc, cap; | ||
5034 | hda_nid_t conn[HDA_MAX_NUM_INPUTS]; | ||
5035 | int nconns, i, j; | ||
5036 | |||
5037 | adc = nids[n]; | ||
5038 | if (get_wcaps_type(get_wcaps(codec, adc)) != AC_WID_AUD_IN) | ||
5039 | continue; | ||
5040 | cap = adc; | ||
5041 | nconns = snd_hda_get_connections(codec, cap, conn, | ||
5042 | ARRAY_SIZE(conn)); | ||
5043 | if (nconns == 1) { | ||
5044 | cap = conn[0]; | ||
5045 | nconns = snd_hda_get_connections(codec, cap, conn, | ||
5046 | ARRAY_SIZE(conn)); | ||
5047 | } | ||
5048 | if (nconns <= 0) | ||
5049 | continue; | ||
5050 | if (!fallback_adc) { | ||
5051 | fallback_adc = adc; | ||
5052 | fallback_cap = cap; | ||
5053 | } | ||
5054 | for (i = 0; i < AUTO_PIN_LAST; i++) { | ||
5055 | hda_nid_t nid = spec->autocfg.input_pins[i]; | ||
5056 | if (!nid) | ||
5057 | continue; | ||
5058 | for (j = 0; j < nconns; j++) { | ||
5059 | if (conn[j] == nid) | ||
5060 | break; | ||
5061 | } | ||
5062 | if (j >= nconns) | ||
5063 | break; | ||
5064 | } | ||
5065 | if (i >= AUTO_PIN_LAST) { | ||
5066 | int num_adcs = spec->num_adc_nids; | ||
5067 | spec->private_adc_nids[num_adcs] = adc; | ||
5068 | spec->private_capsrc_nids[num_adcs] = cap; | ||
5069 | spec->num_adc_nids++; | ||
5070 | spec->adc_nids = spec->private_adc_nids; | ||
5071 | if (adc != cap) | ||
5072 | spec->capsrc_nids = spec->private_capsrc_nids; | ||
5073 | } | ||
5074 | } | ||
5075 | if (!spec->num_adc_nids) { | ||
5076 | printk(KERN_WARNING "hda_codec: %s: no valid ADC found;" | ||
5077 | " using fallback 0x%x\n", | ||
5078 | codec->chip_name, fallback_adc); | ||
5079 | spec->private_adc_nids[0] = fallback_adc; | ||
5080 | spec->adc_nids = spec->private_adc_nids; | ||
5081 | if (fallback_adc != fallback_cap) { | ||
5082 | spec->private_capsrc_nids[0] = fallback_cap; | ||
5083 | spec->capsrc_nids = spec->private_adc_nids; | ||
5084 | } | ||
5085 | } | ||
5086 | } | ||
5087 | |||
4987 | #ifdef CONFIG_SND_HDA_INPUT_BEEP | 5088 | #ifdef CONFIG_SND_HDA_INPUT_BEEP |
4988 | #define set_beep_amp(spec, nid, idx, dir) \ | 5089 | #define set_beep_amp(spec, nid, idx, dir) \ |
4989 | ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir)) | 5090 | ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir)) |
@@ -6326,6 +6427,8 @@ static void alc260_auto_init_analog_input(struct hda_codec *codec) | |||
6326 | } | 6427 | } |
6327 | } | 6428 | } |
6328 | 6429 | ||
6430 | #define alc260_auto_init_input_src alc880_auto_init_input_src | ||
6431 | |||
6329 | /* | 6432 | /* |
6330 | * generic initialization of ADC, input mixers and output mixers | 6433 | * generic initialization of ADC, input mixers and output mixers |
6331 | */ | 6434 | */ |
@@ -6412,6 +6515,7 @@ static void alc260_auto_init(struct hda_codec *codec) | |||
6412 | struct alc_spec *spec = codec->spec; | 6515 | struct alc_spec *spec = codec->spec; |
6413 | alc260_auto_init_multi_out(codec); | 6516 | alc260_auto_init_multi_out(codec); |
6414 | alc260_auto_init_analog_input(codec); | 6517 | alc260_auto_init_analog_input(codec); |
6518 | alc260_auto_init_input_src(codec); | ||
6415 | if (spec->unsol_event) | 6519 | if (spec->unsol_event) |
6416 | alc_inithook(codec); | 6520 | alc_inithook(codec); |
6417 | } | 6521 | } |
@@ -8384,6 +8488,42 @@ static struct snd_kcontrol_new alc883_medion_md2_mixer[] = { | |||
8384 | { } /* end */ | 8488 | { } /* end */ |
8385 | }; | 8489 | }; |
8386 | 8490 | ||
8491 | static struct snd_kcontrol_new alc883_medion_wim2160_mixer[] = { | ||
8492 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | ||
8493 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | ||
8494 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x15, 0x0, HDA_OUTPUT), | ||
8495 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT), | ||
8496 | HDA_CODEC_VOLUME("Line Playback Volume", 0x08, 0x0, HDA_INPUT), | ||
8497 | HDA_CODEC_MUTE("Line Playback Switch", 0x08, 0x0, HDA_INPUT), | ||
8498 | { } /* end */ | ||
8499 | }; | ||
8500 | |||
8501 | static struct hda_verb alc883_medion_wim2160_verbs[] = { | ||
8502 | /* Unmute front mixer */ | ||
8503 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
8504 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
8505 | |||
8506 | /* Set speaker pin to front mixer */ | ||
8507 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
8508 | |||
8509 | /* Init headphone pin */ | ||
8510 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
8511 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
8512 | {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
8513 | {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | ||
8514 | |||
8515 | { } /* end */ | ||
8516 | }; | ||
8517 | |||
8518 | /* toggle speaker-output according to the hp-jack state */ | ||
8519 | static void alc883_medion_wim2160_setup(struct hda_codec *codec) | ||
8520 | { | ||
8521 | struct alc_spec *spec = codec->spec; | ||
8522 | |||
8523 | spec->autocfg.hp_pins[0] = 0x1a; | ||
8524 | spec->autocfg.speaker_pins[0] = 0x15; | ||
8525 | } | ||
8526 | |||
8387 | static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = { | 8527 | static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = { |
8388 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 8528 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
8389 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | 8529 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), |
@@ -8398,9 +8538,7 @@ static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = { | |||
8398 | 8538 | ||
8399 | static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = { | 8539 | static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = { |
8400 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 8540 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
8401 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | ||
8402 | HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT), | 8541 | HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT), |
8403 | HDA_BIND_MUTE("LFE Playback Switch", 0x0f, 2, HDA_INPUT), | ||
8404 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | 8542 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), |
8405 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | 8543 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), |
8406 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | 8544 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), |
@@ -9095,6 +9233,7 @@ static const char *alc882_models[ALC882_MODEL_LAST] = { | |||
9095 | [ALC888_ACER_ASPIRE_7730G] = "acer-aspire-7730g", | 9233 | [ALC888_ACER_ASPIRE_7730G] = "acer-aspire-7730g", |
9096 | [ALC883_MEDION] = "medion", | 9234 | [ALC883_MEDION] = "medion", |
9097 | [ALC883_MEDION_MD2] = "medion-md2", | 9235 | [ALC883_MEDION_MD2] = "medion-md2", |
9236 | [ALC883_MEDION_WIM2160] = "medion-wim2160", | ||
9098 | [ALC883_LAPTOP_EAPD] = "laptop-eapd", | 9237 | [ALC883_LAPTOP_EAPD] = "laptop-eapd", |
9099 | [ALC883_LENOVO_101E_2ch] = "lenovo-101e", | 9238 | [ALC883_LENOVO_101E_2ch] = "lenovo-101e", |
9100 | [ALC883_LENOVO_NB0763] = "lenovo-nb0763", | 9239 | [ALC883_LENOVO_NB0763] = "lenovo-nb0763", |
@@ -9211,6 +9350,7 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = { | |||
9211 | SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG), | 9350 | SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG), |
9212 | 9351 | ||
9213 | SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG), | 9352 | SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG), |
9353 | SND_PCI_QUIRK(0x1558, 0x0571, "Clevo laptop M570U", ALC883_3ST_6ch_DIG), | ||
9214 | SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720), | 9354 | SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720), |
9215 | SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720), | 9355 | SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720), |
9216 | SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R), | 9356 | SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R), |
@@ -9749,6 +9889,21 @@ static struct alc_config_preset alc882_presets[] = { | |||
9749 | .setup = alc883_medion_md2_setup, | 9889 | .setup = alc883_medion_md2_setup, |
9750 | .init_hook = alc_automute_amp, | 9890 | .init_hook = alc_automute_amp, |
9751 | }, | 9891 | }, |
9892 | [ALC883_MEDION_WIM2160] = { | ||
9893 | .mixers = { alc883_medion_wim2160_mixer }, | ||
9894 | .init_verbs = { alc883_init_verbs, alc883_medion_wim2160_verbs }, | ||
9895 | .num_dacs = ARRAY_SIZE(alc883_dac_nids), | ||
9896 | .dac_nids = alc883_dac_nids, | ||
9897 | .dig_out_nid = ALC883_DIGOUT_NID, | ||
9898 | .num_adc_nids = ARRAY_SIZE(alc883_adc_nids), | ||
9899 | .adc_nids = alc883_adc_nids, | ||
9900 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), | ||
9901 | .channel_mode = alc883_3ST_2ch_modes, | ||
9902 | .input_mux = &alc883_capture_source, | ||
9903 | .unsol_event = alc_automute_amp_unsol_event, | ||
9904 | .setup = alc883_medion_wim2160_setup, | ||
9905 | .init_hook = alc_automute_amp, | ||
9906 | }, | ||
9752 | [ALC883_LAPTOP_EAPD] = { | 9907 | [ALC883_LAPTOP_EAPD] = { |
9753 | .mixers = { alc883_base_mixer }, | 9908 | .mixers = { alc883_base_mixer }, |
9754 | .init_verbs = { alc883_init_verbs, alc882_eapd_verbs }, | 9909 | .init_verbs = { alc883_init_verbs, alc882_eapd_verbs }, |
@@ -10041,13 +10196,12 @@ static void alc882_auto_set_output_and_unmute(struct hda_codec *codec, | |||
10041 | int idx; | 10196 | int idx; |
10042 | 10197 | ||
10043 | alc_set_pin_output(codec, nid, pin_type); | 10198 | alc_set_pin_output(codec, nid, pin_type); |
10199 | if (dac_idx >= spec->multiout.num_dacs) | ||
10200 | return; | ||
10044 | if (spec->multiout.dac_nids[dac_idx] == 0x25) | 10201 | if (spec->multiout.dac_nids[dac_idx] == 0x25) |
10045 | idx = 4; | 10202 | idx = 4; |
10046 | else { | 10203 | else |
10047 | if (spec->multiout.num_dacs >= dac_idx) | ||
10048 | return; | ||
10049 | idx = spec->multiout.dac_nids[dac_idx] - 2; | 10204 | idx = spec->multiout.dac_nids[dac_idx] - 2; |
10050 | } | ||
10051 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx); | 10205 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx); |
10052 | 10206 | ||
10053 | } | 10207 | } |
@@ -10295,7 +10449,8 @@ static int patch_alc882(struct hda_codec *codec) | |||
10295 | board_config = ALC882_AUTO; | 10449 | board_config = ALC882_AUTO; |
10296 | } | 10450 | } |
10297 | 10451 | ||
10298 | alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups); | 10452 | if (board_config == ALC882_AUTO) |
10453 | alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 1); | ||
10299 | 10454 | ||
10300 | if (board_config == ALC882_AUTO) { | 10455 | if (board_config == ALC882_AUTO) { |
10301 | /* automatic parse from the BIOS config */ | 10456 | /* automatic parse from the BIOS config */ |
@@ -10368,6 +10523,9 @@ static int patch_alc882(struct hda_codec *codec) | |||
10368 | set_capture_mixer(codec); | 10523 | set_capture_mixer(codec); |
10369 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | 10524 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); |
10370 | 10525 | ||
10526 | if (board_config == ALC882_AUTO) | ||
10527 | alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 0); | ||
10528 | |||
10371 | spec->vmaster_nid = 0x0c; | 10529 | spec->vmaster_nid = 0x0c; |
10372 | 10530 | ||
10373 | codec->patch_ops = alc_patch_ops; | 10531 | codec->patch_ops = alc_patch_ops; |
@@ -12459,11 +12617,11 @@ static void alc268_aspire_one_speaker_automute(struct hda_codec *codec) | |||
12459 | unsigned char bits; | 12617 | unsigned char bits; |
12460 | 12618 | ||
12461 | present = snd_hda_jack_detect(codec, 0x15); | 12619 | present = snd_hda_jack_detect(codec, 0x15); |
12462 | bits = present ? AMP_IN_MUTE(0) : 0; | 12620 | bits = present ? HDA_AMP_MUTE : 0; |
12463 | snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0, | 12621 | snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0, |
12464 | AMP_IN_MUTE(0), bits); | 12622 | HDA_AMP_MUTE, bits); |
12465 | snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1, | 12623 | snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1, |
12466 | AMP_IN_MUTE(0), bits); | 12624 | HDA_AMP_MUTE, bits); |
12467 | } | 12625 | } |
12468 | 12626 | ||
12469 | static void alc268_acer_lc_unsol_event(struct hda_codec *codec, | 12627 | static void alc268_acer_lc_unsol_event(struct hda_codec *codec, |
@@ -12748,6 +12906,7 @@ static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid, | |||
12748 | dac = 0x02; | 12906 | dac = 0x02; |
12749 | break; | 12907 | break; |
12750 | case 0x15: | 12908 | case 0x15: |
12909 | case 0x21: /* ALC269vb has this pin, too */ | ||
12751 | dac = 0x03; | 12910 | dac = 0x03; |
12752 | break; | 12911 | break; |
12753 | default: | 12912 | default: |
@@ -13333,9 +13492,9 @@ static hda_nid_t alc269vb_capsrc_nids[1] = { | |||
13333 | 0x22, | 13492 | 0x22, |
13334 | }; | 13493 | }; |
13335 | 13494 | ||
13336 | /* NOTE: ADC2 (0x07) is connected from a recording *MIXER* (0x24), | 13495 | static hda_nid_t alc269_adc_candidates[] = { |
13337 | * not a mux! | 13496 | 0x08, 0x09, 0x07, |
13338 | */ | 13497 | }; |
13339 | 13498 | ||
13340 | #define alc269_modes alc260_modes | 13499 | #define alc269_modes alc260_modes |
13341 | #define alc269_capture_source alc880_lg_lw_capture_source | 13500 | #define alc269_capture_source alc880_lg_lw_capture_source |
@@ -13482,11 +13641,11 @@ static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec) | |||
13482 | unsigned char bits; | 13641 | unsigned char bits; |
13483 | 13642 | ||
13484 | present = snd_hda_jack_detect(codec, 0x15); | 13643 | present = snd_hda_jack_detect(codec, 0x15); |
13485 | bits = present ? AMP_IN_MUTE(0) : 0; | 13644 | bits = present ? HDA_AMP_MUTE : 0; |
13486 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, | 13645 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, |
13487 | AMP_IN_MUTE(0), bits); | 13646 | HDA_AMP_MUTE, bits); |
13488 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, | 13647 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, |
13489 | AMP_IN_MUTE(0), bits); | 13648 | HDA_AMP_MUTE, bits); |
13490 | 13649 | ||
13491 | snd_hda_codec_write(codec, 0x20, 0, | 13650 | snd_hda_codec_write(codec, 0x20, 0, |
13492 | AC_VERB_SET_COEF_INDEX, 0x0c); | 13651 | AC_VERB_SET_COEF_INDEX, 0x0c); |
@@ -13511,11 +13670,11 @@ static void alc269_lifebook_speaker_automute(struct hda_codec *codec) | |||
13511 | /* Check port replicator headphone socket */ | 13670 | /* Check port replicator headphone socket */ |
13512 | present |= snd_hda_jack_detect(codec, 0x1a); | 13671 | present |= snd_hda_jack_detect(codec, 0x1a); |
13513 | 13672 | ||
13514 | bits = present ? AMP_IN_MUTE(0) : 0; | 13673 | bits = present ? HDA_AMP_MUTE : 0; |
13515 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, | 13674 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, |
13516 | AMP_IN_MUTE(0), bits); | 13675 | HDA_AMP_MUTE, bits); |
13517 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, | 13676 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, |
13518 | AMP_IN_MUTE(0), bits); | 13677 | HDA_AMP_MUTE, bits); |
13519 | 13678 | ||
13520 | snd_hda_codec_write(codec, 0x20, 0, | 13679 | snd_hda_codec_write(codec, 0x20, 0, |
13521 | AC_VERB_SET_COEF_INDEX, 0x0c); | 13680 | AC_VERB_SET_COEF_INDEX, 0x0c); |
@@ -13646,11 +13805,11 @@ static void alc269_speaker_automute(struct hda_codec *codec) | |||
13646 | unsigned char bits; | 13805 | unsigned char bits; |
13647 | 13806 | ||
13648 | present = snd_hda_jack_detect(codec, nid); | 13807 | present = snd_hda_jack_detect(codec, nid); |
13649 | bits = present ? AMP_IN_MUTE(0) : 0; | 13808 | bits = present ? HDA_AMP_MUTE : 0; |
13650 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, | 13809 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, |
13651 | AMP_IN_MUTE(0), bits); | 13810 | HDA_AMP_MUTE, bits); |
13652 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, | 13811 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, |
13653 | AMP_IN_MUTE(0), bits); | 13812 | HDA_AMP_MUTE, bits); |
13654 | } | 13813 | } |
13655 | 13814 | ||
13656 | /* unsolicited event for HP jack sensing */ | 13815 | /* unsolicited event for HP jack sensing */ |
@@ -13667,19 +13826,19 @@ static void alc269_laptop_unsol_event(struct hda_codec *codec, | |||
13667 | } | 13826 | } |
13668 | } | 13827 | } |
13669 | 13828 | ||
13670 | static void alc269_laptop_dmic_setup(struct hda_codec *codec) | 13829 | static void alc269_laptop_amic_setup(struct hda_codec *codec) |
13671 | { | 13830 | { |
13672 | struct alc_spec *spec = codec->spec; | 13831 | struct alc_spec *spec = codec->spec; |
13673 | spec->autocfg.hp_pins[0] = 0x15; | 13832 | spec->autocfg.hp_pins[0] = 0x15; |
13674 | spec->autocfg.speaker_pins[0] = 0x14; | 13833 | spec->autocfg.speaker_pins[0] = 0x14; |
13675 | spec->ext_mic.pin = 0x18; | 13834 | spec->ext_mic.pin = 0x18; |
13676 | spec->ext_mic.mux_idx = 0; | 13835 | spec->ext_mic.mux_idx = 0; |
13677 | spec->int_mic.pin = 0x12; | 13836 | spec->int_mic.pin = 0x19; |
13678 | spec->int_mic.mux_idx = 5; | 13837 | spec->int_mic.mux_idx = 1; |
13679 | spec->auto_mic = 1; | 13838 | spec->auto_mic = 1; |
13680 | } | 13839 | } |
13681 | 13840 | ||
13682 | static void alc269vb_laptop_dmic_setup(struct hda_codec *codec) | 13841 | static void alc269_laptop_dmic_setup(struct hda_codec *codec) |
13683 | { | 13842 | { |
13684 | struct alc_spec *spec = codec->spec; | 13843 | struct alc_spec *spec = codec->spec; |
13685 | spec->autocfg.hp_pins[0] = 0x15; | 13844 | spec->autocfg.hp_pins[0] = 0x15; |
@@ -13687,14 +13846,14 @@ static void alc269vb_laptop_dmic_setup(struct hda_codec *codec) | |||
13687 | spec->ext_mic.pin = 0x18; | 13846 | spec->ext_mic.pin = 0x18; |
13688 | spec->ext_mic.mux_idx = 0; | 13847 | spec->ext_mic.mux_idx = 0; |
13689 | spec->int_mic.pin = 0x12; | 13848 | spec->int_mic.pin = 0x12; |
13690 | spec->int_mic.mux_idx = 6; | 13849 | spec->int_mic.mux_idx = 5; |
13691 | spec->auto_mic = 1; | 13850 | spec->auto_mic = 1; |
13692 | } | 13851 | } |
13693 | 13852 | ||
13694 | static void alc269_laptop_amic_setup(struct hda_codec *codec) | 13853 | static void alc269vb_laptop_amic_setup(struct hda_codec *codec) |
13695 | { | 13854 | { |
13696 | struct alc_spec *spec = codec->spec; | 13855 | struct alc_spec *spec = codec->spec; |
13697 | spec->autocfg.hp_pins[0] = 0x15; | 13856 | spec->autocfg.hp_pins[0] = 0x21; |
13698 | spec->autocfg.speaker_pins[0] = 0x14; | 13857 | spec->autocfg.speaker_pins[0] = 0x14; |
13699 | spec->ext_mic.pin = 0x18; | 13858 | spec->ext_mic.pin = 0x18; |
13700 | spec->ext_mic.mux_idx = 0; | 13859 | spec->ext_mic.mux_idx = 0; |
@@ -13703,6 +13862,18 @@ static void alc269_laptop_amic_setup(struct hda_codec *codec) | |||
13703 | spec->auto_mic = 1; | 13862 | spec->auto_mic = 1; |
13704 | } | 13863 | } |
13705 | 13864 | ||
13865 | static void alc269vb_laptop_dmic_setup(struct hda_codec *codec) | ||
13866 | { | ||
13867 | struct alc_spec *spec = codec->spec; | ||
13868 | spec->autocfg.hp_pins[0] = 0x21; | ||
13869 | spec->autocfg.speaker_pins[0] = 0x14; | ||
13870 | spec->ext_mic.pin = 0x18; | ||
13871 | spec->ext_mic.mux_idx = 0; | ||
13872 | spec->int_mic.pin = 0x12; | ||
13873 | spec->int_mic.mux_idx = 6; | ||
13874 | spec->auto_mic = 1; | ||
13875 | } | ||
13876 | |||
13706 | static void alc269_laptop_inithook(struct hda_codec *codec) | 13877 | static void alc269_laptop_inithook(struct hda_codec *codec) |
13707 | { | 13878 | { |
13708 | alc269_speaker_automute(codec); | 13879 | alc269_speaker_automute(codec); |
@@ -13842,7 +14013,6 @@ static int alc269_parse_auto_config(struct hda_codec *codec) | |||
13842 | struct alc_spec *spec = codec->spec; | 14013 | struct alc_spec *spec = codec->spec; |
13843 | int err; | 14014 | int err; |
13844 | static hda_nid_t alc269_ignore[] = { 0x1d, 0 }; | 14015 | static hda_nid_t alc269_ignore[] = { 0x1d, 0 }; |
13845 | hda_nid_t real_capsrc_nids; | ||
13846 | 14016 | ||
13847 | err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, | 14017 | err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, |
13848 | alc269_ignore); | 14018 | alc269_ignore); |
@@ -13866,18 +14036,19 @@ static int alc269_parse_auto_config(struct hda_codec *codec) | |||
13866 | 14036 | ||
13867 | if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010) { | 14037 | if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010) { |
13868 | add_verb(spec, alc269vb_init_verbs); | 14038 | add_verb(spec, alc269vb_init_verbs); |
13869 | real_capsrc_nids = alc269vb_capsrc_nids[0]; | ||
13870 | alc_ssid_check(codec, 0, 0x1b, 0x14, 0x21); | 14039 | alc_ssid_check(codec, 0, 0x1b, 0x14, 0x21); |
13871 | } else { | 14040 | } else { |
13872 | add_verb(spec, alc269_init_verbs); | 14041 | add_verb(spec, alc269_init_verbs); |
13873 | real_capsrc_nids = alc269_capsrc_nids[0]; | ||
13874 | alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0); | 14042 | alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0); |
13875 | } | 14043 | } |
13876 | 14044 | ||
13877 | spec->num_mux_defs = 1; | 14045 | spec->num_mux_defs = 1; |
13878 | spec->input_mux = &spec->private_imux[0]; | 14046 | spec->input_mux = &spec->private_imux[0]; |
14047 | fillup_priv_adc_nids(codec, alc269_adc_candidates, | ||
14048 | sizeof(alc269_adc_candidates)); | ||
14049 | |||
13879 | /* set default input source */ | 14050 | /* set default input source */ |
13880 | snd_hda_codec_write_cache(codec, real_capsrc_nids, | 14051 | snd_hda_codec_write_cache(codec, spec->capsrc_nids[0], |
13881 | 0, AC_VERB_SET_CONNECT_SEL, | 14052 | 0, AC_VERB_SET_CONNECT_SEL, |
13882 | spec->input_mux->items[0].index); | 14053 | spec->input_mux->items[0].index); |
13883 | 14054 | ||
@@ -13907,6 +14078,27 @@ static void alc269_auto_init(struct hda_codec *codec) | |||
13907 | alc_inithook(codec); | 14078 | alc_inithook(codec); |
13908 | } | 14079 | } |
13909 | 14080 | ||
14081 | enum { | ||
14082 | ALC269_FIXUP_SONY_VAIO, | ||
14083 | }; | ||
14084 | |||
14085 | const static struct hda_verb alc269_sony_vaio_fixup_verbs[] = { | ||
14086 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD}, | ||
14087 | {} | ||
14088 | }; | ||
14089 | |||
14090 | static const struct alc_fixup alc269_fixups[] = { | ||
14091 | [ALC269_FIXUP_SONY_VAIO] = { | ||
14092 | .verbs = alc269_sony_vaio_fixup_verbs | ||
14093 | }, | ||
14094 | }; | ||
14095 | |||
14096 | static struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
14097 | SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), | ||
14098 | {} | ||
14099 | }; | ||
14100 | |||
14101 | |||
13910 | /* | 14102 | /* |
13911 | * configuration and preset | 14103 | * configuration and preset |
13912 | */ | 14104 | */ |
@@ -13966,7 +14158,7 @@ static struct snd_pci_quirk alc269_cfg_tbl[] = { | |||
13966 | ALC269_DMIC), | 14158 | ALC269_DMIC), |
13967 | SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC), | 14159 | SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC), |
13968 | SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC), | 14160 | SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC), |
13969 | SND_PCI_QUIRK(0x104d, 0x9071, "SONY XTB", ALC269_DMIC), | 14161 | SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO), |
13970 | SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK), | 14162 | SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK), |
13971 | SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC), | 14163 | SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC), |
13972 | SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU), | 14164 | SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU), |
@@ -14040,7 +14232,7 @@ static struct alc_config_preset alc269_presets[] = { | |||
14040 | .num_channel_mode = ARRAY_SIZE(alc269_modes), | 14232 | .num_channel_mode = ARRAY_SIZE(alc269_modes), |
14041 | .channel_mode = alc269_modes, | 14233 | .channel_mode = alc269_modes, |
14042 | .unsol_event = alc269_laptop_unsol_event, | 14234 | .unsol_event = alc269_laptop_unsol_event, |
14043 | .setup = alc269_laptop_amic_setup, | 14235 | .setup = alc269vb_laptop_amic_setup, |
14044 | .init_hook = alc269_laptop_inithook, | 14236 | .init_hook = alc269_laptop_inithook, |
14045 | }, | 14237 | }, |
14046 | [ALC269VB_DMIC] = { | 14238 | [ALC269VB_DMIC] = { |
@@ -14120,6 +14312,9 @@ static int patch_alc269(struct hda_codec *codec) | |||
14120 | board_config = ALC269_AUTO; | 14312 | board_config = ALC269_AUTO; |
14121 | } | 14313 | } |
14122 | 14314 | ||
14315 | if (board_config == ALC269_AUTO) | ||
14316 | alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 1); | ||
14317 | |||
14123 | if (board_config == ALC269_AUTO) { | 14318 | if (board_config == ALC269_AUTO) { |
14124 | /* automatic parse from the BIOS config */ | 14319 | /* automatic parse from the BIOS config */ |
14125 | err = alc269_parse_auto_config(codec); | 14320 | err = alc269_parse_auto_config(codec); |
@@ -14156,20 +14351,25 @@ static int patch_alc269(struct hda_codec *codec) | |||
14156 | spec->stream_digital_playback = &alc269_pcm_digital_playback; | 14351 | spec->stream_digital_playback = &alc269_pcm_digital_playback; |
14157 | spec->stream_digital_capture = &alc269_pcm_digital_capture; | 14352 | spec->stream_digital_capture = &alc269_pcm_digital_capture; |
14158 | 14353 | ||
14159 | if (!is_alc269vb) { | 14354 | if (!spec->adc_nids) { /* wasn't filled automatically? use default */ |
14160 | spec->adc_nids = alc269_adc_nids; | 14355 | if (!is_alc269vb) { |
14161 | spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids); | 14356 | spec->adc_nids = alc269_adc_nids; |
14162 | spec->capsrc_nids = alc269_capsrc_nids; | 14357 | spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids); |
14163 | } else { | 14358 | spec->capsrc_nids = alc269_capsrc_nids; |
14164 | spec->adc_nids = alc269vb_adc_nids; | 14359 | } else { |
14165 | spec->num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids); | 14360 | spec->adc_nids = alc269vb_adc_nids; |
14166 | spec->capsrc_nids = alc269vb_capsrc_nids; | 14361 | spec->num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids); |
14362 | spec->capsrc_nids = alc269vb_capsrc_nids; | ||
14363 | } | ||
14167 | } | 14364 | } |
14168 | 14365 | ||
14169 | if (!spec->cap_mixer) | 14366 | if (!spec->cap_mixer) |
14170 | set_capture_mixer(codec); | 14367 | set_capture_mixer(codec); |
14171 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); | 14368 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); |
14172 | 14369 | ||
14370 | if (board_config == ALC269_AUTO) | ||
14371 | alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 0); | ||
14372 | |||
14173 | spec->vmaster_nid = 0x02; | 14373 | spec->vmaster_nid = 0x02; |
14174 | 14374 | ||
14175 | codec->patch_ops = alc_patch_ops; | 14375 | codec->patch_ops = alc_patch_ops; |
@@ -15258,7 +15458,8 @@ static int patch_alc861(struct hda_codec *codec) | |||
15258 | board_config = ALC861_AUTO; | 15458 | board_config = ALC861_AUTO; |
15259 | } | 15459 | } |
15260 | 15460 | ||
15261 | alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups); | 15461 | if (board_config == ALC861_AUTO) |
15462 | alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 1); | ||
15262 | 15463 | ||
15263 | if (board_config == ALC861_AUTO) { | 15464 | if (board_config == ALC861_AUTO) { |
15264 | /* automatic parse from the BIOS config */ | 15465 | /* automatic parse from the BIOS config */ |
@@ -15295,6 +15496,9 @@ static int patch_alc861(struct hda_codec *codec) | |||
15295 | 15496 | ||
15296 | spec->vmaster_nid = 0x03; | 15497 | spec->vmaster_nid = 0x03; |
15297 | 15498 | ||
15499 | if (board_config == ALC861_AUTO) | ||
15500 | alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 0); | ||
15501 | |||
15298 | codec->patch_ops = alc_patch_ops; | 15502 | codec->patch_ops = alc_patch_ops; |
15299 | if (board_config == ALC861_AUTO) { | 15503 | if (board_config == ALC861_AUTO) { |
15300 | spec->init_hook = alc861_auto_init; | 15504 | spec->init_hook = alc861_auto_init; |
@@ -16229,7 +16433,8 @@ static int patch_alc861vd(struct hda_codec *codec) | |||
16229 | board_config = ALC861VD_AUTO; | 16433 | board_config = ALC861VD_AUTO; |
16230 | } | 16434 | } |
16231 | 16435 | ||
16232 | alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups); | 16436 | if (board_config == ALC861VD_AUTO) |
16437 | alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 1); | ||
16233 | 16438 | ||
16234 | if (board_config == ALC861VD_AUTO) { | 16439 | if (board_config == ALC861VD_AUTO) { |
16235 | /* automatic parse from the BIOS config */ | 16440 | /* automatic parse from the BIOS config */ |
@@ -16277,6 +16482,9 @@ static int patch_alc861vd(struct hda_codec *codec) | |||
16277 | 16482 | ||
16278 | spec->vmaster_nid = 0x02; | 16483 | spec->vmaster_nid = 0x02; |
16279 | 16484 | ||
16485 | if (board_config == ALC861VD_AUTO) | ||
16486 | alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 0); | ||
16487 | |||
16280 | codec->patch_ops = alc_patch_ops; | 16488 | codec->patch_ops = alc_patch_ops; |
16281 | 16489 | ||
16282 | if (board_config == ALC861VD_AUTO) | 16490 | if (board_config == ALC861VD_AUTO) |
@@ -17115,9 +17323,9 @@ static void alc663_m51va_speaker_automute(struct hda_codec *codec) | |||
17115 | present = snd_hda_jack_detect(codec, 0x21); | 17323 | present = snd_hda_jack_detect(codec, 0x21); |
17116 | bits = present ? HDA_AMP_MUTE : 0; | 17324 | bits = present ? HDA_AMP_MUTE : 0; |
17117 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, | 17325 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, |
17118 | AMP_IN_MUTE(0), bits); | 17326 | HDA_AMP_MUTE, bits); |
17119 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, | 17327 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, |
17120 | AMP_IN_MUTE(0), bits); | 17328 | HDA_AMP_MUTE, bits); |
17121 | } | 17329 | } |
17122 | 17330 | ||
17123 | static void alc663_21jd_two_speaker_automute(struct hda_codec *codec) | 17331 | static void alc663_21jd_two_speaker_automute(struct hda_codec *codec) |
@@ -17128,13 +17336,13 @@ static void alc663_21jd_two_speaker_automute(struct hda_codec *codec) | |||
17128 | present = snd_hda_jack_detect(codec, 0x21); | 17336 | present = snd_hda_jack_detect(codec, 0x21); |
17129 | bits = present ? HDA_AMP_MUTE : 0; | 17337 | bits = present ? HDA_AMP_MUTE : 0; |
17130 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, | 17338 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, |
17131 | AMP_IN_MUTE(0), bits); | 17339 | HDA_AMP_MUTE, bits); |
17132 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, | 17340 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, |
17133 | AMP_IN_MUTE(0), bits); | 17341 | HDA_AMP_MUTE, bits); |
17134 | snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0, | 17342 | snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0, |
17135 | AMP_IN_MUTE(0), bits); | 17343 | HDA_AMP_MUTE, bits); |
17136 | snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1, | 17344 | snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1, |
17137 | AMP_IN_MUTE(0), bits); | 17345 | HDA_AMP_MUTE, bits); |
17138 | } | 17346 | } |
17139 | 17347 | ||
17140 | static void alc663_15jd_two_speaker_automute(struct hda_codec *codec) | 17348 | static void alc663_15jd_two_speaker_automute(struct hda_codec *codec) |
@@ -17145,13 +17353,13 @@ static void alc663_15jd_two_speaker_automute(struct hda_codec *codec) | |||
17145 | present = snd_hda_jack_detect(codec, 0x15); | 17353 | present = snd_hda_jack_detect(codec, 0x15); |
17146 | bits = present ? HDA_AMP_MUTE : 0; | 17354 | bits = present ? HDA_AMP_MUTE : 0; |
17147 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, | 17355 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, |
17148 | AMP_IN_MUTE(0), bits); | 17356 | HDA_AMP_MUTE, bits); |
17149 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, | 17357 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, |
17150 | AMP_IN_MUTE(0), bits); | 17358 | HDA_AMP_MUTE, bits); |
17151 | snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0, | 17359 | snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0, |
17152 | AMP_IN_MUTE(0), bits); | 17360 | HDA_AMP_MUTE, bits); |
17153 | snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1, | 17361 | snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1, |
17154 | AMP_IN_MUTE(0), bits); | 17362 | HDA_AMP_MUTE, bits); |
17155 | } | 17363 | } |
17156 | 17364 | ||
17157 | static void alc662_f5z_speaker_automute(struct hda_codec *codec) | 17365 | static void alc662_f5z_speaker_automute(struct hda_codec *codec) |
@@ -17190,14 +17398,14 @@ static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec) | |||
17190 | 17398 | ||
17191 | if (present1 || present2) { | 17399 | if (present1 || present2) { |
17192 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, | 17400 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, |
17193 | AMP_IN_MUTE(0), AMP_IN_MUTE(0)); | 17401 | HDA_AMP_MUTE, HDA_AMP_MUTE); |
17194 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, | 17402 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, |
17195 | AMP_IN_MUTE(0), AMP_IN_MUTE(0)); | 17403 | HDA_AMP_MUTE, HDA_AMP_MUTE); |
17196 | } else { | 17404 | } else { |
17197 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, | 17405 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, |
17198 | AMP_IN_MUTE(0), 0); | 17406 | HDA_AMP_MUTE, 0); |
17199 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, | 17407 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, |
17200 | AMP_IN_MUTE(0), 0); | 17408 | HDA_AMP_MUTE, 0); |
17201 | } | 17409 | } |
17202 | } | 17410 | } |
17203 | 17411 | ||
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index c4be3fab94e5..7fb7d017a347 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -1607,6 +1607,10 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = { | |||
1607 | "Dell Studio 1555", STAC_DELL_M6_DMIC), | 1607 | "Dell Studio 1555", STAC_DELL_M6_DMIC), |
1608 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02bd, | 1608 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02bd, |
1609 | "Dell Studio 1557", STAC_DELL_M6_DMIC), | 1609 | "Dell Studio 1557", STAC_DELL_M6_DMIC), |
1610 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02fe, | ||
1611 | "Dell Studio XPS 1645", STAC_DELL_M6_BOTH), | ||
1612 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0413, | ||
1613 | "Dell Studio 1558", STAC_DELL_M6_BOTH), | ||
1610 | {} /* terminator */ | 1614 | {} /* terminator */ |
1611 | }; | 1615 | }; |
1612 | 1616 | ||
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 9ddc37300f6b..73453814e098 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c | |||
@@ -476,7 +476,7 @@ static struct snd_kcontrol_new *via_clone_control(struct via_spec *spec, | |||
476 | knew->name = kstrdup(tmpl->name, GFP_KERNEL); | 476 | knew->name = kstrdup(tmpl->name, GFP_KERNEL); |
477 | if (!knew->name) | 477 | if (!knew->name) |
478 | return NULL; | 478 | return NULL; |
479 | return 0; | 479 | return knew; |
480 | } | 480 | } |
481 | 481 | ||
482 | static void via_free_kctls(struct hda_codec *codec) | 482 | static void via_free_kctls(struct hda_codec *codec) |
@@ -1215,14 +1215,13 @@ static struct snd_kcontrol_new via_hp_mixer[2] = { | |||
1215 | }, | 1215 | }, |
1216 | }; | 1216 | }; |
1217 | 1217 | ||
1218 | static int via_hp_build(struct via_spec *spec) | 1218 | static int via_hp_build(struct hda_codec *codec) |
1219 | { | 1219 | { |
1220 | struct via_spec *spec = codec->spec; | ||
1220 | struct snd_kcontrol_new *knew; | 1221 | struct snd_kcontrol_new *knew; |
1221 | hda_nid_t nid; | 1222 | hda_nid_t nid; |
1222 | 1223 | int nums; | |
1223 | knew = via_clone_control(spec, &via_hp_mixer[0]); | 1224 | hda_nid_t conn[HDA_MAX_CONNECTIONS]; |
1224 | if (knew == NULL) | ||
1225 | return -ENOMEM; | ||
1226 | 1225 | ||
1227 | switch (spec->codec_type) { | 1226 | switch (spec->codec_type) { |
1228 | case VT1718S: | 1227 | case VT1718S: |
@@ -1239,6 +1238,14 @@ static int via_hp_build(struct via_spec *spec) | |||
1239 | break; | 1238 | break; |
1240 | } | 1239 | } |
1241 | 1240 | ||
1241 | nums = snd_hda_get_connections(codec, nid, conn, HDA_MAX_CONNECTIONS); | ||
1242 | if (nums <= 1) | ||
1243 | return 0; | ||
1244 | |||
1245 | knew = via_clone_control(spec, &via_hp_mixer[0]); | ||
1246 | if (knew == NULL) | ||
1247 | return -ENOMEM; | ||
1248 | |||
1242 | knew->subdevice = HDA_SUBDEV_NID_FLAG | nid; | 1249 | knew->subdevice = HDA_SUBDEV_NID_FLAG | nid; |
1243 | knew->private_value = nid; | 1250 | knew->private_value = nid; |
1244 | 1251 | ||
@@ -2561,7 +2568,7 @@ static int vt1708_parse_auto_config(struct hda_codec *codec) | |||
2561 | spec->input_mux = &spec->private_imux[0]; | 2568 | spec->input_mux = &spec->private_imux[0]; |
2562 | 2569 | ||
2563 | if (spec->hp_mux) | 2570 | if (spec->hp_mux) |
2564 | via_hp_build(spec); | 2571 | via_hp_build(codec); |
2565 | 2572 | ||
2566 | via_smart51_build(spec); | 2573 | via_smart51_build(spec); |
2567 | return 1; | 2574 | return 1; |
@@ -3087,7 +3094,7 @@ static int vt1709_parse_auto_config(struct hda_codec *codec) | |||
3087 | spec->input_mux = &spec->private_imux[0]; | 3094 | spec->input_mux = &spec->private_imux[0]; |
3088 | 3095 | ||
3089 | if (spec->hp_mux) | 3096 | if (spec->hp_mux) |
3090 | via_hp_build(spec); | 3097 | via_hp_build(codec); |
3091 | 3098 | ||
3092 | via_smart51_build(spec); | 3099 | via_smart51_build(spec); |
3093 | return 1; | 3100 | return 1; |
@@ -3654,7 +3661,7 @@ static int vt1708B_parse_auto_config(struct hda_codec *codec) | |||
3654 | spec->input_mux = &spec->private_imux[0]; | 3661 | spec->input_mux = &spec->private_imux[0]; |
3655 | 3662 | ||
3656 | if (spec->hp_mux) | 3663 | if (spec->hp_mux) |
3657 | via_hp_build(spec); | 3664 | via_hp_build(codec); |
3658 | 3665 | ||
3659 | via_smart51_build(spec); | 3666 | via_smart51_build(spec); |
3660 | return 1; | 3667 | return 1; |
@@ -4140,7 +4147,7 @@ static int vt1708S_parse_auto_config(struct hda_codec *codec) | |||
4140 | spec->input_mux = &spec->private_imux[0]; | 4147 | spec->input_mux = &spec->private_imux[0]; |
4141 | 4148 | ||
4142 | if (spec->hp_mux) | 4149 | if (spec->hp_mux) |
4143 | via_hp_build(spec); | 4150 | via_hp_build(codec); |
4144 | 4151 | ||
4145 | via_smart51_build(spec); | 4152 | via_smart51_build(spec); |
4146 | return 1; | 4153 | return 1; |
@@ -4510,7 +4517,7 @@ static int vt1702_parse_auto_config(struct hda_codec *codec) | |||
4510 | spec->input_mux = &spec->private_imux[0]; | 4517 | spec->input_mux = &spec->private_imux[0]; |
4511 | 4518 | ||
4512 | if (spec->hp_mux) | 4519 | if (spec->hp_mux) |
4513 | via_hp_build(spec); | 4520 | via_hp_build(codec); |
4514 | 4521 | ||
4515 | return 1; | 4522 | return 1; |
4516 | } | 4523 | } |
@@ -4930,7 +4937,7 @@ static int vt1718S_parse_auto_config(struct hda_codec *codec) | |||
4930 | spec->input_mux = &spec->private_imux[0]; | 4937 | spec->input_mux = &spec->private_imux[0]; |
4931 | 4938 | ||
4932 | if (spec->hp_mux) | 4939 | if (spec->hp_mux) |
4933 | via_hp_build(spec); | 4940 | via_hp_build(codec); |
4934 | 4941 | ||
4935 | via_smart51_build(spec); | 4942 | via_smart51_build(spec); |
4936 | 4943 | ||
@@ -5425,7 +5432,7 @@ static int vt1716S_parse_auto_config(struct hda_codec *codec) | |||
5425 | spec->input_mux = &spec->private_imux[0]; | 5432 | spec->input_mux = &spec->private_imux[0]; |
5426 | 5433 | ||
5427 | if (spec->hp_mux) | 5434 | if (spec->hp_mux) |
5428 | via_hp_build(spec); | 5435 | via_hp_build(codec); |
5429 | 5436 | ||
5430 | via_smart51_build(spec); | 5437 | via_smart51_build(spec); |
5431 | 5438 | ||
@@ -5781,7 +5788,7 @@ static int vt2002P_parse_auto_config(struct hda_codec *codec) | |||
5781 | spec->input_mux = &spec->private_imux[0]; | 5788 | spec->input_mux = &spec->private_imux[0]; |
5782 | 5789 | ||
5783 | if (spec->hp_mux) | 5790 | if (spec->hp_mux) |
5784 | via_hp_build(spec); | 5791 | via_hp_build(codec); |
5785 | 5792 | ||
5786 | return 1; | 5793 | return 1; |
5787 | } | 5794 | } |
@@ -6000,12 +6007,12 @@ static int vt1812_auto_create_multi_out_ctls(struct via_spec *spec, | |||
6000 | 6007 | ||
6001 | /* Line-Out: PortE */ | 6008 | /* Line-Out: PortE */ |
6002 | err = via_add_control(spec, VIA_CTL_WIDGET_VOL, | 6009 | err = via_add_control(spec, VIA_CTL_WIDGET_VOL, |
6003 | "Master Front Playback Volume", | 6010 | "Front Playback Volume", |
6004 | HDA_COMPOSE_AMP_VAL(0x8, 3, 0, HDA_OUTPUT)); | 6011 | HDA_COMPOSE_AMP_VAL(0x8, 3, 0, HDA_OUTPUT)); |
6005 | if (err < 0) | 6012 | if (err < 0) |
6006 | return err; | 6013 | return err; |
6007 | err = via_add_control(spec, VIA_CTL_WIDGET_BIND_PIN_MUTE, | 6014 | err = via_add_control(spec, VIA_CTL_WIDGET_BIND_PIN_MUTE, |
6008 | "Master Front Playback Switch", | 6015 | "Front Playback Switch", |
6009 | HDA_COMPOSE_AMP_VAL(0x28, 3, 0, HDA_OUTPUT)); | 6016 | HDA_COMPOSE_AMP_VAL(0x28, 3, 0, HDA_OUTPUT)); |
6010 | if (err < 0) | 6017 | if (err < 0) |
6011 | return err; | 6018 | return err; |
@@ -6130,7 +6137,7 @@ static int vt1812_parse_auto_config(struct hda_codec *codec) | |||
6130 | spec->input_mux = &spec->private_imux[0]; | 6137 | spec->input_mux = &spec->private_imux[0]; |
6131 | 6138 | ||
6132 | if (spec->hp_mux) | 6139 | if (spec->hp_mux) |
6133 | via_hp_build(spec); | 6140 | via_hp_build(codec); |
6134 | 6141 | ||
6135 | return 1; | 6142 | return 1; |
6136 | } | 6143 | } |
diff --git a/sound/pci/maestro3.c b/sound/pci/maestro3.c index b64e78139d63..b56e33676780 100644 --- a/sound/pci/maestro3.c +++ b/sound/pci/maestro3.c | |||
@@ -849,6 +849,7 @@ struct snd_m3 { | |||
849 | struct snd_kcontrol *master_switch; | 849 | struct snd_kcontrol *master_switch; |
850 | struct snd_kcontrol *master_volume; | 850 | struct snd_kcontrol *master_volume; |
851 | struct tasklet_struct hwvol_tq; | 851 | struct tasklet_struct hwvol_tq; |
852 | unsigned int in_suspend; | ||
852 | 853 | ||
853 | #ifdef CONFIG_PM | 854 | #ifdef CONFIG_PM |
854 | u16 *suspend_mem; | 855 | u16 *suspend_mem; |
@@ -884,6 +885,7 @@ static DEFINE_PCI_DEVICE_TABLE(snd_m3_ids) = { | |||
884 | MODULE_DEVICE_TABLE(pci, snd_m3_ids); | 885 | MODULE_DEVICE_TABLE(pci, snd_m3_ids); |
885 | 886 | ||
886 | static struct snd_pci_quirk m3_amp_quirk_list[] __devinitdata = { | 887 | static struct snd_pci_quirk m3_amp_quirk_list[] __devinitdata = { |
888 | SND_PCI_QUIRK(0x0E11, 0x0094, "Compaq Evo N600c", 0x0c), | ||
887 | SND_PCI_QUIRK(0x10f7, 0x833e, "Panasonic CF-28", 0x0d), | 889 | SND_PCI_QUIRK(0x10f7, 0x833e, "Panasonic CF-28", 0x0d), |
888 | SND_PCI_QUIRK(0x10f7, 0x833d, "Panasonic CF-72", 0x0d), | 890 | SND_PCI_QUIRK(0x10f7, 0x833d, "Panasonic CF-72", 0x0d), |
889 | SND_PCI_QUIRK(0x1033, 0x80f1, "NEC LM800J/7", 0x03), | 891 | SND_PCI_QUIRK(0x1033, 0x80f1, "NEC LM800J/7", 0x03), |
@@ -1613,6 +1615,11 @@ static void snd_m3_update_hw_volume(unsigned long private_data) | |||
1613 | outb(0x88, chip->iobase + SHADOW_MIX_REG_MASTER); | 1615 | outb(0x88, chip->iobase + SHADOW_MIX_REG_MASTER); |
1614 | outb(0x88, chip->iobase + HW_VOL_COUNTER_MASTER); | 1616 | outb(0x88, chip->iobase + HW_VOL_COUNTER_MASTER); |
1615 | 1617 | ||
1618 | /* Ignore spurious HV interrupts during suspend / resume, this avoids | ||
1619 | mistaking them for a mute button press. */ | ||
1620 | if (chip->in_suspend) | ||
1621 | return; | ||
1622 | |||
1616 | if (!chip->master_switch || !chip->master_volume) | 1623 | if (!chip->master_switch || !chip->master_volume) |
1617 | return; | 1624 | return; |
1618 | 1625 | ||
@@ -2424,6 +2431,7 @@ static int m3_suspend(struct pci_dev *pci, pm_message_t state) | |||
2424 | if (chip->suspend_mem == NULL) | 2431 | if (chip->suspend_mem == NULL) |
2425 | return 0; | 2432 | return 0; |
2426 | 2433 | ||
2434 | chip->in_suspend = 1; | ||
2427 | snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); | 2435 | snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); |
2428 | snd_pcm_suspend_all(chip->pcm); | 2436 | snd_pcm_suspend_all(chip->pcm); |
2429 | snd_ac97_suspend(chip->ac97); | 2437 | snd_ac97_suspend(chip->ac97); |
@@ -2497,6 +2505,7 @@ static int m3_resume(struct pci_dev *pci) | |||
2497 | snd_m3_hv_init(chip); | 2505 | snd_m3_hv_init(chip); |
2498 | 2506 | ||
2499 | snd_power_change_state(card, SNDRV_CTL_POWER_D0); | 2507 | snd_power_change_state(card, SNDRV_CTL_POWER_D0); |
2508 | chip->in_suspend = 0; | ||
2500 | return 0; | 2509 | return 0; |
2501 | } | 2510 | } |
2502 | #endif /* CONFIG_PM */ | 2511 | #endif /* CONFIG_PM */ |
diff --git a/sound/pci/mixart/mixart.c b/sound/pci/mixart/mixart.c index 55e9315d4ccd..3be8f97c8bc0 100644 --- a/sound/pci/mixart/mixart.c +++ b/sound/pci/mixart/mixart.c | |||
@@ -1162,13 +1162,15 @@ static long snd_mixart_BA0_read(struct snd_info_entry *entry, void *file_private | |||
1162 | unsigned long count, unsigned long pos) | 1162 | unsigned long count, unsigned long pos) |
1163 | { | 1163 | { |
1164 | struct mixart_mgr *mgr = entry->private_data; | 1164 | struct mixart_mgr *mgr = entry->private_data; |
1165 | unsigned long maxsize; | ||
1165 | 1166 | ||
1166 | count = count & ~3; /* make sure the read size is a multiple of 4 bytes */ | 1167 | if (pos >= MIXART_BA0_SIZE) |
1167 | if(count <= 0) | ||
1168 | return 0; | 1168 | return 0; |
1169 | if(pos + count > MIXART_BA0_SIZE) | 1169 | maxsize = MIXART_BA0_SIZE - pos; |
1170 | count = (long)(MIXART_BA0_SIZE - pos); | 1170 | if (count > maxsize) |
1171 | if(copy_to_user_fromio(buf, MIXART_MEM( mgr, pos ), count)) | 1171 | count = maxsize; |
1172 | count = count & ~3; /* make sure the read size is a multiple of 4 bytes */ | ||
1173 | if (copy_to_user_fromio(buf, MIXART_MEM(mgr, pos), count)) | ||
1172 | return -EFAULT; | 1174 | return -EFAULT; |
1173 | return count; | 1175 | return count; |
1174 | } | 1176 | } |
@@ -1181,13 +1183,15 @@ static long snd_mixart_BA1_read(struct snd_info_entry *entry, void *file_private | |||
1181 | unsigned long count, unsigned long pos) | 1183 | unsigned long count, unsigned long pos) |
1182 | { | 1184 | { |
1183 | struct mixart_mgr *mgr = entry->private_data; | 1185 | struct mixart_mgr *mgr = entry->private_data; |
1186 | unsigned long maxsize; | ||
1184 | 1187 | ||
1185 | count = count & ~3; /* make sure the read size is a multiple of 4 bytes */ | 1188 | if (pos > MIXART_BA1_SIZE) |
1186 | if(count <= 0) | ||
1187 | return 0; | 1189 | return 0; |
1188 | if(pos + count > MIXART_BA1_SIZE) | 1190 | maxsize = MIXART_BA1_SIZE - pos; |
1189 | count = (long)(MIXART_BA1_SIZE - pos); | 1191 | if (count > maxsize) |
1190 | if(copy_to_user_fromio(buf, MIXART_REG( mgr, pos ), count)) | 1192 | count = maxsize; |
1193 | count = count & ~3; /* make sure the read size is a multiple of 4 bytes */ | ||
1194 | if (copy_to_user_fromio(buf, MIXART_REG(mgr, pos), count)) | ||
1191 | return -EFAULT; | 1195 | return -EFAULT; |
1192 | return count; | 1196 | return count; |
1193 | } | 1197 | } |