ALSA: hda - Fix NID association for capture mixers
Takashi Iwai [Wed, 23 Dec 2009 07:31:59 +0000 (08:31 +0100)]
Fix the wrong implementation of NID <-> kctl mapping for capture mixers
introduced by the ocmmit 5b0cb1d850c26893b1468b3a519433a1b7a176be.
So far, the driver returns an error at probe.

Signed-off-by: Takashi Iwai <tiwai@suse.de>

sound/pci/hda/hda_codec.c
sound/pci/hda/hda_local.h
sound/pci/hda/patch_analog.c
sound/pci/hda/patch_cirrus.c
sound/pci/hda/patch_cmedia.c
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_via.c

index c848ec0..29c90d7 100644 (file)
@@ -3537,32 +3537,6 @@ int snd_hda_add_new_ctls(struct hda_codec *codec, struct snd_kcontrol_new *knew)
 }
 EXPORT_SYMBOL_HDA(snd_hda_add_new_ctls);
 
-/**
- * snd_hda_add_nids - assign nids to controls from the array
- * @codec: the HDA codec
- * @kctl: struct snd_kcontrol
- * @index: index to kctl
- * @nids: the array of hda_nid_t
- * @size: count of hda_nid_t items
- *
- * This helper function assigns NIDs in the given array to a control element.
- *
- * Returns 0 if successful, or a negative error code.
- */
-int snd_hda_add_nids(struct hda_codec *codec, struct snd_kcontrol *kctl,
-                    unsigned int index, hda_nid_t *nids, unsigned int size)
-{
-       int err;
-
-       for ( ; size > 0; size--, nids++) {
-               err = snd_hda_add_nid(codec, kctl, index, *nids);
-               if (err < 0)
-                       return err;
-       }
-       return 0;
-}
-EXPORT_SYMBOL_HDA(snd_hda_add_nids);
-
 #ifdef CONFIG_SND_HDA_POWER_SAVE
 static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg,
                                unsigned int power_state);
index d505d05..7cee364 100644 (file)
@@ -343,8 +343,6 @@ int snd_hda_check_board_codec_sid_config(struct hda_codec *codec,
                                const struct snd_pci_quirk *tbl);
 int snd_hda_add_new_ctls(struct hda_codec *codec,
                         struct snd_kcontrol_new *knew);
-int snd_hda_add_nids(struct hda_codec *codec, struct snd_kcontrol *kctl,
-                    unsigned int index, hda_nid_t *nids, unsigned int size);
 
 /*
  * unsolicited event handler
index 92b72d4..45ee352 100644 (file)
@@ -244,8 +244,7 @@ static int ad198x_build_controls(struct hda_codec *codec)
        if (!kctl)
                kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
        for (i = 0; kctl && i < kctl->count; i++) {
-               err = snd_hda_add_nids(codec, kctl, i, spec->capsrc_nids,
-                                      spec->input_mux->num_items);
+               err = snd_hda_add_nid(codec, kctl, i, spec->capsrc_nids[i]);
                if (err < 0)
                        return err;
        }
index 093cfbb..7de782a 100644 (file)
@@ -753,6 +753,7 @@ static int build_input(struct hda_codec *codec)
        spec->capture_bind[1] = make_bind_capture(codec, &snd_hda_bind_vol);
        for (i = 0; i < 2; i++) {
                struct snd_kcontrol *kctl;
+               int n;
                if (!spec->capture_bind[i])
                        return -ENOMEM;
                kctl = snd_ctl_new1(&cs_capture_ctls[i], codec);
@@ -762,10 +763,13 @@ static int build_input(struct hda_codec *codec)
                err = snd_hda_ctl_add(codec, 0, kctl);
                if (err < 0)
                        return err;
-               err = snd_hda_add_nids(codec, kctl, 0, spec->adc_nid,
-                                      spec->num_inputs);
-               if (err < 0)
-                       return err;
+               for (n = 0; n < AUTO_PIN_LAST; n++) {
+                       if (!spec->adc_nid[n])
+                               continue;
+                       err = snd_hda_add_nid(codec, kctl, 0, spec->adc_nid[i]);
+                       if (err < 0)
+                               return err;
+               }
        }
        
        if (spec->num_inputs > 1 && !spec->mic_detect) {
index cc1c223..ff60908 100644 (file)
@@ -345,8 +345,7 @@ static int cmi9880_build_controls(struct hda_codec *codec)
        /* assign Capture Source enums to NID */
        kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
        for (i = 0; kctl && i < kctl->count; i++) {
-               err = snd_hda_add_nids(codec, kctl, i, spec->adc_nids,
-                                      spec->input_mux->num_items);
+               err = snd_hda_add_nid(codec, kctl, i, spec->adc_nids[i]);
                if (err < 0)
                        return err;
        }
index e7cdc6a..a451990 100644 (file)
@@ -2551,8 +2551,7 @@ static int alc_build_controls(struct hda_codec *codec)
                hda_nid_t *nids = spec->capsrc_nids;
                if (!nids)
                        nids = spec->adc_nids;
-               err = snd_hda_add_nids(codec, kctl, i, nids,
-                                      spec->input_mux->num_items);
+               err = snd_hda_add_nid(codec, kctl, i, nids[i]);
                if (err < 0)
                        return err;
        }
index de4839e..9ddc373 100644 (file)
@@ -1907,8 +1907,7 @@ static int via_build_controls(struct hda_codec *codec)
        /* assign Capture Source enums to NID */
        kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
        for (i = 0; kctl && i < kctl->count; i++) {
-               err = snd_hda_add_nids(codec, kctl, i, spec->mux_nids,
-                                      spec->input_mux->num_items);
+               err = snd_hda_add_nid(codec, kctl, i, spec->mux_nids[i]);
                if (err < 0)
                        return err;
        }