ALSA: hda - Fix channel maps for Nvidia 7x 8ch HDMI codecs
authorTakashi Iwai <tiwai@suse.de>
Wed, 1 Aug 2012 10:17:41 +0000 (12:17 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 6 Sep 2012 16:08:30 +0000 (18:08 +0200)
Some old Nvidia HDMI codecs with 8ch support only 2/8 or
2/6/8 channels and with the fixed CLFE-first map.

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

index 4a5d24fe8adf1656ea7194dcd8704df948c561d9..2c53ea889da95167e73fc6eb7210309637bfcaff 100644 (file)
@@ -2155,6 +2155,43 @@ static int patch_nvhdmi_2ch(struct hda_codec *codec)
        return 0;
 }
 
+static int nvhdmi_7x_8ch_build_pcms(struct hda_codec *codec)
+{
+       struct hdmi_spec *spec = codec->spec;
+       int err = simple_playback_build_pcms(codec);
+       spec->pcm_rec[0].own_chmap = true;
+       return err;
+}
+
+static int nvhdmi_7x_8ch_build_controls(struct hda_codec *codec)
+{
+       struct hdmi_spec *spec = codec->spec;
+       struct snd_pcm_chmap *chmap;
+       int err;
+
+       err = simple_playback_build_controls(codec);
+       if (err < 0)
+               return err;
+
+       /* add channel maps */
+       err = snd_pcm_add_chmap_ctls(spec->pcm_rec[0].pcm,
+                                    SNDRV_PCM_STREAM_PLAYBACK,
+                                    snd_pcm_alt_chmaps, 8, 0, &chmap);
+       if (err < 0)
+               return err;
+       switch (codec->preset->id) {
+       case 0x10de0002:
+       case 0x10de0003:
+       case 0x10de0005:
+       case 0x10de0006:
+               chmap->channel_mask = (1U << 2) | (1U << 8);
+               break;
+       case 0x10de0007:
+               chmap->channel_mask = (1U << 2) | (1U << 6) | (1U << 8);
+       }
+       return 0;
+}
+
 static int patch_nvhdmi_8ch_7x(struct hda_codec *codec)
 {
        struct hdmi_spec *spec;
@@ -2165,6 +2202,8 @@ static int patch_nvhdmi_8ch_7x(struct hda_codec *codec)
        spec->multiout.max_channels = 8;
        spec->pcm_playback = nvhdmi_pcm_playback_8ch_7x;
        codec->patch_ops.init = nvhdmi_7x_init_8ch;
+       codec->patch_ops.build_pcms = nvhdmi_7x_8ch_build_pcms;
+       codec->patch_ops.build_controls = nvhdmi_7x_8ch_build_controls;
 
        /* Initialize the audio infoframe channel mask and checksum to something
         * valid */