diff options
Diffstat (limited to 'sound/pci/hda/patch_sigmatel.c')
| -rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 66c0876bf734..8eb6508cd991 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/delay.h> | 28 | #include <linux/delay.h> |
| 29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
| 30 | #include <linux/pci.h> | 30 | #include <linux/pci.h> |
| 31 | #include <linux/dmi.h> | ||
| 31 | #include <sound/core.h> | 32 | #include <sound/core.h> |
| 32 | #include <sound/asoundef.h> | 33 | #include <sound/asoundef.h> |
| 33 | #include <sound/jack.h> | 34 | #include <sound/jack.h> |
| @@ -1693,6 +1694,8 @@ static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = { | |||
| 1693 | "DFI LanParty", STAC_92HD71BXX_REF), | 1694 | "DFI LanParty", STAC_92HD71BXX_REF), |
| 1694 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fb, | 1695 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fb, |
| 1695 | "HP dv4-1222nr", STAC_HP_DV4_1222NR), | 1696 | "HP dv4-1222nr", STAC_HP_DV4_1222NR), |
| 1697 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x1720, | ||
| 1698 | "HP", STAC_HP_DV5), | ||
| 1696 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3080, | 1699 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3080, |
| 1697 | "HP", STAC_HP_DV5), | 1700 | "HP", STAC_HP_DV5), |
| 1698 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x30f0, | 1701 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x30f0, |
| @@ -4665,6 +4668,26 @@ static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res) | |||
| 4665 | } | 4668 | } |
| 4666 | } | 4669 | } |
| 4667 | 4670 | ||
| 4671 | static int hp_bseries_system(u32 subsystem_id) | ||
| 4672 | { | ||
| 4673 | switch (subsystem_id) { | ||
| 4674 | case 0x103c307e: | ||
| 4675 | case 0x103c307f: | ||
| 4676 | case 0x103c3080: | ||
| 4677 | case 0x103c3081: | ||
| 4678 | case 0x103c1722: | ||
| 4679 | case 0x103c1723: | ||
| 4680 | case 0x103c1724: | ||
| 4681 | case 0x103c1725: | ||
| 4682 | case 0x103c1726: | ||
| 4683 | case 0x103c1727: | ||
| 4684 | case 0x103c1728: | ||
| 4685 | case 0x103c1729: | ||
| 4686 | return 1; | ||
| 4687 | } | ||
| 4688 | return 0; | ||
| 4689 | } | ||
| 4690 | |||
| 4668 | #ifdef CONFIG_PROC_FS | 4691 | #ifdef CONFIG_PROC_FS |
| 4669 | static void stac92hd_proc_hook(struct snd_info_buffer *buffer, | 4692 | static void stac92hd_proc_hook(struct snd_info_buffer *buffer, |
| 4670 | struct hda_codec *codec, hda_nid_t nid) | 4693 | struct hda_codec *codec, hda_nid_t nid) |
| @@ -4754,6 +4777,11 @@ static int stac92xx_hp_check_power_status(struct hda_codec *codec, | |||
| 4754 | else | 4777 | else |
| 4755 | spec->gpio_data |= spec->gpio_led; /* white */ | 4778 | spec->gpio_data |= spec->gpio_led; /* white */ |
| 4756 | 4779 | ||
| 4780 | if (hp_bseries_system(codec->subsystem_id)) { | ||
| 4781 | /* LED state is inverted on these systems */ | ||
| 4782 | spec->gpio_data ^= spec->gpio_led; | ||
| 4783 | } | ||
| 4784 | |||
| 4757 | stac_gpio_set(codec, spec->gpio_mask, | 4785 | stac_gpio_set(codec, spec->gpio_mask, |
| 4758 | spec->gpio_dir, | 4786 | spec->gpio_dir, |
| 4759 | spec->gpio_data); | 4787 | spec->gpio_data); |
| @@ -5243,6 +5271,7 @@ static int patch_stac92hd71bxx(struct hda_codec *codec) | |||
| 5243 | { | 5271 | { |
| 5244 | struct sigmatel_spec *spec; | 5272 | struct sigmatel_spec *spec; |
| 5245 | struct hda_verb *unmute_init = stac92hd71bxx_unmute_core_init; | 5273 | struct hda_verb *unmute_init = stac92hd71bxx_unmute_core_init; |
| 5274 | unsigned int pin_cfg; | ||
| 5246 | int err = 0; | 5275 | int err = 0; |
| 5247 | 5276 | ||
| 5248 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 5277 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
| @@ -5426,6 +5455,45 @@ again: | |||
| 5426 | break; | 5455 | break; |
| 5427 | } | 5456 | } |
| 5428 | 5457 | ||
| 5458 | if (hp_bseries_system(codec->subsystem_id)) { | ||
| 5459 | pin_cfg = snd_hda_codec_get_pincfg(codec, 0x0f); | ||
| 5460 | if (get_defcfg_device(pin_cfg) == AC_JACK_LINE_OUT || | ||
| 5461 | get_defcfg_device(pin_cfg) == AC_JACK_SPEAKER || | ||
| 5462 | get_defcfg_device(pin_cfg) == AC_JACK_HP_OUT) { | ||
| 5463 | /* It was changed in the BIOS to just satisfy MS DTM. | ||
| 5464 | * Lets turn it back into slaved HP | ||
| 5465 | */ | ||
| 5466 | pin_cfg = (pin_cfg & (~AC_DEFCFG_DEVICE)) | ||
| 5467 | | (AC_JACK_HP_OUT << | ||
| 5468 | AC_DEFCFG_DEVICE_SHIFT); | ||
| 5469 | pin_cfg = (pin_cfg & (~(AC_DEFCFG_DEF_ASSOC | ||
| 5470 | | AC_DEFCFG_SEQUENCE))) | ||
| 5471 | | 0x1f; | ||
| 5472 | snd_hda_codec_set_pincfg(codec, 0x0f, pin_cfg); | ||
| 5473 | } | ||
| 5474 | } | ||
| 5475 | |||
| 5476 | if ((codec->subsystem_id >> 16) == PCI_VENDOR_ID_HP) { | ||
| 5477 | const struct dmi_device *dev = NULL; | ||
| 5478 | while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, | ||
| 5479 | NULL, dev))) { | ||
| 5480 | if (strcmp(dev->name, "HP_Mute_LED_1")) { | ||
| 5481 | switch (codec->vendor_id) { | ||
| 5482 | case 0x111d7608: | ||
| 5483 | spec->gpio_led = 0x01; | ||
| 5484 | break; | ||
| 5485 | case 0x111d7600: | ||
| 5486 | case 0x111d7601: | ||
| 5487 | case 0x111d7602: | ||
| 5488 | case 0x111d7603: | ||
| 5489 | spec->gpio_led = 0x08; | ||
| 5490 | break; | ||
| 5491 | } | ||
| 5492 | break; | ||
| 5493 | } | ||
| 5494 | } | ||
| 5495 | } | ||
| 5496 | |||
| 5429 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 5497 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
| 5430 | if (spec->gpio_led) { | 5498 | if (spec->gpio_led) { |
| 5431 | spec->gpio_mask |= spec->gpio_led; | 5499 | spec->gpio_mask |= spec->gpio_led; |
