diff options
Diffstat (limited to 'sound/pci/hda/patch_cirrus.c')
-rw-r--r-- | sound/pci/hda/patch_cirrus.c | 31 |
1 files changed, 11 insertions, 20 deletions
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index 8ba306856d38..2439e84dcb21 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c | |||
@@ -500,7 +500,7 @@ static int add_mute(struct hda_codec *codec, const char *name, int index, | |||
500 | knew.private_value = pval; | 500 | knew.private_value = pval; |
501 | snprintf(tmp, sizeof(tmp), "%s %s Switch", name, dir_sfx[dir]); | 501 | snprintf(tmp, sizeof(tmp), "%s %s Switch", name, dir_sfx[dir]); |
502 | *kctlp = snd_ctl_new1(&knew, codec); | 502 | *kctlp = snd_ctl_new1(&knew, codec); |
503 | return snd_hda_ctl_add(codec, *kctlp); | 503 | return snd_hda_ctl_add(codec, get_amp_nid_(pval), *kctlp); |
504 | } | 504 | } |
505 | 505 | ||
506 | static int add_volume(struct hda_codec *codec, const char *name, | 506 | static int add_volume(struct hda_codec *codec, const char *name, |
@@ -513,7 +513,7 @@ static int add_volume(struct hda_codec *codec, const char *name, | |||
513 | knew.private_value = pval; | 513 | knew.private_value = pval; |
514 | snprintf(tmp, sizeof(tmp), "%s %s Volume", name, dir_sfx[dir]); | 514 | snprintf(tmp, sizeof(tmp), "%s %s Volume", name, dir_sfx[dir]); |
515 | *kctlp = snd_ctl_new1(&knew, codec); | 515 | *kctlp = snd_ctl_new1(&knew, codec); |
516 | return snd_hda_ctl_add(codec, *kctlp); | 516 | return snd_hda_ctl_add(codec, get_amp_nid_(pval), *kctlp); |
517 | } | 517 | } |
518 | 518 | ||
519 | static void fix_volume_caps(struct hda_codec *codec, hda_nid_t dac) | 519 | static void fix_volume_caps(struct hda_codec *codec, hda_nid_t dac) |
@@ -536,14 +536,14 @@ static int add_vmaster(struct hda_codec *codec, hda_nid_t dac) | |||
536 | 536 | ||
537 | spec->vmaster_sw = | 537 | spec->vmaster_sw = |
538 | snd_ctl_make_virtual_master("Master Playback Switch", NULL); | 538 | snd_ctl_make_virtual_master("Master Playback Switch", NULL); |
539 | err = snd_hda_ctl_add(codec, spec->vmaster_sw); | 539 | err = snd_hda_ctl_add(codec, dac, spec->vmaster_sw); |
540 | if (err < 0) | 540 | if (err < 0) |
541 | return err; | 541 | return err; |
542 | 542 | ||
543 | snd_hda_set_vmaster_tlv(codec, dac, HDA_OUTPUT, tlv); | 543 | snd_hda_set_vmaster_tlv(codec, dac, HDA_OUTPUT, tlv); |
544 | spec->vmaster_vol = | 544 | spec->vmaster_vol = |
545 | snd_ctl_make_virtual_master("Master Playback Volume", tlv); | 545 | snd_ctl_make_virtual_master("Master Playback Volume", tlv); |
546 | err = snd_hda_ctl_add(codec, spec->vmaster_vol); | 546 | err = snd_hda_ctl_add(codec, dac, spec->vmaster_vol); |
547 | if (err < 0) | 547 | if (err < 0) |
548 | return err; | 548 | return err; |
549 | return 0; | 549 | return 0; |
@@ -756,13 +756,13 @@ static int build_input(struct hda_codec *codec) | |||
756 | if (!kctl) | 756 | if (!kctl) |
757 | return -ENOMEM; | 757 | return -ENOMEM; |
758 | kctl->private_value = (long)spec->capture_bind[i]; | 758 | kctl->private_value = (long)spec->capture_bind[i]; |
759 | err = snd_hda_ctl_add(codec, kctl); | 759 | err = snd_hda_ctl_add(codec, 0, kctl); |
760 | if (err < 0) | 760 | if (err < 0) |
761 | return err; | 761 | return err; |
762 | } | 762 | } |
763 | 763 | ||
764 | if (spec->num_inputs > 1 && !spec->mic_detect) { | 764 | if (spec->num_inputs > 1 && !spec->mic_detect) { |
765 | err = snd_hda_ctl_add(codec, | 765 | err = snd_hda_ctl_add(codec, 0, |
766 | snd_ctl_new1(&cs_capture_source, codec)); | 766 | snd_ctl_new1(&cs_capture_source, codec)); |
767 | if (err < 0) | 767 | if (err < 0) |
768 | return err; | 768 | return err; |
@@ -807,7 +807,7 @@ static void cs_automute(struct hda_codec *codec) | |||
807 | { | 807 | { |
808 | struct cs_spec *spec = codec->spec; | 808 | struct cs_spec *spec = codec->spec; |
809 | struct auto_pin_cfg *cfg = &spec->autocfg; | 809 | struct auto_pin_cfg *cfg = &spec->autocfg; |
810 | unsigned int caps, present, hp_present; | 810 | unsigned int caps, hp_present; |
811 | hda_nid_t nid; | 811 | hda_nid_t nid; |
812 | int i; | 812 | int i; |
813 | 813 | ||
@@ -817,12 +817,7 @@ static void cs_automute(struct hda_codec *codec) | |||
817 | caps = snd_hda_query_pin_caps(codec, nid); | 817 | caps = snd_hda_query_pin_caps(codec, nid); |
818 | if (!(caps & AC_PINCAP_PRES_DETECT)) | 818 | if (!(caps & AC_PINCAP_PRES_DETECT)) |
819 | continue; | 819 | continue; |
820 | if (caps & AC_PINCAP_TRIG_REQ) | 820 | hp_present = snd_hda_jack_detect(codec, nid); |
821 | snd_hda_codec_read(codec, nid, 0, | ||
822 | AC_VERB_SET_PIN_SENSE, 0); | ||
823 | present = snd_hda_codec_read(codec, nid, 0, | ||
824 | AC_VERB_GET_PIN_SENSE, 0); | ||
825 | hp_present |= (present & AC_PINSENSE_PRESENCE) != 0; | ||
826 | if (hp_present) | 821 | if (hp_present) |
827 | break; | 822 | break; |
828 | } | 823 | } |
@@ -844,15 +839,11 @@ static void cs_automic(struct hda_codec *codec) | |||
844 | struct cs_spec *spec = codec->spec; | 839 | struct cs_spec *spec = codec->spec; |
845 | struct auto_pin_cfg *cfg = &spec->autocfg; | 840 | struct auto_pin_cfg *cfg = &spec->autocfg; |
846 | hda_nid_t nid; | 841 | hda_nid_t nid; |
847 | unsigned int caps, present; | 842 | unsigned int present; |
848 | 843 | ||
849 | nid = cfg->input_pins[spec->automic_idx]; | 844 | nid = cfg->input_pins[spec->automic_idx]; |
850 | caps = snd_hda_query_pin_caps(codec, nid); | 845 | present = snd_hda_jack_detect(codec, nid); |
851 | if (caps & AC_PINCAP_TRIG_REQ) | 846 | if (present) |
852 | snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0); | ||
853 | present = snd_hda_codec_read(codec, nid, 0, | ||
854 | AC_VERB_GET_PIN_SENSE, 0); | ||
855 | if (present & AC_PINSENSE_PRESENCE) | ||
856 | change_cur_input(codec, spec->automic_idx, 0); | 847 | change_cur_input(codec, spec->automic_idx, 0); |
857 | else { | 848 | else { |
858 | unsigned int imic = (spec->automic_idx == AUTO_PIN_MIC) ? | 849 | unsigned int imic = (spec->automic_idx == AUTO_PIN_MIC) ? |