diff options
Diffstat (limited to 'sound')
-rw-r--r-- | sound/core/vmaster.c | 1 | ||||
-rw-r--r-- | sound/isa/sscape.c | 6 | ||||
-rw-r--r-- | sound/last.c | 2 | ||||
-rw-r--r-- | sound/oss/msnd_pinnacle.c | 8 | ||||
-rw-r--r-- | sound/pci/asihpi/hpi_internal.h | 4 | ||||
-rw-r--r-- | sound/pci/asihpi/hpios.c | 10 | ||||
-rw-r--r-- | sound/pci/hda/hda_codec.h | 3 | ||||
-rw-r--r-- | sound/pci/hda/hda_eld.c | 6 | ||||
-rw-r--r-- | sound/pci/hda/hda_proc.c | 13 | ||||
-rw-r--r-- | sound/pci/hda/patch_conexant.c | 143 | ||||
-rw-r--r-- | sound/pci/hda/patch_hdmi.c | 9 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 86 | ||||
-rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 5 |
13 files changed, 184 insertions, 112 deletions
diff --git a/sound/core/vmaster.c b/sound/core/vmaster.c index 14a286a7bf2b..857586135d18 100644 --- a/sound/core/vmaster.c +++ b/sound/core/vmaster.c | |||
@@ -419,6 +419,7 @@ EXPORT_SYMBOL(snd_ctl_make_virtual_master); | |||
419 | * snd_ctl_add_vmaster_hook - Add a hook to a vmaster control | 419 | * snd_ctl_add_vmaster_hook - Add a hook to a vmaster control |
420 | * @kcontrol: vmaster kctl element | 420 | * @kcontrol: vmaster kctl element |
421 | * @hook: the hook function | 421 | * @hook: the hook function |
422 | * @private_data: the private_data pointer to be saved | ||
422 | * | 423 | * |
423 | * Adds the given hook to the vmaster control element so that it's called | 424 | * Adds the given hook to the vmaster control element so that it's called |
424 | * at each time when the value is changed. | 425 | * at each time when the value is changed. |
diff --git a/sound/isa/sscape.c b/sound/isa/sscape.c index b4a6aa960f4b..8490f59709bb 100644 --- a/sound/isa/sscape.c +++ b/sound/isa/sscape.c | |||
@@ -1019,13 +1019,15 @@ static int __devinit create_sscape(int dev, struct snd_card *card) | |||
1019 | irq_cfg = get_irq_config(sscape->type, irq[dev]); | 1019 | irq_cfg = get_irq_config(sscape->type, irq[dev]); |
1020 | if (irq_cfg == INVALID_IRQ) { | 1020 | if (irq_cfg == INVALID_IRQ) { |
1021 | snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", irq[dev]); | 1021 | snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", irq[dev]); |
1022 | return -ENXIO; | 1022 | err = -ENXIO; |
1023 | goto _release_dma; | ||
1023 | } | 1024 | } |
1024 | 1025 | ||
1025 | mpu_irq_cfg = get_irq_config(sscape->type, mpu_irq[dev]); | 1026 | mpu_irq_cfg = get_irq_config(sscape->type, mpu_irq[dev]); |
1026 | if (mpu_irq_cfg == INVALID_IRQ) { | 1027 | if (mpu_irq_cfg == INVALID_IRQ) { |
1027 | snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", mpu_irq[dev]); | 1028 | snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", mpu_irq[dev]); |
1028 | return -ENXIO; | 1029 | err = -ENXIO; |
1030 | goto _release_dma; | ||
1029 | } | 1031 | } |
1030 | 1032 | ||
1031 | /* | 1033 | /* |
diff --git a/sound/last.c b/sound/last.c index bdd0857b8871..7ffc182e0844 100644 --- a/sound/last.c +++ b/sound/last.c | |||
@@ -38,4 +38,4 @@ static int __init alsa_sound_last_init(void) | |||
38 | return 0; | 38 | return 0; |
39 | } | 39 | } |
40 | 40 | ||
41 | __initcall(alsa_sound_last_init); | 41 | late_initcall_sync(alsa_sound_last_init); |
diff --git a/sound/oss/msnd_pinnacle.c b/sound/oss/msnd_pinnacle.c index 2c79d60a725f..536c4c0514d3 100644 --- a/sound/oss/msnd_pinnacle.c +++ b/sound/oss/msnd_pinnacle.c | |||
@@ -1294,6 +1294,8 @@ static int __init calibrate_adc(WORD srate) | |||
1294 | 1294 | ||
1295 | static int upload_dsp_code(void) | 1295 | static int upload_dsp_code(void) |
1296 | { | 1296 | { |
1297 | int ret = 0; | ||
1298 | |||
1297 | msnd_outb(HPBLKSEL_0, dev.io + HP_BLKS); | 1299 | msnd_outb(HPBLKSEL_0, dev.io + HP_BLKS); |
1298 | #ifndef HAVE_DSPCODEH | 1300 | #ifndef HAVE_DSPCODEH |
1299 | INITCODESIZE = mod_firmware_load(INITCODEFILE, &INITCODE); | 1301 | INITCODESIZE = mod_firmware_load(INITCODEFILE, &INITCODE); |
@@ -1312,7 +1314,8 @@ static int upload_dsp_code(void) | |||
1312 | memcpy_toio(dev.base, PERMCODE, PERMCODESIZE); | 1314 | memcpy_toio(dev.base, PERMCODE, PERMCODESIZE); |
1313 | if (msnd_upload_host(&dev, INITCODE, INITCODESIZE) < 0) { | 1315 | if (msnd_upload_host(&dev, INITCODE, INITCODESIZE) < 0) { |
1314 | printk(KERN_WARNING LOGNAME ": Error uploading to DSP\n"); | 1316 | printk(KERN_WARNING LOGNAME ": Error uploading to DSP\n"); |
1315 | return -ENODEV; | 1317 | ret = -ENODEV; |
1318 | goto out; | ||
1316 | } | 1319 | } |
1317 | #ifdef HAVE_DSPCODEH | 1320 | #ifdef HAVE_DSPCODEH |
1318 | printk(KERN_INFO LOGNAME ": DSP firmware uploaded (resident)\n"); | 1321 | printk(KERN_INFO LOGNAME ": DSP firmware uploaded (resident)\n"); |
@@ -1320,12 +1323,13 @@ static int upload_dsp_code(void) | |||
1320 | printk(KERN_INFO LOGNAME ": DSP firmware uploaded\n"); | 1323 | printk(KERN_INFO LOGNAME ": DSP firmware uploaded\n"); |
1321 | #endif | 1324 | #endif |
1322 | 1325 | ||
1326 | out: | ||
1323 | #ifndef HAVE_DSPCODEH | 1327 | #ifndef HAVE_DSPCODEH |
1324 | vfree(INITCODE); | 1328 | vfree(INITCODE); |
1325 | vfree(PERMCODE); | 1329 | vfree(PERMCODE); |
1326 | #endif | 1330 | #endif |
1327 | 1331 | ||
1328 | return 0; | 1332 | return ret; |
1329 | } | 1333 | } |
1330 | 1334 | ||
1331 | #ifdef MSND_CLASSIC | 1335 | #ifdef MSND_CLASSIC |
diff --git a/sound/pci/asihpi/hpi_internal.h b/sound/pci/asihpi/hpi_internal.h index 8c63200cf339..bc86cb726d79 100644 --- a/sound/pci/asihpi/hpi_internal.h +++ b/sound/pci/asihpi/hpi_internal.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /****************************************************************************** | 1 | /****************************************************************************** |
2 | 2 | ||
3 | AudioScience HPI driver | 3 | AudioScience HPI driver |
4 | Copyright (C) 1997-2011 AudioScience Inc. <support@audioscience.com> | 4 | Copyright (C) 1997-2012 AudioScience Inc. <support@audioscience.com> |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify | 6 | This program is free software; you can redistribute it and/or modify |
7 | it under the terms of version 2 of the GNU General Public License as | 7 | it under the terms of version 2 of the GNU General Public License as |
@@ -42,7 +42,7 @@ On error *pLockedMemHandle marked invalid, non-zero returned. | |||
42 | If this function succeeds, then HpiOs_LockedMem_GetVirtAddr() and | 42 | If this function succeeds, then HpiOs_LockedMem_GetVirtAddr() and |
43 | HpiOs_LockedMem_GetPyhsAddr() will always succed on the returned handle. | 43 | HpiOs_LockedMem_GetPyhsAddr() will always succed on the returned handle. |
44 | */ | 44 | */ |
45 | int hpios_locked_mem_alloc(struct consistent_dma_area *p_locked_mem_handle, | 45 | u16 hpios_locked_mem_alloc(struct consistent_dma_area *p_locked_mem_handle, |
46 | /**< memory handle */ | 46 | /**< memory handle */ |
47 | u32 size, /**< Size in bytes to allocate */ | 47 | u32 size, /**< Size in bytes to allocate */ |
48 | struct pci_dev *p_os_reference | 48 | struct pci_dev *p_os_reference |
diff --git a/sound/pci/asihpi/hpios.c b/sound/pci/asihpi/hpios.c index 87f4385fe8c7..5ef4fe964366 100644 --- a/sound/pci/asihpi/hpios.c +++ b/sound/pci/asihpi/hpios.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /****************************************************************************** | 1 | /****************************************************************************** |
2 | 2 | ||
3 | AudioScience HPI driver | 3 | AudioScience HPI driver |
4 | Copyright (C) 1997-2011 AudioScience Inc. <support@audioscience.com> | 4 | Copyright (C) 1997-2012 AudioScience Inc. <support@audioscience.com> |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify | 6 | This program is free software; you can redistribute it and/or modify |
7 | it under the terms of version 2 of the GNU General Public License as | 7 | it under the terms of version 2 of the GNU General Public License as |
@@ -39,11 +39,11 @@ void hpios_delay_micro_seconds(u32 num_micro_sec) | |||
39 | 39 | ||
40 | } | 40 | } |
41 | 41 | ||
42 | /** Allocated an area of locked memory for bus master DMA operations. | 42 | /** Allocate an area of locked memory for bus master DMA operations. |
43 | 43 | ||
44 | On error, return -ENOMEM, and *pMemArea.size = 0 | 44 | If allocation fails, return 1, and *pMemArea.size = 0 |
45 | */ | 45 | */ |
46 | int hpios_locked_mem_alloc(struct consistent_dma_area *p_mem_area, u32 size, | 46 | u16 hpios_locked_mem_alloc(struct consistent_dma_area *p_mem_area, u32 size, |
47 | struct pci_dev *pdev) | 47 | struct pci_dev *pdev) |
48 | { | 48 | { |
49 | /*?? any benefit in using managed dmam_alloc_coherent? */ | 49 | /*?? any benefit in using managed dmam_alloc_coherent? */ |
@@ -62,7 +62,7 @@ int hpios_locked_mem_alloc(struct consistent_dma_area *p_mem_area, u32 size, | |||
62 | HPI_DEBUG_LOG(WARNING, | 62 | HPI_DEBUG_LOG(WARNING, |
63 | "failed to allocate %d bytes locked memory\n", size); | 63 | "failed to allocate %d bytes locked memory\n", size); |
64 | p_mem_area->size = 0; | 64 | p_mem_area->size = 0; |
65 | return -ENOMEM; | 65 | return 1; |
66 | } | 66 | } |
67 | } | 67 | } |
68 | 68 | ||
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 9a9f372e1be4..56b4f74c0b13 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
@@ -851,6 +851,9 @@ struct hda_codec { | |||
851 | unsigned int pin_amp_workaround:1; /* pin out-amp takes index | 851 | unsigned int pin_amp_workaround:1; /* pin out-amp takes index |
852 | * (e.g. Conexant codecs) | 852 | * (e.g. Conexant codecs) |
853 | */ | 853 | */ |
854 | unsigned int single_adc_amp:1; /* adc in-amp takes no index | ||
855 | * (e.g. CX20549 codec) | ||
856 | */ | ||
854 | unsigned int no_sticky_stream:1; /* no sticky-PCM stream assignment */ | 857 | unsigned int no_sticky_stream:1; /* no sticky-PCM stream assignment */ |
855 | unsigned int pins_shutup:1; /* pins are shut up */ | 858 | unsigned int pins_shutup:1; /* pins are shut up */ |
856 | unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */ | 859 | unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */ |
diff --git a/sound/pci/hda/hda_eld.c b/sound/pci/hda/hda_eld.c index b58b4b1687fa..4c054f4486b9 100644 --- a/sound/pci/hda/hda_eld.c +++ b/sound/pci/hda/hda_eld.c | |||
@@ -418,7 +418,7 @@ static void hdmi_show_short_audio_desc(struct cea_sad *a) | |||
418 | else | 418 | else |
419 | buf2[0] = '\0'; | 419 | buf2[0] = '\0'; |
420 | 420 | ||
421 | printk(KERN_INFO "HDMI: supports coding type %s:" | 421 | _snd_printd(SND_PR_VERBOSE, "HDMI: supports coding type %s:" |
422 | " channels = %d, rates =%s%s\n", | 422 | " channels = %d, rates =%s%s\n", |
423 | cea_audio_coding_type_names[a->format], | 423 | cea_audio_coding_type_names[a->format], |
424 | a->channels, | 424 | a->channels, |
@@ -442,14 +442,14 @@ void snd_hdmi_show_eld(struct hdmi_eld *e) | |||
442 | { | 442 | { |
443 | int i; | 443 | int i; |
444 | 444 | ||
445 | printk(KERN_INFO "HDMI: detected monitor %s at connection type %s\n", | 445 | _snd_printd(SND_PR_VERBOSE, "HDMI: detected monitor %s at connection type %s\n", |
446 | e->monitor_name, | 446 | e->monitor_name, |
447 | eld_connection_type_names[e->conn_type]); | 447 | eld_connection_type_names[e->conn_type]); |
448 | 448 | ||
449 | if (e->spk_alloc) { | 449 | if (e->spk_alloc) { |
450 | char buf[SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE]; | 450 | char buf[SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE]; |
451 | snd_print_channel_allocation(e->spk_alloc, buf, sizeof(buf)); | 451 | snd_print_channel_allocation(e->spk_alloc, buf, sizeof(buf)); |
452 | printk(KERN_INFO "HDMI: available speakers:%s\n", buf); | 452 | _snd_printd(SND_PR_VERBOSE, "HDMI: available speakers:%s\n", buf); |
453 | } | 453 | } |
454 | 454 | ||
455 | for (i = 0; i < e->sad_count; i++) | 455 | for (i = 0; i < e->sad_count; i++) |
diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c index 254ab5204603..e59e2f059b6e 100644 --- a/sound/pci/hda/hda_proc.c +++ b/sound/pci/hda/hda_proc.c | |||
@@ -651,9 +651,16 @@ static void print_codec_info(struct snd_info_entry *entry, | |||
651 | snd_iprintf(buffer, " Amp-In caps: "); | 651 | snd_iprintf(buffer, " Amp-In caps: "); |
652 | print_amp_caps(buffer, codec, nid, HDA_INPUT); | 652 | print_amp_caps(buffer, codec, nid, HDA_INPUT); |
653 | snd_iprintf(buffer, " Amp-In vals: "); | 653 | snd_iprintf(buffer, " Amp-In vals: "); |
654 | print_amp_vals(buffer, codec, nid, HDA_INPUT, | 654 | if (wid_type == AC_WID_PIN || |
655 | wid_caps & AC_WCAP_STEREO, | 655 | (codec->single_adc_amp && |
656 | wid_type == AC_WID_PIN ? 1 : conn_len); | 656 | wid_type == AC_WID_AUD_IN)) |
657 | print_amp_vals(buffer, codec, nid, HDA_INPUT, | ||
658 | wid_caps & AC_WCAP_STEREO, | ||
659 | 1); | ||
660 | else | ||
661 | print_amp_vals(buffer, codec, nid, HDA_INPUT, | ||
662 | wid_caps & AC_WCAP_STEREO, | ||
663 | conn_len); | ||
657 | } | 664 | } |
658 | if (wid_caps & AC_WCAP_OUT_AMP) { | 665 | if (wid_caps & AC_WCAP_OUT_AMP) { |
659 | snd_iprintf(buffer, " Amp-Out caps: "); | 666 | snd_iprintf(buffer, " Amp-Out caps: "); |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 8c6523bbc797..d906c5b74cf0 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
@@ -141,7 +141,6 @@ struct conexant_spec { | |||
141 | unsigned int hp_laptop:1; | 141 | unsigned int hp_laptop:1; |
142 | unsigned int asus:1; | 142 | unsigned int asus:1; |
143 | unsigned int pin_eapd_ctrls:1; | 143 | unsigned int pin_eapd_ctrls:1; |
144 | unsigned int single_adc_amp:1; | ||
145 | 144 | ||
146 | unsigned int adc_switching:1; | 145 | unsigned int adc_switching:1; |
147 | 146 | ||
@@ -687,27 +686,26 @@ static const struct hda_channel_mode cxt5045_modes[1] = { | |||
687 | static const struct hda_input_mux cxt5045_capture_source = { | 686 | static const struct hda_input_mux cxt5045_capture_source = { |
688 | .num_items = 2, | 687 | .num_items = 2, |
689 | .items = { | 688 | .items = { |
690 | { "IntMic", 0x1 }, | 689 | { "Internal Mic", 0x1 }, |
691 | { "ExtMic", 0x2 }, | 690 | { "Mic", 0x2 }, |
692 | } | 691 | } |
693 | }; | 692 | }; |
694 | 693 | ||
695 | static const struct hda_input_mux cxt5045_capture_source_benq = { | 694 | static const struct hda_input_mux cxt5045_capture_source_benq = { |
696 | .num_items = 5, | 695 | .num_items = 4, |
697 | .items = { | 696 | .items = { |
698 | { "IntMic", 0x1 }, | 697 | { "Internal Mic", 0x1 }, |
699 | { "ExtMic", 0x2 }, | 698 | { "Mic", 0x2 }, |
700 | { "LineIn", 0x3 }, | 699 | { "Line", 0x3 }, |
701 | { "CD", 0x4 }, | 700 | { "Mixer", 0x0 }, |
702 | { "Mixer", 0x0 }, | ||
703 | } | 701 | } |
704 | }; | 702 | }; |
705 | 703 | ||
706 | static const struct hda_input_mux cxt5045_capture_source_hp530 = { | 704 | static const struct hda_input_mux cxt5045_capture_source_hp530 = { |
707 | .num_items = 2, | 705 | .num_items = 2, |
708 | .items = { | 706 | .items = { |
709 | { "ExtMic", 0x1 }, | 707 | { "Mic", 0x1 }, |
710 | { "IntMic", 0x2 }, | 708 | { "Internal Mic", 0x2 }, |
711 | } | 709 | } |
712 | }; | 710 | }; |
713 | 711 | ||
@@ -798,10 +796,8 @@ static void cxt5045_hp_unsol_event(struct hda_codec *codec, | |||
798 | } | 796 | } |
799 | 797 | ||
800 | static const struct snd_kcontrol_new cxt5045_mixers[] = { | 798 | static const struct snd_kcontrol_new cxt5045_mixers[] = { |
801 | HDA_CODEC_VOLUME("Internal Mic Capture Volume", 0x1a, 0x01, HDA_INPUT), | 799 | HDA_CODEC_VOLUME("Capture Volume", 0x1a, 0x00, HDA_INPUT), |
802 | HDA_CODEC_MUTE("Internal Mic Capture Switch", 0x1a, 0x01, HDA_INPUT), | 800 | HDA_CODEC_MUTE("Capture Switch", 0x1a, 0x0, HDA_INPUT), |
803 | HDA_CODEC_VOLUME("Mic Capture Volume", 0x1a, 0x02, HDA_INPUT), | ||
804 | HDA_CODEC_MUTE("Mic Capture Switch", 0x1a, 0x02, HDA_INPUT), | ||
805 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x17, 0x0, HDA_INPUT), | 801 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x17, 0x0, HDA_INPUT), |
806 | HDA_CODEC_MUTE("PCM Playback Switch", 0x17, 0x0, HDA_INPUT), | 802 | HDA_CODEC_MUTE("PCM Playback Switch", 0x17, 0x0, HDA_INPUT), |
807 | HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x1, HDA_INPUT), | 803 | HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x1, HDA_INPUT), |
@@ -822,27 +818,15 @@ static const struct snd_kcontrol_new cxt5045_mixers[] = { | |||
822 | }; | 818 | }; |
823 | 819 | ||
824 | static const struct snd_kcontrol_new cxt5045_benq_mixers[] = { | 820 | static const struct snd_kcontrol_new cxt5045_benq_mixers[] = { |
825 | HDA_CODEC_VOLUME("CD Capture Volume", 0x1a, 0x04, HDA_INPUT), | 821 | HDA_CODEC_VOLUME("Line Playback Volume", 0x17, 0x3, HDA_INPUT), |
826 | HDA_CODEC_MUTE("CD Capture Switch", 0x1a, 0x04, HDA_INPUT), | 822 | HDA_CODEC_MUTE("Line Playback Switch", 0x17, 0x3, HDA_INPUT), |
827 | HDA_CODEC_VOLUME("CD Playback Volume", 0x17, 0x4, HDA_INPUT), | ||
828 | HDA_CODEC_MUTE("CD Playback Switch", 0x17, 0x4, HDA_INPUT), | ||
829 | |||
830 | HDA_CODEC_VOLUME("Line In Capture Volume", 0x1a, 0x03, HDA_INPUT), | ||
831 | HDA_CODEC_MUTE("Line In Capture Switch", 0x1a, 0x03, HDA_INPUT), | ||
832 | HDA_CODEC_VOLUME("Line In Playback Volume", 0x17, 0x3, HDA_INPUT), | ||
833 | HDA_CODEC_MUTE("Line In Playback Switch", 0x17, 0x3, HDA_INPUT), | ||
834 | |||
835 | HDA_CODEC_VOLUME("Mixer Capture Volume", 0x1a, 0x0, HDA_INPUT), | ||
836 | HDA_CODEC_MUTE("Mixer Capture Switch", 0x1a, 0x0, HDA_INPUT), | ||
837 | 823 | ||
838 | {} | 824 | {} |
839 | }; | 825 | }; |
840 | 826 | ||
841 | static const struct snd_kcontrol_new cxt5045_mixers_hp530[] = { | 827 | static const struct snd_kcontrol_new cxt5045_mixers_hp530[] = { |
842 | HDA_CODEC_VOLUME("Internal Mic Capture Volume", 0x1a, 0x02, HDA_INPUT), | 828 | HDA_CODEC_VOLUME("Capture Volume", 0x1a, 0x00, HDA_INPUT), |
843 | HDA_CODEC_MUTE("Internal Mic Capture Switch", 0x1a, 0x02, HDA_INPUT), | 829 | HDA_CODEC_MUTE("Capture Switch", 0x1a, 0x0, HDA_INPUT), |
844 | HDA_CODEC_VOLUME("Mic Capture Volume", 0x1a, 0x01, HDA_INPUT), | ||
845 | HDA_CODEC_MUTE("Mic Capture Switch", 0x1a, 0x01, HDA_INPUT), | ||
846 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x17, 0x0, HDA_INPUT), | 830 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x17, 0x0, HDA_INPUT), |
847 | HDA_CODEC_MUTE("PCM Playback Switch", 0x17, 0x0, HDA_INPUT), | 831 | HDA_CODEC_MUTE("PCM Playback Switch", 0x17, 0x0, HDA_INPUT), |
848 | HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x2, HDA_INPUT), | 832 | HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x2, HDA_INPUT), |
@@ -946,10 +930,10 @@ static const struct snd_kcontrol_new cxt5045_test_mixer[] = { | |||
946 | /* Output controls */ | 930 | /* Output controls */ |
947 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x10, 0x0, HDA_OUTPUT), | 931 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x10, 0x0, HDA_OUTPUT), |
948 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x10, 0x0, HDA_OUTPUT), | 932 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x10, 0x0, HDA_OUTPUT), |
949 | HDA_CODEC_VOLUME("Node 11 Playback Volume", 0x11, 0x0, HDA_OUTPUT), | 933 | HDA_CODEC_VOLUME("HP-OUT Playback Volume", 0x11, 0x0, HDA_OUTPUT), |
950 | HDA_CODEC_MUTE("Node 11 Playback Switch", 0x11, 0x0, HDA_OUTPUT), | 934 | HDA_CODEC_MUTE("HP-OUT Playback Switch", 0x11, 0x0, HDA_OUTPUT), |
951 | HDA_CODEC_VOLUME("Node 12 Playback Volume", 0x12, 0x0, HDA_OUTPUT), | 935 | HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x12, 0x0, HDA_OUTPUT), |
952 | HDA_CODEC_MUTE("Node 12 Playback Switch", 0x12, 0x0, HDA_OUTPUT), | 936 | HDA_CODEC_MUTE("LINE1 Playback Switch", 0x12, 0x0, HDA_OUTPUT), |
953 | 937 | ||
954 | /* Modes for retasking pin widgets */ | 938 | /* Modes for retasking pin widgets */ |
955 | CXT_PIN_MODE("HP-OUT pin mode", 0x11, CXT_PIN_DIR_INOUT), | 939 | CXT_PIN_MODE("HP-OUT pin mode", 0x11, CXT_PIN_DIR_INOUT), |
@@ -960,16 +944,16 @@ static const struct snd_kcontrol_new cxt5045_test_mixer[] = { | |||
960 | 944 | ||
961 | /* Loopback mixer controls */ | 945 | /* Loopback mixer controls */ |
962 | 946 | ||
963 | HDA_CODEC_VOLUME("Mixer-1 Volume", 0x17, 0x0, HDA_INPUT), | 947 | HDA_CODEC_VOLUME("PCM Volume", 0x17, 0x0, HDA_INPUT), |
964 | HDA_CODEC_MUTE("Mixer-1 Switch", 0x17, 0x0, HDA_INPUT), | 948 | HDA_CODEC_MUTE("PCM Switch", 0x17, 0x0, HDA_INPUT), |
965 | HDA_CODEC_VOLUME("Mixer-2 Volume", 0x17, 0x1, HDA_INPUT), | 949 | HDA_CODEC_VOLUME("MIC1 pin Volume", 0x17, 0x1, HDA_INPUT), |
966 | HDA_CODEC_MUTE("Mixer-2 Switch", 0x17, 0x1, HDA_INPUT), | 950 | HDA_CODEC_MUTE("MIC1 pin Switch", 0x17, 0x1, HDA_INPUT), |
967 | HDA_CODEC_VOLUME("Mixer-3 Volume", 0x17, 0x2, HDA_INPUT), | 951 | HDA_CODEC_VOLUME("LINE1 pin Volume", 0x17, 0x2, HDA_INPUT), |
968 | HDA_CODEC_MUTE("Mixer-3 Switch", 0x17, 0x2, HDA_INPUT), | 952 | HDA_CODEC_MUTE("LINE1 pin Switch", 0x17, 0x2, HDA_INPUT), |
969 | HDA_CODEC_VOLUME("Mixer-4 Volume", 0x17, 0x3, HDA_INPUT), | 953 | HDA_CODEC_VOLUME("HP-OUT pin Volume", 0x17, 0x3, HDA_INPUT), |
970 | HDA_CODEC_MUTE("Mixer-4 Switch", 0x17, 0x3, HDA_INPUT), | 954 | HDA_CODEC_MUTE("HP-OUT pin Switch", 0x17, 0x3, HDA_INPUT), |
971 | HDA_CODEC_VOLUME("Mixer-5 Volume", 0x17, 0x4, HDA_INPUT), | 955 | HDA_CODEC_VOLUME("CD pin Volume", 0x17, 0x4, HDA_INPUT), |
972 | HDA_CODEC_MUTE("Mixer-5 Switch", 0x17, 0x4, HDA_INPUT), | 956 | HDA_CODEC_MUTE("CD pin Switch", 0x17, 0x4, HDA_INPUT), |
973 | { | 957 | { |
974 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 958 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
975 | .name = "Input Source", | 959 | .name = "Input Source", |
@@ -978,16 +962,8 @@ static const struct snd_kcontrol_new cxt5045_test_mixer[] = { | |||
978 | .put = conexant_mux_enum_put, | 962 | .put = conexant_mux_enum_put, |
979 | }, | 963 | }, |
980 | /* Audio input controls */ | 964 | /* Audio input controls */ |
981 | HDA_CODEC_VOLUME("Input-1 Volume", 0x1a, 0x0, HDA_INPUT), | 965 | HDA_CODEC_VOLUME("Capture Volume", 0x1a, 0x0, HDA_INPUT), |
982 | HDA_CODEC_MUTE("Input-1 Switch", 0x1a, 0x0, HDA_INPUT), | 966 | HDA_CODEC_MUTE("Capture Switch", 0x1a, 0x0, HDA_INPUT), |
983 | HDA_CODEC_VOLUME("Input-2 Volume", 0x1a, 0x1, HDA_INPUT), | ||
984 | HDA_CODEC_MUTE("Input-2 Switch", 0x1a, 0x1, HDA_INPUT), | ||
985 | HDA_CODEC_VOLUME("Input-3 Volume", 0x1a, 0x2, HDA_INPUT), | ||
986 | HDA_CODEC_MUTE("Input-3 Switch", 0x1a, 0x2, HDA_INPUT), | ||
987 | HDA_CODEC_VOLUME("Input-4 Volume", 0x1a, 0x3, HDA_INPUT), | ||
988 | HDA_CODEC_MUTE("Input-4 Switch", 0x1a, 0x3, HDA_INPUT), | ||
989 | HDA_CODEC_VOLUME("Input-5 Volume", 0x1a, 0x4, HDA_INPUT), | ||
990 | HDA_CODEC_MUTE("Input-5 Switch", 0x1a, 0x4, HDA_INPUT), | ||
991 | { } /* end */ | 967 | { } /* end */ |
992 | }; | 968 | }; |
993 | 969 | ||
@@ -1009,10 +985,6 @@ static const struct hda_verb cxt5045_test_init_verbs[] = { | |||
1009 | {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | 985 | {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
1010 | {0x18, AC_VERB_SET_DIGI_CONVERT_1, 0}, | 986 | {0x18, AC_VERB_SET_DIGI_CONVERT_1, 0}, |
1011 | 987 | ||
1012 | /* Start with output sum widgets muted and their output gains at min */ | ||
1013 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
1014 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
1015 | |||
1016 | /* Unmute retasking pin widget output buffers since the default | 988 | /* Unmute retasking pin widget output buffers since the default |
1017 | * state appears to be output. As the pin mode is changed by the | 989 | * state appears to be output. As the pin mode is changed by the |
1018 | * user the pin mode control will take care of enabling the pin's | 990 | * user the pin mode control will take care of enabling the pin's |
@@ -1027,11 +999,11 @@ static const struct hda_verb cxt5045_test_init_verbs[] = { | |||
1027 | /* Set ADC connection select to match default mixer setting (mic1 | 999 | /* Set ADC connection select to match default mixer setting (mic1 |
1028 | * pin) | 1000 | * pin) |
1029 | */ | 1001 | */ |
1030 | {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, | 1002 | {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, |
1031 | {0x17, AC_VERB_SET_CONNECT_SEL, 0x00}, | 1003 | {0x17, AC_VERB_SET_CONNECT_SEL, 0x01}, |
1032 | 1004 | ||
1033 | /* Mute all inputs to mixer widget (even unconnected ones) */ | 1005 | /* Mute all inputs to mixer widget (even unconnected ones) */ |
1034 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* Mixer pin */ | 1006 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* Mixer */ |
1035 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* Mic1 pin */ | 1007 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* Mic1 pin */ |
1036 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* Line pin */ | 1008 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* Line pin */ |
1037 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* HP pin */ | 1009 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* HP pin */ |
@@ -1110,7 +1082,7 @@ static int patch_cxt5045(struct hda_codec *codec) | |||
1110 | if (!spec) | 1082 | if (!spec) |
1111 | return -ENOMEM; | 1083 | return -ENOMEM; |
1112 | codec->spec = spec; | 1084 | codec->spec = spec; |
1113 | codec->pin_amp_workaround = 1; | 1085 | codec->single_adc_amp = 1; |
1114 | 1086 | ||
1115 | spec->multiout.max_channels = 2; | 1087 | spec->multiout.max_channels = 2; |
1116 | spec->multiout.num_dacs = ARRAY_SIZE(cxt5045_dac_nids); | 1088 | spec->multiout.num_dacs = ARRAY_SIZE(cxt5045_dac_nids); |
@@ -3999,9 +3971,14 @@ static void cx_auto_init_output(struct hda_codec *codec) | |||
3999 | int i; | 3971 | int i; |
4000 | 3972 | ||
4001 | mute_outputs(codec, spec->multiout.num_dacs, spec->multiout.dac_nids); | 3973 | mute_outputs(codec, spec->multiout.num_dacs, spec->multiout.dac_nids); |
4002 | for (i = 0; i < cfg->hp_outs; i++) | 3974 | for (i = 0; i < cfg->hp_outs; i++) { |
3975 | unsigned int val = PIN_OUT; | ||
3976 | if (snd_hda_query_pin_caps(codec, cfg->hp_pins[i]) & | ||
3977 | AC_PINCAP_HP_DRV) | ||
3978 | val |= AC_PINCTL_HP_EN; | ||
4003 | snd_hda_codec_write(codec, cfg->hp_pins[i], 0, | 3979 | snd_hda_codec_write(codec, cfg->hp_pins[i], 0, |
4004 | AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP); | 3980 | AC_VERB_SET_PIN_WIDGET_CONTROL, val); |
3981 | } | ||
4005 | mute_outputs(codec, cfg->hp_outs, cfg->hp_pins); | 3982 | mute_outputs(codec, cfg->hp_outs, cfg->hp_pins); |
4006 | mute_outputs(codec, cfg->line_outs, cfg->line_out_pins); | 3983 | mute_outputs(codec, cfg->line_outs, cfg->line_out_pins); |
4007 | mute_outputs(codec, cfg->speaker_outs, cfg->speaker_pins); | 3984 | mute_outputs(codec, cfg->speaker_outs, cfg->speaker_pins); |
@@ -4220,7 +4197,7 @@ static int cx_auto_add_capture_volume(struct hda_codec *codec, hda_nid_t nid, | |||
4220 | int idx = get_input_connection(codec, adc_nid, nid); | 4197 | int idx = get_input_connection(codec, adc_nid, nid); |
4221 | if (idx < 0) | 4198 | if (idx < 0) |
4222 | continue; | 4199 | continue; |
4223 | if (spec->single_adc_amp) | 4200 | if (codec->single_adc_amp) |
4224 | idx = 0; | 4201 | idx = 0; |
4225 | return cx_auto_add_volume_idx(codec, label, pfx, | 4202 | return cx_auto_add_volume_idx(codec, label, pfx, |
4226 | cidx, adc_nid, HDA_INPUT, idx); | 4203 | cidx, adc_nid, HDA_INPUT, idx); |
@@ -4275,7 +4252,7 @@ static int cx_auto_build_input_controls(struct hda_codec *codec) | |||
4275 | if (cidx < 0) | 4252 | if (cidx < 0) |
4276 | continue; | 4253 | continue; |
4277 | input_conn[i] = spec->imux_info[i].adc; | 4254 | input_conn[i] = spec->imux_info[i].adc; |
4278 | if (!spec->single_adc_amp) | 4255 | if (!codec->single_adc_amp) |
4279 | input_conn[i] |= cidx << 8; | 4256 | input_conn[i] |= cidx << 8; |
4280 | if (i > 0 && input_conn[i] != input_conn[0]) | 4257 | if (i > 0 && input_conn[i] != input_conn[0]) |
4281 | multi_connection = 1; | 4258 | multi_connection = 1; |
@@ -4419,8 +4396,10 @@ static void apply_pin_fixup(struct hda_codec *codec, | |||
4419 | 4396 | ||
4420 | enum { | 4397 | enum { |
4421 | CXT_PINCFG_LENOVO_X200, | 4398 | CXT_PINCFG_LENOVO_X200, |
4399 | CXT_PINCFG_LENOVO_TP410, | ||
4422 | }; | 4400 | }; |
4423 | 4401 | ||
4402 | /* ThinkPad X200 & co with cxt5051 */ | ||
4424 | static const struct cxt_pincfg cxt_pincfg_lenovo_x200[] = { | 4403 | static const struct cxt_pincfg cxt_pincfg_lenovo_x200[] = { |
4425 | { 0x16, 0x042140ff }, /* HP (seq# overridden) */ | 4404 | { 0x16, 0x042140ff }, /* HP (seq# overridden) */ |
4426 | { 0x17, 0x21a11000 }, /* dock-mic */ | 4405 | { 0x17, 0x21a11000 }, /* dock-mic */ |
@@ -4429,15 +4408,33 @@ static const struct cxt_pincfg cxt_pincfg_lenovo_x200[] = { | |||
4429 | {} | 4408 | {} |
4430 | }; | 4409 | }; |
4431 | 4410 | ||
4411 | /* ThinkPad 410/420/510/520, X201 & co with cxt5066 */ | ||
4412 | static const struct cxt_pincfg cxt_pincfg_lenovo_tp410[] = { | ||
4413 | { 0x19, 0x042110ff }, /* HP (seq# overridden) */ | ||
4414 | { 0x1a, 0x21a190f0 }, /* dock-mic */ | ||
4415 | { 0x1c, 0x212140ff }, /* dock-HP */ | ||
4416 | {} | ||
4417 | }; | ||
4418 | |||
4432 | static const struct cxt_pincfg *cxt_pincfg_tbl[] = { | 4419 | static const struct cxt_pincfg *cxt_pincfg_tbl[] = { |
4433 | [CXT_PINCFG_LENOVO_X200] = cxt_pincfg_lenovo_x200, | 4420 | [CXT_PINCFG_LENOVO_X200] = cxt_pincfg_lenovo_x200, |
4421 | [CXT_PINCFG_LENOVO_TP410] = cxt_pincfg_lenovo_tp410, | ||
4434 | }; | 4422 | }; |
4435 | 4423 | ||
4436 | static const struct snd_pci_quirk cxt_fixups[] = { | 4424 | static const struct snd_pci_quirk cxt5051_fixups[] = { |
4437 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo X200", CXT_PINCFG_LENOVO_X200), | 4425 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo X200", CXT_PINCFG_LENOVO_X200), |
4438 | {} | 4426 | {} |
4439 | }; | 4427 | }; |
4440 | 4428 | ||
4429 | static const struct snd_pci_quirk cxt5066_fixups[] = { | ||
4430 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400", CXT_PINCFG_LENOVO_TP410), | ||
4431 | SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo T410", CXT_PINCFG_LENOVO_TP410), | ||
4432 | SND_PCI_QUIRK(0x17aa, 0x215f, "Lenovo T510", CXT_PINCFG_LENOVO_TP410), | ||
4433 | SND_PCI_QUIRK(0x17aa, 0x21ce, "Lenovo T420", CXT_PINCFG_LENOVO_TP410), | ||
4434 | SND_PCI_QUIRK(0x17aa, 0x21cf, "Lenovo T520", CXT_PINCFG_LENOVO_TP410), | ||
4435 | {} | ||
4436 | }; | ||
4437 | |||
4441 | /* add "fake" mute amp-caps to DACs on cx5051 so that mixer mute switches | 4438 | /* add "fake" mute amp-caps to DACs on cx5051 so that mixer mute switches |
4442 | * can be created (bko#42825) | 4439 | * can be created (bko#42825) |
4443 | */ | 4440 | */ |
@@ -4466,19 +4463,21 @@ static int patch_conexant_auto(struct hda_codec *codec) | |||
4466 | if (!spec) | 4463 | if (!spec) |
4467 | return -ENOMEM; | 4464 | return -ENOMEM; |
4468 | codec->spec = spec; | 4465 | codec->spec = spec; |
4469 | codec->pin_amp_workaround = 1; | ||
4470 | 4466 | ||
4471 | switch (codec->vendor_id) { | 4467 | switch (codec->vendor_id) { |
4472 | case 0x14f15045: | 4468 | case 0x14f15045: |
4473 | spec->single_adc_amp = 1; | 4469 | codec->single_adc_amp = 1; |
4474 | break; | 4470 | break; |
4475 | case 0x14f15051: | 4471 | case 0x14f15051: |
4476 | add_cx5051_fake_mutes(codec); | 4472 | add_cx5051_fake_mutes(codec); |
4473 | codec->pin_amp_workaround = 1; | ||
4474 | apply_pin_fixup(codec, cxt5051_fixups, cxt_pincfg_tbl); | ||
4477 | break; | 4475 | break; |
4476 | default: | ||
4477 | codec->pin_amp_workaround = 1; | ||
4478 | apply_pin_fixup(codec, cxt5066_fixups, cxt_pincfg_tbl); | ||
4478 | } | 4479 | } |
4479 | 4480 | ||
4480 | apply_pin_fixup(codec, cxt_fixups, cxt_pincfg_tbl); | ||
4481 | |||
4482 | /* Show mute-led control only on HP laptops | 4481 | /* Show mute-led control only on HP laptops |
4483 | * This is a sort of white-list: on HP laptops, EAPD corresponds | 4482 | * This is a sort of white-list: on HP laptops, EAPD corresponds |
4484 | * only to the mute-LED without actualy amp function. Meanwhile, | 4483 | * only to the mute-LED without actualy amp function. Meanwhile, |
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 540cd13f7f15..83f345f3c961 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
@@ -757,8 +757,6 @@ static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res) | |||
757 | struct hdmi_spec *spec = codec->spec; | 757 | struct hdmi_spec *spec = codec->spec; |
758 | int tag = res >> AC_UNSOL_RES_TAG_SHIFT; | 758 | int tag = res >> AC_UNSOL_RES_TAG_SHIFT; |
759 | int pin_nid; | 759 | int pin_nid; |
760 | int pd = !!(res & AC_UNSOL_RES_PD); | ||
761 | int eldv = !!(res & AC_UNSOL_RES_ELDV); | ||
762 | int pin_idx; | 760 | int pin_idx; |
763 | struct hda_jack_tbl *jack; | 761 | struct hda_jack_tbl *jack; |
764 | 762 | ||
@@ -768,9 +766,10 @@ static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res) | |||
768 | pin_nid = jack->nid; | 766 | pin_nid = jack->nid; |
769 | jack->jack_dirty = 1; | 767 | jack->jack_dirty = 1; |
770 | 768 | ||
771 | printk(KERN_INFO | 769 | _snd_printd(SND_PR_VERBOSE, |
772 | "HDMI hot plug event: Codec=%d Pin=%d Presence_Detect=%d ELD_Valid=%d\n", | 770 | "HDMI hot plug event: Codec=%d Pin=%d Presence_Detect=%d ELD_Valid=%d\n", |
773 | codec->addr, pin_nid, pd, eldv); | 771 | codec->addr, pin_nid, |
772 | !!(res & AC_UNSOL_RES_PD), !!(res & AC_UNSOL_RES_ELDV)); | ||
774 | 773 | ||
775 | pin_idx = pin_nid_to_pin_index(spec, pin_nid); | 774 | pin_idx = pin_nid_to_pin_index(spec, pin_nid); |
776 | if (pin_idx < 0) | 775 | if (pin_idx < 0) |
@@ -992,7 +991,7 @@ static void hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll) | |||
992 | if (eld->monitor_present) | 991 | if (eld->monitor_present) |
993 | eld_valid = !!(present & AC_PINSENSE_ELDV); | 992 | eld_valid = !!(present & AC_PINSENSE_ELDV); |
994 | 993 | ||
995 | printk(KERN_INFO | 994 | _snd_printd(SND_PR_VERBOSE, |
996 | "HDMI status: Codec=%d Pin=%d Presence_Detect=%d ELD_Valid=%d\n", | 995 | "HDMI status: Codec=%d Pin=%d Presence_Detect=%d ELD_Valid=%d\n", |
997 | codec->addr, pin_nid, eld->monitor_present, eld_valid); | 996 | codec->addr, pin_nid, eld->monitor_present, eld_valid); |
998 | 997 | ||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 9917e55d6f11..818f90bc7d57 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -1445,6 +1445,13 @@ enum { | |||
1445 | ALC_FIXUP_ACT_BUILD, | 1445 | ALC_FIXUP_ACT_BUILD, |
1446 | }; | 1446 | }; |
1447 | 1447 | ||
1448 | static void alc_apply_pincfgs(struct hda_codec *codec, | ||
1449 | const struct alc_pincfg *cfg) | ||
1450 | { | ||
1451 | for (; cfg->nid; cfg++) | ||
1452 | snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val); | ||
1453 | } | ||
1454 | |||
1448 | static void alc_apply_fixup(struct hda_codec *codec, int action) | 1455 | static void alc_apply_fixup(struct hda_codec *codec, int action) |
1449 | { | 1456 | { |
1450 | struct alc_spec *spec = codec->spec; | 1457 | struct alc_spec *spec = codec->spec; |
@@ -1478,9 +1485,7 @@ static void alc_apply_fixup(struct hda_codec *codec, int action) | |||
1478 | snd_printdd(KERN_INFO "hda_codec: %s: " | 1485 | snd_printdd(KERN_INFO "hda_codec: %s: " |
1479 | "Apply pincfg for %s\n", | 1486 | "Apply pincfg for %s\n", |
1480 | codec->chip_name, modelname); | 1487 | codec->chip_name, modelname); |
1481 | for (; cfg->nid; cfg++) | 1488 | alc_apply_pincfgs(codec, cfg); |
1482 | snd_hda_codec_set_pincfg(codec, cfg->nid, | ||
1483 | cfg->val); | ||
1484 | break; | 1489 | break; |
1485 | case ALC_FIXUP_VERBS: | 1490 | case ALC_FIXUP_VERBS: |
1486 | if (action != ALC_FIXUP_ACT_PROBE || !fix->v.verbs) | 1491 | if (action != ALC_FIXUP_ACT_PROBE || !fix->v.verbs) |
@@ -3398,8 +3403,10 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec) | |||
3398 | for (;;) { | 3403 | for (;;) { |
3399 | badness = fill_and_eval_dacs(codec, fill_hardwired, | 3404 | badness = fill_and_eval_dacs(codec, fill_hardwired, |
3400 | fill_mio_first); | 3405 | fill_mio_first); |
3401 | if (badness < 0) | 3406 | if (badness < 0) { |
3407 | kfree(best_cfg); | ||
3402 | return badness; | 3408 | return badness; |
3409 | } | ||
3403 | debug_badness("==> lo_type=%d, wired=%d, mio=%d, badness=0x%x\n", | 3410 | debug_badness("==> lo_type=%d, wired=%d, mio=%d, badness=0x%x\n", |
3404 | cfg->line_out_type, fill_hardwired, fill_mio_first, | 3411 | cfg->line_out_type, fill_hardwired, fill_mio_first, |
3405 | badness); | 3412 | badness); |
@@ -3434,7 +3441,7 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec) | |||
3434 | cfg->line_out_type = AUTO_PIN_SPEAKER_OUT; | 3441 | cfg->line_out_type = AUTO_PIN_SPEAKER_OUT; |
3435 | fill_hardwired = true; | 3442 | fill_hardwired = true; |
3436 | continue; | 3443 | continue; |
3437 | } | 3444 | } |
3438 | if (cfg->hp_outs > 0 && | 3445 | if (cfg->hp_outs > 0 && |
3439 | cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) { | 3446 | cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) { |
3440 | cfg->speaker_outs = cfg->line_outs; | 3447 | cfg->speaker_outs = cfg->line_outs; |
@@ -3448,7 +3455,7 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec) | |||
3448 | cfg->line_out_type = AUTO_PIN_HP_OUT; | 3455 | cfg->line_out_type = AUTO_PIN_HP_OUT; |
3449 | fill_hardwired = true; | 3456 | fill_hardwired = true; |
3450 | continue; | 3457 | continue; |
3451 | } | 3458 | } |
3452 | break; | 3459 | break; |
3453 | } | 3460 | } |
3454 | 3461 | ||
@@ -4423,7 +4430,7 @@ static int alc_parse_auto_config(struct hda_codec *codec, | |||
4423 | static int alc880_parse_auto_config(struct hda_codec *codec) | 4430 | static int alc880_parse_auto_config(struct hda_codec *codec) |
4424 | { | 4431 | { |
4425 | static const hda_nid_t alc880_ignore[] = { 0x1d, 0 }; | 4432 | static const hda_nid_t alc880_ignore[] = { 0x1d, 0 }; |
4426 | static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 }; | 4433 | static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 }; |
4427 | return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids); | 4434 | return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids); |
4428 | } | 4435 | } |
4429 | 4436 | ||
@@ -4859,6 +4866,7 @@ enum { | |||
4859 | ALC260_FIXUP_GPIO1_TOGGLE, | 4866 | ALC260_FIXUP_GPIO1_TOGGLE, |
4860 | ALC260_FIXUP_REPLACER, | 4867 | ALC260_FIXUP_REPLACER, |
4861 | ALC260_FIXUP_HP_B1900, | 4868 | ALC260_FIXUP_HP_B1900, |
4869 | ALC260_FIXUP_KN1, | ||
4862 | }; | 4870 | }; |
4863 | 4871 | ||
4864 | static void alc260_gpio1_automute(struct hda_codec *codec) | 4872 | static void alc260_gpio1_automute(struct hda_codec *codec) |
@@ -4886,6 +4894,36 @@ static void alc260_fixup_gpio1_toggle(struct hda_codec *codec, | |||
4886 | } | 4894 | } |
4887 | } | 4895 | } |
4888 | 4896 | ||
4897 | static void alc260_fixup_kn1(struct hda_codec *codec, | ||
4898 | const struct alc_fixup *fix, int action) | ||
4899 | { | ||
4900 | struct alc_spec *spec = codec->spec; | ||
4901 | static const struct alc_pincfg pincfgs[] = { | ||
4902 | { 0x0f, 0x02214000 }, /* HP/speaker */ | ||
4903 | { 0x12, 0x90a60160 }, /* int mic */ | ||
4904 | { 0x13, 0x02a19000 }, /* ext mic */ | ||
4905 | { 0x18, 0x01446000 }, /* SPDIF out */ | ||
4906 | /* disable bogus I/O pins */ | ||
4907 | { 0x10, 0x411111f0 }, | ||
4908 | { 0x11, 0x411111f0 }, | ||
4909 | { 0x14, 0x411111f0 }, | ||
4910 | { 0x15, 0x411111f0 }, | ||
4911 | { 0x16, 0x411111f0 }, | ||
4912 | { 0x17, 0x411111f0 }, | ||
4913 | { 0x19, 0x411111f0 }, | ||
4914 | { } | ||
4915 | }; | ||
4916 | |||
4917 | switch (action) { | ||
4918 | case ALC_FIXUP_ACT_PRE_PROBE: | ||
4919 | alc_apply_pincfgs(codec, pincfgs); | ||
4920 | break; | ||
4921 | case ALC_FIXUP_ACT_PROBE: | ||
4922 | spec->init_amp = ALC_INIT_NONE; | ||
4923 | break; | ||
4924 | } | ||
4925 | } | ||
4926 | |||
4889 | static const struct alc_fixup alc260_fixups[] = { | 4927 | static const struct alc_fixup alc260_fixups[] = { |
4890 | [ALC260_FIXUP_HP_DC5750] = { | 4928 | [ALC260_FIXUP_HP_DC5750] = { |
4891 | .type = ALC_FIXUP_PINS, | 4929 | .type = ALC_FIXUP_PINS, |
@@ -4936,7 +4974,11 @@ static const struct alc_fixup alc260_fixups[] = { | |||
4936 | .v.func = alc260_fixup_gpio1_toggle, | 4974 | .v.func = alc260_fixup_gpio1_toggle, |
4937 | .chained = true, | 4975 | .chained = true, |
4938 | .chain_id = ALC260_FIXUP_COEF, | 4976 | .chain_id = ALC260_FIXUP_COEF, |
4939 | } | 4977 | }, |
4978 | [ALC260_FIXUP_KN1] = { | ||
4979 | .type = ALC_FIXUP_FUNC, | ||
4980 | .v.func = alc260_fixup_kn1, | ||
4981 | }, | ||
4940 | }; | 4982 | }; |
4941 | 4983 | ||
4942 | static const struct snd_pci_quirk alc260_fixup_tbl[] = { | 4984 | static const struct snd_pci_quirk alc260_fixup_tbl[] = { |
@@ -4946,6 +4988,7 @@ static const struct snd_pci_quirk alc260_fixup_tbl[] = { | |||
4946 | SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750), | 4988 | SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750), |
4947 | SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900), | 4989 | SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900), |
4948 | SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1), | 4990 | SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1), |
4991 | SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1), | ||
4949 | SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER), | 4992 | SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER), |
4950 | SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF), | 4993 | SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF), |
4951 | {} | 4994 | {} |
@@ -5269,7 +5312,9 @@ static const struct alc_fixup alc882_fixups[] = { | |||
5269 | { 0x16, 0x99130111 }, /* CLFE speaker */ | 5312 | { 0x16, 0x99130111 }, /* CLFE speaker */ |
5270 | { 0x17, 0x99130112 }, /* surround speaker */ | 5313 | { 0x17, 0x99130112 }, /* surround speaker */ |
5271 | { } | 5314 | { } |
5272 | } | 5315 | }, |
5316 | .chained = true, | ||
5317 | .chain_id = ALC882_FIXUP_GPIO1, | ||
5273 | }, | 5318 | }, |
5274 | [ALC882_FIXUP_ACER_ASPIRE_8930G] = { | 5319 | [ALC882_FIXUP_ACER_ASPIRE_8930G] = { |
5275 | .type = ALC_FIXUP_PINS, | 5320 | .type = ALC_FIXUP_PINS, |
@@ -5312,7 +5357,9 @@ static const struct alc_fixup alc882_fixups[] = { | |||
5312 | { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, | 5357 | { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, |
5313 | { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 }, | 5358 | { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 }, |
5314 | { } | 5359 | { } |
5315 | } | 5360 | }, |
5361 | .chained = true, | ||
5362 | .chain_id = ALC882_FIXUP_GPIO1, | ||
5316 | }, | 5363 | }, |
5317 | [ALC885_FIXUP_MACPRO_GPIO] = { | 5364 | [ALC885_FIXUP_MACPRO_GPIO] = { |
5318 | .type = ALC_FIXUP_FUNC, | 5365 | .type = ALC_FIXUP_FUNC, |
@@ -5359,6 +5406,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { | |||
5359 | ALC882_FIXUP_ACER_ASPIRE_4930G), | 5406 | ALC882_FIXUP_ACER_ASPIRE_4930G), |
5360 | SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210), | 5407 | SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210), |
5361 | SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE), | 5408 | SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE), |
5409 | SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G), | ||
5362 | SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736), | 5410 | SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736), |
5363 | SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD), | 5411 | SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD), |
5364 | SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V), | 5412 | SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V), |
@@ -5384,6 +5432,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { | |||
5384 | SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF), | 5432 | SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF), |
5385 | SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF), | 5433 | SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF), |
5386 | SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF), | 5434 | SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF), |
5435 | SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 5,1", ALC885_FIXUP_MACPRO_GPIO), | ||
5387 | SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF), | 5436 | SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF), |
5388 | SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF), | 5437 | SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF), |
5389 | SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF), | 5438 | SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF), |
@@ -5399,6 +5448,13 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { | |||
5399 | {} | 5448 | {} |
5400 | }; | 5449 | }; |
5401 | 5450 | ||
5451 | static const struct alc_model_fixup alc882_fixup_models[] = { | ||
5452 | {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"}, | ||
5453 | {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"}, | ||
5454 | {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"}, | ||
5455 | {} | ||
5456 | }; | ||
5457 | |||
5402 | /* | 5458 | /* |
5403 | * BIOS auto configuration | 5459 | * BIOS auto configuration |
5404 | */ | 5460 | */ |
@@ -5439,7 +5495,8 @@ static int patch_alc882(struct hda_codec *codec) | |||
5439 | if (err < 0) | 5495 | if (err < 0) |
5440 | goto error; | 5496 | goto error; |
5441 | 5497 | ||
5442 | alc_pick_fixup(codec, NULL, alc882_fixup_tbl, alc882_fixups); | 5498 | alc_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl, |
5499 | alc882_fixups); | ||
5443 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | 5500 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); |
5444 | 5501 | ||
5445 | alc_auto_parse_customize_define(codec); | 5502 | alc_auto_parse_customize_define(codec); |
@@ -6052,6 +6109,7 @@ static const struct alc_fixup alc269_fixups[] = { | |||
6052 | 6109 | ||
6053 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { | 6110 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
6054 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_MIC2_MUTE_LED), | 6111 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_MIC2_MUTE_LED), |
6112 | SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_DMIC), | ||
6055 | SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), | 6113 | SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), |
6056 | SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC), | 6114 | SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC), |
6057 | SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC), | 6115 | SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC), |
@@ -6079,7 +6137,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
6079 | * Basically the device should work as is without the fixup table. | 6137 | * Basically the device should work as is without the fixup table. |
6080 | * If BIOS doesn't give a proper info, enable the corresponding | 6138 | * If BIOS doesn't give a proper info, enable the corresponding |
6081 | * fixup entry. | 6139 | * fixup entry. |
6082 | */ | 6140 | */ |
6083 | SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", | 6141 | SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", |
6084 | ALC269_FIXUP_AMIC), | 6142 | ALC269_FIXUP_AMIC), |
6085 | SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC), | 6143 | SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC), |
@@ -6296,7 +6354,7 @@ static void alc_fixup_no_jack_detect(struct hda_codec *codec, | |||
6296 | { | 6354 | { |
6297 | if (action == ALC_FIXUP_ACT_PRE_PROBE) | 6355 | if (action == ALC_FIXUP_ACT_PRE_PROBE) |
6298 | codec->no_jack_detect = 1; | 6356 | codec->no_jack_detect = 1; |
6299 | } | 6357 | } |
6300 | 6358 | ||
6301 | static const struct alc_fixup alc861_fixups[] = { | 6359 | static const struct alc_fixup alc861_fixups[] = { |
6302 | [ALC861_FIXUP_FSC_AMILO_PI1505] = { | 6360 | [ALC861_FIXUP_FSC_AMILO_PI1505] = { |
@@ -6714,7 +6772,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = { | |||
6714 | * Basically the device should work as is without the fixup table. | 6772 | * Basically the device should work as is without the fixup table. |
6715 | * If BIOS doesn't give a proper info, enable the corresponding | 6773 | * If BIOS doesn't give a proper info, enable the corresponding |
6716 | * fixup entry. | 6774 | * fixup entry. |
6717 | */ | 6775 | */ |
6718 | SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1), | 6776 | SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1), |
6719 | SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3), | 6777 | SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3), |
6720 | SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1), | 6778 | SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1), |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 33a9946b492c..4742cac26aa9 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -5063,12 +5063,11 @@ static void stac92xx_update_led_status(struct hda_codec *codec, int enabled) | |||
5063 | if (spec->gpio_led_polarity) | 5063 | if (spec->gpio_led_polarity) |
5064 | muted = !muted; | 5064 | muted = !muted; |
5065 | 5065 | ||
5066 | /*polarity defines *not* muted state level*/ | ||
5067 | if (!spec->vref_mute_led_nid) { | 5066 | if (!spec->vref_mute_led_nid) { |
5068 | if (muted) | 5067 | if (muted) |
5069 | spec->gpio_data &= ~spec->gpio_led; /* orange */ | 5068 | spec->gpio_data |= spec->gpio_led; |
5070 | else | 5069 | else |
5071 | spec->gpio_data |= spec->gpio_led; /* white */ | 5070 | spec->gpio_data &= ~spec->gpio_led; |
5072 | stac_gpio_set(codec, spec->gpio_mask, | 5071 | stac_gpio_set(codec, spec->gpio_mask, |
5073 | spec->gpio_dir, spec->gpio_data); | 5072 | spec->gpio_dir, spec->gpio_data); |
5074 | } else { | 5073 | } else { |