| From 43785eaeb1cfb8aed3cf8027f298b242f88fdc45 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Mon, 16 Jun 2008 15:47:26 +0200 |
| Subject: ALSA: hda - Fix wrong volumes in AD1988 auto-probe mode |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit 43785eaeb1cfb8aed3cf8027f298b242f88fdc45 upstream |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| sound/pci/hda/patch_analog.c | 32 +++++++++++++++++++++----------- |
| 1 file changed, 21 insertions(+), 11 deletions(-) |
| |
| --- a/sound/pci/hda/patch_analog.c |
| +++ b/sound/pci/hda/patch_analog.c |
| @@ -2623,7 +2623,7 @@ static int ad1988_auto_create_extra_out( |
| { |
| struct ad198x_spec *spec = codec->spec; |
| hda_nid_t nid; |
| - int idx, err; |
| + int i, idx, err; |
| char name[32]; |
| |
| if (! pin) |
| @@ -2631,16 +2631,26 @@ static int ad1988_auto_create_extra_out( |
| |
| idx = ad1988_pin_idx(pin); |
| nid = ad1988_idx_to_dac(codec, idx); |
| - /* specify the DAC as the extra output */ |
| - if (! spec->multiout.hp_nid) |
| - spec->multiout.hp_nid = nid; |
| - else |
| - spec->multiout.extra_out_nid[0] = nid; |
| - /* control HP volume/switch on the output mixer amp */ |
| - sprintf(name, "%s Playback Volume", pfx); |
| - if ((err = add_control(spec, AD_CTL_WIDGET_VOL, name, |
| - HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT))) < 0) |
| - return err; |
| + /* check whether the corresponding DAC was already taken */ |
| + for (i = 0; i < spec->autocfg.line_outs; i++) { |
| + hda_nid_t pin = spec->autocfg.line_out_pins[i]; |
| + hda_nid_t dac = ad1988_idx_to_dac(codec, ad1988_pin_idx(pin)); |
| + if (dac == nid) |
| + break; |
| + } |
| + if (i >= spec->autocfg.line_outs) { |
| + /* specify the DAC as the extra output */ |
| + if (!spec->multiout.hp_nid) |
| + spec->multiout.hp_nid = nid; |
| + else |
| + spec->multiout.extra_out_nid[0] = nid; |
| + /* control HP volume/switch on the output mixer amp */ |
| + sprintf(name, "%s Playback Volume", pfx); |
| + err = add_control(spec, AD_CTL_WIDGET_VOL, name, |
| + HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT)); |
| + if (err < 0) |
| + return err; |
| + } |
| nid = ad1988_mixer_nids[idx]; |
| sprintf(name, "%s Playback Switch", pfx); |
| if ((err = add_control(spec, AD_CTL_BIND_MUTE, name, |