ALSA: hda - Use generic array for loopback list management
authorTakashi Iwai <tiwai@suse.de>
Thu, 7 Feb 2013 09:45:11 +0000 (10:45 +0100)
committerTakashi Iwai <tiwai@suse.de>
Thu, 7 Feb 2013 09:45:11 +0000 (10:45 +0100)
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_generic.c
sound/pci/hda/hda_generic.h
sound/pci/hda/patch_via.c

index c2cd3d6b6003a203b3815878036398dcd37833ec..6af5aded1ed58a152b7e875280981fbea54ce9db 100644 (file)
@@ -42,6 +42,7 @@ int snd_hda_gen_spec_init(struct hda_gen_spec *spec)
 {
        snd_array_init(&spec->kctls, sizeof(struct snd_kcontrol_new), 32);
        snd_array_init(&spec->paths, sizeof(struct nid_path), 8);
+       snd_array_init(&spec->loopback_list, sizeof(struct hda_amp_list), 8);
        mutex_init(&spec->pcm_mutex);
        return 0;
 }
@@ -82,6 +83,7 @@ void snd_hda_gen_spec_free(struct hda_gen_spec *spec)
                return;
        free_kctls(spec);
        snd_array_free(&spec->paths);
+       snd_array_free(&spec->loopback_list);
 }
 EXPORT_SYMBOL_HDA(snd_hda_gen_spec_free);
 
@@ -2484,18 +2486,18 @@ static int create_in_jack_mode(struct hda_codec *codec, hda_nid_t pin)
  */
 
 /* add the powersave loopback-list entry */
-static void add_loopback_list(struct hda_gen_spec *spec, hda_nid_t mix, int idx)
+static int add_loopback_list(struct hda_gen_spec *spec, hda_nid_t mix, int idx)
 {
        struct hda_amp_list *list;
 
-       if (spec->num_loopbacks >= ARRAY_SIZE(spec->loopback_list) - 1)
-               return;
-       list = spec->loopback_list + spec->num_loopbacks;
+       list = snd_array_new(&spec->loopback_list);
+       if (!list)
+               return -ENOMEM;
        list->nid = mix;
        list->dir = HDA_INPUT;
        list->idx = idx;
-       spec->num_loopbacks++;
-       spec->loopback.amplist = spec->loopback_list;
+       spec->loopback.amplist = spec->loopback_list.list;
+       return 0;
 }
 
 /* create input playback/capture controls for the given pin */
@@ -2536,7 +2538,9 @@ static int new_analog_input(struct hda_codec *codec, int input_idx,
        }
 
        path->active = true;
-       add_loopback_list(spec, mix_nid, idx);
+       err = add_loopback_list(spec, mix_nid, idx);
+       if (err < 0)
+               return err;
 
        if (spec->mixer_nid != spec->mixer_merge_nid &&
            !spec->loopback_merge_path) {
index d5348dd7a14f36fedfb5ccf677f16c38a848f930..009b57be96d36e4ee9103794404edf968d009748 100644 (file)
@@ -228,8 +228,7 @@ struct hda_gen_spec {
        struct hda_vmaster_mute_hook vmaster_mute;
 
        struct hda_loopback_check loopback;
-       int num_loopbacks;
-       struct hda_amp_list loopback_list[8];
+       struct snd_array loopback_list;
 
        /* multi-io */
        int multi_ios;
index ca7d962a08a61399aaf9fc35fe573ccca1bc81bb..c35338a8771d9a01020c5c088be985402041a17c 100644 (file)
@@ -355,10 +355,12 @@ static bool is_aa_path_mute(struct hda_codec *codec)
 {
        struct via_spec *spec = codec->spec;
        const struct hda_amp_list *p;
-       int i, ch, v;
+       int ch, v;
 
-       for (i = 0; i < spec->gen.num_loopbacks; i++) {
-               p = &spec->gen.loopback_list[i];
+       p = spec->gen.loopback.amplist;
+       if (!p)
+               return true;
+       for (; p->nid; p++) {
                for (ch = 0; ch < 2; ch++) {
                        v = snd_hda_codec_amp_read(codec, p->nid, ch, p->dir,
                                                   p->idx);