diff options
| -rw-r--r-- | Documentation/sound/alsa/HD-Audio-Models.txt | 5 | ||||
| -rw-r--r-- | Documentation/sound/alsa/HD-Audio.txt | 27 | ||||
| -rw-r--r-- | sound/pci/hda/hda_codec.c | 6 | ||||
| -rw-r--r-- | sound/pci/hda/hda_codec.h | 3 | ||||
| -rw-r--r-- | sound/pci/hda/hda_hwdep.c | 53 | ||||
| -rw-r--r-- | sound/pci/hda/hda_intel.c | 28 | ||||
| -rw-r--r-- | sound/pci/hda/patch_analog.c | 2 | ||||
| -rw-r--r-- | sound/pci/hda/patch_conexant.c | 255 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 830 | ||||
| -rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 151 |
10 files changed, 876 insertions, 484 deletions
diff --git a/Documentation/sound/alsa/HD-Audio-Models.txt b/Documentation/sound/alsa/HD-Audio-Models.txt index e72cee9e2a71..1d38b0dfba95 100644 --- a/Documentation/sound/alsa/HD-Audio-Models.txt +++ b/Documentation/sound/alsa/HD-Audio-Models.txt | |||
| @@ -124,6 +124,8 @@ ALC882/883/885/888/889 | |||
| 124 | asus-a7m ASUS A7M | 124 | asus-a7m ASUS A7M |
| 125 | macpro MacPro support | 125 | macpro MacPro support |
| 126 | mb5 Macbook 5,1 | 126 | mb5 Macbook 5,1 |
| 127 | macmini3 Macmini 3,1 | ||
| 128 | mba21 Macbook Air 2,1 | ||
| 127 | mbp3 Macbook Pro rev3 | 129 | mbp3 Macbook Pro rev3 |
| 128 | imac24 iMac 24'' with jack detection | 130 | imac24 iMac 24'' with jack detection |
| 129 | imac91 iMac 9,1 | 131 | imac91 iMac 9,1 |
| @@ -279,13 +281,16 @@ Conexant 5051 | |||
| 279 | laptop Basic Laptop config (default) | 281 | laptop Basic Laptop config (default) |
| 280 | hp HP Spartan laptop | 282 | hp HP Spartan laptop |
| 281 | hp-dv6736 HP dv6736 | 283 | hp-dv6736 HP dv6736 |
| 284 | hp-f700 HP Compaq Presario F700 | ||
| 282 | lenovo-x200 Lenovo X200 laptop | 285 | lenovo-x200 Lenovo X200 laptop |
| 286 | toshiba Toshiba Satellite M300 | ||
| 283 | 287 | ||
| 284 | Conexant 5066 | 288 | Conexant 5066 |
| 285 | ============= | 289 | ============= |
| 286 | laptop Basic Laptop config (default) | 290 | laptop Basic Laptop config (default) |
| 287 | dell-laptop Dell laptops | 291 | dell-laptop Dell laptops |
| 288 | olpc-xo-1_5 OLPC XO 1.5 | 292 | olpc-xo-1_5 OLPC XO 1.5 |
| 293 | ideapad Lenovo IdeaPad U150 | ||
| 289 | 294 | ||
| 290 | STAC9200 | 295 | STAC9200 |
| 291 | ======== | 296 | ======== |
diff --git a/Documentation/sound/alsa/HD-Audio.txt b/Documentation/sound/alsa/HD-Audio.txt index 6325bec06a72..f4dd3bf99d12 100644 --- a/Documentation/sound/alsa/HD-Audio.txt +++ b/Documentation/sound/alsa/HD-Audio.txt | |||
| @@ -452,6 +452,33 @@ Similarly, the lines after `[verb]` are parsed as `init_verbs` | |||
| 452 | sysfs entries, and the lines after `[hint]` are parsed as `hints` | 452 | sysfs entries, and the lines after `[hint]` are parsed as `hints` |
| 453 | sysfs entries, respectively. | 453 | sysfs entries, respectively. |
| 454 | 454 | ||
| 455 | Another example to override the codec vendor id from 0x12345678 to | ||
| 456 | 0xdeadbeef is like below: | ||
| 457 | ------------------------------------------------------------------------ | ||
| 458 | [codec] | ||
| 459 | 0x12345678 0xabcd1234 2 | ||
| 460 | |||
| 461 | [vendor_id] | ||
| 462 | 0xdeadbeef | ||
| 463 | ------------------------------------------------------------------------ | ||
| 464 | |||
| 465 | In the similar way, you can override the codec subsystem_id via | ||
| 466 | `[subsystem_id]`, the revision id via `[revision_id]` line. | ||
| 467 | Also, the codec chip name can be rewritten via `[chip_name]` line. | ||
| 468 | ------------------------------------------------------------------------ | ||
| 469 | [codec] | ||
| 470 | 0x12345678 0xabcd1234 2 | ||
| 471 | |||
| 472 | [subsystem_id] | ||
| 473 | 0xffff1111 | ||
| 474 | |||
| 475 | [revision_id] | ||
| 476 | 0x10 | ||
| 477 | |||
| 478 | [chip_name] | ||
| 479 | My-own NEWS-0002 | ||
| 480 | ------------------------------------------------------------------------ | ||
| 481 | |||
| 455 | The hd-audio driver reads the file via request_firmware(). Thus, | 482 | The hd-audio driver reads the file via request_firmware(). Thus, |
| 456 | a patch file has to be located on the appropriate firmware path, | 483 | a patch file has to be located on the appropriate firmware path, |
| 457 | typically, /lib/firmware. For example, when you pass the option | 484 | typically, /lib/firmware. For example, when you pass the option |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 26ceace88c96..76d3c4c049db 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
| @@ -2767,7 +2767,8 @@ static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg, | |||
| 2767 | snd_hda_codec_read(codec, fg, 0, AC_VERB_SET_POWER_STATE, | 2767 | snd_hda_codec_read(codec, fg, 0, AC_VERB_SET_POWER_STATE, |
| 2768 | power_state); | 2768 | power_state); |
| 2769 | /* partial workaround for "azx_get_response timeout" */ | 2769 | /* partial workaround for "azx_get_response timeout" */ |
| 2770 | if (power_state == AC_PWRST_D0) | 2770 | if (power_state == AC_PWRST_D0 && |
| 2771 | (codec->vendor_id & 0xffff0000) == 0x14f10000) | ||
| 2771 | msleep(10); | 2772 | msleep(10); |
| 2772 | 2773 | ||
| 2773 | nid = codec->start_nid; | 2774 | nid = codec->start_nid; |
| @@ -2801,7 +2802,6 @@ static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg, | |||
| 2801 | if (power_state == AC_PWRST_D0) { | 2802 | if (power_state == AC_PWRST_D0) { |
| 2802 | unsigned long end_time; | 2803 | unsigned long end_time; |
| 2803 | int state; | 2804 | int state; |
| 2804 | msleep(10); | ||
| 2805 | /* wait until the codec reachs to D0 */ | 2805 | /* wait until the codec reachs to D0 */ |
| 2806 | end_time = jiffies + msecs_to_jiffies(500); | 2806 | end_time = jiffies + msecs_to_jiffies(500); |
| 2807 | do { | 2807 | do { |
| @@ -3275,6 +3275,8 @@ const char *snd_hda_pcm_type_name[HDA_PCM_NTYPES] = { | |||
| 3275 | 3275 | ||
| 3276 | /* | 3276 | /* |
| 3277 | * get the empty PCM device number to assign | 3277 | * get the empty PCM device number to assign |
| 3278 | * | ||
| 3279 | * note the max device number is limited by HDA_MAX_PCMS, currently 10 | ||
| 3278 | */ | 3280 | */ |
| 3279 | static int get_empty_pcm_device(struct hda_bus *bus, int type) | 3281 | static int get_empty_pcm_device(struct hda_bus *bus, int type) |
| 3280 | { | 3282 | { |
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 0c8f05cc56be..b75da47571e6 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
| @@ -527,6 +527,9 @@ enum { | |||
| 527 | /* max. codec address */ | 527 | /* max. codec address */ |
| 528 | #define HDA_MAX_CODEC_ADDRESS 0x0f | 528 | #define HDA_MAX_CODEC_ADDRESS 0x0f |
| 529 | 529 | ||
| 530 | /* max number of PCM devics per card */ | ||
| 531 | #define HDA_MAX_PCMS 10 | ||
| 532 | |||
| 530 | /* | 533 | /* |
| 531 | * generic arrays | 534 | * generic arrays |
| 532 | */ | 535 | */ |
diff --git a/sound/pci/hda/hda_hwdep.c b/sound/pci/hda/hda_hwdep.c index b36919c0d363..a1fc83753cc6 100644 --- a/sound/pci/hda/hda_hwdep.c +++ b/sound/pci/hda/hda_hwdep.c | |||
| @@ -625,6 +625,10 @@ enum { | |||
| 625 | LINE_MODE_PINCFG, | 625 | LINE_MODE_PINCFG, |
| 626 | LINE_MODE_VERB, | 626 | LINE_MODE_VERB, |
| 627 | LINE_MODE_HINT, | 627 | LINE_MODE_HINT, |
| 628 | LINE_MODE_VENDOR_ID, | ||
| 629 | LINE_MODE_SUBSYSTEM_ID, | ||
| 630 | LINE_MODE_REVISION_ID, | ||
| 631 | LINE_MODE_CHIP_NAME, | ||
| 628 | NUM_LINE_MODES, | 632 | NUM_LINE_MODES, |
| 629 | }; | 633 | }; |
| 630 | 634 | ||
| @@ -654,53 +658,71 @@ static void parse_codec_mode(char *buf, struct hda_bus *bus, | |||
| 654 | } | 658 | } |
| 655 | 659 | ||
| 656 | /* parse the contents after the other command tags, [pincfg], [verb], | 660 | /* parse the contents after the other command tags, [pincfg], [verb], |
| 657 | * [hint] and [model] | 661 | * [vendor_id], [subsystem_id], [revision_id], [chip_name], [hint] and [model] |
| 658 | * just pass to the sysfs helper (only when any codec was specified) | 662 | * just pass to the sysfs helper (only when any codec was specified) |
| 659 | */ | 663 | */ |
| 660 | static void parse_pincfg_mode(char *buf, struct hda_bus *bus, | 664 | static void parse_pincfg_mode(char *buf, struct hda_bus *bus, |
| 661 | struct hda_codec **codecp) | 665 | struct hda_codec **codecp) |
| 662 | { | 666 | { |
| 663 | if (!*codecp) | ||
| 664 | return; | ||
| 665 | parse_user_pin_configs(*codecp, buf); | 667 | parse_user_pin_configs(*codecp, buf); |
| 666 | } | 668 | } |
| 667 | 669 | ||
| 668 | static void parse_verb_mode(char *buf, struct hda_bus *bus, | 670 | static void parse_verb_mode(char *buf, struct hda_bus *bus, |
| 669 | struct hda_codec **codecp) | 671 | struct hda_codec **codecp) |
| 670 | { | 672 | { |
| 671 | if (!*codecp) | ||
| 672 | return; | ||
| 673 | parse_init_verbs(*codecp, buf); | 673 | parse_init_verbs(*codecp, buf); |
| 674 | } | 674 | } |
| 675 | 675 | ||
| 676 | static void parse_hint_mode(char *buf, struct hda_bus *bus, | 676 | static void parse_hint_mode(char *buf, struct hda_bus *bus, |
| 677 | struct hda_codec **codecp) | 677 | struct hda_codec **codecp) |
| 678 | { | 678 | { |
| 679 | if (!*codecp) | ||
| 680 | return; | ||
| 681 | parse_hints(*codecp, buf); | 679 | parse_hints(*codecp, buf); |
| 682 | } | 680 | } |
| 683 | 681 | ||
| 684 | static void parse_model_mode(char *buf, struct hda_bus *bus, | 682 | static void parse_model_mode(char *buf, struct hda_bus *bus, |
| 685 | struct hda_codec **codecp) | 683 | struct hda_codec **codecp) |
| 686 | { | 684 | { |
| 687 | if (!*codecp) | ||
| 688 | return; | ||
| 689 | kfree((*codecp)->modelname); | 685 | kfree((*codecp)->modelname); |
| 690 | (*codecp)->modelname = kstrdup(buf, GFP_KERNEL); | 686 | (*codecp)->modelname = kstrdup(buf, GFP_KERNEL); |
| 691 | } | 687 | } |
| 692 | 688 | ||
| 689 | static void parse_chip_name_mode(char *buf, struct hda_bus *bus, | ||
| 690 | struct hda_codec **codecp) | ||
| 691 | { | ||
| 692 | kfree((*codecp)->chip_name); | ||
| 693 | (*codecp)->chip_name = kstrdup(buf, GFP_KERNEL); | ||
| 694 | } | ||
| 695 | |||
| 696 | #define DEFINE_PARSE_ID_MODE(name) \ | ||
| 697 | static void parse_##name##_mode(char *buf, struct hda_bus *bus, \ | ||
| 698 | struct hda_codec **codecp) \ | ||
| 699 | { \ | ||
| 700 | unsigned long val; \ | ||
| 701 | if (!strict_strtoul(buf, 0, &val)) \ | ||
| 702 | (*codecp)->name = val; \ | ||
| 703 | } | ||
| 704 | |||
| 705 | DEFINE_PARSE_ID_MODE(vendor_id); | ||
| 706 | DEFINE_PARSE_ID_MODE(subsystem_id); | ||
| 707 | DEFINE_PARSE_ID_MODE(revision_id); | ||
| 708 | |||
| 709 | |||
| 693 | struct hda_patch_item { | 710 | struct hda_patch_item { |
| 694 | const char *tag; | 711 | const char *tag; |
| 695 | void (*parser)(char *buf, struct hda_bus *bus, struct hda_codec **retc); | 712 | void (*parser)(char *buf, struct hda_bus *bus, struct hda_codec **retc); |
| 713 | int need_codec; | ||
| 696 | }; | 714 | }; |
| 697 | 715 | ||
| 698 | static struct hda_patch_item patch_items[NUM_LINE_MODES] = { | 716 | static struct hda_patch_item patch_items[NUM_LINE_MODES] = { |
| 699 | [LINE_MODE_CODEC] = { "[codec]", parse_codec_mode }, | 717 | [LINE_MODE_CODEC] = { "[codec]", parse_codec_mode, 0 }, |
| 700 | [LINE_MODE_MODEL] = { "[model]", parse_model_mode }, | 718 | [LINE_MODE_MODEL] = { "[model]", parse_model_mode, 1 }, |
| 701 | [LINE_MODE_VERB] = { "[verb]", parse_verb_mode }, | 719 | [LINE_MODE_VERB] = { "[verb]", parse_verb_mode, 1 }, |
| 702 | [LINE_MODE_PINCFG] = { "[pincfg]", parse_pincfg_mode }, | 720 | [LINE_MODE_PINCFG] = { "[pincfg]", parse_pincfg_mode, 1 }, |
| 703 | [LINE_MODE_HINT] = { "[hint]", parse_hint_mode }, | 721 | [LINE_MODE_HINT] = { "[hint]", parse_hint_mode, 1 }, |
| 722 | [LINE_MODE_VENDOR_ID] = { "[vendor_id]", parse_vendor_id_mode, 1 }, | ||
| 723 | [LINE_MODE_SUBSYSTEM_ID] = { "[subsystem_id]", parse_subsystem_id_mode, 1 }, | ||
| 724 | [LINE_MODE_REVISION_ID] = { "[revision_id]", parse_revision_id_mode, 1 }, | ||
| 725 | [LINE_MODE_CHIP_NAME] = { "[chip_name]", parse_chip_name_mode, 1 }, | ||
| 704 | }; | 726 | }; |
| 705 | 727 | ||
| 706 | /* check the line starting with '[' -- change the parser mode accodingly */ | 728 | /* check the line starting with '[' -- change the parser mode accodingly */ |
| @@ -783,7 +805,8 @@ int snd_hda_load_patch(struct hda_bus *bus, const char *patch) | |||
| 783 | continue; | 805 | continue; |
| 784 | if (*buf == '[') | 806 | if (*buf == '[') |
| 785 | line_mode = parse_line_mode(buf, bus); | 807 | line_mode = parse_line_mode(buf, bus); |
| 786 | else if (patch_items[line_mode].parser) | 808 | else if (patch_items[line_mode].parser && |
| 809 | (codec || !patch_items[line_mode].need_codec)) | ||
| 787 | patch_items[line_mode].parser(buf, bus, &codec); | 810 | patch_items[line_mode].parser(buf, bus, &codec); |
| 788 | } | 811 | } |
| 789 | release_firmware(fw); | 812 | release_firmware(fw); |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 9925055608b1..d5c93ad852ee 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -125,6 +125,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6}," | |||
| 125 | "{Intel, ICH9}," | 125 | "{Intel, ICH9}," |
| 126 | "{Intel, ICH10}," | 126 | "{Intel, ICH10}," |
| 127 | "{Intel, PCH}," | 127 | "{Intel, PCH}," |
| 128 | "{Intel, CPT}," | ||
| 128 | "{Intel, SCH}," | 129 | "{Intel, SCH}," |
| 129 | "{ATI, SB450}," | 130 | "{ATI, SB450}," |
| 130 | "{ATI, SB600}," | 131 | "{ATI, SB600}," |
| @@ -259,8 +260,6 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 }; | |||
| 259 | #define AZX_MAX_FRAG 32 | 260 | #define AZX_MAX_FRAG 32 |
| 260 | /* max buffer size - no h/w limit, you can increase as you like */ | 261 | /* max buffer size - no h/w limit, you can increase as you like */ |
| 261 | #define AZX_MAX_BUF_SIZE (1024*1024*1024) | 262 | #define AZX_MAX_BUF_SIZE (1024*1024*1024) |
| 262 | /* max number of PCM devics per card */ | ||
| 263 | #define AZX_MAX_PCMS 8 | ||
| 264 | 263 | ||
| 265 | /* RIRB int mask: overrun[2], response[0] */ | 264 | /* RIRB int mask: overrun[2], response[0] */ |
| 266 | #define RIRB_INT_RESPONSE 0x01 | 265 | #define RIRB_INT_RESPONSE 0x01 |
| @@ -408,7 +407,7 @@ struct azx { | |||
| 408 | struct azx_dev *azx_dev; | 407 | struct azx_dev *azx_dev; |
| 409 | 408 | ||
| 410 | /* PCM */ | 409 | /* PCM */ |
| 411 | struct snd_pcm *pcm[AZX_MAX_PCMS]; | 410 | struct snd_pcm *pcm[HDA_MAX_PCMS]; |
| 412 | 411 | ||
| 413 | /* HD codec */ | 412 | /* HD codec */ |
| 414 | unsigned short codec_mask; | 413 | unsigned short codec_mask; |
| @@ -449,6 +448,7 @@ struct azx { | |||
| 449 | /* driver types */ | 448 | /* driver types */ |
| 450 | enum { | 449 | enum { |
| 451 | AZX_DRIVER_ICH, | 450 | AZX_DRIVER_ICH, |
| 451 | AZX_DRIVER_PCH, | ||
| 452 | AZX_DRIVER_SCH, | 452 | AZX_DRIVER_SCH, |
| 453 | AZX_DRIVER_ATI, | 453 | AZX_DRIVER_ATI, |
| 454 | AZX_DRIVER_ATIHDMI, | 454 | AZX_DRIVER_ATIHDMI, |
| @@ -463,6 +463,7 @@ enum { | |||
| 463 | 463 | ||
| 464 | static char *driver_short_names[] __devinitdata = { | 464 | static char *driver_short_names[] __devinitdata = { |
| 465 | [AZX_DRIVER_ICH] = "HDA Intel", | 465 | [AZX_DRIVER_ICH] = "HDA Intel", |
| 466 | [AZX_DRIVER_PCH] = "HDA Intel PCH", | ||
| 466 | [AZX_DRIVER_SCH] = "HDA Intel MID", | 467 | [AZX_DRIVER_SCH] = "HDA Intel MID", |
| 467 | [AZX_DRIVER_ATI] = "HDA ATI SB", | 468 | [AZX_DRIVER_ATI] = "HDA ATI SB", |
| 468 | [AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI", | 469 | [AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI", |
| @@ -968,8 +969,8 @@ static void azx_stream_start(struct azx *chip, struct azx_dev *azx_dev) | |||
| 968 | azx_dev->insufficient = 1; | 969 | azx_dev->insufficient = 1; |
| 969 | 970 | ||
| 970 | /* enable SIE */ | 971 | /* enable SIE */ |
| 971 | azx_writeb(chip, INTCTL, | 972 | azx_writel(chip, INTCTL, |
| 972 | azx_readb(chip, INTCTL) | (1 << azx_dev->index)); | 973 | azx_readl(chip, INTCTL) | (1 << azx_dev->index)); |
| 973 | /* set DMA start and interrupt mask */ | 974 | /* set DMA start and interrupt mask */ |
| 974 | azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) | | 975 | azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) | |
| 975 | SD_CTL_DMA_START | SD_INT_MASK); | 976 | SD_CTL_DMA_START | SD_INT_MASK); |
| @@ -988,8 +989,8 @@ static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev) | |||
| 988 | { | 989 | { |
| 989 | azx_stream_clear(chip, azx_dev); | 990 | azx_stream_clear(chip, azx_dev); |
| 990 | /* disable SIE */ | 991 | /* disable SIE */ |
| 991 | azx_writeb(chip, INTCTL, | 992 | azx_writel(chip, INTCTL, |
| 992 | azx_readb(chip, INTCTL) & ~(1 << azx_dev->index)); | 993 | azx_readl(chip, INTCTL) & ~(1 << azx_dev->index)); |
| 993 | } | 994 | } |
| 994 | 995 | ||
| 995 | 996 | ||
| @@ -1065,6 +1066,7 @@ static void azx_init_pci(struct azx *chip) | |||
| 1065 | 0x01, NVIDIA_HDA_ENABLE_COHBIT); | 1066 | 0x01, NVIDIA_HDA_ENABLE_COHBIT); |
| 1066 | break; | 1067 | break; |
| 1067 | case AZX_DRIVER_SCH: | 1068 | case AZX_DRIVER_SCH: |
| 1069 | case AZX_DRIVER_PCH: | ||
| 1068 | pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop); | 1070 | pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop); |
| 1069 | if (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) { | 1071 | if (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) { |
| 1070 | pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, | 1072 | pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, |
| @@ -1350,7 +1352,7 @@ static void azx_bus_reset(struct hda_bus *bus) | |||
| 1350 | if (chip->initialized) { | 1352 | if (chip->initialized) { |
| 1351 | int i; | 1353 | int i; |
| 1352 | 1354 | ||
| 1353 | for (i = 0; i < AZX_MAX_PCMS; i++) | 1355 | for (i = 0; i < HDA_MAX_PCMS; i++) |
| 1354 | snd_pcm_suspend_all(chip->pcm[i]); | 1356 | snd_pcm_suspend_all(chip->pcm[i]); |
| 1355 | snd_hda_suspend(chip->bus); | 1357 | snd_hda_suspend(chip->bus); |
| 1356 | snd_hda_resume(chip->bus); | 1358 | snd_hda_resume(chip->bus); |
| @@ -1412,7 +1414,7 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model) | |||
| 1412 | chip->codec_mask &= ~(1 << c); | 1414 | chip->codec_mask &= ~(1 << c); |
| 1413 | /* More badly, accessing to a non-existing | 1415 | /* More badly, accessing to a non-existing |
| 1414 | * codec often screws up the controller chip, | 1416 | * codec often screws up the controller chip, |
| 1415 | * and distrubs the further communications. | 1417 | * and disturbs the further communications. |
| 1416 | * Thus if an error occurs during probing, | 1418 | * Thus if an error occurs during probing, |
| 1417 | * better to reset the controller chip to | 1419 | * better to reset the controller chip to |
| 1418 | * get back to the sanity state. | 1420 | * get back to the sanity state. |
| @@ -1983,7 +1985,7 @@ azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec, | |||
| 1983 | int pcm_dev = cpcm->device; | 1985 | int pcm_dev = cpcm->device; |
| 1984 | int s, err; | 1986 | int s, err; |
| 1985 | 1987 | ||
| 1986 | if (pcm_dev >= AZX_MAX_PCMS) { | 1988 | if (pcm_dev >= HDA_MAX_PCMS) { |
| 1987 | snd_printk(KERN_ERR SFX "Invalid PCM device number %d\n", | 1989 | snd_printk(KERN_ERR SFX "Invalid PCM device number %d\n", |
| 1988 | pcm_dev); | 1990 | pcm_dev); |
| 1989 | return -EINVAL; | 1991 | return -EINVAL; |
| @@ -2139,7 +2141,7 @@ static int azx_suspend(struct pci_dev *pci, pm_message_t state) | |||
| 2139 | 2141 | ||
| 2140 | snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); | 2142 | snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); |
| 2141 | azx_clear_irq_pending(chip); | 2143 | azx_clear_irq_pending(chip); |
| 2142 | for (i = 0; i < AZX_MAX_PCMS; i++) | 2144 | for (i = 0; i < HDA_MAX_PCMS; i++) |
| 2143 | snd_pcm_suspend_all(chip->pcm[i]); | 2145 | snd_pcm_suspend_all(chip->pcm[i]); |
| 2144 | if (chip->initialized) | 2146 | if (chip->initialized) |
| 2145 | snd_hda_suspend(chip->bus); | 2147 | snd_hda_suspend(chip->bus); |
| @@ -2262,6 +2264,7 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = { | |||
| 2262 | SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB), | 2264 | SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB), |
| 2263 | SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB), | 2265 | SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB), |
| 2264 | SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB), | 2266 | SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB), |
| 2267 | SND_PCI_QUIRK(0x1106, 0x3288, "ASUS M2V-MX SE", POS_FIX_LPIB), | ||
| 2265 | SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), | 2268 | SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), |
| 2266 | SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB), | 2269 | SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB), |
| 2267 | {} | 2270 | {} |
| @@ -2418,6 +2421,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | |||
| 2418 | if (bdl_pos_adj[dev] < 0) { | 2421 | if (bdl_pos_adj[dev] < 0) { |
| 2419 | switch (chip->driver_type) { | 2422 | switch (chip->driver_type) { |
| 2420 | case AZX_DRIVER_ICH: | 2423 | case AZX_DRIVER_ICH: |
| 2424 | case AZX_DRIVER_PCH: | ||
| 2421 | bdl_pos_adj[dev] = 1; | 2425 | bdl_pos_adj[dev] = 1; |
| 2422 | break; | 2426 | break; |
| 2423 | default: | 2427 | default: |
| @@ -2696,6 +2700,8 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | |||
| 2696 | { PCI_DEVICE(0x8086, 0x3a6e), .driver_data = AZX_DRIVER_ICH }, | 2700 | { PCI_DEVICE(0x8086, 0x3a6e), .driver_data = AZX_DRIVER_ICH }, |
| 2697 | /* PCH */ | 2701 | /* PCH */ |
| 2698 | { PCI_DEVICE(0x8086, 0x3b56), .driver_data = AZX_DRIVER_ICH }, | 2702 | { PCI_DEVICE(0x8086, 0x3b56), .driver_data = AZX_DRIVER_ICH }, |
| 2703 | /* CPT */ | ||
| 2704 | { PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH }, | ||
| 2699 | /* SCH */ | 2705 | /* SCH */ |
| 2700 | { PCI_DEVICE(0x8086, 0x811b), .driver_data = AZX_DRIVER_SCH }, | 2706 | { PCI_DEVICE(0x8086, 0x811b), .driver_data = AZX_DRIVER_SCH }, |
| 2701 | /* ATI SB 450/600 */ | 2707 | /* ATI SB 450/600 */ |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 214301d568fa..e6d1bdff1b6e 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
| @@ -1098,7 +1098,7 @@ static struct snd_pci_quirk ad1986a_cfg_tbl[] = { | |||
| 1098 | SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS M2N", AD1986A_3STACK), | 1098 | SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS M2N", AD1986A_3STACK), |
| 1099 | SND_PCI_QUIRK(0x1043, 0x8234, "ASUS M2N", AD1986A_3STACK), | 1099 | SND_PCI_QUIRK(0x1043, 0x8234, "ASUS M2N", AD1986A_3STACK), |
| 1100 | SND_PCI_QUIRK(0x10de, 0xcb84, "ASUS A8N-VM", AD1986A_3STACK), | 1100 | SND_PCI_QUIRK(0x10de, 0xcb84, "ASUS A8N-VM", AD1986A_3STACK), |
| 1101 | SND_PCI_QUIRK(0x1179, 0xff40, "Toshiba", AD1986A_LAPTOP_EAPD), | 1101 | SND_PCI_QUIRK(0x1179, 0xff40, "Toshiba Satellite L40-10Q", AD1986A_3STACK), |
| 1102 | SND_PCI_QUIRK(0x144d, 0xb03c, "Samsung R55", AD1986A_3STACK), | 1102 | SND_PCI_QUIRK(0x144d, 0xb03c, "Samsung R55", AD1986A_3STACK), |
| 1103 | SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_LAPTOP), | 1103 | SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_LAPTOP), |
| 1104 | SND_PCI_QUIRK(0x144d, 0xc024, "Samsung P50", AD1986A_SAMSUNG_P50), | 1104 | SND_PCI_QUIRK(0x144d, 0xc024, "Samsung P50", AD1986A_SAMSUNG_P50), |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 685015a53292..194a28c54992 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
| @@ -42,10 +42,12 @@ | |||
| 42 | 42 | ||
| 43 | /* Conexant 5051 specific */ | 43 | /* Conexant 5051 specific */ |
| 44 | 44 | ||
| 45 | #define CXT5051_SPDIF_OUT 0x1C | 45 | #define CXT5051_SPDIF_OUT 0x12 |
| 46 | #define CXT5051_PORTB_EVENT 0x38 | 46 | #define CXT5051_PORTB_EVENT 0x38 |
| 47 | #define CXT5051_PORTC_EVENT 0x39 | 47 | #define CXT5051_PORTC_EVENT 0x39 |
| 48 | 48 | ||
| 49 | #define AUTO_MIC_PORTB (1 << 1) | ||
| 50 | #define AUTO_MIC_PORTC (1 << 2) | ||
| 49 | 51 | ||
| 50 | struct conexant_jack { | 52 | struct conexant_jack { |
| 51 | 53 | ||
| @@ -74,7 +76,7 @@ struct conexant_spec { | |||
| 74 | */ | 76 | */ |
| 75 | unsigned int cur_eapd; | 77 | unsigned int cur_eapd; |
| 76 | unsigned int hp_present; | 78 | unsigned int hp_present; |
| 77 | unsigned int no_auto_mic; | 79 | unsigned int auto_mic; |
| 78 | unsigned int need_dac_fix; | 80 | unsigned int need_dac_fix; |
| 79 | 81 | ||
| 80 | /* capture */ | 82 | /* capture */ |
| @@ -111,7 +113,8 @@ struct conexant_spec { | |||
| 111 | 113 | ||
| 112 | unsigned int dell_automute; | 114 | unsigned int dell_automute; |
| 113 | unsigned int port_d_mode; | 115 | unsigned int port_d_mode; |
| 114 | unsigned int dell_vostro; | 116 | unsigned int dell_vostro:1; |
| 117 | unsigned int ideapad:1; | ||
| 115 | 118 | ||
| 116 | unsigned int ext_mic_present; | 119 | unsigned int ext_mic_present; |
| 117 | unsigned int recording; | 120 | unsigned int recording; |
| @@ -1603,6 +1606,11 @@ static void cxt5051_update_speaker(struct hda_codec *codec) | |||
| 1603 | { | 1606 | { |
| 1604 | struct conexant_spec *spec = codec->spec; | 1607 | struct conexant_spec *spec = codec->spec; |
| 1605 | unsigned int pinctl; | 1608 | unsigned int pinctl; |
| 1609 | /* headphone pin */ | ||
| 1610 | pinctl = (spec->hp_present && spec->cur_eapd) ? PIN_HP : 0; | ||
| 1611 | snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, | ||
| 1612 | pinctl); | ||
| 1613 | /* speaker pin */ | ||
| 1606 | pinctl = (!spec->hp_present && spec->cur_eapd) ? PIN_OUT : 0; | 1614 | pinctl = (!spec->hp_present && spec->cur_eapd) ? PIN_OUT : 0; |
| 1607 | snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, | 1615 | snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, |
| 1608 | pinctl); | 1616 | pinctl); |
| @@ -1626,7 +1634,7 @@ static void cxt5051_portb_automic(struct hda_codec *codec) | |||
| 1626 | struct conexant_spec *spec = codec->spec; | 1634 | struct conexant_spec *spec = codec->spec; |
| 1627 | unsigned int present; | 1635 | unsigned int present; |
| 1628 | 1636 | ||
| 1629 | if (spec->no_auto_mic) | 1637 | if (!(spec->auto_mic & AUTO_MIC_PORTB)) |
| 1630 | return; | 1638 | return; |
| 1631 | present = snd_hda_jack_detect(codec, 0x17); | 1639 | present = snd_hda_jack_detect(codec, 0x17); |
| 1632 | snd_hda_codec_write(codec, 0x14, 0, | 1640 | snd_hda_codec_write(codec, 0x14, 0, |
| @@ -1641,7 +1649,7 @@ static void cxt5051_portc_automic(struct hda_codec *codec) | |||
| 1641 | unsigned int present; | 1649 | unsigned int present; |
| 1642 | hda_nid_t new_adc; | 1650 | hda_nid_t new_adc; |
| 1643 | 1651 | ||
| 1644 | if (spec->no_auto_mic) | 1652 | if (!(spec->auto_mic & AUTO_MIC_PORTC)) |
| 1645 | return; | 1653 | return; |
| 1646 | present = snd_hda_jack_detect(codec, 0x18); | 1654 | present = snd_hda_jack_detect(codec, 0x18); |
| 1647 | if (present) | 1655 | if (present) |
| @@ -1687,13 +1695,7 @@ static void cxt5051_hp_unsol_event(struct hda_codec *codec, | |||
| 1687 | conexant_report_jack(codec, nid); | 1695 | conexant_report_jack(codec, nid); |
| 1688 | } | 1696 | } |
| 1689 | 1697 | ||
| 1690 | static struct snd_kcontrol_new cxt5051_mixers[] = { | 1698 | static struct snd_kcontrol_new cxt5051_playback_mixers[] = { |
| 1691 | HDA_CODEC_VOLUME("Internal Mic Volume", 0x14, 0x00, HDA_INPUT), | ||
| 1692 | HDA_CODEC_MUTE("Internal Mic Switch", 0x14, 0x00, HDA_INPUT), | ||
| 1693 | HDA_CODEC_VOLUME("External Mic Volume", 0x14, 0x01, HDA_INPUT), | ||
| 1694 | HDA_CODEC_MUTE("External Mic Switch", 0x14, 0x01, HDA_INPUT), | ||
| 1695 | HDA_CODEC_VOLUME("Docking Mic Volume", 0x15, 0x00, HDA_INPUT), | ||
| 1696 | HDA_CODEC_MUTE("Docking Mic Switch", 0x15, 0x00, HDA_INPUT), | ||
| 1697 | HDA_CODEC_VOLUME("Master Playback Volume", 0x10, 0x00, HDA_OUTPUT), | 1699 | HDA_CODEC_VOLUME("Master Playback Volume", 0x10, 0x00, HDA_OUTPUT), |
| 1698 | { | 1700 | { |
| 1699 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 1701 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
| @@ -1703,7 +1705,16 @@ static struct snd_kcontrol_new cxt5051_mixers[] = { | |||
| 1703 | .put = cxt5051_hp_master_sw_put, | 1705 | .put = cxt5051_hp_master_sw_put, |
| 1704 | .private_value = 0x1a, | 1706 | .private_value = 0x1a, |
| 1705 | }, | 1707 | }, |
| 1708 | {} | ||
| 1709 | }; | ||
| 1706 | 1710 | ||
| 1711 | static struct snd_kcontrol_new cxt5051_capture_mixers[] = { | ||
| 1712 | HDA_CODEC_VOLUME("Internal Mic Volume", 0x14, 0x00, HDA_INPUT), | ||
| 1713 | HDA_CODEC_MUTE("Internal Mic Switch", 0x14, 0x00, HDA_INPUT), | ||
| 1714 | HDA_CODEC_VOLUME("External Mic Volume", 0x14, 0x01, HDA_INPUT), | ||
| 1715 | HDA_CODEC_MUTE("External Mic Switch", 0x14, 0x01, HDA_INPUT), | ||
| 1716 | HDA_CODEC_VOLUME("Docking Mic Volume", 0x15, 0x00, HDA_INPUT), | ||
| 1717 | HDA_CODEC_MUTE("Docking Mic Switch", 0x15, 0x00, HDA_INPUT), | ||
| 1707 | {} | 1718 | {} |
| 1708 | }; | 1719 | }; |
| 1709 | 1720 | ||
| @@ -1712,48 +1723,26 @@ static struct snd_kcontrol_new cxt5051_hp_mixers[] = { | |||
| 1712 | HDA_CODEC_MUTE("Internal Mic Switch", 0x14, 0x00, HDA_INPUT), | 1723 | HDA_CODEC_MUTE("Internal Mic Switch", 0x14, 0x00, HDA_INPUT), |
| 1713 | HDA_CODEC_VOLUME("External Mic Volume", 0x15, 0x00, HDA_INPUT), | 1724 | HDA_CODEC_VOLUME("External Mic Volume", 0x15, 0x00, HDA_INPUT), |
| 1714 | HDA_CODEC_MUTE("External Mic Switch", 0x15, 0x00, HDA_INPUT), | 1725 | HDA_CODEC_MUTE("External Mic Switch", 0x15, 0x00, HDA_INPUT), |
| 1715 | HDA_CODEC_VOLUME("Master Playback Volume", 0x10, 0x00, HDA_OUTPUT), | ||
| 1716 | { | ||
| 1717 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
| 1718 | .name = "Master Playback Switch", | ||
| 1719 | .info = cxt_eapd_info, | ||
| 1720 | .get = cxt_eapd_get, | ||
| 1721 | .put = cxt5051_hp_master_sw_put, | ||
| 1722 | .private_value = 0x1a, | ||
| 1723 | }, | ||
| 1724 | |||
| 1725 | {} | 1726 | {} |
| 1726 | }; | 1727 | }; |
| 1727 | 1728 | ||
| 1728 | static struct snd_kcontrol_new cxt5051_hp_dv6736_mixers[] = { | 1729 | static struct snd_kcontrol_new cxt5051_hp_dv6736_mixers[] = { |
| 1729 | HDA_CODEC_VOLUME("Mic Volume", 0x14, 0x00, HDA_INPUT), | 1730 | HDA_CODEC_VOLUME("Capture Volume", 0x14, 0x00, HDA_INPUT), |
| 1730 | HDA_CODEC_MUTE("Mic Switch", 0x14, 0x00, HDA_INPUT), | 1731 | HDA_CODEC_MUTE("Capture Switch", 0x14, 0x00, HDA_INPUT), |
| 1731 | HDA_CODEC_VOLUME("Master Playback Volume", 0x10, 0x00, HDA_OUTPUT), | ||
| 1732 | { | ||
| 1733 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
| 1734 | .name = "Master Playback Switch", | ||
| 1735 | .info = cxt_eapd_info, | ||
| 1736 | .get = cxt_eapd_get, | ||
| 1737 | .put = cxt5051_hp_master_sw_put, | ||
| 1738 | .private_value = 0x1a, | ||
| 1739 | }, | ||
| 1740 | |||
| 1741 | {} | 1732 | {} |
| 1742 | }; | 1733 | }; |
| 1743 | 1734 | ||
| 1744 | static struct snd_kcontrol_new cxt5051_f700_mixers[] = { | 1735 | static struct snd_kcontrol_new cxt5051_f700_mixers[] = { |
| 1745 | HDA_CODEC_VOLUME("Mic Volume", 0x14, 0x01, HDA_INPUT), | 1736 | HDA_CODEC_VOLUME("Capture Volume", 0x14, 0x01, HDA_INPUT), |
| 1746 | HDA_CODEC_MUTE("Mic Switch", 0x14, 0x01, HDA_INPUT), | 1737 | HDA_CODEC_MUTE("Capture Switch", 0x14, 0x01, HDA_INPUT), |
| 1747 | HDA_CODEC_VOLUME("Master Playback Volume", 0x10, 0x00, HDA_OUTPUT), | 1738 | {} |
| 1748 | { | 1739 | }; |
| 1749 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
| 1750 | .name = "Master Playback Switch", | ||
| 1751 | .info = cxt_eapd_info, | ||
| 1752 | .get = cxt_eapd_get, | ||
| 1753 | .put = cxt5051_hp_master_sw_put, | ||
| 1754 | .private_value = 0x1a, | ||
| 1755 | }, | ||
| 1756 | 1740 | ||
| 1741 | static struct snd_kcontrol_new cxt5051_toshiba_mixers[] = { | ||
| 1742 | HDA_CODEC_VOLUME("Internal Mic Volume", 0x14, 0x00, HDA_INPUT), | ||
| 1743 | HDA_CODEC_MUTE("Internal Mic Switch", 0x14, 0x00, HDA_INPUT), | ||
| 1744 | HDA_CODEC_VOLUME("External Mic Volume", 0x14, 0x01, HDA_INPUT), | ||
| 1745 | HDA_CODEC_MUTE("External Mic Switch", 0x14, 0x01, HDA_INPUT), | ||
| 1757 | {} | 1746 | {} |
| 1758 | }; | 1747 | }; |
| 1759 | 1748 | ||
| @@ -1782,8 +1771,6 @@ static struct hda_verb cxt5051_init_verbs[] = { | |||
| 1782 | /* EAPD */ | 1771 | /* EAPD */ |
| 1783 | {0x1a, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ | 1772 | {0x1a, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ |
| 1784 | {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT}, | 1773 | {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT}, |
| 1785 | {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CXT5051_PORTB_EVENT}, | ||
| 1786 | {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CXT5051_PORTC_EVENT}, | ||
| 1787 | { } /* end */ | 1774 | { } /* end */ |
| 1788 | }; | 1775 | }; |
| 1789 | 1776 | ||
| @@ -1809,7 +1796,6 @@ static struct hda_verb cxt5051_hp_dv6736_init_verbs[] = { | |||
| 1809 | /* EAPD */ | 1796 | /* EAPD */ |
| 1810 | {0x1a, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ | 1797 | {0x1a, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ |
| 1811 | {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT}, | 1798 | {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT}, |
| 1812 | {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CXT5051_PORTB_EVENT}, | ||
| 1813 | { } /* end */ | 1799 | { } /* end */ |
| 1814 | }; | 1800 | }; |
| 1815 | 1801 | ||
| @@ -1841,15 +1827,13 @@ static struct hda_verb cxt5051_lenovo_x200_init_verbs[] = { | |||
| 1841 | /* EAPD */ | 1827 | /* EAPD */ |
| 1842 | {0x1a, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ | 1828 | {0x1a, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ |
| 1843 | {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT}, | 1829 | {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT}, |
| 1844 | {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CXT5051_PORTB_EVENT}, | ||
| 1845 | {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CXT5051_PORTC_EVENT}, | ||
| 1846 | {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT}, | 1830 | {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT}, |
| 1847 | { } /* end */ | 1831 | { } /* end */ |
| 1848 | }; | 1832 | }; |
| 1849 | 1833 | ||
| 1850 | static struct hda_verb cxt5051_f700_init_verbs[] = { | 1834 | static struct hda_verb cxt5051_f700_init_verbs[] = { |
| 1851 | /* Line in, Mic */ | 1835 | /* Line in, Mic */ |
| 1852 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1) | 0x03}, | 1836 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03}, |
| 1853 | {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 1837 | {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
| 1854 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0}, | 1838 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0}, |
| 1855 | {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0}, | 1839 | {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0}, |
| @@ -1869,15 +1853,34 @@ static struct hda_verb cxt5051_f700_init_verbs[] = { | |||
| 1869 | /* EAPD */ | 1853 | /* EAPD */ |
| 1870 | {0x1a, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ | 1854 | {0x1a, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ |
| 1871 | {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT}, | 1855 | {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT}, |
| 1872 | {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CXT5051_PORTB_EVENT}, | ||
| 1873 | { } /* end */ | 1856 | { } /* end */ |
| 1874 | }; | 1857 | }; |
| 1875 | 1858 | ||
| 1859 | static void cxt5051_init_mic_port(struct hda_codec *codec, hda_nid_t nid, | ||
| 1860 | unsigned int event) | ||
| 1861 | { | ||
| 1862 | snd_hda_codec_write(codec, nid, 0, | ||
| 1863 | AC_VERB_SET_UNSOLICITED_ENABLE, | ||
| 1864 | AC_USRSP_EN | event); | ||
| 1865 | #ifdef CONFIG_SND_HDA_INPUT_JACK | ||
| 1866 | conexant_add_jack(codec, nid, SND_JACK_MICROPHONE); | ||
| 1867 | conexant_report_jack(codec, nid); | ||
| 1868 | #endif | ||
| 1869 | } | ||
| 1870 | |||
| 1876 | /* initialize jack-sensing, too */ | 1871 | /* initialize jack-sensing, too */ |
| 1877 | static int cxt5051_init(struct hda_codec *codec) | 1872 | static int cxt5051_init(struct hda_codec *codec) |
| 1878 | { | 1873 | { |
| 1874 | struct conexant_spec *spec = codec->spec; | ||
| 1875 | |||
| 1879 | conexant_init(codec); | 1876 | conexant_init(codec); |
| 1880 | conexant_init_jacks(codec); | 1877 | conexant_init_jacks(codec); |
| 1878 | |||
| 1879 | if (spec->auto_mic & AUTO_MIC_PORTB) | ||
| 1880 | cxt5051_init_mic_port(codec, 0x17, CXT5051_PORTB_EVENT); | ||
| 1881 | if (spec->auto_mic & AUTO_MIC_PORTC) | ||
| 1882 | cxt5051_init_mic_port(codec, 0x18, CXT5051_PORTC_EVENT); | ||
| 1883 | |||
| 1881 | if (codec->patch_ops.unsol_event) { | 1884 | if (codec->patch_ops.unsol_event) { |
| 1882 | cxt5051_hp_automute(codec); | 1885 | cxt5051_hp_automute(codec); |
| 1883 | cxt5051_portb_automic(codec); | 1886 | cxt5051_portb_automic(codec); |
| @@ -1893,6 +1896,7 @@ enum { | |||
| 1893 | CXT5051_HP_DV6736, /* HP without mic switch */ | 1896 | CXT5051_HP_DV6736, /* HP without mic switch */ |
| 1894 | CXT5051_LENOVO_X200, /* Lenovo X200 laptop */ | 1897 | CXT5051_LENOVO_X200, /* Lenovo X200 laptop */ |
| 1895 | CXT5051_F700, /* HP Compaq Presario F700 */ | 1898 | CXT5051_F700, /* HP Compaq Presario F700 */ |
| 1899 | CXT5051_TOSHIBA, /* Toshiba M300 & co */ | ||
| 1896 | CXT5051_MODELS | 1900 | CXT5051_MODELS |
| 1897 | }; | 1901 | }; |
| 1898 | 1902 | ||
| @@ -1901,17 +1905,19 @@ static const char *cxt5051_models[CXT5051_MODELS] = { | |||
| 1901 | [CXT5051_HP] = "hp", | 1905 | [CXT5051_HP] = "hp", |
| 1902 | [CXT5051_HP_DV6736] = "hp-dv6736", | 1906 | [CXT5051_HP_DV6736] = "hp-dv6736", |
| 1903 | [CXT5051_LENOVO_X200] = "lenovo-x200", | 1907 | [CXT5051_LENOVO_X200] = "lenovo-x200", |
| 1904 | [CXT5051_F700] = "hp 700" | 1908 | [CXT5051_F700] = "hp-700", |
| 1909 | [CXT5051_TOSHIBA] = "toshiba", | ||
| 1905 | }; | 1910 | }; |
| 1906 | 1911 | ||
| 1907 | static struct snd_pci_quirk cxt5051_cfg_tbl[] = { | 1912 | static struct snd_pci_quirk cxt5051_cfg_tbl[] = { |
| 1908 | SND_PCI_QUIRK(0x103c, 0x30cf, "HP DV6736", CXT5051_HP_DV6736), | 1913 | SND_PCI_QUIRK(0x103c, 0x30cf, "HP DV6736", CXT5051_HP_DV6736), |
| 1909 | SND_PCI_QUIRK(0x103c, 0x360b, "Compaq Presario CQ60", CXT5051_HP), | 1914 | SND_PCI_QUIRK(0x103c, 0x360b, "Compaq Presario CQ60", CXT5051_HP), |
| 1915 | SND_PCI_QUIRK(0x103c, 0x30ea, "Compaq Presario F700", CXT5051_F700), | ||
| 1916 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba M30x", CXT5051_TOSHIBA), | ||
| 1910 | SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board", | 1917 | SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board", |
| 1911 | CXT5051_LAPTOP), | 1918 | CXT5051_LAPTOP), |
| 1912 | SND_PCI_QUIRK(0x14f1, 0x5051, "HP Spartan 1.1", CXT5051_HP), | 1919 | SND_PCI_QUIRK(0x14f1, 0x5051, "HP Spartan 1.1", CXT5051_HP), |
| 1913 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo X200", CXT5051_LENOVO_X200), | 1920 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo X200", CXT5051_LENOVO_X200), |
| 1914 | SND_PCI_QUIRK(0x103c, 0x30ea, "Compaq Presario F700", CXT5051_F700), | ||
| 1915 | {} | 1921 | {} |
| 1916 | }; | 1922 | }; |
| 1917 | 1923 | ||
| @@ -1935,8 +1941,9 @@ static int patch_cxt5051(struct hda_codec *codec) | |||
| 1935 | spec->multiout.dig_out_nid = CXT5051_SPDIF_OUT; | 1941 | spec->multiout.dig_out_nid = CXT5051_SPDIF_OUT; |
| 1936 | spec->num_adc_nids = 1; /* not 2; via auto-mic switch */ | 1942 | spec->num_adc_nids = 1; /* not 2; via auto-mic switch */ |
| 1937 | spec->adc_nids = cxt5051_adc_nids; | 1943 | spec->adc_nids = cxt5051_adc_nids; |
| 1938 | spec->num_mixers = 1; | 1944 | spec->num_mixers = 2; |
| 1939 | spec->mixers[0] = cxt5051_mixers; | 1945 | spec->mixers[0] = cxt5051_capture_mixers; |
| 1946 | spec->mixers[1] = cxt5051_playback_mixers; | ||
| 1940 | spec->num_init_verbs = 1; | 1947 | spec->num_init_verbs = 1; |
| 1941 | spec->init_verbs[0] = cxt5051_init_verbs; | 1948 | spec->init_verbs[0] = cxt5051_init_verbs; |
| 1942 | spec->spdif_route = 0; | 1949 | spec->spdif_route = 0; |
| @@ -1950,6 +1957,7 @@ static int patch_cxt5051(struct hda_codec *codec) | |||
| 1950 | board_config = snd_hda_check_board_config(codec, CXT5051_MODELS, | 1957 | board_config = snd_hda_check_board_config(codec, CXT5051_MODELS, |
| 1951 | cxt5051_models, | 1958 | cxt5051_models, |
| 1952 | cxt5051_cfg_tbl); | 1959 | cxt5051_cfg_tbl); |
| 1960 | spec->auto_mic = AUTO_MIC_PORTB | AUTO_MIC_PORTC; | ||
| 1953 | switch (board_config) { | 1961 | switch (board_config) { |
| 1954 | case CXT5051_HP: | 1962 | case CXT5051_HP: |
| 1955 | spec->mixers[0] = cxt5051_hp_mixers; | 1963 | spec->mixers[0] = cxt5051_hp_mixers; |
| @@ -1957,7 +1965,7 @@ static int patch_cxt5051(struct hda_codec *codec) | |||
| 1957 | case CXT5051_HP_DV6736: | 1965 | case CXT5051_HP_DV6736: |
| 1958 | spec->init_verbs[0] = cxt5051_hp_dv6736_init_verbs; | 1966 | spec->init_verbs[0] = cxt5051_hp_dv6736_init_verbs; |
| 1959 | spec->mixers[0] = cxt5051_hp_dv6736_mixers; | 1967 | spec->mixers[0] = cxt5051_hp_dv6736_mixers; |
| 1960 | spec->no_auto_mic = 1; | 1968 | spec->auto_mic = 0; |
| 1961 | break; | 1969 | break; |
| 1962 | case CXT5051_LENOVO_X200: | 1970 | case CXT5051_LENOVO_X200: |
| 1963 | spec->init_verbs[0] = cxt5051_lenovo_x200_init_verbs; | 1971 | spec->init_verbs[0] = cxt5051_lenovo_x200_init_verbs; |
| @@ -1965,7 +1973,11 @@ static int patch_cxt5051(struct hda_codec *codec) | |||
| 1965 | case CXT5051_F700: | 1973 | case CXT5051_F700: |
| 1966 | spec->init_verbs[0] = cxt5051_f700_init_verbs; | 1974 | spec->init_verbs[0] = cxt5051_f700_init_verbs; |
| 1967 | spec->mixers[0] = cxt5051_f700_mixers; | 1975 | spec->mixers[0] = cxt5051_f700_mixers; |
| 1968 | spec->no_auto_mic = 1; | 1976 | spec->auto_mic = 0; |
| 1977 | break; | ||
| 1978 | case CXT5051_TOSHIBA: | ||
| 1979 | spec->mixers[0] = cxt5051_toshiba_mixers; | ||
| 1980 | spec->auto_mic = AUTO_MIC_PORTB; | ||
| 1969 | break; | 1981 | break; |
| 1970 | } | 1982 | } |
| 1971 | 1983 | ||
| @@ -2156,6 +2168,34 @@ static void cxt5066_vostro_automic(struct hda_codec *codec) | |||
| 2156 | } | 2168 | } |
| 2157 | } | 2169 | } |
| 2158 | 2170 | ||
| 2171 | /* toggle input of built-in digital mic and mic jack appropriately */ | ||
| 2172 | static void cxt5066_ideapad_automic(struct hda_codec *codec) | ||
| 2173 | { | ||
| 2174 | unsigned int present; | ||
| 2175 | |||
| 2176 | struct hda_verb ext_mic_present[] = { | ||
| 2177 | {0x14, AC_VERB_SET_CONNECT_SEL, 0}, | ||
| 2178 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
| 2179 | {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, | ||
| 2180 | {} | ||
| 2181 | }; | ||
| 2182 | static struct hda_verb ext_mic_absent[] = { | ||
| 2183 | {0x14, AC_VERB_SET_CONNECT_SEL, 2}, | ||
| 2184 | {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
| 2185 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, | ||
| 2186 | {} | ||
| 2187 | }; | ||
| 2188 | |||
| 2189 | present = snd_hda_jack_detect(codec, 0x1b); | ||
| 2190 | if (present) { | ||
| 2191 | snd_printdd("CXT5066: external microphone detected\n"); | ||
| 2192 | snd_hda_sequence_write(codec, ext_mic_present); | ||
| 2193 | } else { | ||
| 2194 | snd_printdd("CXT5066: external microphone absent\n"); | ||
| 2195 | snd_hda_sequence_write(codec, ext_mic_absent); | ||
| 2196 | } | ||
| 2197 | } | ||
| 2198 | |||
| 2159 | /* mute internal speaker if HP is plugged */ | 2199 | /* mute internal speaker if HP is plugged */ |
| 2160 | static void cxt5066_hp_automute(struct hda_codec *codec) | 2200 | static void cxt5066_hp_automute(struct hda_codec *codec) |
| 2161 | { | 2201 | { |
| @@ -2205,6 +2245,20 @@ static void cxt5066_vostro_event(struct hda_codec *codec, unsigned int res) | |||
| 2205 | } | 2245 | } |
| 2206 | } | 2246 | } |
| 2207 | 2247 | ||
| 2248 | /* unsolicited event for jack sensing */ | ||
| 2249 | static void cxt5066_ideapad_event(struct hda_codec *codec, unsigned int res) | ||
| 2250 | { | ||
| 2251 | snd_printdd("CXT5066_ideapad: unsol event %x (%x)\n", res, res >> 26); | ||
| 2252 | switch (res >> 26) { | ||
| 2253 | case CONEXANT_HP_EVENT: | ||
| 2254 | cxt5066_hp_automute(codec); | ||
| 2255 | break; | ||
| 2256 | case CONEXANT_MIC_EVENT: | ||
| 2257 | cxt5066_ideapad_automic(codec); | ||
| 2258 | break; | ||
| 2259 | } | ||
| 2260 | } | ||
| 2261 | |||
| 2208 | static const struct hda_input_mux cxt5066_analog_mic_boost = { | 2262 | static const struct hda_input_mux cxt5066_analog_mic_boost = { |
| 2209 | .num_items = 5, | 2263 | .num_items = 5, |
| 2210 | .items = { | 2264 | .items = { |
| @@ -2216,13 +2270,21 @@ static const struct hda_input_mux cxt5066_analog_mic_boost = { | |||
| 2216 | }, | 2270 | }, |
| 2217 | }; | 2271 | }; |
| 2218 | 2272 | ||
| 2219 | static int cxt5066_set_mic_boost(struct hda_codec *codec) | 2273 | static void cxt5066_set_mic_boost(struct hda_codec *codec) |
| 2220 | { | 2274 | { |
| 2221 | struct conexant_spec *spec = codec->spec; | 2275 | struct conexant_spec *spec = codec->spec; |
| 2222 | return snd_hda_codec_write_cache(codec, 0x17, 0, | 2276 | snd_hda_codec_write_cache(codec, 0x17, 0, |
| 2223 | AC_VERB_SET_AMP_GAIN_MUTE, | 2277 | AC_VERB_SET_AMP_GAIN_MUTE, |
| 2224 | AC_AMP_SET_RIGHT | AC_AMP_SET_LEFT | AC_AMP_SET_OUTPUT | | 2278 | AC_AMP_SET_RIGHT | AC_AMP_SET_LEFT | AC_AMP_SET_OUTPUT | |
| 2225 | cxt5066_analog_mic_boost.items[spec->mic_boost].index); | 2279 | cxt5066_analog_mic_boost.items[spec->mic_boost].index); |
| 2280 | if (spec->ideapad) { | ||
| 2281 | /* adjust the internal mic as well...it is not through 0x17 */ | ||
| 2282 | snd_hda_codec_write_cache(codec, 0x23, 0, | ||
| 2283 | AC_VERB_SET_AMP_GAIN_MUTE, | ||
| 2284 | AC_AMP_SET_RIGHT | AC_AMP_SET_LEFT | AC_AMP_SET_INPUT | | ||
| 2285 | cxt5066_analog_mic_boost. | ||
| 2286 | items[spec->mic_boost].index); | ||
| 2287 | } | ||
| 2226 | } | 2288 | } |
| 2227 | 2289 | ||
| 2228 | static int cxt5066_mic_boost_mux_enum_info(struct snd_kcontrol *kcontrol, | 2290 | static int cxt5066_mic_boost_mux_enum_info(struct snd_kcontrol *kcontrol, |
| @@ -2653,6 +2715,56 @@ static struct hda_verb cxt5066_init_verbs_vostro[] = { | |||
| 2653 | { } /* end */ | 2715 | { } /* end */ |
| 2654 | }; | 2716 | }; |
| 2655 | 2717 | ||
| 2718 | static struct hda_verb cxt5066_init_verbs_ideapad[] = { | ||
| 2719 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, /* Port B */ | ||
| 2720 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, /* Port C */ | ||
| 2721 | {0x1e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Port F */ | ||
| 2722 | {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Port E */ | ||
| 2723 | |||
| 2724 | /* Speakers */ | ||
| 2725 | {0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
| 2726 | {0x1f, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */ | ||
| 2727 | |||
| 2728 | /* HP, Amp */ | ||
| 2729 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
| 2730 | {0x19, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */ | ||
| 2731 | |||
| 2732 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
| 2733 | {0x1c, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */ | ||
| 2734 | |||
| 2735 | /* DAC1 */ | ||
| 2736 | {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 2737 | |||
| 2738 | /* Node 14 connections: 0x17 0x18 0x23 0x24 0x27 */ | ||
| 2739 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x50}, | ||
| 2740 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
| 2741 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2) | 0x50}, | ||
| 2742 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
| 2743 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
| 2744 | {0x14, AC_VERB_SET_CONNECT_SEL, 2}, /* default to internal mic */ | ||
| 2745 | |||
| 2746 | /* Audio input selector */ | ||
| 2747 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x2}, | ||
| 2748 | {0x17, AC_VERB_SET_CONNECT_SEL, 1}, /* route ext mic */ | ||
| 2749 | |||
| 2750 | /* SPDIF route: PCM */ | ||
| 2751 | {0x20, AC_VERB_SET_CONNECT_SEL, 0x0}, | ||
| 2752 | {0x22, AC_VERB_SET_CONNECT_SEL, 0x0}, | ||
| 2753 | |||
| 2754 | {0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
| 2755 | {0x22, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
| 2756 | |||
| 2757 | /* internal microphone */ | ||
| 2758 | {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* enable int mic */ | ||
| 2759 | |||
| 2760 | /* EAPD */ | ||
| 2761 | {0x1d, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ | ||
| 2762 | |||
| 2763 | {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT}, | ||
| 2764 | {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT}, | ||
| 2765 | { } /* end */ | ||
| 2766 | }; | ||
| 2767 | |||
| 2656 | static struct hda_verb cxt5066_init_verbs_portd_lo[] = { | 2768 | static struct hda_verb cxt5066_init_verbs_portd_lo[] = { |
| 2657 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | 2769 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
| 2658 | { } /* end */ | 2770 | { } /* end */ |
| @@ -2669,6 +2781,8 @@ static int cxt5066_init(struct hda_codec *codec) | |||
| 2669 | cxt5066_hp_automute(codec); | 2781 | cxt5066_hp_automute(codec); |
| 2670 | if (spec->dell_vostro) | 2782 | if (spec->dell_vostro) |
| 2671 | cxt5066_vostro_automic(codec); | 2783 | cxt5066_vostro_automic(codec); |
| 2784 | else if (spec->ideapad) | ||
| 2785 | cxt5066_ideapad_automic(codec); | ||
| 2672 | } | 2786 | } |
| 2673 | cxt5066_set_mic_boost(codec); | 2787 | cxt5066_set_mic_boost(codec); |
| 2674 | return 0; | 2788 | return 0; |
| @@ -2694,6 +2808,7 @@ enum { | |||
| 2694 | CXT5066_DELL_LAPTOP, /* Dell Laptop */ | 2808 | CXT5066_DELL_LAPTOP, /* Dell Laptop */ |
| 2695 | CXT5066_OLPC_XO_1_5, /* OLPC XO 1.5 */ | 2809 | CXT5066_OLPC_XO_1_5, /* OLPC XO 1.5 */ |
| 2696 | CXT5066_DELL_VOSTO, /* Dell Vostro 1015i */ | 2810 | CXT5066_DELL_VOSTO, /* Dell Vostro 1015i */ |
| 2811 | CXT5066_IDEAPAD, /* Lenovo IdeaPad U150 */ | ||
| 2697 | CXT5066_MODELS | 2812 | CXT5066_MODELS |
| 2698 | }; | 2813 | }; |
| 2699 | 2814 | ||
| @@ -2701,7 +2816,8 @@ static const char *cxt5066_models[CXT5066_MODELS] = { | |||
| 2701 | [CXT5066_LAPTOP] = "laptop", | 2816 | [CXT5066_LAPTOP] = "laptop", |
| 2702 | [CXT5066_DELL_LAPTOP] = "dell-laptop", | 2817 | [CXT5066_DELL_LAPTOP] = "dell-laptop", |
| 2703 | [CXT5066_OLPC_XO_1_5] = "olpc-xo-1_5", | 2818 | [CXT5066_OLPC_XO_1_5] = "olpc-xo-1_5", |
| 2704 | [CXT5066_DELL_VOSTO] = "dell-vostro" | 2819 | [CXT5066_DELL_VOSTO] = "dell-vostro", |
| 2820 | [CXT5066_IDEAPAD] = "ideapad", | ||
| 2705 | }; | 2821 | }; |
| 2706 | 2822 | ||
| 2707 | static struct snd_pci_quirk cxt5066_cfg_tbl[] = { | 2823 | static struct snd_pci_quirk cxt5066_cfg_tbl[] = { |
| @@ -2711,6 +2827,7 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = { | |||
| 2711 | CXT5066_DELL_LAPTOP), | 2827 | CXT5066_DELL_LAPTOP), |
| 2712 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), | 2828 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), |
| 2713 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), | 2829 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), |
| 2830 | SND_PCI_QUIRK(0x17aa, 0x3a0d, "ideapad", CXT5066_IDEAPAD), | ||
| 2714 | {} | 2831 | {} |
| 2715 | }; | 2832 | }; |
| 2716 | 2833 | ||
| @@ -2802,6 +2919,22 @@ static int patch_cxt5066(struct hda_codec *codec) | |||
| 2802 | /* input source automatically selected */ | 2919 | /* input source automatically selected */ |
| 2803 | spec->input_mux = NULL; | 2920 | spec->input_mux = NULL; |
| 2804 | break; | 2921 | break; |
| 2922 | case CXT5066_IDEAPAD: | ||
| 2923 | codec->patch_ops.init = cxt5066_init; | ||
| 2924 | codec->patch_ops.unsol_event = cxt5066_ideapad_event; | ||
| 2925 | spec->mixers[spec->num_mixers++] = cxt5066_mixer_master; | ||
| 2926 | spec->mixers[spec->num_mixers++] = cxt5066_mixers; | ||
| 2927 | spec->init_verbs[0] = cxt5066_init_verbs_ideapad; | ||
| 2928 | spec->port_d_mode = 0; | ||
| 2929 | spec->ideapad = 1; | ||
| 2930 | spec->mic_boost = 2; /* default 20dB gain */ | ||
| 2931 | |||
| 2932 | /* no S/PDIF out */ | ||
| 2933 | spec->multiout.dig_out_nid = 0; | ||
| 2934 | |||
| 2935 | /* input source automatically selected */ | ||
| 2936 | spec->input_mux = NULL; | ||
| 2937 | break; | ||
| 2805 | } | 2938 | } |
| 2806 | 2939 | ||
| 2807 | return 0; | 2940 | return 0; |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index f628c33d80b3..e8cbe216e912 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -131,8 +131,10 @@ enum { | |||
| 131 | enum { | 131 | enum { |
| 132 | ALC269_BASIC, | 132 | ALC269_BASIC, |
| 133 | ALC269_QUANTA_FL1, | 133 | ALC269_QUANTA_FL1, |
| 134 | ALC269_ASUS_AMIC, | 134 | ALC269_AMIC, |
| 135 | ALC269_ASUS_DMIC, | 135 | ALC269_DMIC, |
| 136 | ALC269VB_AMIC, | ||
| 137 | ALC269VB_DMIC, | ||
| 136 | ALC269_FUJITSU, | 138 | ALC269_FUJITSU, |
| 137 | ALC269_LIFEBOOK, | 139 | ALC269_LIFEBOOK, |
| 138 | ALC269_AUTO, | 140 | ALC269_AUTO, |
| @@ -207,8 +209,10 @@ enum { | |||
| 207 | ALC882_ASUS_A7J, | 209 | ALC882_ASUS_A7J, |
| 208 | ALC882_ASUS_A7M, | 210 | ALC882_ASUS_A7M, |
| 209 | ALC885_MACPRO, | 211 | ALC885_MACPRO, |
| 212 | ALC885_MBA21, | ||
| 210 | ALC885_MBP3, | 213 | ALC885_MBP3, |
| 211 | ALC885_MB5, | 214 | ALC885_MB5, |
| 215 | ALC885_MACMINI3, | ||
| 212 | ALC885_IMAC24, | 216 | ALC885_IMAC24, |
| 213 | ALC885_IMAC91, | 217 | ALC885_IMAC91, |
| 214 | ALC883_3ST_2ch_DIG, | 218 | ALC883_3ST_2ch_DIG, |
| @@ -841,27 +845,6 @@ static void add_verb(struct alc_spec *spec, const struct hda_verb *verb) | |||
| 841 | spec->init_verbs[spec->num_init_verbs++] = verb; | 845 | spec->init_verbs[spec->num_init_verbs++] = verb; |
| 842 | } | 846 | } |
| 843 | 847 | ||
| 844 | #ifdef CONFIG_PROC_FS | ||
| 845 | /* | ||
| 846 | * hook for proc | ||
| 847 | */ | ||
| 848 | static void print_realtek_coef(struct snd_info_buffer *buffer, | ||
| 849 | struct hda_codec *codec, hda_nid_t nid) | ||
| 850 | { | ||
| 851 | int coeff; | ||
| 852 | |||
| 853 | if (nid != 0x20) | ||
| 854 | return; | ||
| 855 | coeff = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0); | ||
| 856 | snd_iprintf(buffer, " Processing Coefficient: 0x%02x\n", coeff); | ||
| 857 | coeff = snd_hda_codec_read(codec, nid, 0, | ||
| 858 | AC_VERB_GET_COEF_INDEX, 0); | ||
| 859 | snd_iprintf(buffer, " Coefficient Index: 0x%02x\n", coeff); | ||
| 860 | } | ||
| 861 | #else | ||
| 862 | #define print_realtek_coef NULL | ||
| 863 | #endif | ||
| 864 | |||
| 865 | /* | 848 | /* |
| 866 | * set up from the preset table | 849 | * set up from the preset table |
| 867 | */ | 850 | */ |
| @@ -1166,6 +1149,7 @@ static void alc_auto_init_amp(struct hda_codec *codec, int type) | |||
| 1166 | case 0x10ec0888: | 1149 | case 0x10ec0888: |
| 1167 | alc888_coef_init(codec); | 1150 | alc888_coef_init(codec); |
| 1168 | break; | 1151 | break; |
| 1152 | #if 0 /* XXX: This may cause the silent output on speaker on some machines */ | ||
| 1169 | case 0x10ec0267: | 1153 | case 0x10ec0267: |
| 1170 | case 0x10ec0268: | 1154 | case 0x10ec0268: |
| 1171 | snd_hda_codec_write(codec, 0x20, 0, | 1155 | snd_hda_codec_write(codec, 0x20, 0, |
| @@ -1178,6 +1162,7 @@ static void alc_auto_init_amp(struct hda_codec *codec, int type) | |||
| 1178 | AC_VERB_SET_PROC_COEF, | 1162 | AC_VERB_SET_PROC_COEF, |
| 1179 | tmp | 0x3000); | 1163 | tmp | 0x3000); |
| 1180 | break; | 1164 | break; |
| 1165 | #endif /* XXX */ | ||
| 1181 | } | 1166 | } |
| 1182 | break; | 1167 | break; |
| 1183 | } | 1168 | } |
| @@ -1269,7 +1254,7 @@ static void alc_init_auto_mic(struct hda_codec *codec) | |||
| 1269 | */ | 1254 | */ |
| 1270 | static int alc_subsystem_id(struct hda_codec *codec, | 1255 | static int alc_subsystem_id(struct hda_codec *codec, |
| 1271 | hda_nid_t porta, hda_nid_t porte, | 1256 | hda_nid_t porta, hda_nid_t porte, |
| 1272 | hda_nid_t portd) | 1257 | hda_nid_t portd, hda_nid_t porti) |
| 1273 | { | 1258 | { |
| 1274 | unsigned int ass, tmp, i; | 1259 | unsigned int ass, tmp, i; |
| 1275 | unsigned nid; | 1260 | unsigned nid; |
| @@ -1295,7 +1280,7 @@ static int alc_subsystem_id(struct hda_codec *codec, | |||
| 1295 | snd_printd("realtek: No valid SSID, " | 1280 | snd_printd("realtek: No valid SSID, " |
| 1296 | "checking pincfg 0x%08x for NID 0x%x\n", | 1281 | "checking pincfg 0x%08x for NID 0x%x\n", |
| 1297 | ass, nid); | 1282 | ass, nid); |
| 1298 | if (!(ass & 1) && !(ass & 0x100000)) | 1283 | if (!(ass & 1)) |
| 1299 | return 0; | 1284 | return 0; |
| 1300 | if ((ass >> 30) != 1) /* no physical connection */ | 1285 | if ((ass >> 30) != 1) /* no physical connection */ |
| 1301 | return 0; | 1286 | return 0; |
| @@ -1355,6 +1340,8 @@ do_sku: | |||
| 1355 | nid = porte; | 1340 | nid = porte; |
| 1356 | else if (tmp == 2) | 1341 | else if (tmp == 2) |
| 1357 | nid = portd; | 1342 | nid = portd; |
| 1343 | else if (tmp == 3) | ||
| 1344 | nid = porti; | ||
| 1358 | else | 1345 | else |
| 1359 | return 1; | 1346 | return 1; |
| 1360 | for (i = 0; i < spec->autocfg.line_outs; i++) | 1347 | for (i = 0; i < spec->autocfg.line_outs; i++) |
| @@ -1369,9 +1356,10 @@ do_sku: | |||
| 1369 | } | 1356 | } |
| 1370 | 1357 | ||
| 1371 | static void alc_ssid_check(struct hda_codec *codec, | 1358 | static void alc_ssid_check(struct hda_codec *codec, |
| 1372 | hda_nid_t porta, hda_nid_t porte, hda_nid_t portd) | 1359 | hda_nid_t porta, hda_nid_t porte, |
| 1360 | hda_nid_t portd, hda_nid_t porti) | ||
| 1373 | { | 1361 | { |
| 1374 | if (!alc_subsystem_id(codec, porta, porte, portd)) { | 1362 | if (!alc_subsystem_id(codec, porta, porte, portd, porti)) { |
| 1375 | struct alc_spec *spec = codec->spec; | 1363 | struct alc_spec *spec = codec->spec; |
| 1376 | snd_printd("realtek: " | 1364 | snd_printd("realtek: " |
| 1377 | "Enable default setup for auto mode as fallback\n"); | 1365 | "Enable default setup for auto mode as fallback\n"); |
| @@ -3729,25 +3717,22 @@ static void alc_power_eapd(struct hda_codec *codec) | |||
| 3729 | /* We currently only handle front, HP */ | 3717 | /* We currently only handle front, HP */ |
| 3730 | switch (codec->vendor_id) { | 3718 | switch (codec->vendor_id) { |
| 3731 | case 0x10ec0260: | 3719 | case 0x10ec0260: |
| 3732 | snd_hda_codec_write(codec, 0x0f, 0, | 3720 | set_eapd(codec, 0x0f, 0); |
| 3733 | AC_VERB_SET_EAPD_BTLENABLE, 0x00); | 3721 | set_eapd(codec, 0x10, 0); |
| 3734 | snd_hda_codec_write(codec, 0x10, 0, | ||
| 3735 | AC_VERB_SET_EAPD_BTLENABLE, 0x00); | ||
| 3736 | break; | 3722 | break; |
| 3737 | case 0x10ec0262: | 3723 | case 0x10ec0262: |
| 3738 | case 0x10ec0267: | 3724 | case 0x10ec0267: |
| 3739 | case 0x10ec0268: | 3725 | case 0x10ec0268: |
| 3740 | case 0x10ec0269: | 3726 | case 0x10ec0269: |
| 3727 | case 0x10ec0270: | ||
| 3741 | case 0x10ec0272: | 3728 | case 0x10ec0272: |
| 3742 | case 0x10ec0660: | 3729 | case 0x10ec0660: |
| 3743 | case 0x10ec0662: | 3730 | case 0x10ec0662: |
| 3744 | case 0x10ec0663: | 3731 | case 0x10ec0663: |
| 3745 | case 0x10ec0862: | 3732 | case 0x10ec0862: |
| 3746 | case 0x10ec0889: | 3733 | case 0x10ec0889: |
| 3747 | snd_hda_codec_write(codec, 0x14, 0, | 3734 | set_eapd(codec, 0x14, 0); |
| 3748 | AC_VERB_SET_EAPD_BTLENABLE, 0x00); | 3735 | set_eapd(codec, 0x15, 0); |
| 3749 | snd_hda_codec_write(codec, 0x15, 0, | ||
| 3750 | AC_VERB_SET_EAPD_BTLENABLE, 0x00); | ||
| 3751 | break; | 3736 | break; |
| 3752 | } | 3737 | } |
| 3753 | } | 3738 | } |
| @@ -4877,7 +4862,7 @@ static int alc880_parse_auto_config(struct hda_codec *codec) | |||
| 4877 | spec->num_mux_defs = 1; | 4862 | spec->num_mux_defs = 1; |
| 4878 | spec->input_mux = &spec->private_imux[0]; | 4863 | spec->input_mux = &spec->private_imux[0]; |
| 4879 | 4864 | ||
| 4880 | alc_ssid_check(codec, 0x15, 0x1b, 0x14); | 4865 | alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0); |
| 4881 | 4866 | ||
| 4882 | return 1; | 4867 | return 1; |
| 4883 | } | 4868 | } |
| @@ -5081,7 +5066,6 @@ static int patch_alc880(struct hda_codec *codec) | |||
| 5081 | if (!spec->loopback.amplist) | 5066 | if (!spec->loopback.amplist) |
| 5082 | spec->loopback.amplist = alc880_loopbacks; | 5067 | spec->loopback.amplist = alc880_loopbacks; |
| 5083 | #endif | 5068 | #endif |
| 5084 | codec->proc_widget_hook = print_realtek_coef; | ||
| 5085 | 5069 | ||
| 5086 | return 0; | 5070 | return 0; |
| 5087 | } | 5071 | } |
| @@ -6412,7 +6396,7 @@ static int alc260_parse_auto_config(struct hda_codec *codec) | |||
| 6412 | spec->num_mux_defs = 1; | 6396 | spec->num_mux_defs = 1; |
| 6413 | spec->input_mux = &spec->private_imux[0]; | 6397 | spec->input_mux = &spec->private_imux[0]; |
| 6414 | 6398 | ||
| 6415 | alc_ssid_check(codec, 0x10, 0x15, 0x0f); | 6399 | alc_ssid_check(codec, 0x10, 0x15, 0x0f, 0); |
| 6416 | 6400 | ||
| 6417 | return 1; | 6401 | return 1; |
| 6418 | } | 6402 | } |
| @@ -6691,7 +6675,6 @@ static int patch_alc260(struct hda_codec *codec) | |||
| 6691 | if (!spec->loopback.amplist) | 6675 | if (!spec->loopback.amplist) |
| 6692 | spec->loopback.amplist = alc260_loopbacks; | 6676 | spec->loopback.amplist = alc260_loopbacks; |
| 6693 | #endif | 6677 | #endif |
| 6694 | codec->proc_widget_hook = print_realtek_coef; | ||
| 6695 | 6678 | ||
| 6696 | return 0; | 6679 | return 0; |
| 6697 | } | 6680 | } |
| @@ -6773,6 +6756,14 @@ static struct hda_input_mux mb5_capture_source = { | |||
| 6773 | }, | 6756 | }, |
| 6774 | }; | 6757 | }; |
| 6775 | 6758 | ||
| 6759 | static struct hda_input_mux macmini3_capture_source = { | ||
| 6760 | .num_items = 2, | ||
| 6761 | .items = { | ||
| 6762 | { "Line", 0x2 }, | ||
| 6763 | { "CD", 0x4 }, | ||
| 6764 | }, | ||
| 6765 | }; | ||
| 6766 | |||
| 6776 | static struct hda_input_mux alc883_3stack_6ch_intel = { | 6767 | static struct hda_input_mux alc883_3stack_6ch_intel = { |
| 6777 | .num_items = 4, | 6768 | .num_items = 4, |
| 6778 | .items = { | 6769 | .items = { |
| @@ -6961,6 +6952,13 @@ static struct hda_channel_mode alc882_sixstack_modes[2] = { | |||
| 6961 | { 8, alc882_sixstack_ch8_init }, | 6952 | { 8, alc882_sixstack_ch8_init }, |
| 6962 | }; | 6953 | }; |
| 6963 | 6954 | ||
| 6955 | |||
| 6956 | /* Macbook Air 2,1 */ | ||
| 6957 | |||
| 6958 | static struct hda_channel_mode alc885_mba21_ch_modes[1] = { | ||
| 6959 | { 2, NULL }, | ||
| 6960 | }; | ||
| 6961 | |||
| 6964 | /* | 6962 | /* |
| 6965 | * macbook pro ALC885 can switch LineIn to LineOut without losing Mic | 6963 | * macbook pro ALC885 can switch LineIn to LineOut without losing Mic |
| 6966 | */ | 6964 | */ |
| @@ -7021,6 +7019,7 @@ static struct hda_channel_mode alc885_mb5_6ch_modes[2] = { | |||
| 7021 | { 6, alc885_mb5_ch6_init }, | 7019 | { 6, alc885_mb5_ch6_init }, |
| 7022 | }; | 7020 | }; |
| 7023 | 7021 | ||
| 7022 | #define alc885_macmini3_6ch_modes alc885_mb5_6ch_modes | ||
| 7024 | 7023 | ||
| 7025 | /* | 7024 | /* |
| 7026 | * 2ch mode | 7025 | * 2ch mode |
| @@ -7232,6 +7231,15 @@ static struct snd_kcontrol_new alc882_base_mixer[] = { | |||
| 7232 | { } /* end */ | 7231 | { } /* end */ |
| 7233 | }; | 7232 | }; |
| 7234 | 7233 | ||
| 7234 | /* Macbook Air 2,1 same control for HP and internal Speaker */ | ||
| 7235 | |||
| 7236 | static struct snd_kcontrol_new alc885_mba21_mixer[] = { | ||
| 7237 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT), | ||
| 7238 | HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT), | ||
| 7239 | { } | ||
| 7240 | }; | ||
| 7241 | |||
| 7242 | |||
| 7235 | static struct snd_kcontrol_new alc885_mbp3_mixer[] = { | 7243 | static struct snd_kcontrol_new alc885_mbp3_mixer[] = { |
| 7236 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT), | 7244 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT), |
| 7237 | HDA_BIND_MUTE ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT), | 7245 | HDA_BIND_MUTE ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT), |
| @@ -7265,6 +7273,21 @@ static struct snd_kcontrol_new alc885_mb5_mixer[] = { | |||
| 7265 | { } /* end */ | 7273 | { } /* end */ |
| 7266 | }; | 7274 | }; |
| 7267 | 7275 | ||
| 7276 | static struct snd_kcontrol_new alc885_macmini3_mixer[] = { | ||
| 7277 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), | ||
| 7278 | HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT), | ||
| 7279 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT), | ||
| 7280 | HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT), | ||
| 7281 | HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT), | ||
| 7282 | HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT), | ||
| 7283 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT), | ||
| 7284 | HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT), | ||
| 7285 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT), | ||
| 7286 | HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT), | ||
| 7287 | HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT), | ||
| 7288 | { } /* end */ | ||
| 7289 | }; | ||
| 7290 | |||
| 7268 | static struct snd_kcontrol_new alc885_imac91_mixer[] = { | 7291 | static struct snd_kcontrol_new alc885_imac91_mixer[] = { |
| 7269 | HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0c, 0x00, HDA_OUTPUT), | 7292 | HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0c, 0x00, HDA_OUTPUT), |
| 7270 | HDA_BIND_MUTE ("Line-Out Playback Switch", 0x0c, 0x02, HDA_INPUT), | 7293 | HDA_BIND_MUTE ("Line-Out Playback Switch", 0x0c, 0x02, HDA_INPUT), |
| @@ -7356,29 +7379,18 @@ static struct snd_kcontrol_new alc882_chmode_mixer[] = { | |||
| 7356 | 7379 | ||
| 7357 | static struct hda_verb alc882_base_init_verbs[] = { | 7380 | static struct hda_verb alc882_base_init_verbs[] = { |
| 7358 | /* Front mixer: unmute input/output amp left and right (volume = 0) */ | 7381 | /* Front mixer: unmute input/output amp left and right (volume = 0) */ |
| 7359 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 7360 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 7382 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, |
| 7361 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | 7383 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, |
| 7362 | /* Rear mixer */ | 7384 | /* Rear mixer */ |
| 7363 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 7364 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 7385 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, |
| 7365 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | 7386 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, |
| 7366 | /* CLFE mixer */ | 7387 | /* CLFE mixer */ |
| 7367 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 7368 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 7388 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, |
| 7369 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | 7389 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, |
| 7370 | /* Side mixer */ | 7390 | /* Side mixer */ |
| 7371 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 7372 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 7391 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, |
| 7373 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | 7392 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, |
| 7374 | 7393 | ||
| 7375 | /* mute analog input loopbacks */ | ||
| 7376 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
| 7377 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
| 7378 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
| 7379 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
| 7380 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
| 7381 | |||
| 7382 | /* Front Pin: output 0 (0x0c) */ | 7394 | /* Front Pin: output 0 (0x0c) */ |
| 7383 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | 7395 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
| 7384 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 7396 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| @@ -7415,14 +7427,8 @@ static struct hda_verb alc882_base_init_verbs[] = { | |||
| 7415 | /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ | 7427 | /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ |
| 7416 | /* Input mixer2 */ | 7428 | /* Input mixer2 */ |
| 7417 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 7429 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
| 7418 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
| 7419 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
| 7420 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
| 7421 | /* Input mixer3 */ | 7430 | /* Input mixer3 */ |
| 7422 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 7431 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
| 7423 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
| 7424 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
| 7425 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
| 7426 | /* ADC2: mute amp left and right */ | 7432 | /* ADC2: mute amp left and right */ |
| 7427 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 7433 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, |
| 7428 | {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, | 7434 | {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, |
| @@ -7466,26 +7472,17 @@ static struct hda_verb alc_hp15_unsol_verbs[] = { | |||
| 7466 | 7472 | ||
| 7467 | static struct hda_verb alc885_init_verbs[] = { | 7473 | static struct hda_verb alc885_init_verbs[] = { |
| 7468 | /* Front mixer: unmute input/output amp left and right (volume = 0) */ | 7474 | /* Front mixer: unmute input/output amp left and right (volume = 0) */ |
| 7469 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 7475 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
| 7470 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 7476 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, |
| 7471 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
| 7472 | /* Rear mixer */ | 7477 | /* Rear mixer */ |
| 7473 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 7478 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
| 7474 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 7479 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, |
| 7475 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
| 7476 | /* CLFE mixer */ | 7480 | /* CLFE mixer */ |
| 7477 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 7481 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
| 7478 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 7482 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, |
| 7479 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
| 7480 | /* Side mixer */ | 7483 | /* Side mixer */ |
| 7481 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 7484 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
| 7482 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 7485 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, |
| 7483 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
| 7484 | |||
| 7485 | /* mute analog input loopbacks */ | ||
| 7486 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
| 7487 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
| 7488 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
| 7489 | 7486 | ||
| 7490 | /* Front HP Pin: output 0 (0x0c) */ | 7487 | /* Front HP Pin: output 0 (0x0c) */ |
| 7491 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | 7488 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, |
| @@ -7519,17 +7516,11 @@ static struct hda_verb alc885_init_verbs[] = { | |||
| 7519 | 7516 | ||
| 7520 | /* Mixer elements: 0x18, , 0x1a, 0x1b */ | 7517 | /* Mixer elements: 0x18, , 0x1a, 0x1b */ |
| 7521 | /* Input mixer1 */ | 7518 | /* Input mixer1 */ |
| 7522 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, | 7519 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
| 7523 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
| 7524 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
| 7525 | /* Input mixer2 */ | 7520 | /* Input mixer2 */ |
| 7526 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 7521 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
| 7527 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
| 7528 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
| 7529 | /* Input mixer3 */ | 7522 | /* Input mixer3 */ |
| 7530 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, | 7523 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
| 7531 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
| 7532 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
| 7533 | /* ADC2: mute amp left and right */ | 7524 | /* ADC2: mute amp left and right */ |
| 7534 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 7525 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, |
| 7535 | /* ADC3: mute amp left and right */ | 7526 | /* ADC3: mute amp left and right */ |
| @@ -7671,6 +7662,76 @@ static struct hda_verb alc885_mb5_init_verbs[] = { | |||
| 7671 | { } | 7662 | { } |
| 7672 | }; | 7663 | }; |
| 7673 | 7664 | ||
| 7665 | /* Macmini 3,1 */ | ||
| 7666 | static struct hda_verb alc885_macmini3_init_verbs[] = { | ||
| 7667 | /* DACs */ | ||
| 7668 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 7669 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 7670 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 7671 | {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 7672 | /* Front mixer */ | ||
| 7673 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 7674 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
| 7675 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
| 7676 | /* Surround mixer */ | ||
| 7677 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 7678 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
| 7679 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
| 7680 | /* LFE mixer */ | ||
| 7681 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 7682 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
| 7683 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
| 7684 | /* HP mixer */ | ||
| 7685 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 7686 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
| 7687 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
| 7688 | /* Front Pin (0x0c) */ | ||
| 7689 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01}, | ||
| 7690 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 7691 | {0x18, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
| 7692 | /* LFE Pin (0x0e) */ | ||
| 7693 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01}, | ||
| 7694 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 7695 | {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, | ||
| 7696 | /* HP Pin (0x0f) */ | ||
| 7697 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
| 7698 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 7699 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x03}, | ||
| 7700 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | ||
| 7701 | /* Line In pin */ | ||
| 7702 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
| 7703 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
| 7704 | |||
| 7705 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
| 7706 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
| 7707 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
| 7708 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
| 7709 | { } | ||
| 7710 | }; | ||
| 7711 | |||
| 7712 | |||
| 7713 | static struct hda_verb alc885_mba21_init_verbs[] = { | ||
| 7714 | /*Internal and HP Speaker Mixer*/ | ||
| 7715 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 7716 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 7717 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
| 7718 | /*Internal Speaker Pin (0x0c)*/ | ||
| 7719 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) }, | ||
| 7720 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 7721 | {0x18, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
| 7722 | /* HP Pin: output 0 (0x0e) */ | ||
| 7723 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, | ||
| 7724 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 7725 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
| 7726 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)}, | ||
| 7727 | /* Line in (is hp when jack connected)*/ | ||
| 7728 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50}, | ||
| 7729 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
| 7730 | |||
| 7731 | { } | ||
| 7732 | }; | ||
| 7733 | |||
| 7734 | |||
| 7674 | /* Macbook Pro rev3 */ | 7735 | /* Macbook Pro rev3 */ |
| 7675 | static struct hda_verb alc885_mbp3_init_verbs[] = { | 7736 | static struct hda_verb alc885_mbp3_init_verbs[] = { |
| 7676 | /* Front mixer: unmute input/output amp left and right (volume = 0) */ | 7737 | /* Front mixer: unmute input/output amp left and right (volume = 0) */ |
| @@ -7833,54 +7894,35 @@ static void alc885_imac24_setup(struct hda_codec *codec) | |||
| 7833 | spec->autocfg.speaker_pins[1] = 0x1a; | 7894 | spec->autocfg.speaker_pins[1] = 0x1a; |
| 7834 | } | 7895 | } |
| 7835 | 7896 | ||
| 7836 | static void alc885_mbp3_setup(struct hda_codec *codec) | 7897 | #define alc885_mb5_setup alc885_imac24_setup |
| 7837 | { | 7898 | #define alc885_macmini3_setup alc885_imac24_setup |
| 7838 | struct alc_spec *spec = codec->spec; | ||
| 7839 | |||
| 7840 | spec->autocfg.hp_pins[0] = 0x15; | ||
| 7841 | spec->autocfg.speaker_pins[0] = 0x14; | ||
| 7842 | } | ||
| 7843 | 7899 | ||
| 7844 | static void alc885_mb5_automute(struct hda_codec *codec) | 7900 | /* Macbook Air 2,1 */ |
| 7901 | static void alc885_mba21_setup(struct hda_codec *codec) | ||
| 7845 | { | 7902 | { |
| 7846 | unsigned int present; | 7903 | struct alc_spec *spec = codec->spec; |
| 7847 | |||
| 7848 | present = snd_hda_codec_read(codec, 0x14, 0, | ||
| 7849 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
| 7850 | snd_hda_codec_amp_stereo(codec, 0x18, HDA_OUTPUT, 0, | ||
| 7851 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
| 7852 | snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0, | ||
| 7853 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
| 7854 | 7904 | ||
| 7905 | spec->autocfg.hp_pins[0] = 0x14; | ||
| 7906 | spec->autocfg.speaker_pins[0] = 0x18; | ||
| 7855 | } | 7907 | } |
| 7856 | 7908 | ||
| 7857 | static void alc885_mb5_unsol_event(struct hda_codec *codec, | ||
| 7858 | unsigned int res) | ||
| 7859 | { | ||
| 7860 | /* Headphone insertion or removal. */ | ||
| 7861 | if ((res >> 26) == ALC880_HP_EVENT) | ||
| 7862 | alc885_mb5_automute(codec); | ||
| 7863 | } | ||
| 7864 | 7909 | ||
| 7865 | static void alc885_imac91_automute(struct hda_codec *codec) | ||
| 7866 | { | ||
| 7867 | unsigned int present; | ||
| 7868 | 7910 | ||
| 7869 | present = snd_hda_codec_read(codec, 0x14, 0, | 7911 | static void alc885_mbp3_setup(struct hda_codec *codec) |
| 7870 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | 7912 | { |
| 7871 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, | 7913 | struct alc_spec *spec = codec->spec; |
| 7872 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
| 7873 | snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0, | ||
| 7874 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
| 7875 | 7914 | ||
| 7915 | spec->autocfg.hp_pins[0] = 0x15; | ||
| 7916 | spec->autocfg.speaker_pins[0] = 0x14; | ||
| 7876 | } | 7917 | } |
| 7877 | 7918 | ||
| 7878 | static void alc885_imac91_unsol_event(struct hda_codec *codec, | 7919 | static void alc885_imac91_setup(struct hda_codec *codec) |
| 7879 | unsigned int res) | ||
| 7880 | { | 7920 | { |
| 7881 | /* Headphone insertion or removal. */ | 7921 | struct alc_spec *spec = codec->spec; |
| 7882 | if ((res >> 26) == ALC880_HP_EVENT) | 7922 | |
| 7883 | alc885_imac91_automute(codec); | 7923 | spec->autocfg.hp_pins[0] = 0x14; |
| 7924 | spec->autocfg.speaker_pins[0] = 0x15; | ||
| 7925 | spec->autocfg.speaker_pins[1] = 0x1a; | ||
| 7884 | } | 7926 | } |
| 7885 | 7927 | ||
| 7886 | static struct hda_verb alc882_targa_verbs[] = { | 7928 | static struct hda_verb alc882_targa_verbs[] = { |
| @@ -8015,18 +8057,6 @@ static struct hda_verb alc883_auto_init_verbs[] = { | |||
| 8015 | {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, | 8057 | {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, |
| 8016 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 8058 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
| 8017 | 8059 | ||
| 8018 | /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback | ||
| 8019 | * mixer widget | ||
| 8020 | * Note: PASD motherboards uses the Line In 2 as the input for | ||
| 8021 | * front panel mic (mic 2) | ||
| 8022 | */ | ||
| 8023 | /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ | ||
| 8024 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
| 8025 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
| 8026 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
| 8027 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
| 8028 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
| 8029 | |||
| 8030 | /* | 8060 | /* |
| 8031 | * Set up output mixers (0x0c - 0x0f) | 8061 | * Set up output mixers (0x0c - 0x0f) |
| 8032 | */ | 8062 | */ |
| @@ -8051,16 +8081,9 @@ static struct hda_verb alc883_auto_init_verbs[] = { | |||
| 8051 | /* FIXME: use matrix-type input source selection */ | 8081 | /* FIXME: use matrix-type input source selection */ |
| 8052 | /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ | 8082 | /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ |
| 8053 | /* Input mixer2 */ | 8083 | /* Input mixer2 */ |
| 8054 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, | 8084 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
| 8055 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, | ||
| 8056 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, | ||
| 8057 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, | ||
| 8058 | /* Input mixer3 */ | 8085 | /* Input mixer3 */ |
| 8059 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, | 8086 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
| 8060 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, | ||
| 8061 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, | ||
| 8062 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, | ||
| 8063 | |||
| 8064 | { } | 8087 | { } |
| 8065 | }; | 8088 | }; |
| 8066 | 8089 | ||
| @@ -9047,6 +9070,8 @@ static const char *alc882_models[ALC882_MODEL_LAST] = { | |||
| 9047 | [ALC882_ASUS_A7M] = "asus-a7m", | 9070 | [ALC882_ASUS_A7M] = "asus-a7m", |
| 9048 | [ALC885_MACPRO] = "macpro", | 9071 | [ALC885_MACPRO] = "macpro", |
| 9049 | [ALC885_MB5] = "mb5", | 9072 | [ALC885_MB5] = "mb5", |
| 9073 | [ALC885_MACMINI3] = "macmini3", | ||
| 9074 | [ALC885_MBA21] = "mba21", | ||
| 9050 | [ALC885_MBP3] = "mbp3", | 9075 | [ALC885_MBP3] = "mbp3", |
| 9051 | [ALC885_IMAC24] = "imac24", | 9076 | [ALC885_IMAC24] = "imac24", |
| 9052 | [ALC885_IMAC91] = "imac91", | 9077 | [ALC885_IMAC91] = "imac91", |
| @@ -9230,6 +9255,7 @@ static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = { | |||
| 9230 | */ | 9255 | */ |
| 9231 | SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5), | 9256 | SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5), |
| 9232 | SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5), | 9257 | SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5), |
| 9258 | SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3), | ||
| 9233 | {} /* terminator */ | 9259 | {} /* terminator */ |
| 9234 | }; | 9260 | }; |
| 9235 | 9261 | ||
| @@ -9281,6 +9307,18 @@ static struct alc_config_preset alc882_presets[] = { | |||
| 9281 | .input_mux = &alc882_capture_source, | 9307 | .input_mux = &alc882_capture_source, |
| 9282 | .dig_out_nid = ALC882_DIGOUT_NID, | 9308 | .dig_out_nid = ALC882_DIGOUT_NID, |
| 9283 | }, | 9309 | }, |
| 9310 | [ALC885_MBA21] = { | ||
| 9311 | .mixers = { alc885_mba21_mixer }, | ||
| 9312 | .init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs }, | ||
| 9313 | .num_dacs = 2, | ||
| 9314 | .dac_nids = alc882_dac_nids, | ||
| 9315 | .channel_mode = alc885_mba21_ch_modes, | ||
| 9316 | .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes), | ||
| 9317 | .input_mux = &alc882_capture_source, | ||
| 9318 | .unsol_event = alc_automute_amp_unsol_event, | ||
| 9319 | .setup = alc885_mba21_setup, | ||
| 9320 | .init_hook = alc_automute_amp, | ||
| 9321 | }, | ||
| 9284 | [ALC885_MBP3] = { | 9322 | [ALC885_MBP3] = { |
| 9285 | .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer }, | 9323 | .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer }, |
| 9286 | .init_verbs = { alc885_mbp3_init_verbs, | 9324 | .init_verbs = { alc885_mbp3_init_verbs, |
| @@ -9308,8 +9346,24 @@ static struct alc_config_preset alc882_presets[] = { | |||
| 9308 | .input_mux = &mb5_capture_source, | 9346 | .input_mux = &mb5_capture_source, |
| 9309 | .dig_out_nid = ALC882_DIGOUT_NID, | 9347 | .dig_out_nid = ALC882_DIGOUT_NID, |
| 9310 | .dig_in_nid = ALC882_DIGIN_NID, | 9348 | .dig_in_nid = ALC882_DIGIN_NID, |
| 9311 | .unsol_event = alc885_mb5_unsol_event, | 9349 | .unsol_event = alc_automute_amp_unsol_event, |
| 9312 | .init_hook = alc885_mb5_automute, | 9350 | .setup = alc885_mb5_setup, |
| 9351 | .init_hook = alc_automute_amp, | ||
| 9352 | }, | ||
| 9353 | [ALC885_MACMINI3] = { | ||
| 9354 | .mixers = { alc885_macmini3_mixer, alc882_chmode_mixer }, | ||
| 9355 | .init_verbs = { alc885_macmini3_init_verbs, | ||
| 9356 | alc880_gpio1_init_verbs }, | ||
| 9357 | .num_dacs = ARRAY_SIZE(alc882_dac_nids), | ||
| 9358 | .dac_nids = alc882_dac_nids, | ||
| 9359 | .channel_mode = alc885_macmini3_6ch_modes, | ||
| 9360 | .num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes), | ||
| 9361 | .input_mux = &macmini3_capture_source, | ||
| 9362 | .dig_out_nid = ALC882_DIGOUT_NID, | ||
| 9363 | .dig_in_nid = ALC882_DIGIN_NID, | ||
| 9364 | .unsol_event = alc_automute_amp_unsol_event, | ||
| 9365 | .setup = alc885_macmini3_setup, | ||
| 9366 | .init_hook = alc_automute_amp, | ||
| 9313 | }, | 9367 | }, |
| 9314 | [ALC885_MACPRO] = { | 9368 | [ALC885_MACPRO] = { |
| 9315 | .mixers = { alc882_macpro_mixer }, | 9369 | .mixers = { alc882_macpro_mixer }, |
| @@ -9348,8 +9402,9 @@ static struct alc_config_preset alc882_presets[] = { | |||
| 9348 | .input_mux = &alc882_capture_source, | 9402 | .input_mux = &alc882_capture_source, |
| 9349 | .dig_out_nid = ALC882_DIGOUT_NID, | 9403 | .dig_out_nid = ALC882_DIGOUT_NID, |
| 9350 | .dig_in_nid = ALC882_DIGIN_NID, | 9404 | .dig_in_nid = ALC882_DIGIN_NID, |
| 9351 | .unsol_event = alc885_imac91_unsol_event, | 9405 | .unsol_event = alc_automute_amp_unsol_event, |
| 9352 | .init_hook = alc885_imac91_automute, | 9406 | .setup = alc885_imac91_setup, |
| 9407 | .init_hook = alc_automute_amp, | ||
| 9353 | }, | 9408 | }, |
| 9354 | [ALC882_TARGA] = { | 9409 | [ALC882_TARGA] = { |
| 9355 | .mixers = { alc882_targa_mixer, alc882_chmode_mixer }, | 9410 | .mixers = { alc882_targa_mixer, alc882_chmode_mixer }, |
| @@ -10172,7 +10227,7 @@ static int alc882_parse_auto_config(struct hda_codec *codec) | |||
| 10172 | spec->num_mux_defs = 1; | 10227 | spec->num_mux_defs = 1; |
| 10173 | spec->input_mux = &spec->private_imux[0]; | 10228 | spec->input_mux = &spec->private_imux[0]; |
| 10174 | 10229 | ||
| 10175 | alc_ssid_check(codec, 0x15, 0x1b, 0x14); | 10230 | alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0); |
| 10176 | 10231 | ||
| 10177 | err = alc_auto_add_mic_boost(codec); | 10232 | err = alc_auto_add_mic_boost(codec); |
| 10178 | if (err < 0) | 10233 | if (err < 0) |
| @@ -10310,7 +10365,6 @@ static int patch_alc882(struct hda_codec *codec) | |||
| 10310 | if (!spec->loopback.amplist) | 10365 | if (!spec->loopback.amplist) |
| 10311 | spec->loopback.amplist = alc882_loopbacks; | 10366 | spec->loopback.amplist = alc882_loopbacks; |
| 10312 | #endif | 10367 | #endif |
| 10313 | codec->proc_widget_hook = print_realtek_coef; | ||
| 10314 | 10368 | ||
| 10315 | return 0; | 10369 | return 0; |
| 10316 | } | 10370 | } |
| @@ -11731,7 +11785,7 @@ static int alc262_parse_auto_config(struct hda_codec *codec) | |||
| 11731 | if (err < 0) | 11785 | if (err < 0) |
| 11732 | return err; | 11786 | return err; |
| 11733 | 11787 | ||
| 11734 | alc_ssid_check(codec, 0x15, 0x14, 0x1b); | 11788 | alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0); |
| 11735 | 11789 | ||
| 11736 | return 1; | 11790 | return 1; |
| 11737 | } | 11791 | } |
| @@ -12174,7 +12228,6 @@ static int patch_alc262(struct hda_codec *codec) | |||
| 12174 | if (!spec->loopback.amplist) | 12228 | if (!spec->loopback.amplist) |
| 12175 | spec->loopback.amplist = alc262_loopbacks; | 12229 | spec->loopback.amplist = alc262_loopbacks; |
| 12176 | #endif | 12230 | #endif |
| 12177 | codec->proc_widget_hook = print_realtek_coef; | ||
| 12178 | 12231 | ||
| 12179 | return 0; | 12232 | return 0; |
| 12180 | } | 12233 | } |
| @@ -12683,7 +12736,6 @@ static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid, | |||
| 12683 | dac = 0x02; | 12736 | dac = 0x02; |
| 12684 | break; | 12737 | break; |
| 12685 | case 0x15: | 12738 | case 0x15: |
| 12686 | case 0x21: | ||
| 12687 | dac = 0x03; | 12739 | dac = 0x03; |
| 12688 | break; | 12740 | break; |
| 12689 | default: | 12741 | default: |
| @@ -12904,7 +12956,7 @@ static int alc268_parse_auto_config(struct hda_codec *codec) | |||
| 12904 | if (err < 0) | 12956 | if (err < 0) |
| 12905 | return err; | 12957 | return err; |
| 12906 | 12958 | ||
| 12907 | alc_ssid_check(codec, 0x15, 0x1b, 0x14); | 12959 | alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0); |
| 12908 | 12960 | ||
| 12909 | return 1; | 12961 | return 1; |
| 12910 | } | 12962 | } |
| @@ -13241,8 +13293,6 @@ static int patch_alc268(struct hda_codec *codec) | |||
| 13241 | if (board_config == ALC268_AUTO) | 13293 | if (board_config == ALC268_AUTO) |
| 13242 | spec->init_hook = alc268_auto_init; | 13294 | spec->init_hook = alc268_auto_init; |
| 13243 | 13295 | ||
| 13244 | codec->proc_widget_hook = print_realtek_coef; | ||
| 13245 | |||
| 13246 | return 0; | 13296 | return 0; |
| 13247 | } | 13297 | } |
| 13248 | 13298 | ||
| @@ -13262,6 +13312,15 @@ static hda_nid_t alc269_capsrc_nids[1] = { | |||
| 13262 | 0x23, | 13312 | 0x23, |
| 13263 | }; | 13313 | }; |
| 13264 | 13314 | ||
| 13315 | static hda_nid_t alc269vb_adc_nids[1] = { | ||
| 13316 | /* ADC1 */ | ||
| 13317 | 0x09, | ||
| 13318 | }; | ||
| 13319 | |||
| 13320 | static hda_nid_t alc269vb_capsrc_nids[1] = { | ||
| 13321 | 0x22, | ||
| 13322 | }; | ||
| 13323 | |||
| 13265 | /* NOTE: ADC2 (0x07) is connected from a recording *MIXER* (0x24), | 13324 | /* NOTE: ADC2 (0x07) is connected from a recording *MIXER* (0x24), |
| 13266 | * not a mux! | 13325 | * not a mux! |
| 13267 | */ | 13326 | */ |
| @@ -13330,7 +13389,7 @@ static struct snd_kcontrol_new alc269_lifebook_mixer[] = { | |||
| 13330 | { } | 13389 | { } |
| 13331 | }; | 13390 | }; |
| 13332 | 13391 | ||
| 13333 | static struct snd_kcontrol_new alc269_eeepc_mixer[] = { | 13392 | static struct snd_kcontrol_new alc269_laptop_mixer[] = { |
| 13334 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), | 13393 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), |
| 13335 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), | 13394 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), |
| 13336 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), | 13395 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), |
| @@ -13338,16 +13397,47 @@ static struct snd_kcontrol_new alc269_eeepc_mixer[] = { | |||
| 13338 | { } /* end */ | 13397 | { } /* end */ |
| 13339 | }; | 13398 | }; |
| 13340 | 13399 | ||
| 13400 | static struct snd_kcontrol_new alc269vb_laptop_mixer[] = { | ||
| 13401 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), | ||
| 13402 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), | ||
| 13403 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT), | ||
| 13404 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), | ||
| 13405 | { } /* end */ | ||
| 13406 | }; | ||
| 13407 | |||
| 13341 | /* capture mixer elements */ | 13408 | /* capture mixer elements */ |
| 13342 | static struct snd_kcontrol_new alc269_epc_capture_mixer[] = { | 13409 | static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = { |
| 13410 | HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), | ||
| 13411 | HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), | ||
| 13412 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | ||
| 13413 | HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT), | ||
| 13414 | { } /* end */ | ||
| 13415 | }; | ||
| 13416 | |||
| 13417 | static struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = { | ||
| 13343 | HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), | 13418 | HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), |
| 13344 | HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), | 13419 | HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), |
| 13345 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | 13420 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), |
| 13346 | { } /* end */ | 13421 | { } /* end */ |
| 13347 | }; | 13422 | }; |
| 13348 | 13423 | ||
| 13424 | static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = { | ||
| 13425 | HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT), | ||
| 13426 | HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT), | ||
| 13427 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | ||
| 13428 | HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT), | ||
| 13429 | { } /* end */ | ||
| 13430 | }; | ||
| 13431 | |||
| 13432 | static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = { | ||
| 13433 | HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT), | ||
| 13434 | HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT), | ||
| 13435 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | ||
| 13436 | { } /* end */ | ||
| 13437 | }; | ||
| 13438 | |||
| 13349 | /* FSC amilo */ | 13439 | /* FSC amilo */ |
| 13350 | #define alc269_fujitsu_mixer alc269_eeepc_mixer | 13440 | #define alc269_fujitsu_mixer alc269_laptop_mixer |
| 13351 | 13441 | ||
| 13352 | static struct hda_verb alc269_quanta_fl1_verbs[] = { | 13442 | static struct hda_verb alc269_quanta_fl1_verbs[] = { |
| 13353 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, | 13443 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, |
| @@ -13490,7 +13580,7 @@ static void alc269_lifebook_init_hook(struct hda_codec *codec) | |||
| 13490 | alc269_lifebook_mic_autoswitch(codec); | 13580 | alc269_lifebook_mic_autoswitch(codec); |
| 13491 | } | 13581 | } |
| 13492 | 13582 | ||
| 13493 | static struct hda_verb alc269_eeepc_dmic_init_verbs[] = { | 13583 | static struct hda_verb alc269_laptop_dmic_init_verbs[] = { |
| 13494 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, | 13584 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, |
| 13495 | {0x23, AC_VERB_SET_CONNECT_SEL, 0x05}, | 13585 | {0x23, AC_VERB_SET_CONNECT_SEL, 0x05}, |
| 13496 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 }, | 13586 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 }, |
| @@ -13501,7 +13591,7 @@ static struct hda_verb alc269_eeepc_dmic_init_verbs[] = { | |||
| 13501 | {} | 13591 | {} |
| 13502 | }; | 13592 | }; |
| 13503 | 13593 | ||
| 13504 | static struct hda_verb alc269_eeepc_amic_init_verbs[] = { | 13594 | static struct hda_verb alc269_laptop_amic_init_verbs[] = { |
| 13505 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, | 13595 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, |
| 13506 | {0x23, AC_VERB_SET_CONNECT_SEL, 0x01}, | 13596 | {0x23, AC_VERB_SET_CONNECT_SEL, 0x01}, |
| 13507 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 }, | 13597 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 }, |
| @@ -13511,6 +13601,28 @@ static struct hda_verb alc269_eeepc_amic_init_verbs[] = { | |||
| 13511 | {} | 13601 | {} |
| 13512 | }; | 13602 | }; |
| 13513 | 13603 | ||
| 13604 | static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = { | ||
| 13605 | {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, | ||
| 13606 | {0x22, AC_VERB_SET_CONNECT_SEL, 0x06}, | ||
| 13607 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 }, | ||
| 13608 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))}, | ||
| 13609 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
| 13610 | {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, | ||
| 13611 | {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, | ||
| 13612 | {} | ||
| 13613 | }; | ||
| 13614 | |||
| 13615 | static struct hda_verb alc269vb_laptop_amic_init_verbs[] = { | ||
| 13616 | {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, | ||
| 13617 | {0x22, AC_VERB_SET_CONNECT_SEL, 0x01}, | ||
| 13618 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 }, | ||
| 13619 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))}, | ||
| 13620 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
| 13621 | {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, | ||
| 13622 | {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, | ||
| 13623 | {} | ||
| 13624 | }; | ||
| 13625 | |||
| 13514 | /* toggle speaker-output according to the hp-jack state */ | 13626 | /* toggle speaker-output according to the hp-jack state */ |
| 13515 | static void alc269_speaker_automute(struct hda_codec *codec) | 13627 | static void alc269_speaker_automute(struct hda_codec *codec) |
| 13516 | { | 13628 | { |
| @@ -13528,7 +13640,7 @@ static void alc269_speaker_automute(struct hda_codec *codec) | |||
| 13528 | } | 13640 | } |
| 13529 | 13641 | ||
| 13530 | /* unsolicited event for HP jack sensing */ | 13642 | /* unsolicited event for HP jack sensing */ |
| 13531 | static void alc269_eeepc_unsol_event(struct hda_codec *codec, | 13643 | static void alc269_laptop_unsol_event(struct hda_codec *codec, |
| 13532 | unsigned int res) | 13644 | unsigned int res) |
| 13533 | { | 13645 | { |
| 13534 | switch (res >> 26) { | 13646 | switch (res >> 26) { |
| @@ -13541,7 +13653,7 @@ static void alc269_eeepc_unsol_event(struct hda_codec *codec, | |||
| 13541 | } | 13653 | } |
| 13542 | } | 13654 | } |
| 13543 | 13655 | ||
| 13544 | static void alc269_eeepc_dmic_setup(struct hda_codec *codec) | 13656 | static void alc269_laptop_dmic_setup(struct hda_codec *codec) |
| 13545 | { | 13657 | { |
| 13546 | struct alc_spec *spec = codec->spec; | 13658 | struct alc_spec *spec = codec->spec; |
| 13547 | spec->ext_mic.pin = 0x18; | 13659 | spec->ext_mic.pin = 0x18; |
| @@ -13551,7 +13663,17 @@ static void alc269_eeepc_dmic_setup(struct hda_codec *codec) | |||
| 13551 | spec->auto_mic = 1; | 13663 | spec->auto_mic = 1; |
| 13552 | } | 13664 | } |
| 13553 | 13665 | ||
| 13554 | static void alc269_eeepc_amic_setup(struct hda_codec *codec) | 13666 | static void alc269vb_laptop_dmic_setup(struct hda_codec *codec) |
| 13667 | { | ||
| 13668 | struct alc_spec *spec = codec->spec; | ||
| 13669 | spec->ext_mic.pin = 0x18; | ||
| 13670 | spec->ext_mic.mux_idx = 0; | ||
| 13671 | spec->int_mic.pin = 0x12; | ||
| 13672 | spec->int_mic.mux_idx = 6; | ||
| 13673 | spec->auto_mic = 1; | ||
| 13674 | } | ||
| 13675 | |||
| 13676 | static void alc269_laptop_amic_setup(struct hda_codec *codec) | ||
| 13555 | { | 13677 | { |
| 13556 | struct alc_spec *spec = codec->spec; | 13678 | struct alc_spec *spec = codec->spec; |
| 13557 | spec->ext_mic.pin = 0x18; | 13679 | spec->ext_mic.pin = 0x18; |
| @@ -13561,7 +13683,7 @@ static void alc269_eeepc_amic_setup(struct hda_codec *codec) | |||
| 13561 | spec->auto_mic = 1; | 13683 | spec->auto_mic = 1; |
| 13562 | } | 13684 | } |
| 13563 | 13685 | ||
| 13564 | static void alc269_eeepc_inithook(struct hda_codec *codec) | 13686 | static void alc269_laptop_inithook(struct hda_codec *codec) |
| 13565 | { | 13687 | { |
| 13566 | alc269_speaker_automute(codec); | 13688 | alc269_speaker_automute(codec); |
| 13567 | alc_mic_automute(codec); | 13689 | alc_mic_automute(codec); |
| @@ -13574,22 +13696,10 @@ static struct hda_verb alc269_init_verbs[] = { | |||
| 13574 | /* | 13696 | /* |
| 13575 | * Unmute ADC0 and set the default input to mic-in | 13697 | * Unmute ADC0 and set the default input to mic-in |
| 13576 | */ | 13698 | */ |
| 13577 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 13699 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
| 13578 | |||
| 13579 | /* Mute input amps (PCBeep, Line In, Mic 1 & Mic 2) of the | ||
| 13580 | * analog-loopback mixer widget | ||
| 13581 | * Note: PASD motherboards uses the Line In 2 as the input for | ||
| 13582 | * front panel mic (mic 2) | ||
| 13583 | */ | ||
| 13584 | /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ | ||
| 13585 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
| 13586 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
| 13587 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
| 13588 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
| 13589 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
| 13590 | 13700 | ||
| 13591 | /* | 13701 | /* |
| 13592 | * Set up output mixers (0x0c - 0x0e) | 13702 | * Set up output mixers (0x02 - 0x03) |
| 13593 | */ | 13703 | */ |
| 13594 | /* set vol=0 to output mixers */ | 13704 | /* set vol=0 to output mixers */ |
| 13595 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 13705 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, |
| @@ -13614,26 +13724,57 @@ static struct hda_verb alc269_init_verbs[] = { | |||
| 13614 | 13724 | ||
| 13615 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 13725 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| 13616 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 13726 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| 13617 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
| 13618 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
| 13619 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
| 13620 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
| 13621 | {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
| 13622 | 13727 | ||
| 13623 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, | 13728 | /* FIXME: use Mux-type input source selection */ |
| 13624 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, | 13729 | /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */ |
| 13730 | /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ | ||
| 13731 | {0x23, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
| 13625 | 13732 | ||
| 13626 | /* FIXME: use matrix-type input source selection */ | 13733 | /* set EAPD */ |
| 13734 | {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, | ||
| 13735 | { } | ||
| 13736 | }; | ||
| 13737 | |||
| 13738 | static struct hda_verb alc269vb_init_verbs[] = { | ||
| 13739 | /* | ||
| 13740 | * Unmute ADC0 and set the default input to mic-in | ||
| 13741 | */ | ||
| 13742 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 13743 | |||
| 13744 | /* | ||
| 13745 | * Set up output mixers (0x02 - 0x03) | ||
| 13746 | */ | ||
| 13747 | /* set vol=0 to output mixers */ | ||
| 13748 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 13749 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 13750 | |||
| 13751 | /* set up input amps for analog loopback */ | ||
| 13752 | /* Amp Indices: DAC = 0, mixer = 1 */ | ||
| 13753 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 13754 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
| 13755 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 13756 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
| 13757 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 13758 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
| 13759 | |||
| 13760 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
| 13761 | {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
| 13762 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
| 13763 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
| 13764 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
| 13765 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
| 13766 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
| 13767 | |||
| 13768 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 13769 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 13770 | |||
| 13771 | /* FIXME: use Mux-type input source selection */ | ||
| 13627 | /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */ | 13772 | /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */ |
| 13628 | /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ | 13773 | /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ |
| 13629 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 13774 | {0x22, AC_VERB_SET_CONNECT_SEL, 0x00}, |
| 13630 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
| 13631 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
| 13632 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
| 13633 | 13775 | ||
| 13634 | /* set EAPD */ | 13776 | /* set EAPD */ |
| 13635 | {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, | 13777 | {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, |
| 13636 | {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, | ||
| 13637 | { } | 13778 | { } |
| 13638 | }; | 13779 | }; |
| 13639 | 13780 | ||
| @@ -13681,6 +13822,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec) | |||
| 13681 | struct alc_spec *spec = codec->spec; | 13822 | struct alc_spec *spec = codec->spec; |
| 13682 | int err; | 13823 | int err; |
| 13683 | static hda_nid_t alc269_ignore[] = { 0x1d, 0 }; | 13824 | static hda_nid_t alc269_ignore[] = { 0x1d, 0 }; |
| 13825 | hda_nid_t real_capsrc_nids; | ||
| 13684 | 13826 | ||
| 13685 | err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, | 13827 | err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, |
| 13686 | alc269_ignore); | 13828 | alc269_ignore); |
| @@ -13702,11 +13844,20 @@ static int alc269_parse_auto_config(struct hda_codec *codec) | |||
| 13702 | if (spec->kctls.list) | 13844 | if (spec->kctls.list) |
| 13703 | add_mixer(spec, spec->kctls.list); | 13845 | add_mixer(spec, spec->kctls.list); |
| 13704 | 13846 | ||
| 13705 | add_verb(spec, alc269_init_verbs); | 13847 | if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010) { |
| 13848 | add_verb(spec, alc269vb_init_verbs); | ||
| 13849 | real_capsrc_nids = alc269vb_capsrc_nids[0]; | ||
| 13850 | alc_ssid_check(codec, 0, 0x1b, 0x14, 0x21); | ||
| 13851 | } else { | ||
| 13852 | add_verb(spec, alc269_init_verbs); | ||
| 13853 | real_capsrc_nids = alc269_capsrc_nids[0]; | ||
| 13854 | alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0); | ||
| 13855 | } | ||
| 13856 | |||
| 13706 | spec->num_mux_defs = 1; | 13857 | spec->num_mux_defs = 1; |
| 13707 | spec->input_mux = &spec->private_imux[0]; | 13858 | spec->input_mux = &spec->private_imux[0]; |
| 13708 | /* set default input source */ | 13859 | /* set default input source */ |
| 13709 | snd_hda_codec_write_cache(codec, alc269_capsrc_nids[0], | 13860 | snd_hda_codec_write_cache(codec, real_capsrc_nids, |
| 13710 | 0, AC_VERB_SET_CONNECT_SEL, | 13861 | 0, AC_VERB_SET_CONNECT_SEL, |
| 13711 | spec->input_mux->items[0].index); | 13862 | spec->input_mux->items[0].index); |
| 13712 | 13863 | ||
| @@ -13717,8 +13868,6 @@ static int alc269_parse_auto_config(struct hda_codec *codec) | |||
| 13717 | if (!spec->cap_mixer && !spec->no_analog) | 13868 | if (!spec->cap_mixer && !spec->no_analog) |
| 13718 | set_capture_mixer(codec); | 13869 | set_capture_mixer(codec); |
| 13719 | 13870 | ||
| 13720 | alc_ssid_check(codec, 0x15, 0x1b, 0x14); | ||
| 13721 | |||
| 13722 | return 1; | 13871 | return 1; |
| 13723 | } | 13872 | } |
| 13724 | 13873 | ||
| @@ -13744,8 +13893,8 @@ static void alc269_auto_init(struct hda_codec *codec) | |||
| 13744 | static const char *alc269_models[ALC269_MODEL_LAST] = { | 13893 | static const char *alc269_models[ALC269_MODEL_LAST] = { |
| 13745 | [ALC269_BASIC] = "basic", | 13894 | [ALC269_BASIC] = "basic", |
| 13746 | [ALC269_QUANTA_FL1] = "quanta", | 13895 | [ALC269_QUANTA_FL1] = "quanta", |
| 13747 | [ALC269_ASUS_AMIC] = "asus-amic", | 13896 | [ALC269_AMIC] = "laptop-amic", |
| 13748 | [ALC269_ASUS_DMIC] = "asus-dmic", | 13897 | [ALC269_DMIC] = "laptop-dmic", |
| 13749 | [ALC269_FUJITSU] = "fujitsu", | 13898 | [ALC269_FUJITSU] = "fujitsu", |
| 13750 | [ALC269_LIFEBOOK] = "lifebook", | 13899 | [ALC269_LIFEBOOK] = "lifebook", |
| 13751 | [ALC269_AUTO] = "auto", | 13900 | [ALC269_AUTO] = "auto", |
| @@ -13754,43 +13903,57 @@ static const char *alc269_models[ALC269_MODEL_LAST] = { | |||
| 13754 | static struct snd_pci_quirk alc269_cfg_tbl[] = { | 13903 | static struct snd_pci_quirk alc269_cfg_tbl[] = { |
| 13755 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1), | 13904 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1), |
| 13756 | SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", | 13905 | SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", |
| 13757 | ALC269_ASUS_AMIC), | 13906 | ALC269_AMIC), |
| 13758 | SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_ASUS_AMIC), | 13907 | SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC), |
| 13759 | SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80JT", ALC269_ASUS_AMIC), | 13908 | SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC), |
| 13760 | SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_ASUS_AMIC), | 13909 | SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC), |
| 13761 | SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_ASUS_AMIC), | 13910 | SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC), |
| 13762 | SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_ASUS_AMIC), | 13911 | SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC), |
| 13763 | SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_ASUS_AMIC), | 13912 | SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC), |
| 13764 | SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_ASUS_AMIC), | 13913 | SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC), |
| 13765 | SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_ASUS_AMIC), | 13914 | SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC), |
| 13766 | SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_ASUS_AMIC), | 13915 | SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC), |
| 13767 | SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_ASUS_AMIC), | 13916 | SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_AMIC), |
| 13768 | SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_ASUS_AMIC), | 13917 | SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC), |
| 13769 | SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_ASUS_AMIC), | 13918 | SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC), |
| 13770 | SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_ASUS_AMIC), | 13919 | SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC), |
| 13771 | SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_ASUS_AMIC), | 13920 | SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC), |
| 13772 | SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_ASUS_AMIC), | 13921 | SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC), |
| 13773 | SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_ASUS_AMIC), | 13922 | SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC), |
| 13774 | SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_ASUS_AMIC), | 13923 | SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC), |
| 13775 | SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_ASUS_AMIC), | 13924 | SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC), |
| 13776 | SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_ASUS_AMIC), | 13925 | SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC), |
| 13777 | SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_ASUS_AMIC), | 13926 | SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC), |
| 13778 | SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_ASUS_AMIC), | 13927 | SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC), |
| 13779 | SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_ASUS_AMIC), | 13928 | SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC), |
| 13780 | SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_ASUS_AMIC), | 13929 | SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC), |
| 13781 | SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_ASUS_DMIC), | 13930 | SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC), |
| 13782 | SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_ASUS_AMIC), | 13931 | SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC), |
| 13783 | SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_ASUS_AMIC), | 13932 | SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC), |
| 13784 | SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_ASUS_AMIC), | 13933 | SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC), |
| 13785 | SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_ASUS_AMIC), | 13934 | SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC), |
| 13935 | SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC), | ||
| 13936 | SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC), | ||
| 13937 | SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC), | ||
| 13938 | SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC), | ||
| 13939 | SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC), | ||
| 13940 | SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC), | ||
| 13941 | SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC), | ||
| 13942 | SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC), | ||
| 13786 | SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901", | 13943 | SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901", |
| 13787 | ALC269_ASUS_DMIC), | 13944 | ALC269_DMIC), |
| 13788 | SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101", | 13945 | SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101", |
| 13789 | ALC269_ASUS_DMIC), | 13946 | ALC269_DMIC), |
| 13790 | SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_ASUS_DMIC), | 13947 | SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC), |
| 13791 | SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_ASUS_DMIC), | 13948 | SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC), |
| 13792 | SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU), | 13949 | SND_PCI_QUIRK(0x104d, 0x9071, "SONY XTB", ALC269_DMIC), |
| 13793 | SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK), | 13950 | SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK), |
| 13951 | SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC), | ||
| 13952 | SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU), | ||
| 13953 | SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_AMIC), | ||
| 13954 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_AMIC), | ||
| 13955 | SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_DMIC), | ||
| 13956 | SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_DMIC), | ||
| 13794 | {} | 13957 | {} |
| 13795 | }; | 13958 | }; |
| 13796 | 13959 | ||
| @@ -13818,47 +13981,75 @@ static struct alc_config_preset alc269_presets[] = { | |||
| 13818 | .setup = alc269_quanta_fl1_setup, | 13981 | .setup = alc269_quanta_fl1_setup, |
| 13819 | .init_hook = alc269_quanta_fl1_init_hook, | 13982 | .init_hook = alc269_quanta_fl1_init_hook, |
| 13820 | }, | 13983 | }, |
| 13821 | [ALC269_ASUS_AMIC] = { | 13984 | [ALC269_AMIC] = { |
| 13822 | .mixers = { alc269_eeepc_mixer }, | 13985 | .mixers = { alc269_laptop_mixer }, |
| 13823 | .cap_mixer = alc269_epc_capture_mixer, | 13986 | .cap_mixer = alc269_laptop_analog_capture_mixer, |
| 13824 | .init_verbs = { alc269_init_verbs, | 13987 | .init_verbs = { alc269_init_verbs, |
| 13825 | alc269_eeepc_amic_init_verbs }, | 13988 | alc269_laptop_amic_init_verbs }, |
| 13826 | .num_dacs = ARRAY_SIZE(alc269_dac_nids), | 13989 | .num_dacs = ARRAY_SIZE(alc269_dac_nids), |
| 13827 | .dac_nids = alc269_dac_nids, | 13990 | .dac_nids = alc269_dac_nids, |
| 13828 | .hp_nid = 0x03, | 13991 | .hp_nid = 0x03, |
| 13829 | .num_channel_mode = ARRAY_SIZE(alc269_modes), | 13992 | .num_channel_mode = ARRAY_SIZE(alc269_modes), |
| 13830 | .channel_mode = alc269_modes, | 13993 | .channel_mode = alc269_modes, |
| 13831 | .unsol_event = alc269_eeepc_unsol_event, | 13994 | .unsol_event = alc269_laptop_unsol_event, |
| 13832 | .setup = alc269_eeepc_amic_setup, | 13995 | .setup = alc269_laptop_amic_setup, |
| 13833 | .init_hook = alc269_eeepc_inithook, | 13996 | .init_hook = alc269_laptop_inithook, |
| 13834 | }, | 13997 | }, |
| 13835 | [ALC269_ASUS_DMIC] = { | 13998 | [ALC269_DMIC] = { |
| 13836 | .mixers = { alc269_eeepc_mixer }, | 13999 | .mixers = { alc269_laptop_mixer }, |
| 13837 | .cap_mixer = alc269_epc_capture_mixer, | 14000 | .cap_mixer = alc269_laptop_digital_capture_mixer, |
| 13838 | .init_verbs = { alc269_init_verbs, | 14001 | .init_verbs = { alc269_init_verbs, |
| 13839 | alc269_eeepc_dmic_init_verbs }, | 14002 | alc269_laptop_dmic_init_verbs }, |
| 14003 | .num_dacs = ARRAY_SIZE(alc269_dac_nids), | ||
| 14004 | .dac_nids = alc269_dac_nids, | ||
| 14005 | .hp_nid = 0x03, | ||
| 14006 | .num_channel_mode = ARRAY_SIZE(alc269_modes), | ||
| 14007 | .channel_mode = alc269_modes, | ||
| 14008 | .unsol_event = alc269_laptop_unsol_event, | ||
| 14009 | .setup = alc269_laptop_dmic_setup, | ||
| 14010 | .init_hook = alc269_laptop_inithook, | ||
| 14011 | }, | ||
| 14012 | [ALC269VB_AMIC] = { | ||
| 14013 | .mixers = { alc269vb_laptop_mixer }, | ||
| 14014 | .cap_mixer = alc269vb_laptop_analog_capture_mixer, | ||
| 14015 | .init_verbs = { alc269vb_init_verbs, | ||
| 14016 | alc269vb_laptop_amic_init_verbs }, | ||
| 14017 | .num_dacs = ARRAY_SIZE(alc269_dac_nids), | ||
| 14018 | .dac_nids = alc269_dac_nids, | ||
| 14019 | .hp_nid = 0x03, | ||
| 14020 | .num_channel_mode = ARRAY_SIZE(alc269_modes), | ||
| 14021 | .channel_mode = alc269_modes, | ||
| 14022 | .unsol_event = alc269_laptop_unsol_event, | ||
| 14023 | .setup = alc269_laptop_amic_setup, | ||
| 14024 | .init_hook = alc269_laptop_inithook, | ||
| 14025 | }, | ||
| 14026 | [ALC269VB_DMIC] = { | ||
| 14027 | .mixers = { alc269vb_laptop_mixer }, | ||
| 14028 | .cap_mixer = alc269vb_laptop_digital_capture_mixer, | ||
| 14029 | .init_verbs = { alc269vb_init_verbs, | ||
| 14030 | alc269vb_laptop_dmic_init_verbs }, | ||
| 13840 | .num_dacs = ARRAY_SIZE(alc269_dac_nids), | 14031 | .num_dacs = ARRAY_SIZE(alc269_dac_nids), |
| 13841 | .dac_nids = alc269_dac_nids, | 14032 | .dac_nids = alc269_dac_nids, |
| 13842 | .hp_nid = 0x03, | 14033 | .hp_nid = 0x03, |
| 13843 | .num_channel_mode = ARRAY_SIZE(alc269_modes), | 14034 | .num_channel_mode = ARRAY_SIZE(alc269_modes), |
| 13844 | .channel_mode = alc269_modes, | 14035 | .channel_mode = alc269_modes, |
| 13845 | .unsol_event = alc269_eeepc_unsol_event, | 14036 | .unsol_event = alc269_laptop_unsol_event, |
| 13846 | .setup = alc269_eeepc_dmic_setup, | 14037 | .setup = alc269vb_laptop_dmic_setup, |
| 13847 | .init_hook = alc269_eeepc_inithook, | 14038 | .init_hook = alc269_laptop_inithook, |
| 13848 | }, | 14039 | }, |
| 13849 | [ALC269_FUJITSU] = { | 14040 | [ALC269_FUJITSU] = { |
| 13850 | .mixers = { alc269_fujitsu_mixer }, | 14041 | .mixers = { alc269_fujitsu_mixer }, |
| 13851 | .cap_mixer = alc269_epc_capture_mixer, | 14042 | .cap_mixer = alc269_laptop_digital_capture_mixer, |
| 13852 | .init_verbs = { alc269_init_verbs, | 14043 | .init_verbs = { alc269_init_verbs, |
| 13853 | alc269_eeepc_dmic_init_verbs }, | 14044 | alc269_laptop_dmic_init_verbs }, |
| 13854 | .num_dacs = ARRAY_SIZE(alc269_dac_nids), | 14045 | .num_dacs = ARRAY_SIZE(alc269_dac_nids), |
| 13855 | .dac_nids = alc269_dac_nids, | 14046 | .dac_nids = alc269_dac_nids, |
| 13856 | .hp_nid = 0x03, | 14047 | .hp_nid = 0x03, |
| 13857 | .num_channel_mode = ARRAY_SIZE(alc269_modes), | 14048 | .num_channel_mode = ARRAY_SIZE(alc269_modes), |
| 13858 | .channel_mode = alc269_modes, | 14049 | .channel_mode = alc269_modes, |
| 13859 | .unsol_event = alc269_eeepc_unsol_event, | 14050 | .unsol_event = alc269_laptop_unsol_event, |
| 13860 | .setup = alc269_eeepc_dmic_setup, | 14051 | .setup = alc269_laptop_dmic_setup, |
| 13861 | .init_hook = alc269_eeepc_inithook, | 14052 | .init_hook = alc269_laptop_inithook, |
| 13862 | }, | 14053 | }, |
| 13863 | [ALC269_LIFEBOOK] = { | 14054 | [ALC269_LIFEBOOK] = { |
| 13864 | .mixers = { alc269_lifebook_mixer }, | 14055 | .mixers = { alc269_lifebook_mixer }, |
| @@ -13879,6 +14070,7 @@ static int patch_alc269(struct hda_codec *codec) | |||
| 13879 | struct alc_spec *spec; | 14070 | struct alc_spec *spec; |
| 13880 | int board_config; | 14071 | int board_config; |
| 13881 | int err; | 14072 | int err; |
| 14073 | int is_alc269vb = 0; | ||
| 13882 | 14074 | ||
| 13883 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 14075 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
| 13884 | if (spec == NULL) | 14076 | if (spec == NULL) |
| @@ -13895,6 +14087,7 @@ static int patch_alc269(struct hda_codec *codec) | |||
| 13895 | alc_free(codec); | 14087 | alc_free(codec); |
| 13896 | return -ENOMEM; | 14088 | return -ENOMEM; |
| 13897 | } | 14089 | } |
| 14090 | is_alc269vb = 1; | ||
| 13898 | } | 14091 | } |
| 13899 | 14092 | ||
| 13900 | board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST, | 14093 | board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST, |
| @@ -13930,7 +14123,7 @@ static int patch_alc269(struct hda_codec *codec) | |||
| 13930 | if (board_config != ALC269_AUTO) | 14123 | if (board_config != ALC269_AUTO) |
| 13931 | setup_preset(codec, &alc269_presets[board_config]); | 14124 | setup_preset(codec, &alc269_presets[board_config]); |
| 13932 | 14125 | ||
| 13933 | if (codec->subsystem_id == 0x17aa3bf8) { | 14126 | if (board_config == ALC269_QUANTA_FL1) { |
| 13934 | /* Due to a hardware problem on Lenovo Ideadpad, we need to | 14127 | /* Due to a hardware problem on Lenovo Ideadpad, we need to |
| 13935 | * fix the sample rate of analog I/O to 44.1kHz | 14128 | * fix the sample rate of analog I/O to 44.1kHz |
| 13936 | */ | 14129 | */ |
| @@ -13943,9 +14136,16 @@ static int patch_alc269(struct hda_codec *codec) | |||
| 13943 | spec->stream_digital_playback = &alc269_pcm_digital_playback; | 14136 | spec->stream_digital_playback = &alc269_pcm_digital_playback; |
| 13944 | spec->stream_digital_capture = &alc269_pcm_digital_capture; | 14137 | spec->stream_digital_capture = &alc269_pcm_digital_capture; |
| 13945 | 14138 | ||
| 13946 | spec->adc_nids = alc269_adc_nids; | 14139 | if (!is_alc269vb) { |
| 13947 | spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids); | 14140 | spec->adc_nids = alc269_adc_nids; |
| 13948 | spec->capsrc_nids = alc269_capsrc_nids; | 14141 | spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids); |
| 14142 | spec->capsrc_nids = alc269_capsrc_nids; | ||
| 14143 | } else { | ||
| 14144 | spec->adc_nids = alc269vb_adc_nids; | ||
| 14145 | spec->num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids); | ||
| 14146 | spec->capsrc_nids = alc269vb_capsrc_nids; | ||
| 14147 | } | ||
| 14148 | |||
| 13949 | if (!spec->cap_mixer) | 14149 | if (!spec->cap_mixer) |
| 13950 | set_capture_mixer(codec); | 14150 | set_capture_mixer(codec); |
| 13951 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); | 14151 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); |
| @@ -13959,7 +14159,6 @@ static int patch_alc269(struct hda_codec *codec) | |||
| 13959 | if (!spec->loopback.amplist) | 14159 | if (!spec->loopback.amplist) |
| 13960 | spec->loopback.amplist = alc269_loopbacks; | 14160 | spec->loopback.amplist = alc269_loopbacks; |
| 13961 | #endif | 14161 | #endif |
| 13962 | codec->proc_widget_hook = print_realtek_coef; | ||
| 13963 | 14162 | ||
| 13964 | return 0; | 14163 | return 0; |
| 13965 | } | 14164 | } |
| @@ -14822,7 +15021,7 @@ static int alc861_parse_auto_config(struct hda_codec *codec) | |||
| 14822 | spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids); | 15021 | spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids); |
| 14823 | set_capture_mixer(codec); | 15022 | set_capture_mixer(codec); |
| 14824 | 15023 | ||
| 14825 | alc_ssid_check(codec, 0x0e, 0x0f, 0x0b); | 15024 | alc_ssid_check(codec, 0x0e, 0x0f, 0x0b, 0); |
| 14826 | 15025 | ||
| 14827 | return 1; | 15026 | return 1; |
| 14828 | } | 15027 | } |
| @@ -15087,7 +15286,6 @@ static int patch_alc861(struct hda_codec *codec) | |||
| 15087 | if (!spec->loopback.amplist) | 15286 | if (!spec->loopback.amplist) |
| 15088 | spec->loopback.amplist = alc861_loopbacks; | 15287 | spec->loopback.amplist = alc861_loopbacks; |
| 15089 | #endif | 15288 | #endif |
| 15090 | codec->proc_widget_hook = print_realtek_coef; | ||
| 15091 | 15289 | ||
| 15092 | return 0; | 15290 | return 0; |
| 15093 | } | 15291 | } |
| @@ -15714,7 +15912,7 @@ static struct alc_config_preset alc861vd_presets[] = { | |||
| 15714 | static int alc861vd_auto_create_input_ctls(struct hda_codec *codec, | 15912 | static int alc861vd_auto_create_input_ctls(struct hda_codec *codec, |
| 15715 | const struct auto_pin_cfg *cfg) | 15913 | const struct auto_pin_cfg *cfg) |
| 15716 | { | 15914 | { |
| 15717 | return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x22, 0); | 15915 | return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0); |
| 15718 | } | 15916 | } |
| 15719 | 15917 | ||
| 15720 | 15918 | ||
| @@ -15950,7 +16148,7 @@ static int alc861vd_parse_auto_config(struct hda_codec *codec) | |||
| 15950 | if (err < 0) | 16148 | if (err < 0) |
| 15951 | return err; | 16149 | return err; |
| 15952 | 16150 | ||
| 15953 | alc_ssid_check(codec, 0x15, 0x1b, 0x14); | 16151 | alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0); |
| 15954 | 16152 | ||
| 15955 | return 1; | 16153 | return 1; |
| 15956 | } | 16154 | } |
| @@ -16067,7 +16265,6 @@ static int patch_alc861vd(struct hda_codec *codec) | |||
| 16067 | if (!spec->loopback.amplist) | 16265 | if (!spec->loopback.amplist) |
| 16068 | spec->loopback.amplist = alc861vd_loopbacks; | 16266 | spec->loopback.amplist = alc861vd_loopbacks; |
| 16069 | #endif | 16267 | #endif |
| 16070 | codec->proc_widget_hook = print_realtek_coef; | ||
| 16071 | 16268 | ||
| 16072 | return 0; | 16269 | return 0; |
| 16073 | } | 16270 | } |
| @@ -16534,13 +16731,6 @@ static struct hda_verb alc662_init_verbs[] = { | |||
| 16534 | /* ADC: mute amp left and right */ | 16731 | /* ADC: mute amp left and right */ |
| 16535 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 16732 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, |
| 16536 | {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, | 16733 | {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, |
| 16537 | /* Front mixer: unmute input/output amp left and right (volume = 0) */ | ||
| 16538 | |||
| 16539 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
| 16540 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
| 16541 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
| 16542 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
| 16543 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
| 16544 | 16734 | ||
| 16545 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 16735 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
| 16546 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | 16736 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, |
| @@ -16590,6 +16780,28 @@ static struct hda_verb alc662_init_verbs[] = { | |||
| 16590 | { } | 16780 | { } |
| 16591 | }; | 16781 | }; |
| 16592 | 16782 | ||
| 16783 | static struct hda_verb alc663_init_verbs[] = { | ||
| 16784 | {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
| 16785 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 16786 | {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
| 16787 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 16788 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 16789 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
| 16790 | { } | ||
| 16791 | }; | ||
| 16792 | |||
| 16793 | static struct hda_verb alc272_init_verbs[] = { | ||
| 16794 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
| 16795 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
| 16796 | {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
| 16797 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 16798 | {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
| 16799 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 16800 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 16801 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
| 16802 | { } | ||
| 16803 | }; | ||
| 16804 | |||
| 16593 | static struct hda_verb alc662_sue_init_verbs[] = { | 16805 | static struct hda_verb alc662_sue_init_verbs[] = { |
| 16594 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT}, | 16806 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT}, |
| 16595 | {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT}, | 16807 | {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT}, |
| @@ -16609,61 +16821,6 @@ static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = { | |||
| 16609 | {} | 16821 | {} |
| 16610 | }; | 16822 | }; |
| 16611 | 16823 | ||
| 16612 | /* | ||
| 16613 | * generic initialization of ADC, input mixers and output mixers | ||
| 16614 | */ | ||
| 16615 | static struct hda_verb alc662_auto_init_verbs[] = { | ||
| 16616 | /* | ||
| 16617 | * Unmute ADC and set the default input to mic-in | ||
| 16618 | */ | ||
| 16619 | {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
| 16620 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 16621 | |||
| 16622 | /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback | ||
| 16623 | * mixer widget | ||
| 16624 | * Note: PASD motherboards uses the Line In 2 as the input for front | ||
| 16625 | * panel mic (mic 2) | ||
| 16626 | */ | ||
| 16627 | /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ | ||
| 16628 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
| 16629 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
| 16630 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
| 16631 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
| 16632 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
| 16633 | |||
| 16634 | /* | ||
| 16635 | * Set up output mixers (0x0c - 0x0f) | ||
| 16636 | */ | ||
| 16637 | /* set vol=0 to output mixers */ | ||
| 16638 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 16639 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 16640 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 16641 | |||
| 16642 | /* set up input amps for analog loopback */ | ||
| 16643 | /* Amp Indices: DAC = 0, mixer = 1 */ | ||
| 16644 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 16645 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
| 16646 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 16647 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
| 16648 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 16649 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
| 16650 | |||
| 16651 | |||
| 16652 | /* FIXME: use matrix-type input source selection */ | ||
| 16653 | /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ | ||
| 16654 | /* Input mixer */ | ||
| 16655 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 16656 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 16657 | { } | ||
| 16658 | }; | ||
| 16659 | |||
| 16660 | /* additional verbs for ALC663 */ | ||
| 16661 | static struct hda_verb alc663_auto_init_verbs[] = { | ||
| 16662 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 16663 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
| 16664 | { } | ||
| 16665 | }; | ||
| 16666 | |||
| 16667 | static struct hda_verb alc663_m51va_init_verbs[] = { | 16824 | static struct hda_verb alc663_m51va_init_verbs[] = { |
| 16668 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | 16825 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, |
| 16669 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | 16826 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, |
| @@ -17414,6 +17571,7 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = { | |||
| 17414 | SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1), | 17571 | SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1), |
| 17415 | SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1), | 17572 | SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1), |
| 17416 | SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3), | 17573 | SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3), |
| 17574 | SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC663_ASUS_MODE1), | ||
| 17417 | SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3), | 17575 | SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3), |
| 17418 | SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1), | 17576 | SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1), |
| 17419 | SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2), | 17577 | SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2), |
| @@ -17449,6 +17607,7 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = { | |||
| 17449 | SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3), | 17607 | SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3), |
| 17450 | SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3), | 17608 | SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3), |
| 17451 | SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1), | 17609 | SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1), |
| 17610 | SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC663_ASUS_MODE1), | ||
| 17452 | SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1), | 17611 | SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1), |
| 17453 | SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1), | 17612 | SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1), |
| 17454 | SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1), | 17613 | SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1), |
| @@ -17476,6 +17635,7 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = { | |||
| 17476 | SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10), | 17635 | SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10), |
| 17477 | SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", | 17636 | SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", |
| 17478 | ALC662_3ST_6ch_DIG), | 17637 | ALC662_3ST_6ch_DIG), |
| 17638 | SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13), | ||
| 17479 | SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG), | 17639 | SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG), |
| 17480 | SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA), | 17640 | SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA), |
| 17481 | SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E), | 17641 | SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E), |
| @@ -18094,15 +18254,23 @@ static int alc662_parse_auto_config(struct hda_codec *codec) | |||
| 18094 | spec->num_mux_defs = 1; | 18254 | spec->num_mux_defs = 1; |
| 18095 | spec->input_mux = &spec->private_imux[0]; | 18255 | spec->input_mux = &spec->private_imux[0]; |
| 18096 | 18256 | ||
| 18097 | add_verb(spec, alc662_auto_init_verbs); | 18257 | add_verb(spec, alc662_init_verbs); |
| 18098 | if (codec->vendor_id == 0x10ec0663) | 18258 | if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 || |
| 18099 | add_verb(spec, alc663_auto_init_verbs); | 18259 | codec->vendor_id == 0x10ec0665) |
| 18260 | add_verb(spec, alc663_init_verbs); | ||
| 18261 | |||
| 18262 | if (codec->vendor_id == 0x10ec0272) | ||
| 18263 | add_verb(spec, alc272_init_verbs); | ||
| 18100 | 18264 | ||
| 18101 | err = alc_auto_add_mic_boost(codec); | 18265 | err = alc_auto_add_mic_boost(codec); |
| 18102 | if (err < 0) | 18266 | if (err < 0) |
| 18103 | return err; | 18267 | return err; |
| 18104 | 18268 | ||
| 18105 | alc_ssid_check(codec, 0x15, 0x1b, 0x14); | 18269 | if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 || |
| 18270 | codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670) | ||
| 18271 | alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0x21); | ||
| 18272 | else | ||
| 18273 | alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0); | ||
| 18106 | 18274 | ||
| 18107 | return 1; | 18275 | return 1; |
| 18108 | } | 18276 | } |
| @@ -18188,11 +18356,20 @@ static int patch_alc662(struct hda_codec *codec) | |||
| 18188 | 18356 | ||
| 18189 | if (!spec->cap_mixer) | 18357 | if (!spec->cap_mixer) |
| 18190 | set_capture_mixer(codec); | 18358 | set_capture_mixer(codec); |
| 18191 | if (codec->vendor_id == 0x10ec0662) | 18359 | |
| 18360 | switch (codec->vendor_id) { | ||
| 18361 | case 0x10ec0662: | ||
| 18192 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | 18362 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); |
| 18193 | else | 18363 | break; |
| 18364 | case 0x10ec0272: | ||
| 18365 | case 0x10ec0663: | ||
| 18366 | case 0x10ec0665: | ||
| 18194 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); | 18367 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); |
| 18195 | 18368 | break; | |
| 18369 | case 0x10ec0273: | ||
| 18370 | set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT); | ||
| 18371 | break; | ||
| 18372 | } | ||
| 18196 | spec->vmaster_nid = 0x02; | 18373 | spec->vmaster_nid = 0x02; |
| 18197 | 18374 | ||
| 18198 | codec->patch_ops = alc_patch_ops; | 18375 | codec->patch_ops = alc_patch_ops; |
| @@ -18202,7 +18379,6 @@ static int patch_alc662(struct hda_codec *codec) | |||
| 18202 | if (!spec->loopback.amplist) | 18379 | if (!spec->loopback.amplist) |
| 18203 | spec->loopback.amplist = alc662_loopbacks; | 18380 | spec->loopback.amplist = alc662_loopbacks; |
| 18204 | #endif | 18381 | #endif |
| 18205 | codec->proc_widget_hook = print_realtek_coef; | ||
| 18206 | 18382 | ||
| 18207 | return 0; | 18383 | return 0; |
| 18208 | } | 18384 | } |
| @@ -18243,6 +18419,8 @@ static struct hda_codec_preset snd_hda_preset_realtek[] = { | |||
| 18243 | { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1", | 18419 | { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1", |
| 18244 | .patch = patch_alc662 }, | 18420 | .patch = patch_alc662 }, |
| 18245 | { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 }, | 18421 | { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 }, |
| 18422 | { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 }, | ||
| 18423 | { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 }, | ||
| 18246 | { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 }, | 18424 | { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 }, |
| 18247 | { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 }, | 18425 | { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 }, |
| 18248 | { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 }, | 18426 | { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 }, |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index dbffb5b5c69d..8c416bb18a57 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -568,6 +568,11 @@ static hda_nid_t stac92hd83xxx_pin_nids[10] = { | |||
| 568 | 0x0f, 0x10, 0x11, 0x1f, 0x20, | 568 | 0x0f, 0x10, 0x11, 0x1f, 0x20, |
| 569 | }; | 569 | }; |
| 570 | 570 | ||
| 571 | static hda_nid_t stac92hd88xxx_pin_nids[10] = { | ||
| 572 | 0x0a, 0x0b, 0x0c, 0x0d, | ||
| 573 | 0x0f, 0x11, 0x1f, 0x20, | ||
| 574 | }; | ||
| 575 | |||
| 571 | #define STAC92HD71BXX_NUM_PINS 13 | 576 | #define STAC92HD71BXX_NUM_PINS 13 |
| 572 | static hda_nid_t stac92hd71bxx_pin_nids_4port[STAC92HD71BXX_NUM_PINS] = { | 577 | static hda_nid_t stac92hd71bxx_pin_nids_4port[STAC92HD71BXX_NUM_PINS] = { |
| 573 | 0x0a, 0x0b, 0x0c, 0x0d, 0x00, | 578 | 0x0a, 0x0b, 0x0c, 0x0d, 0x00, |
| @@ -2873,6 +2878,13 @@ static hda_nid_t get_unassigned_dac(struct hda_codec *codec, hda_nid_t nid) | |||
| 2873 | 2878 | ||
| 2874 | conn_len = snd_hda_get_connections(codec, nid, conn, | 2879 | conn_len = snd_hda_get_connections(codec, nid, conn, |
| 2875 | HDA_MAX_CONNECTIONS); | 2880 | HDA_MAX_CONNECTIONS); |
| 2881 | /* 92HD88: trace back up the link of nids to find the DAC */ | ||
| 2882 | while (conn_len == 1 && (get_wcaps_type(get_wcaps(codec, conn[0])) | ||
| 2883 | != AC_WID_AUD_OUT)) { | ||
| 2884 | nid = conn[0]; | ||
| 2885 | conn_len = snd_hda_get_connections(codec, nid, conn, | ||
| 2886 | HDA_MAX_CONNECTIONS); | ||
| 2887 | } | ||
| 2876 | for (j = 0; j < conn_len; j++) { | 2888 | for (j = 0; j < conn_len; j++) { |
| 2877 | wcaps = get_wcaps(codec, conn[j]); | 2889 | wcaps = get_wcaps(codec, conn[j]); |
| 2878 | wtype = get_wcaps_type(wcaps); | 2890 | wtype = get_wcaps_type(wcaps); |
| @@ -4351,6 +4363,12 @@ static int stac92xx_init(struct hda_codec *codec) | |||
| 4351 | if (enable_pin_detect(codec, nid, STAC_PWR_EVENT)) | 4363 | if (enable_pin_detect(codec, nid, STAC_PWR_EVENT)) |
| 4352 | stac_issue_unsol_event(codec, nid); | 4364 | stac_issue_unsol_event(codec, nid); |
| 4353 | } | 4365 | } |
| 4366 | |||
| 4367 | #ifdef CONFIG_SND_HDA_POWER_SAVE | ||
| 4368 | /* sync mute LED */ | ||
| 4369 | if (spec->gpio_led && codec->patch_ops.check_power_status) | ||
| 4370 | codec->patch_ops.check_power_status(codec, 0x01); | ||
| 4371 | #endif | ||
| 4354 | if (spec->dac_list) | 4372 | if (spec->dac_list) |
| 4355 | stac92xx_power_down(codec); | 4373 | stac92xx_power_down(codec); |
| 4356 | return 0; | 4374 | return 0; |
| @@ -4742,19 +4760,14 @@ static int hp_blike_system(u32 subsystem_id); | |||
| 4742 | static void set_hp_led_gpio(struct hda_codec *codec) | 4760 | static void set_hp_led_gpio(struct hda_codec *codec) |
| 4743 | { | 4761 | { |
| 4744 | struct sigmatel_spec *spec = codec->spec; | 4762 | struct sigmatel_spec *spec = codec->spec; |
| 4745 | switch (codec->vendor_id) { | 4763 | unsigned int gpio; |
| 4746 | case 0x111d7608: | 4764 | |
| 4747 | /* GPIO 0 */ | 4765 | gpio = snd_hda_param_read(codec, codec->afg, AC_PAR_GPIO_CAP); |
| 4748 | spec->gpio_led = 0x01; | 4766 | gpio &= AC_GPIO_IO_COUNT; |
| 4749 | break; | 4767 | if (gpio > 3) |
| 4750 | case 0x111d7600: | 4768 | spec->gpio_led = 0x08; /* GPIO 3 */ |
| 4751 | case 0x111d7601: | 4769 | else |
| 4752 | case 0x111d7602: | 4770 | spec->gpio_led = 0x01; /* GPIO 0 */ |
| 4753 | case 0x111d7603: | ||
| 4754 | /* GPIO 3 */ | ||
| 4755 | spec->gpio_led = 0x08; | ||
| 4756 | break; | ||
| 4757 | } | ||
| 4758 | } | 4771 | } |
| 4759 | 4772 | ||
| 4760 | /* | 4773 | /* |
| @@ -4777,7 +4790,7 @@ static void set_hp_led_gpio(struct hda_codec *codec) | |||
| 4777 | * Need more information on whether it is true across the entire series. | 4790 | * Need more information on whether it is true across the entire series. |
| 4778 | * -- kunal | 4791 | * -- kunal |
| 4779 | */ | 4792 | */ |
| 4780 | static int find_mute_led_gpio(struct hda_codec *codec) | 4793 | static int find_mute_led_gpio(struct hda_codec *codec, int default_polarity) |
| 4781 | { | 4794 | { |
| 4782 | struct sigmatel_spec *spec = codec->spec; | 4795 | struct sigmatel_spec *spec = codec->spec; |
| 4783 | const struct dmi_device *dev = NULL; | 4796 | const struct dmi_device *dev = NULL; |
| @@ -4804,7 +4817,7 @@ static int find_mute_led_gpio(struct hda_codec *codec) | |||
| 4804 | */ | 4817 | */ |
| 4805 | if (!hp_blike_system(codec->subsystem_id)) { | 4818 | if (!hp_blike_system(codec->subsystem_id)) { |
| 4806 | set_hp_led_gpio(codec); | 4819 | set_hp_led_gpio(codec); |
| 4807 | spec->gpio_led_polarity = 1; | 4820 | spec->gpio_led_polarity = default_polarity; |
| 4808 | return 1; | 4821 | return 1; |
| 4809 | } | 4822 | } |
| 4810 | } | 4823 | } |
| @@ -4902,6 +4915,11 @@ static int stac92xx_resume(struct hda_codec *codec) | |||
| 4902 | stac_issue_unsol_event(codec, | 4915 | stac_issue_unsol_event(codec, |
| 4903 | spec->autocfg.line_out_pins[0]); | 4916 | spec->autocfg.line_out_pins[0]); |
| 4904 | } | 4917 | } |
| 4918 | #ifdef CONFIG_SND_HDA_POWER_SAVE | ||
| 4919 | /* sync mute LED */ | ||
| 4920 | if (spec->gpio_led && codec->patch_ops.check_power_status) | ||
| 4921 | codec->patch_ops.check_power_status(codec, 0x01); | ||
| 4922 | #endif | ||
| 4905 | return 0; | 4923 | return 0; |
| 4906 | } | 4924 | } |
| 4907 | 4925 | ||
| @@ -4921,43 +4939,29 @@ static int stac92xx_hp_check_power_status(struct hda_codec *codec, | |||
| 4921 | hda_nid_t nid) | 4939 | hda_nid_t nid) |
| 4922 | { | 4940 | { |
| 4923 | struct sigmatel_spec *spec = codec->spec; | 4941 | struct sigmatel_spec *spec = codec->spec; |
| 4942 | int i, muted = 1; | ||
| 4924 | 4943 | ||
| 4925 | if (nid == 0x10) { | 4944 | for (i = 0; i < spec->multiout.num_dacs; i++) { |
| 4926 | if (snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) & | 4945 | nid = spec->multiout.dac_nids[i]; |
| 4927 | HDA_AMP_MUTE) | 4946 | if (!(snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) & |
| 4928 | spec->gpio_data &= ~spec->gpio_led; /* orange */ | 4947 | HDA_AMP_MUTE)) { |
| 4929 | else | 4948 | muted = 0; /* something heard */ |
| 4930 | spec->gpio_data |= spec->gpio_led; /* white */ | 4949 | break; |
| 4931 | |||
| 4932 | if (!spec->gpio_led_polarity) { | ||
| 4933 | /* LED state is inverted on these systems */ | ||
| 4934 | spec->gpio_data ^= spec->gpio_led; | ||
| 4935 | } | 4950 | } |
| 4936 | |||
| 4937 | stac_gpio_set(codec, spec->gpio_mask, | ||
| 4938 | spec->gpio_dir, | ||
| 4939 | spec->gpio_data); | ||
| 4940 | } | 4951 | } |
| 4952 | if (muted) | ||
| 4953 | spec->gpio_data &= ~spec->gpio_led; /* orange */ | ||
| 4954 | else | ||
| 4955 | spec->gpio_data |= spec->gpio_led; /* white */ | ||
| 4941 | 4956 | ||
| 4942 | return 0; | 4957 | if (!spec->gpio_led_polarity) { |
| 4943 | } | 4958 | /* LED state is inverted on these systems */ |
| 4944 | 4959 | spec->gpio_data ^= spec->gpio_led; | |
| 4945 | static int idt92hd83xxx_hp_check_power_status(struct hda_codec *codec, | 4960 | } |
| 4946 | hda_nid_t nid) | ||
| 4947 | { | ||
| 4948 | struct sigmatel_spec *spec = codec->spec; | ||
| 4949 | 4961 | ||
| 4950 | if (nid != 0x13) | ||
| 4951 | return 0; | ||
| 4952 | if (snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) & HDA_AMP_MUTE) | ||
| 4953 | spec->gpio_data |= spec->gpio_led; /* mute LED on */ | ||
| 4954 | else | ||
| 4955 | spec->gpio_data &= ~spec->gpio_led; /* mute LED off */ | ||
| 4956 | stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data); | 4962 | stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data); |
| 4957 | |||
| 4958 | return 0; | 4963 | return 0; |
| 4959 | } | 4964 | } |
| 4960 | |||
| 4961 | #endif | 4965 | #endif |
| 4962 | 4966 | ||
| 4963 | static int stac92xx_suspend(struct hda_codec *codec, pm_message_t state) | 4967 | static int stac92xx_suspend(struct hda_codec *codec, pm_message_t state) |
| @@ -5279,7 +5283,6 @@ static int patch_stac92hd83xxx(struct hda_codec *codec) | |||
| 5279 | hda_nid_t conn[STAC92HD83_DAC_COUNT + 1]; | 5283 | hda_nid_t conn[STAC92HD83_DAC_COUNT + 1]; |
| 5280 | int err; | 5284 | int err; |
| 5281 | int num_dacs; | 5285 | int num_dacs; |
| 5282 | hda_nid_t nid; | ||
| 5283 | 5286 | ||
| 5284 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 5287 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
| 5285 | if (spec == NULL) | 5288 | if (spec == NULL) |
| @@ -5318,7 +5321,18 @@ again: | |||
| 5318 | stac92hd83xxx_brd_tbl[spec->board_config]); | 5321 | stac92hd83xxx_brd_tbl[spec->board_config]); |
| 5319 | 5322 | ||
| 5320 | switch (codec->vendor_id) { | 5323 | switch (codec->vendor_id) { |
| 5324 | case 0x111d7666: | ||
| 5325 | case 0x111d7667: | ||
| 5326 | case 0x111d7668: | ||
| 5327 | case 0x111d7669: | ||
| 5328 | spec->num_pins = ARRAY_SIZE(stac92hd88xxx_pin_nids); | ||
| 5329 | spec->pin_nids = stac92hd88xxx_pin_nids; | ||
| 5330 | spec->mono_nid = 0; | ||
| 5331 | spec->digbeep_nid = 0; | ||
| 5332 | spec->num_pwrs = 0; | ||
| 5333 | break; | ||
| 5321 | case 0x111d7604: | 5334 | case 0x111d7604: |
| 5335 | case 0x111d76d4: | ||
| 5322 | case 0x111d7605: | 5336 | case 0x111d7605: |
| 5323 | case 0x111d76d5: | 5337 | case 0x111d76d5: |
| 5324 | if (spec->board_config == STAC_92HD83XXX_PWR_REF) | 5338 | if (spec->board_config == STAC_92HD83XXX_PWR_REF) |
| @@ -5329,8 +5343,10 @@ again: | |||
| 5329 | 5343 | ||
| 5330 | codec->patch_ops = stac92xx_patch_ops; | 5344 | codec->patch_ops = stac92xx_patch_ops; |
| 5331 | 5345 | ||
| 5332 | if (spec->board_config == STAC_92HD83XXX_HP) | 5346 | if (find_mute_led_gpio(codec, 0)) |
| 5333 | spec->gpio_led = 0x01; | 5347 | snd_printd("mute LED gpio %d polarity %d\n", |
| 5348 | spec->gpio_led, | ||
| 5349 | spec->gpio_led_polarity); | ||
| 5334 | 5350 | ||
| 5335 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 5351 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
| 5336 | if (spec->gpio_led) { | 5352 | if (spec->gpio_led) { |
| @@ -5339,7 +5355,7 @@ again: | |||
| 5339 | spec->gpio_data |= spec->gpio_led; | 5355 | spec->gpio_data |= spec->gpio_led; |
| 5340 | /* register check_power_status callback. */ | 5356 | /* register check_power_status callback. */ |
| 5341 | codec->patch_ops.check_power_status = | 5357 | codec->patch_ops.check_power_status = |
| 5342 | idt92hd83xxx_hp_check_power_status; | 5358 | stac92xx_hp_check_power_status; |
| 5343 | } | 5359 | } |
| 5344 | #endif | 5360 | #endif |
| 5345 | 5361 | ||
| @@ -5359,24 +5375,21 @@ again: | |||
| 5359 | return err; | 5375 | return err; |
| 5360 | } | 5376 | } |
| 5361 | 5377 | ||
| 5362 | switch (spec->board_config) { | 5378 | /* docking output support */ |
| 5363 | case STAC_DELL_S14: | 5379 | num_dacs = snd_hda_get_connections(codec, 0xF, |
| 5364 | nid = 0xf; | ||
| 5365 | break; | ||
| 5366 | default: | ||
| 5367 | nid = 0xe; | ||
| 5368 | break; | ||
| 5369 | } | ||
| 5370 | |||
| 5371 | num_dacs = snd_hda_get_connections(codec, nid, | ||
| 5372 | conn, STAC92HD83_DAC_COUNT + 1) - 1; | 5380 | conn, STAC92HD83_DAC_COUNT + 1) - 1; |
| 5373 | if (num_dacs < 0) | 5381 | /* skip non-DAC connections */ |
| 5374 | num_dacs = STAC92HD83_DAC_COUNT; | 5382 | while (num_dacs >= 0 && |
| 5375 | 5383 | (get_wcaps_type(get_wcaps(codec, conn[num_dacs])) | |
| 5376 | /* set port X to select the last DAC | 5384 | != AC_WID_AUD_OUT)) |
| 5377 | */ | 5385 | num_dacs--; |
| 5378 | snd_hda_codec_write_cache(codec, nid, 0, | 5386 | /* set port E and F to select the last DAC */ |
| 5387 | if (num_dacs >= 0) { | ||
| 5388 | snd_hda_codec_write_cache(codec, 0xE, 0, | ||
| 5389 | AC_VERB_SET_CONNECT_SEL, num_dacs); | ||
| 5390 | snd_hda_codec_write_cache(codec, 0xF, 0, | ||
| 5379 | AC_VERB_SET_CONNECT_SEL, num_dacs); | 5391 | AC_VERB_SET_CONNECT_SEL, num_dacs); |
| 5392 | } | ||
| 5380 | 5393 | ||
| 5381 | codec->proc_widget_hook = stac92hd_proc_hook; | 5394 | codec->proc_widget_hook = stac92hd_proc_hook; |
| 5382 | 5395 | ||
| @@ -5657,7 +5670,6 @@ again: | |||
| 5657 | */ | 5670 | */ |
| 5658 | spec->num_smuxes = 1; | 5671 | spec->num_smuxes = 1; |
| 5659 | spec->num_dmuxes = 1; | 5672 | spec->num_dmuxes = 1; |
| 5660 | spec->gpio_led = 0x01; | ||
| 5661 | /* fallthrough */ | 5673 | /* fallthrough */ |
| 5662 | case STAC_HP_DV5: | 5674 | case STAC_HP_DV5: |
| 5663 | snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010); | 5675 | snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010); |
| @@ -5672,8 +5684,6 @@ again: | |||
| 5672 | spec->num_dmics = 1; | 5684 | spec->num_dmics = 1; |
| 5673 | spec->num_dmuxes = 1; | 5685 | spec->num_dmuxes = 1; |
| 5674 | spec->num_smuxes = 1; | 5686 | spec->num_smuxes = 1; |
| 5675 | /* orange/white mute led on GPIO3, orange=0, white=1 */ | ||
| 5676 | spec->gpio_led = 0x08; | ||
| 5677 | break; | 5687 | break; |
| 5678 | } | 5688 | } |
| 5679 | 5689 | ||
| @@ -5695,7 +5705,7 @@ again: | |||
| 5695 | } | 5705 | } |
| 5696 | } | 5706 | } |
| 5697 | 5707 | ||
| 5698 | if (find_mute_led_gpio(codec)) | 5708 | if (find_mute_led_gpio(codec, 1)) |
| 5699 | snd_printd("mute LED gpio %d polarity %d\n", | 5709 | snd_printd("mute LED gpio %d polarity %d\n", |
| 5700 | spec->gpio_led, | 5710 | spec->gpio_led, |
| 5701 | spec->gpio_led_polarity); | 5711 | spec->gpio_led_polarity); |
| @@ -6236,8 +6246,13 @@ static struct hda_codec_preset snd_hda_preset_sigmatel[] = { | |||
| 6236 | { .id = 0x838476a7, .name = "STAC9254D", .patch = patch_stac9205 }, | 6246 | { .id = 0x838476a7, .name = "STAC9254D", .patch = patch_stac9205 }, |
| 6237 | { .id = 0x111d7603, .name = "92HD75B3X5", .patch = patch_stac92hd71bxx}, | 6247 | { .id = 0x111d7603, .name = "92HD75B3X5", .patch = patch_stac92hd71bxx}, |
| 6238 | { .id = 0x111d7604, .name = "92HD83C1X5", .patch = patch_stac92hd83xxx}, | 6248 | { .id = 0x111d7604, .name = "92HD83C1X5", .patch = patch_stac92hd83xxx}, |
| 6249 | { .id = 0x111d76d4, .name = "92HD83C1C5", .patch = patch_stac92hd83xxx}, | ||
| 6239 | { .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx}, | 6250 | { .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx}, |
| 6240 | { .id = 0x111d76d5, .name = "92HD81B1C5", .patch = patch_stac92hd83xxx}, | 6251 | { .id = 0x111d76d5, .name = "92HD81B1C5", .patch = patch_stac92hd83xxx}, |
| 6252 | { .id = 0x111d7666, .name = "92HD88B3", .patch = patch_stac92hd83xxx}, | ||
| 6253 | { .id = 0x111d7667, .name = "92HD88B1", .patch = patch_stac92hd83xxx}, | ||
| 6254 | { .id = 0x111d7668, .name = "92HD88B2", .patch = patch_stac92hd83xxx}, | ||
| 6255 | { .id = 0x111d7669, .name = "92HD88B4", .patch = patch_stac92hd83xxx}, | ||
| 6241 | { .id = 0x111d7608, .name = "92HD75B2X5", .patch = patch_stac92hd71bxx}, | 6256 | { .id = 0x111d7608, .name = "92HD75B2X5", .patch = patch_stac92hd71bxx}, |
| 6242 | { .id = 0x111d7674, .name = "92HD73D1X5", .patch = patch_stac92hd73xx }, | 6257 | { .id = 0x111d7674, .name = "92HD73D1X5", .patch = patch_stac92hd73xx }, |
| 6243 | { .id = 0x111d7675, .name = "92HD73C1X5", .patch = patch_stac92hd73xx }, | 6258 | { .id = 0x111d7675, .name = "92HD73C1X5", .patch = patch_stac92hd73xx }, |
