diff options
| author | Takashi Iwai <tiwai@suse.de> | 2011-07-21 07:45:56 -0400 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2011-07-21 07:55:10 -0400 |
| commit | 020066d1ecc95d74da9be6beb436ac575af01271 (patch) | |
| tree | 706657b35946c4f4ff7606af44a27aefa35f5057 | |
| parent | 737c265bb8399b97231e5b10b5b2375914206427 (diff) | |
ALSA: hda - Fix indep-HP path (de-)activation for VT1708* codecs
This patch fixes non-working indep-HP control on VT1708* codecs.
The problems are that via_independent_hp_put() wasn't fixed to follow
the recent change of three HP paths, and hp_indep_path didn't contain
the amp nids of mixer elements.
Together with the fixes, a few code clean-ups are done.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
| -rw-r--r-- | sound/pci/hda/patch_via.c | 92 |
1 files changed, 52 insertions, 40 deletions
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 5b0342635ebe..761339a0694d 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c | |||
| @@ -566,31 +566,44 @@ static void via_auto_init_multi_out(struct hda_codec *codec) | |||
| 566 | } | 566 | } |
| 567 | } | 567 | } |
| 568 | 568 | ||
| 569 | static void via_auto_init_hp_out(struct hda_codec *codec) | 569 | /* deactivate the inactive headphone-paths */ |
| 570 | static void deactivate_hp_paths(struct hda_codec *codec) | ||
| 570 | { | 571 | { |
| 571 | struct via_spec *spec = codec->spec; | 572 | struct via_spec *spec = codec->spec; |
| 572 | int shared = spec->hp_indep_shared; | 573 | int shared = spec->hp_indep_shared; |
| 573 | 574 | ||
| 574 | if (!spec->hp_path.depth) { | ||
| 575 | via_auto_init_output(codec, &spec->hp_mix_path, PIN_HP, true); | ||
| 576 | return; | ||
| 577 | } | ||
| 578 | if (spec->hp_independent_mode) { | 575 | if (spec->hp_independent_mode) { |
| 579 | activate_output_path(codec, &spec->hp_path, false, false); | 576 | activate_output_path(codec, &spec->hp_path, false, false); |
| 580 | activate_output_path(codec, &spec->hp_mix_path, false, false); | 577 | activate_output_path(codec, &spec->hp_mix_path, false, false); |
| 581 | if (shared) | 578 | if (shared) |
| 582 | activate_output_path(codec, &spec->out_path[shared], | 579 | activate_output_path(codec, &spec->out_path[shared], |
| 583 | false, false); | 580 | false, false); |
| 584 | via_auto_init_output(codec, &spec->hp_indep_path, PIN_HP, true); | 581 | } else if (spec->aamix_mode || !spec->hp_path.depth) { |
| 585 | } else if (spec->aamix_mode) { | 582 | activate_output_path(codec, &spec->hp_indep_path, false, false); |
| 586 | activate_output_path(codec, &spec->hp_path, false, false); | 583 | activate_output_path(codec, &spec->hp_path, false, false); |
| 587 | via_auto_init_output(codec, &spec->hp_mix_path, PIN_HP, true); | ||
| 588 | } else { | 584 | } else { |
| 585 | activate_output_path(codec, &spec->hp_indep_path, false, false); | ||
| 589 | activate_output_path(codec, &spec->hp_mix_path, false, false); | 586 | activate_output_path(codec, &spec->hp_mix_path, false, false); |
| 590 | via_auto_init_output(codec, &spec->hp_path, PIN_HP, true); | ||
| 591 | } | 587 | } |
| 592 | } | 588 | } |
| 593 | 589 | ||
| 590 | static void via_auto_init_hp_out(struct hda_codec *codec) | ||
| 591 | { | ||
| 592 | struct via_spec *spec = codec->spec; | ||
| 593 | |||
| 594 | if (!spec->hp_path.depth) { | ||
| 595 | via_auto_init_output(codec, &spec->hp_mix_path, PIN_HP, true); | ||
| 596 | return; | ||
| 597 | } | ||
| 598 | deactivate_hp_paths(codec); | ||
| 599 | if (spec->hp_independent_mode) | ||
| 600 | via_auto_init_output(codec, &spec->hp_indep_path, PIN_HP, true); | ||
| 601 | else if (spec->aamix_mode) | ||
| 602 | via_auto_init_output(codec, &spec->hp_mix_path, PIN_HP, true); | ||
| 603 | else | ||
| 604 | via_auto_init_output(codec, &spec->hp_path, PIN_HP, true); | ||
| 605 | } | ||
| 606 | |||
| 594 | static void via_auto_init_speaker_out(struct hda_codec *codec) | 607 | static void via_auto_init_speaker_out(struct hda_codec *codec) |
| 595 | { | 608 | { |
| 596 | struct via_spec *spec = codec->spec; | 609 | struct via_spec *spec = codec->spec; |
| @@ -847,18 +860,19 @@ static int via_independent_hp_put(struct snd_kcontrol *kcontrol, | |||
| 847 | } | 860 | } |
| 848 | spec->hp_independent_mode = cur; | 861 | spec->hp_independent_mode = cur; |
| 849 | shared = spec->hp_indep_shared; | 862 | shared = spec->hp_indep_shared; |
| 850 | if (cur) { | 863 | deactivate_hp_paths(codec); |
| 851 | activate_output_path(codec, &spec->hp_mix_path, false, false); | 864 | if (cur) |
| 852 | if (shared) | 865 | activate_output_path(codec, &spec->hp_indep_path, true, false); |
| 853 | activate_output_path(codec, &spec->out_path[shared], | 866 | else { |
| 854 | false, false); | ||
| 855 | activate_output_path(codec, &spec->hp_path, true, false); | ||
| 856 | } else { | ||
| 857 | activate_output_path(codec, &spec->hp_path, false, false); | ||
| 858 | if (shared) | 867 | if (shared) |
| 859 | activate_output_path(codec, &spec->out_path[shared], | 868 | activate_output_path(codec, &spec->out_path[shared], |
| 860 | true, false); | 869 | true, false); |
| 861 | activate_output_path(codec, &spec->hp_mix_path, true, false); | 870 | if (spec->aamix_mode || !spec->hp_path.depth) |
| 871 | activate_output_path(codec, &spec->hp_mix_path, | ||
| 872 | true, false); | ||
| 873 | else | ||
| 874 | activate_output_path(codec, &spec->hp_path, | ||
| 875 | true, false); | ||
| 862 | } | 876 | } |
| 863 | 877 | ||
| 864 | switch_indep_hp_dacs(codec); | 878 | switch_indep_hp_dacs(codec); |
| @@ -1928,6 +1942,12 @@ static void mangle_smart51(struct hda_codec *codec) | |||
| 1928 | } | 1942 | } |
| 1929 | } | 1943 | } |
| 1930 | 1944 | ||
| 1945 | static void copy_path_mixer_ctls(struct nid_path *dst, struct nid_path *src) | ||
| 1946 | { | ||
| 1947 | dst->vol_ctl = src->vol_ctl; | ||
| 1948 | dst->mute_ctl = src->mute_ctl; | ||
| 1949 | } | ||
| 1950 | |||
| 1931 | /* add playback controls from the parsed DAC table */ | 1951 | /* add playback controls from the parsed DAC table */ |
| 1932 | static int via_auto_create_multi_out_ctls(struct hda_codec *codec) | 1952 | static int via_auto_create_multi_out_ctls(struct hda_codec *codec) |
| 1933 | { | 1953 | { |
| @@ -1976,14 +1996,10 @@ static int via_auto_create_multi_out_ctls(struct hda_codec *codec) | |||
| 1976 | if (err < 0) | 1996 | if (err < 0) |
| 1977 | return err; | 1997 | return err; |
| 1978 | } | 1998 | } |
| 1979 | if (path != spec->out_path + i) { | 1999 | if (path != spec->out_path + i) |
| 1980 | spec->out_path[i].vol_ctl = path->vol_ctl; | 2000 | copy_path_mixer_ctls(&spec->out_path[i], path); |
| 1981 | spec->out_path[i].mute_ctl = path->mute_ctl; | 2001 | if (path == spec->out_path && spec->out_mix_path.depth) |
| 1982 | } | 2002 | copy_path_mixer_ctls(&spec->out_mix_path, path); |
| 1983 | if (path == spec->out_path && spec->out_mix_path.depth) { | ||
| 1984 | spec->out_mix_path.vol_ctl = path->vol_ctl; | ||
| 1985 | spec->out_mix_path.mute_ctl = path->mute_ctl; | ||
| 1986 | } | ||
| 1987 | } | 2003 | } |
| 1988 | 2004 | ||
| 1989 | idx = get_connection_index(codec, spec->aa_mix_nid, | 2005 | idx = get_connection_index(codec, spec->aa_mix_nid, |
| @@ -2058,13 +2074,12 @@ static int via_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin) | |||
| 2058 | err = create_ch_ctls(codec, "Headphone", 3, check_dac, path); | 2074 | err = create_ch_ctls(codec, "Headphone", 3, check_dac, path); |
| 2059 | if (err < 0) | 2075 | if (err < 0) |
| 2060 | return err; | 2076 | return err; |
| 2061 | if (check_dac) { | 2077 | if (check_dac) |
| 2062 | spec->hp_mix_path.vol_ctl = path->vol_ctl; | 2078 | copy_path_mixer_ctls(&spec->hp_mix_path, path); |
| 2063 | spec->hp_mix_path.mute_ctl = path->mute_ctl; | 2079 | else |
| 2064 | } else { | 2080 | copy_path_mixer_ctls(&spec->hp_path, path); |
| 2065 | spec->hp_path.vol_ctl = path->vol_ctl; | 2081 | if (spec->hp_indep_path.depth) |
| 2066 | spec->hp_path.mute_ctl = path->mute_ctl; | 2082 | copy_path_mixer_ctls(&spec->hp_indep_path, path); |
| 2067 | } | ||
| 2068 | return 0; | 2083 | return 0; |
| 2069 | } | 2084 | } |
| 2070 | 2085 | ||
| @@ -2106,13 +2121,10 @@ static int via_auto_create_speaker_ctls(struct hda_codec *codec) | |||
| 2106 | err = create_ch_ctls(codec, "Speaker", 3, check_dac, path); | 2121 | err = create_ch_ctls(codec, "Speaker", 3, check_dac, path); |
| 2107 | if (err < 0) | 2122 | if (err < 0) |
| 2108 | return err; | 2123 | return err; |
| 2109 | if (check_dac) { | 2124 | if (check_dac) |
| 2110 | spec->speaker_mix_path.vol_ctl = path->vol_ctl; | 2125 | copy_path_mixer_ctls(&spec->speaker_mix_path, path); |
| 2111 | spec->speaker_mix_path.mute_ctl = path->mute_ctl; | 2126 | else |
| 2112 | } else { | 2127 | copy_path_mixer_ctls(&spec->speaker_path, path); |
| 2113 | spec->speaker_path.vol_ctl = path->vol_ctl; | ||
| 2114 | spec->speaker_path.mute_ctl = path->mute_ctl; | ||
| 2115 | } | ||
| 2116 | return 0; | 2128 | return 0; |
| 2117 | } | 2129 | } |
| 2118 | 2130 | ||
