ALSA: hda - Use alc_get_pfx_name() for all Realtek codecs
[pandora-kernel.git] / sound / pci / hda / patch_realtek.c
index 0f90fac..cb8afda 100644 (file)
@@ -4884,7 +4884,6 @@ static const struct snd_pci_quirk alc880_cfg_tbl[] = {
        SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
        SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
        SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
-       SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
        SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
        SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
        SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
@@ -5360,11 +5359,15 @@ static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
        return 0;
 }
 
-static const char *alc_get_line_out_pfx(struct alc_spec *spec,
-                                       bool can_be_master)
+static const char *alc_get_line_out_pfx(struct alc_spec *spec, int ch,
+                                       bool can_be_master, int *index)
 {
        struct auto_pin_cfg *cfg = &spec->autocfg;
+       static const char * const chname[4] = {
+               "Front", "Surround", NULL /*CLFE*/, "Side"
+       };
 
+       *index = 0;
        if (cfg->line_outs == 1 && !spec->multi_ios &&
            !cfg->hp_outs && !cfg->speaker_outs && can_be_master)
                return "Master";
@@ -5375,23 +5378,23 @@ static const char *alc_get_line_out_pfx(struct alc_spec *spec,
                        return "Speaker";
                break;
        case AUTO_PIN_HP_OUT:
+               /* for multi-io case, only the primary out */
+               if (ch && spec->multi_ios)
+                       break;
+               *index = ch;
                return "Headphone";
        default:
                if (cfg->line_outs == 1 && !spec->multi_ios)
                        return "PCM";
                break;
        }
-       return NULL;
+       return chname[ch];
 }
 
 /* add playback controls from the parsed DAC table */
 static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
                                             const struct auto_pin_cfg *cfg)
 {
-       static const char * const chname[4] = {
-               "Front", "Surround", NULL /*CLFE*/, "Side"
-       };
-       const char *pfx = alc_get_line_out_pfx(spec, false);
        hda_nid_t nid;
        int i, err, noutputs;
 
@@ -5400,10 +5403,13 @@ static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
                noutputs += spec->multi_ios;
 
        for (i = 0; i < noutputs; i++) {
+               const char *name;
+               int index;
                if (!spec->multiout.dac_nids[i])
                        continue;
                nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
-               if (!pfx && i == 2) {
+               name = alc_get_line_out_pfx(spec, i, false, &index);
+               if (!name) {
                        /* Center/LFE */
                        err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
                                              "Center",
@@ -5430,12 +5436,6 @@ static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
                        if (err < 0)
                                return err;
                } else {
-                       const char *name = pfx;
-                       int index = i;
-                       if (!name) {
-                               name = chname[i];
-                               index = 0;
-                       }
                        err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
                                                name, index,
                                          HDA_COMPOSE_AMP_VAL(nid, 3, 0,
@@ -7184,12 +7184,8 @@ static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
        nid = cfg->line_out_pins[0];
        if (nid) {
                const char *pfx;
-               if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
-                       pfx = "Master";
-               else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
-                       pfx = "Speaker";
-               else
-                       pfx = "Front";
+               int index;
+               pfx = alc_get_line_out_pfx(spec, 0, true, &index);
                err = alc260_add_playback_controls(spec, nid, pfx, &vols);
                if (err < 0)
                        return err;
@@ -12258,17 +12254,18 @@ static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
 {
        const char *pfx;
        int vbits;
-       int i, err;
+       int i, index, err;
 
        spec->multiout.num_dacs = 1;    /* only use one dac */
        spec->multiout.dac_nids = spec->private_dac_nids;
        spec->private_dac_nids[0] = 2;
 
-       pfx = alc_get_line_out_pfx(spec, true);
-       if (!pfx)
-               pfx = "Front";
        for (i = 0; i < 2; i++) {
-               err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[i], pfx, i);
+               pfx = alc_get_line_out_pfx(spec, i, true, &index);
+               if (!pfx)
+                       pfx = "PCM";
+               err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[i], pfx,
+                                           index);
                if (err < 0)
                        return err;
                if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
@@ -12288,10 +12285,11 @@ static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
        vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
                alc262_check_volbit(cfg->speaker_pins[0]) |
                alc262_check_volbit(cfg->hp_pins[0]);
-       if (vbits == 1 || vbits == 2)
-               pfx = "Master"; /* only one mixer is used */
        vbits = 0;
        for (i = 0; i < 2; i++) {
+               pfx = alc_get_line_out_pfx(spec, i, true, &index);
+               if (!pfx)
+                       pfx = "PCM";
                err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[i], pfx,
                                             &vbits, i);
                if (err < 0)
@@ -12601,6 +12599,7 @@ static const struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
  */
 enum {
        PINFIX_FSC_H270,
+       PINFIX_HP_Z200,
 };
 
 static const struct alc_fixup alc262_fixups[] = {
@@ -12613,9 +12612,17 @@ static const struct alc_fixup alc262_fixups[] = {
                        { }
                }
        },
+       [PINFIX_HP_Z200] = {
+               .type = ALC_FIXUP_PINS,
+               .v.pins = (const struct alc_pincfg[]) {
+                       { 0x16, 0x99130120 }, /* internal speaker */
+                       { }
+               }
+       },
 };
 
 static const struct snd_pci_quirk alc262_fixup_tbl[] = {
+       SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", PINFIX_HP_Z200),
        SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", PINFIX_FSC_H270),
        {}
 };
@@ -12732,6 +12739,8 @@ static const struct snd_pci_quirk alc262_cfg_tbl[] = {
                           ALC262_HP_BPC),
        SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1500, "HP z series",
                           ALC262_HP_BPC),
+       SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200",
+                          ALC262_AUTO),
        SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
                           ALC262_HP_BPC),
        SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
@@ -13626,10 +13635,8 @@ static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
        nid = cfg->line_out_pins[0];
        if (nid) {
                const char *name;
-               if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
-                       name = "Speaker";
-               else
-                       name = "Front";
+               int index;
+               name = alc_get_line_out_pfx(spec, 0, true, &index);
                err = alc268_new_analog_output(spec, nid, name, 0);
                if (err < 0)
                        return err;
@@ -13873,7 +13880,6 @@ static const struct snd_pci_quirk alc268_cfg_tbl[] = {
        SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
        SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
        SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
-       SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
        SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
        {}
 };
@@ -16026,10 +16032,6 @@ static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
                                             const struct auto_pin_cfg *cfg)
 {
        struct alc_spec *spec = codec->spec;
-       static const char * const chname[4] = {
-               "Front", "Surround", NULL /*CLFE*/, "Side"
-       };
-       const char *pfx = alc_get_line_out_pfx(spec, true);
        hda_nid_t nid;
        int i, err, noutputs;
 
@@ -16038,10 +16040,13 @@ static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
                noutputs += spec->multi_ios;
 
        for (i = 0; i < noutputs; i++) {
+               const char *name;
+               int index;
                nid = spec->multiout.dac_nids[i];
                if (!nid)
                        continue;
-               if (!pfx && i == 2) {
+               name = alc_get_line_out_pfx(spec, i, true, &index);
+               if (!name) {
                        /* Center/LFE */
                        err = alc861_create_out_sw(codec, "Center", nid, 1);
                        if (err < 0)
@@ -16050,12 +16055,6 @@ static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
                        if (err < 0)
                                return err;
                } else {
-                       const char *name = pfx;
-                       int index = i;
-                       if (!name) {
-                               name = chname[i];
-                               index = 0;
-                       }
                        err = __alc861_create_out_sw(codec, name, nid, index, 3);
                        if (err < 0)
                                return err;
@@ -17169,10 +17168,6 @@ static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
                                             const struct auto_pin_cfg *cfg)
 {
-       static const char * const chname[4] = {
-               "Front", "Surround", "CLFE", "Side"
-       };
-       const char *pfx = alc_get_line_out_pfx(spec, true);
        hda_nid_t nid_v, nid_s;
        int i, err, noutputs;
 
@@ -17181,6 +17176,8 @@ static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
                noutputs += spec->multi_ios;
 
        for (i = 0; i < noutputs; i++) {
+               const char *name;
+               int index;
                if (!spec->multiout.dac_nids[i])
                        continue;
                nid_v = alc861vd_idx_to_mixer_vol(
@@ -17190,7 +17187,8 @@ static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
                                alc880_dac_to_idx(
                                        spec->multiout.dac_nids[i]));
 
-               if (!pfx && i == 2) {
+               name = alc_get_line_out_pfx(spec, i, true, &index);
+               if (!name) {
                        /* Center/LFE */
                        err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
                                              "Center",
@@ -17217,12 +17215,6 @@ static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
                        if (err < 0)
                                return err;
                } else {
-                       const char *name = pfx;
-                       int index = i;
-                       if (!name) {
-                               name = chname[i];
-                               index = 0;
-                       }
                        err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
                                                name, index,
                                          HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
@@ -19021,10 +19013,6 @@ static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
                                             const struct auto_pin_cfg *cfg)
 {
        struct alc_spec *spec = codec->spec;
-       static const char * const chname[4] = {
-               "Front", "Surround", NULL /*CLFE*/, "Side"
-       };
-       const char *pfx = alc_get_line_out_pfx(spec, true);
        hda_nid_t nid, mix, pin;
        int i, err, noutputs;
 
@@ -19033,6 +19021,8 @@ static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
                noutputs += spec->multi_ios;
 
        for (i = 0; i < noutputs; i++) {
+               const char *name;
+               int index;
                nid = spec->multiout.dac_nids[i];
                if (!nid)
                        continue;
@@ -19043,7 +19033,8 @@ static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
                mix = alc_auto_dac_to_mix(codec, pin, nid);
                if (!mix)
                        continue;
-               if (!pfx && i == 2) {
+               name = alc_get_line_out_pfx(spec, i, true, &index);
+               if (!name) {
                        /* Center/LFE */
                        err = alc662_add_vol_ctl(spec, "Center", nid, 1);
                        if (err < 0)
@@ -19058,12 +19049,6 @@ static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
                        if (err < 0)
                                return err;
                } else {
-                       const char *name = pfx;
-                       int index = i;
-                       if (!name) {
-                               name = chname[i];
-                               index = 0;
-                       }
                        err = __alc662_add_vol_ctl(spec, name, nid, index, 3);
                        if (err < 0)
                                return err;
@@ -19352,8 +19337,6 @@ static int alc_auto_add_multi_channel_mode(struct hda_codec *codec)
                spec->multi_ios = num_pins;
                spec->ext_channel_count = 2;
                spec->multiout.num_dacs = num_pins + 1;
-               /* for avoiding multi HP mixers */
-               cfg->line_out_type = AUTO_PIN_LINE_OUT;
        }
        return 0;
 }
@@ -19882,10 +19865,8 @@ static int alc680_auto_create_multi_out_ctls(struct alc_spec *spec,
        nid = cfg->line_out_pins[0];
        if (nid) {
                const char *name;
-               if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
-                       name = "Speaker";
-               else
-                       name = "Front";
+               int index;
+               name = alc_get_line_out_pfx(spec, 0, true, &index);
                err = alc680_new_analog_output(spec, nid, name, 0);
                if (err < 0)
                        return err;