diff options
author | Takashi Iwai <tiwai@suse.de> | 2008-06-16 09:47:26 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2008-06-18 03:24:36 -0400 |
commit | 43785eaeb1cfb8aed3cf8027f298b242f88fdc45 (patch) | |
tree | f008e0494eaa7d9c0598e386b1bd3c70215c5bb6 /sound/pci/hda/patch_analog.c | |
parent | 83544994a6a592073e9f6b937c6da12cf5ed2d1e (diff) |
ALSA: hda - Fix wrong volumes in AD1988 auto-probe mode
Don't create mixer volume elements for Headphone and Speaker if they
use the same DAC as normal line-outs on AD1988. Otherwise the amp
value gets screwed up, e.g.
https://bugzilla.novell.com/show_bug.cgi?id=398255
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound/pci/hda/patch_analog.c')
-rw-r--r-- | sound/pci/hda/patch_analog.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 55ce897ef0b3..05ca027fcc01 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
@@ -2621,7 +2621,7 @@ static int ad1988_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin, | |||
2621 | { | 2621 | { |
2622 | struct ad198x_spec *spec = codec->spec; | 2622 | struct ad198x_spec *spec = codec->spec; |
2623 | hda_nid_t nid; | 2623 | hda_nid_t nid; |
2624 | int idx, err; | 2624 | int i, idx, err; |
2625 | char name[32]; | 2625 | char name[32]; |
2626 | 2626 | ||
2627 | if (! pin) | 2627 | if (! pin) |
@@ -2629,16 +2629,26 @@ static int ad1988_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin, | |||
2629 | 2629 | ||
2630 | idx = ad1988_pin_idx(pin); | 2630 | idx = ad1988_pin_idx(pin); |
2631 | nid = ad1988_idx_to_dac(codec, idx); | 2631 | nid = ad1988_idx_to_dac(codec, idx); |
2632 | /* specify the DAC as the extra output */ | 2632 | /* check whether the corresponding DAC was already taken */ |
2633 | if (! spec->multiout.hp_nid) | 2633 | for (i = 0; i < spec->autocfg.line_outs; i++) { |
2634 | spec->multiout.hp_nid = nid; | 2634 | hda_nid_t pin = spec->autocfg.line_out_pins[i]; |
2635 | else | 2635 | hda_nid_t dac = ad1988_idx_to_dac(codec, ad1988_pin_idx(pin)); |
2636 | spec->multiout.extra_out_nid[0] = nid; | 2636 | if (dac == nid) |
2637 | /* control HP volume/switch on the output mixer amp */ | 2637 | break; |
2638 | sprintf(name, "%s Playback Volume", pfx); | 2638 | } |
2639 | if ((err = add_control(spec, AD_CTL_WIDGET_VOL, name, | 2639 | if (i >= spec->autocfg.line_outs) { |
2640 | HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT))) < 0) | 2640 | /* specify the DAC as the extra output */ |
2641 | return err; | 2641 | if (!spec->multiout.hp_nid) |
2642 | spec->multiout.hp_nid = nid; | ||
2643 | else | ||
2644 | spec->multiout.extra_out_nid[0] = nid; | ||
2645 | /* control HP volume/switch on the output mixer amp */ | ||
2646 | sprintf(name, "%s Playback Volume", pfx); | ||
2647 | err = add_control(spec, AD_CTL_WIDGET_VOL, name, | ||
2648 | HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT)); | ||
2649 | if (err < 0) | ||
2650 | return err; | ||
2651 | } | ||
2642 | nid = ad1988_mixer_nids[idx]; | 2652 | nid = ad1988_mixer_nids[idx]; |
2643 | sprintf(name, "%s Playback Switch", pfx); | 2653 | sprintf(name, "%s Playback Switch", pfx); |
2644 | if ((err = add_control(spec, AD_CTL_BIND_MUTE, name, | 2654 | if ((err = add_control(spec, AD_CTL_BIND_MUTE, name, |