ALSA: hda - Fix ALC882 DAC connections in auto mode
authorTakashi Iwai <tiwai@suse.de>
Wed, 7 Apr 2010 07:06:00 +0000 (09:06 +0200)
committerTakashi Iwai <tiwai@suse.de>
Wed, 7 Apr 2010 07:06:00 +0000 (09:06 +0200)
Assign DACs properly to each output.  Currently, the front output is bound
to HP/speaker outputs blindly, but they should be assigned to individual
DACs.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/patch_realtek.c

index c9c31c51863f944f3fbf220265fe5ba145da8d32..f4ca9b2d87841bc5d929c4b5e49cafb62bcf33bf 100644 (file)
@@ -10191,21 +10191,21 @@ static int alc882_auto_create_input_ctls(struct hda_codec *codec,
 
 static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
                                              hda_nid_t nid, int pin_type,
-                                             int dac_idx)
+                                             hda_nid_t dac)
 {
-       /* set as output */
-       struct alc_spec *spec = codec->spec;
        int idx;
 
+       printk("XXX set output pin %x, dac %x\n", nid, dac);
+       /* set as output */
        alc_set_pin_output(codec, nid, pin_type);
-       if (dac_idx >= spec->multiout.num_dacs)
-               return;
-       if (spec->multiout.dac_nids[dac_idx] == 0x25)
+
+       if (dac == 0x25)
                idx = 4;
+       else if (dac >= 0x02 && dac <= 0x05)
+               idx = dac - 2;
        else
-               idx = spec->multiout.dac_nids[dac_idx] - 2;
+               return;
        snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
-
 }
 
 static void alc882_auto_init_multi_out(struct hda_codec *codec)
@@ -10218,22 +10218,29 @@ static void alc882_auto_init_multi_out(struct hda_codec *codec)
                int pin_type = get_pin_type(spec->autocfg.line_out_type);
                if (nid)
                        alc882_auto_set_output_and_unmute(codec, nid, pin_type,
-                                                         i);
+                                       spec->multiout.dac_nids[i]);
        }
 }
 
 static void alc882_auto_init_hp_out(struct hda_codec *codec)
 {
        struct alc_spec *spec = codec->spec;
-       hda_nid_t pin;
+       hda_nid_t pin, dac;
 
        pin = spec->autocfg.hp_pins[0];
-       if (pin) /* connect to front */
-               /* use dac 0 */
-               alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
+       if (pin) {
+               dac = spec->multiout.hp_nid;
+               if (!dac)
+                       dac = spec->multiout.dac_nids[0]; /* to front */
+               alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, dac);
+       }
        pin = spec->autocfg.speaker_pins[0];
-       if (pin)
-               alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
+       if (pin) {
+               dac = spec->multiout.extra_out_nid[0];
+               if (!dac)
+                       dac = spec->multiout.dac_nids[0]; /* to front */
+               alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, dac);
+       }
 }
 
 static void alc882_auto_init_analog_input(struct hda_codec *codec)
@@ -10347,6 +10354,10 @@ static int alc882_parse_auto_config(struct hda_codec *codec)
        if (err < 0)
                return err;
        err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
+       if (err < 0)
+               return err;
+       err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
+                                          "Headphone");
        if (err < 0)
                return err;
        err = alc880_auto_create_extra_out(spec,
@@ -10354,10 +10365,6 @@ static int alc882_parse_auto_config(struct hda_codec *codec)
                                           "Speaker");
        if (err < 0)
                return err;
-       err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
-                                          "Headphone");
-       if (err < 0)
-               return err;
        err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
        if (err < 0)
                return err;