ALSA: hda: SPDIF mux fixes for STAC927x
authorMatthew Ranostay <mranostay@embeddedalley.com>
Tue, 16 Sep 2008 14:39:37 +0000 (10:39 -0400)
committerJaroslav Kysela <perex@perex.cz>
Tue, 23 Sep 2008 06:18:20 +0000 (08:18 +0200)
Corrected bounds-checking in stac92xx_auto_create_mux_input_ctls() and added a spec->spdif_labels
pointer for custom SPDIF mux labels for non-standard codec connections.

Signed-off-by: Matthew Ranostay <mranostay@embeddedalley.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
sound/pci/hda/patch_sigmatel.c

index 16fc3ae..bd0d6f8 100644 (file)
@@ -177,6 +177,7 @@ struct sigmatel_spec {
        unsigned int num_dmuxes;
        hda_nid_t *smux_nids;
        unsigned int num_smuxes;
+       const char **spdif_labels;
 
        hda_nid_t dig_in_nid;
        hda_nid_t mono_nid;
@@ -394,6 +395,11 @@ static hda_nid_t stac927x_dmic_nids[STAC927X_NUM_DMICS + 1] = {
        0x13, 0x14, 0
 };
 
+static const char *stac927x_spdif_labels[5] = {
+       "Digital Playback", "ADAT", "Analog Mux 1",
+       "Analog Mux 2", "Analog Mux 3"
+};
+
 static hda_nid_t stac9205_adc_nids[2] = {
         0x12, 0x13
 };
@@ -3033,26 +3039,29 @@ static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec)
 };
 
 static const char *stac92xx_spdif_labels[3] = {
-       "Digital Playback", "Analog Mux 1", "Analog Mux 2"
+       "Digital Playback", "Analog Mux 1", "Analog Mux 2",
 };
 
 static int stac92xx_auto_create_spdif_mux_ctls(struct hda_codec *codec)
 {
        struct sigmatel_spec *spec = codec->spec;
        struct hda_input_mux *spdif_mux = &spec->private_smux;
+       const char **labels = spec->spdif_labels;
        int i, num_cons;
-       hda_nid_t con_lst[ARRAY_SIZE(stac92xx_spdif_labels)];
+       hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
 
        num_cons = snd_hda_get_connections(codec,
                                spec->smux_nids[0],
                                con_lst,
                                HDA_MAX_NUM_INPUTS);
-       if (!num_cons || num_cons > ARRAY_SIZE(stac92xx_spdif_labels))
+       if (!num_cons)
                return -EINVAL;
 
+       if (!labels)
+               labels = stac92xx_spdif_labels;
+
        for (i = 0; i < num_cons; i++) {
-               spdif_mux->items[spdif_mux->num_items].label =
-                                       stac92xx_spdif_labels[i];
+               spdif_mux->items[spdif_mux->num_items].label = labels[i];
                spdif_mux->items[spdif_mux->num_items].index = i;
                spdif_mux->num_items++;
        }
@@ -4547,6 +4556,7 @@ static int patch_stac927x(struct hda_codec *codec)
        spec->num_muxes = ARRAY_SIZE(stac927x_mux_nids);
        spec->smux_nids = stac927x_smux_nids;
        spec->num_smuxes = ARRAY_SIZE(stac927x_smux_nids);
+       spec->spdif_labels = stac927x_spdif_labels;
        spec->dac_list = stac927x_dac_nids;
        spec->multiout.dac_nids = spec->dac_nids;