diff options
Diffstat (limited to 'sound/pci')
| -rw-r--r-- | sound/pci/hda/hda_codec.c | 64 | ||||
| -rw-r--r-- | sound/pci/hda/hda_codec.h | 1 | ||||
| -rw-r--r-- | sound/pci/hda/hda_local.h | 16 | ||||
| -rw-r--r-- | sound/pci/hda/patch_conexant.c | 1 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 13 | ||||
| -rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 11 | ||||
| -rw-r--r-- | sound/pci/intel8x0.c | 58 |
7 files changed, 118 insertions, 46 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 916a1863af7..e44b107fdc7 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
| @@ -2331,6 +2331,39 @@ int snd_hda_codec_reset(struct hda_codec *codec) | |||
| 2331 | return 0; | 2331 | return 0; |
| 2332 | } | 2332 | } |
| 2333 | 2333 | ||
| 2334 | typedef int (*map_slave_func_t)(void *, struct snd_kcontrol *); | ||
| 2335 | |||
| 2336 | /* apply the function to all matching slave ctls in the mixer list */ | ||
| 2337 | static int map_slaves(struct hda_codec *codec, const char * const *slaves, | ||
| 2338 | map_slave_func_t func, void *data) | ||
| 2339 | { | ||
| 2340 | struct hda_nid_item *items; | ||
| 2341 | const char * const *s; | ||
| 2342 | int i, err; | ||
| 2343 | |||
| 2344 | items = codec->mixers.list; | ||
| 2345 | for (i = 0; i < codec->mixers.used; i++) { | ||
| 2346 | struct snd_kcontrol *sctl = items[i].kctl; | ||
| 2347 | if (!sctl || !sctl->id.name || | ||
| 2348 | sctl->id.iface != SNDRV_CTL_ELEM_IFACE_MIXER) | ||
| 2349 | continue; | ||
| 2350 | for (s = slaves; *s; s++) { | ||
| 2351 | if (!strcmp(sctl->id.name, *s)) { | ||
| 2352 | err = func(data, sctl); | ||
| 2353 | if (err) | ||
| 2354 | return err; | ||
| 2355 | break; | ||
| 2356 | } | ||
| 2357 | } | ||
| 2358 | } | ||
| 2359 | return 0; | ||
| 2360 | } | ||
| 2361 | |||
| 2362 | static int check_slave_present(void *data, struct snd_kcontrol *sctl) | ||
| 2363 | { | ||
| 2364 | return 1; | ||
| 2365 | } | ||
| 2366 | |||
| 2334 | /** | 2367 | /** |
| 2335 | * snd_hda_add_vmaster - create a virtual master control and add slaves | 2368 | * snd_hda_add_vmaster - create a virtual master control and add slaves |
| 2336 | * @codec: HD-audio codec | 2369 | * @codec: HD-audio codec |
| @@ -2351,12 +2384,10 @@ int snd_hda_add_vmaster(struct hda_codec *codec, char *name, | |||
| 2351 | unsigned int *tlv, const char * const *slaves) | 2384 | unsigned int *tlv, const char * const *slaves) |
| 2352 | { | 2385 | { |
| 2353 | struct snd_kcontrol *kctl; | 2386 | struct snd_kcontrol *kctl; |
| 2354 | const char * const *s; | ||
| 2355 | int err; | 2387 | int err; |
| 2356 | 2388 | ||
| 2357 | for (s = slaves; *s && !snd_hda_find_mixer_ctl(codec, *s); s++) | 2389 | err = map_slaves(codec, slaves, check_slave_present, NULL); |
| 2358 | ; | 2390 | if (err != 1) { |
| 2359 | if (!*s) { | ||
| 2360 | snd_printdd("No slave found for %s\n", name); | 2391 | snd_printdd("No slave found for %s\n", name); |
| 2361 | return 0; | 2392 | return 0; |
| 2362 | } | 2393 | } |
| @@ -2367,23 +2398,10 @@ int snd_hda_add_vmaster(struct hda_codec *codec, char *name, | |||
| 2367 | if (err < 0) | 2398 | if (err < 0) |
| 2368 | return err; | 2399 | return err; |
| 2369 | 2400 | ||
| 2370 | for (s = slaves; *s; s++) { | 2401 | err = map_slaves(codec, slaves, (map_slave_func_t)snd_ctl_add_slave, |
| 2371 | struct snd_kcontrol *sctl; | 2402 | kctl); |
| 2372 | int i = 0; | 2403 | if (err < 0) |
| 2373 | for (;;) { | 2404 | return err; |
| 2374 | sctl = _snd_hda_find_mixer_ctl(codec, *s, i); | ||
| 2375 | if (!sctl) { | ||
| 2376 | if (!i) | ||
| 2377 | snd_printdd("Cannot find slave %s, " | ||
| 2378 | "skipped\n", *s); | ||
| 2379 | break; | ||
| 2380 | } | ||
| 2381 | err = snd_ctl_add_slave(kctl, sctl); | ||
| 2382 | if (err < 0) | ||
| 2383 | return err; | ||
| 2384 | i++; | ||
| 2385 | } | ||
| 2386 | } | ||
| 2387 | return 0; | 2405 | return 0; |
| 2388 | } | 2406 | } |
| 2389 | EXPORT_SYMBOL_HDA(snd_hda_add_vmaster); | 2407 | EXPORT_SYMBOL_HDA(snd_hda_add_vmaster); |
| @@ -4752,6 +4770,7 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec, | |||
| 4752 | memset(sequences_hp, 0, sizeof(sequences_hp)); | 4770 | memset(sequences_hp, 0, sizeof(sequences_hp)); |
| 4753 | assoc_line_out = 0; | 4771 | assoc_line_out = 0; |
| 4754 | 4772 | ||
| 4773 | codec->ignore_misc_bit = true; | ||
| 4755 | end_nid = codec->start_nid + codec->num_nodes; | 4774 | end_nid = codec->start_nid + codec->num_nodes; |
| 4756 | for (nid = codec->start_nid; nid < end_nid; nid++) { | 4775 | for (nid = codec->start_nid; nid < end_nid; nid++) { |
| 4757 | unsigned int wid_caps = get_wcaps(codec, nid); | 4776 | unsigned int wid_caps = get_wcaps(codec, nid); |
| @@ -4767,6 +4786,9 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec, | |||
| 4767 | continue; | 4786 | continue; |
| 4768 | 4787 | ||
| 4769 | def_conf = snd_hda_codec_get_pincfg(codec, nid); | 4788 | def_conf = snd_hda_codec_get_pincfg(codec, nid); |
| 4789 | if (!(get_defcfg_misc(snd_hda_codec_get_pincfg(codec, nid)) & | ||
| 4790 | AC_DEFCFG_MISC_NO_PRESENCE)) | ||
| 4791 | codec->ignore_misc_bit = false; | ||
| 4770 | conn = get_defcfg_connect(def_conf); | 4792 | conn = get_defcfg_connect(def_conf); |
| 4771 | if (conn == AC_JACK_PORT_NONE) | 4793 | if (conn == AC_JACK_PORT_NONE) |
| 4772 | continue; | 4794 | continue; |
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 755f2b0f9d8..564471169ca 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
| @@ -854,6 +854,7 @@ struct hda_codec { | |||
| 854 | unsigned int no_sticky_stream:1; /* no sticky-PCM stream assignment */ | 854 | unsigned int no_sticky_stream:1; /* no sticky-PCM stream assignment */ |
| 855 | unsigned int pins_shutup:1; /* pins are shut up */ | 855 | unsigned int pins_shutup:1; /* pins are shut up */ |
| 856 | unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */ | 856 | unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */ |
| 857 | unsigned int ignore_misc_bit:1; /* ignore MISC_NO_PRESENCE bit */ | ||
| 857 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 858 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
| 858 | unsigned int power_on :1; /* current (global) power-state */ | 859 | unsigned int power_on :1; /* current (global) power-state */ |
| 859 | unsigned int power_transition :1; /* power-state in transition */ | 860 | unsigned int power_transition :1; /* power-state in transition */ |
diff --git a/sound/pci/hda/hda_local.h b/sound/pci/hda/hda_local.h index dcbea0da0fa..6579e0f2bb5 100644 --- a/sound/pci/hda/hda_local.h +++ b/sound/pci/hda/hda_local.h | |||
| @@ -510,13 +510,15 @@ int snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid); | |||
| 510 | 510 | ||
| 511 | static inline bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid) | 511 | static inline bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid) |
| 512 | { | 512 | { |
| 513 | return (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_PRES_DETECT) && | 513 | if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_PRES_DETECT)) |
| 514 | /* disable MISC_NO_PRESENCE check because it may break too | 514 | return false; |
| 515 | * many devices | 515 | if (!codec->ignore_misc_bit && |
| 516 | */ | 516 | (get_defcfg_misc(snd_hda_codec_get_pincfg(codec, nid)) & |
| 517 | /*(get_defcfg_misc(snd_hda_codec_get_pincfg(codec, nid) & | 517 | AC_DEFCFG_MISC_NO_PRESENCE)) |
| 518 | AC_DEFCFG_MISC_NO_PRESENCE)) &&*/ | 518 | return false; |
| 519 | (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP); | 519 | if (!(get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP)) |
| 520 | return false; | ||
| 521 | return true; | ||
| 520 | } | 522 | } |
| 521 | 523 | ||
| 522 | /* flags for hda_nid_item */ | 524 | /* flags for hda_nid_item */ |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 5e706e4d173..0de21193a2b 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
| @@ -3062,7 +3062,6 @@ static const struct snd_pci_quirk cxt5066_cfg_tbl[] = { | |||
| 3062 | SND_PCI_QUIRK(0x1043, 0x1993, "Asus U50F", CXT5066_ASUS), | 3062 | SND_PCI_QUIRK(0x1043, 0x1993, "Asus U50F", CXT5066_ASUS), |
| 3063 | SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD), | 3063 | SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD), |
| 3064 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), | 3064 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), |
| 3065 | SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), | ||
| 3066 | SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board", | 3065 | SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board", |
| 3067 | CXT5066_LAPTOP), | 3066 | CXT5066_LAPTOP), |
| 3068 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), | 3067 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index a24e068a021..308bb575bc0 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -284,7 +284,7 @@ static int alc_mux_select(struct hda_codec *codec, unsigned int adc_idx, | |||
| 284 | struct alc_spec *spec = codec->spec; | 284 | struct alc_spec *spec = codec->spec; |
| 285 | const struct hda_input_mux *imux; | 285 | const struct hda_input_mux *imux; |
| 286 | unsigned int mux_idx; | 286 | unsigned int mux_idx; |
| 287 | int i, type; | 287 | int i, type, num_conns; |
| 288 | hda_nid_t nid; | 288 | hda_nid_t nid; |
| 289 | 289 | ||
| 290 | mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx; | 290 | mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx; |
| @@ -307,16 +307,17 @@ static int alc_mux_select(struct hda_codec *codec, unsigned int adc_idx, | |||
| 307 | spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx]; | 307 | spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx]; |
| 308 | 308 | ||
| 309 | /* no selection? */ | 309 | /* no selection? */ |
| 310 | if (snd_hda_get_conn_list(codec, nid, NULL) <= 1) | 310 | num_conns = snd_hda_get_conn_list(codec, nid, NULL); |
| 311 | if (num_conns <= 1) | ||
| 311 | return 1; | 312 | return 1; |
| 312 | 313 | ||
| 313 | type = get_wcaps_type(get_wcaps(codec, nid)); | 314 | type = get_wcaps_type(get_wcaps(codec, nid)); |
| 314 | if (type == AC_WID_AUD_MIX) { | 315 | if (type == AC_WID_AUD_MIX) { |
| 315 | /* Matrix-mixer style (e.g. ALC882) */ | 316 | /* Matrix-mixer style (e.g. ALC882) */ |
| 316 | for (i = 0; i < imux->num_items; i++) { | 317 | int active = imux->items[idx].index; |
| 317 | unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE; | 318 | for (i = 0; i < num_conns; i++) { |
| 318 | snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, | 319 | unsigned int v = (i == active) ? 0 : HDA_AMP_MUTE; |
| 319 | imux->items[i].index, | 320 | snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, i, |
| 320 | HDA_AMP_MUTE, v); | 321 | HDA_AMP_MUTE, v); |
| 321 | } | 322 | } |
| 322 | } else { | 323 | } else { |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 4e715fefebe..edc2b7bc177 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -95,6 +95,7 @@ enum { | |||
| 95 | STAC_92HD83XXX_REF, | 95 | STAC_92HD83XXX_REF, |
| 96 | STAC_92HD83XXX_PWR_REF, | 96 | STAC_92HD83XXX_PWR_REF, |
| 97 | STAC_DELL_S14, | 97 | STAC_DELL_S14, |
| 98 | STAC_DELL_VOSTRO_3500, | ||
| 98 | STAC_92HD83XXX_HP, | 99 | STAC_92HD83XXX_HP, |
| 99 | STAC_92HD83XXX_HP_cNB11_INTQUAD, | 100 | STAC_92HD83XXX_HP_cNB11_INTQUAD, |
| 100 | STAC_HP_DV7_4000, | 101 | STAC_HP_DV7_4000, |
| @@ -1659,6 +1660,12 @@ static const unsigned int dell_s14_pin_configs[10] = { | |||
| 1659 | 0x40f000f0, 0x40f000f0, | 1660 | 0x40f000f0, 0x40f000f0, |
| 1660 | }; | 1661 | }; |
| 1661 | 1662 | ||
| 1663 | static const unsigned int dell_vostro_3500_pin_configs[10] = { | ||
| 1664 | 0x02a11020, 0x0221101f, 0x400000f0, 0x90170110, | ||
| 1665 | 0x400000f1, 0x400000f2, 0x400000f3, 0x90a60160, | ||
| 1666 | 0x400000f4, 0x400000f5, | ||
| 1667 | }; | ||
| 1668 | |||
| 1662 | static const unsigned int hp_dv7_4000_pin_configs[10] = { | 1669 | static const unsigned int hp_dv7_4000_pin_configs[10] = { |
| 1663 | 0x03a12050, 0x0321201f, 0x40f000f0, 0x90170110, | 1670 | 0x03a12050, 0x0321201f, 0x40f000f0, 0x90170110, |
| 1664 | 0x40f000f0, 0x40f000f0, 0x90170110, 0xd5a30140, | 1671 | 0x40f000f0, 0x40f000f0, 0x90170110, 0xd5a30140, |
| @@ -1675,6 +1682,7 @@ static const unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = { | |||
| 1675 | [STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs, | 1682 | [STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs, |
| 1676 | [STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs, | 1683 | [STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs, |
| 1677 | [STAC_DELL_S14] = dell_s14_pin_configs, | 1684 | [STAC_DELL_S14] = dell_s14_pin_configs, |
| 1685 | [STAC_DELL_VOSTRO_3500] = dell_vostro_3500_pin_configs, | ||
| 1678 | [STAC_92HD83XXX_HP_cNB11_INTQUAD] = hp_cNB11_intquad_pin_configs, | 1686 | [STAC_92HD83XXX_HP_cNB11_INTQUAD] = hp_cNB11_intquad_pin_configs, |
| 1679 | [STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs, | 1687 | [STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs, |
| 1680 | }; | 1688 | }; |
| @@ -1684,6 +1692,7 @@ static const char * const stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = { | |||
| 1684 | [STAC_92HD83XXX_REF] = "ref", | 1692 | [STAC_92HD83XXX_REF] = "ref", |
| 1685 | [STAC_92HD83XXX_PWR_REF] = "mic-ref", | 1693 | [STAC_92HD83XXX_PWR_REF] = "mic-ref", |
| 1686 | [STAC_DELL_S14] = "dell-s14", | 1694 | [STAC_DELL_S14] = "dell-s14", |
| 1695 | [STAC_DELL_VOSTRO_3500] = "dell-vostro-3500", | ||
| 1687 | [STAC_92HD83XXX_HP] = "hp", | 1696 | [STAC_92HD83XXX_HP] = "hp", |
| 1688 | [STAC_92HD83XXX_HP_cNB11_INTQUAD] = "hp_cNB11_intquad", | 1697 | [STAC_92HD83XXX_HP_cNB11_INTQUAD] = "hp_cNB11_intquad", |
| 1689 | [STAC_HP_DV7_4000] = "hp-dv7-4000", | 1698 | [STAC_HP_DV7_4000] = "hp-dv7-4000", |
| @@ -1697,6 +1706,8 @@ static const struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = { | |||
| 1697 | "DFI LanParty", STAC_92HD83XXX_REF), | 1706 | "DFI LanParty", STAC_92HD83XXX_REF), |
| 1698 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba, | 1707 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba, |
| 1699 | "unknown Dell", STAC_DELL_S14), | 1708 | "unknown Dell", STAC_DELL_S14), |
| 1709 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x1028, | ||
| 1710 | "Dell Vostro 3500", STAC_DELL_VOSTRO_3500), | ||
| 1700 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x3600, | 1711 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x3600, |
| 1701 | "HP", STAC_92HD83XXX_HP), | 1712 | "HP", STAC_92HD83XXX_HP), |
| 1702 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1656, | 1713 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1656, |
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index 29e312597f2..11718b49b2e 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c | |||
| @@ -1077,6 +1077,13 @@ static snd_pcm_uframes_t snd_intel8x0_pcm_pointer(struct snd_pcm_substream *subs | |||
| 1077 | } | 1077 | } |
| 1078 | if (civ != igetbyte(chip, ichdev->reg_offset + ICH_REG_OFF_CIV)) | 1078 | if (civ != igetbyte(chip, ichdev->reg_offset + ICH_REG_OFF_CIV)) |
| 1079 | continue; | 1079 | continue; |
| 1080 | |||
| 1081 | /* IO read operation is very expensive inside virtual machine | ||
| 1082 | * as it is emulated. The probability that subsequent PICB read | ||
| 1083 | * will return different result is high enough to loop till | ||
| 1084 | * timeout here. | ||
| 1085 | * Same CIV is strict enough condition to be sure that PICB | ||
| 1086 | * is valid inside VM on emulated card. */ | ||
| 1080 | if (chip->inside_vm) | 1087 | if (chip->inside_vm) |
| 1081 | break; | 1088 | break; |
| 1082 | if (ptr1 == igetword(chip, ichdev->reg_offset + ichdev->roff_picb)) | 1089 | if (ptr1 == igetword(chip, ichdev->reg_offset + ichdev->roff_picb)) |
| @@ -2930,6 +2937,45 @@ static unsigned int sis_codec_bits[3] = { | |||
| 2930 | ICH_PCR, ICH_SCR, ICH_SIS_TCR | 2937 | ICH_PCR, ICH_SCR, ICH_SIS_TCR |
| 2931 | }; | 2938 | }; |
| 2932 | 2939 | ||
| 2940 | static int __devinit snd_intel8x0_inside_vm(struct pci_dev *pci) | ||
| 2941 | { | ||
| 2942 | int result = inside_vm; | ||
| 2943 | char *msg = NULL; | ||
| 2944 | |||
| 2945 | /* check module parameter first (override detection) */ | ||
| 2946 | if (result >= 0) { | ||
| 2947 | msg = result ? "enable (forced) VM" : "disable (forced) VM"; | ||
| 2948 | goto fini; | ||
| 2949 | } | ||
| 2950 | |||
| 2951 | /* detect KVM and Parallels virtual environments */ | ||
| 2952 | result = kvm_para_available(); | ||
| 2953 | #ifdef X86_FEATURE_HYPERVISOR | ||
| 2954 | result = result || boot_cpu_has(X86_FEATURE_HYPERVISOR); | ||
| 2955 | #endif | ||
| 2956 | if (!result) | ||
| 2957 | goto fini; | ||
| 2958 | |||
| 2959 | /* check for known (emulated) devices */ | ||
| 2960 | if (pci->subsystem_vendor == 0x1af4 && | ||
| 2961 | pci->subsystem_device == 0x1100) { | ||
| 2962 | /* KVM emulated sound, PCI SSID: 1af4:1100 */ | ||
| 2963 | msg = "enable KVM"; | ||
| 2964 | } else if (pci->subsystem_vendor == 0x1ab8) { | ||
| 2965 | /* Parallels VM emulated sound, PCI SSID: 1ab8:xxxx */ | ||
| 2966 | msg = "enable Parallels VM"; | ||
| 2967 | } else { | ||
| 2968 | msg = "disable (unknown or VT-d) VM"; | ||
| 2969 | result = 0; | ||
| 2970 | } | ||
| 2971 | |||
| 2972 | fini: | ||
| 2973 | if (msg != NULL) | ||
| 2974 | printk(KERN_INFO "intel8x0: %s optimization\n", msg); | ||
| 2975 | |||
| 2976 | return result; | ||
| 2977 | } | ||
| 2978 | |||
| 2933 | static int __devinit snd_intel8x0_create(struct snd_card *card, | 2979 | static int __devinit snd_intel8x0_create(struct snd_card *card, |
| 2934 | struct pci_dev *pci, | 2980 | struct pci_dev *pci, |
| 2935 | unsigned long device_type, | 2981 | unsigned long device_type, |
| @@ -2997,9 +3043,7 @@ static int __devinit snd_intel8x0_create(struct snd_card *card, | |||
| 2997 | if (xbox) | 3043 | if (xbox) |
| 2998 | chip->xbox = 1; | 3044 | chip->xbox = 1; |
| 2999 | 3045 | ||
| 3000 | chip->inside_vm = inside_vm; | 3046 | chip->inside_vm = snd_intel8x0_inside_vm(pci); |
| 3001 | if (inside_vm) | ||
| 3002 | printk(KERN_INFO "intel8x0: enable KVM optimization\n"); | ||
| 3003 | 3047 | ||
| 3004 | if (pci->vendor == PCI_VENDOR_ID_INTEL && | 3048 | if (pci->vendor == PCI_VENDOR_ID_INTEL && |
| 3005 | pci->device == PCI_DEVICE_ID_INTEL_440MX) | 3049 | pci->device == PCI_DEVICE_ID_INTEL_440MX) |
| @@ -3243,14 +3287,6 @@ static int __devinit snd_intel8x0_probe(struct pci_dev *pci, | |||
| 3243 | buggy_irq = 0; | 3287 | buggy_irq = 0; |
| 3244 | } | 3288 | } |
| 3245 | 3289 | ||
| 3246 | if (inside_vm < 0) { | ||
| 3247 | /* detect KVM and Parallels virtual environments */ | ||
| 3248 | inside_vm = kvm_para_available(); | ||
| 3249 | #if defined(__i386__) || defined(__x86_64__) | ||
| 3250 | inside_vm = inside_vm || boot_cpu_has(X86_FEATURE_HYPERVISOR); | ||
| 3251 | #endif | ||
| 3252 | } | ||
| 3253 | |||
| 3254 | if ((err = snd_intel8x0_create(card, pci, pci_id->driver_data, | 3290 | if ((err = snd_intel8x0_create(card, pci, pci_id->driver_data, |
| 3255 | &chip)) < 0) { | 3291 | &chip)) < 0) { |
| 3256 | snd_card_free(card); | 3292 | snd_card_free(card); |
