Merge branch 'topic/tlv-chmap' into for-next
authorTakashi Iwai <tiwai@suse.de>
Sat, 15 Sep 2012 14:32:31 +0000 (16:32 +0200)
committerTakashi Iwai <tiwai@suse.de>
Sat, 15 Sep 2012 14:32:31 +0000 (16:32 +0200)
This is a merge of a topic branch containing the support for the new
channel map API using control elements.

1  2 
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.h

@@@ -2368,7 -2368,6 +2368,7 @@@ int snd_hda_codec_reset(struct hda_code
        }
        if (codec->patch_ops.free)
                codec->patch_ops.free(codec);
 +      memset(&codec->patch_ops, 0, sizeof(codec->patch_ops));
        snd_hda_jack_tbl_clear(codec);
        codec->proc_widget_hook = NULL;
        codec->spec = NULL;
        codec->num_pcms = 0;
        codec->pcm_info = NULL;
        codec->preset = NULL;
 -      memset(&codec->patch_ops, 0, sizeof(codec->patch_ops));
        codec->slave_dig_outs = NULL;
        codec->spdif_status_reset = 0;
        module_put(codec->owner);
@@@ -3688,6 -3688,36 +3688,36 @@@ int /*__devinit*/ snd_hda_build_control
  }
  EXPORT_SYMBOL_HDA(snd_hda_build_controls);
  
+ /*
+  * add standard channel maps if not specified
+  */
+ static int add_std_chmaps(struct hda_codec *codec)
+ {
+       int i, str, err;
+       for (i = 0; i < codec->num_pcms; i++) {
+               for (str = 0; str < 2; str++) {
+                       struct snd_pcm *pcm = codec->pcm_info[i].pcm;
+                       struct hda_pcm_stream *hinfo =
+                               &codec->pcm_info[i].stream[str];
+                       struct snd_pcm_chmap *chmap;
+                       if (codec->pcm_info[i].own_chmap)
+                               continue;
+                       if (!pcm || !hinfo->substreams)
+                               continue;
+                       err = snd_pcm_add_chmap_ctls(pcm, str,
+                                                    snd_pcm_std_chmaps,
+                                                    hinfo->channels_max,
+                                                    0, &chmap);
+                       if (err < 0)
+                               return err;
+                       chmap->channel_mask = SND_PCM_CHMAP_MASK_2468;
+               }
+       }
+       return 0;
+ }
  int snd_hda_codec_build_controls(struct hda_codec *codec)
  {
        int err = 0;
                err = codec->patch_ops.build_controls(codec);
        if (err < 0)
                return err;
+       /* we create chmaps here instead of build_pcms */
+       err = add_std_chmaps(codec);
+       if (err < 0)
+               return err;
        snd_hda_jack_report_sync(codec); /* call at the last init point */
        return 0;
  }
@@@ -776,6 -776,7 +776,7 @@@ struct hda_pcm 
        unsigned int pcm_type;  /* HDA_PCM_TYPE_XXX */
        int device;             /* device number to assign */
        struct snd_pcm *pcm;    /* assigned PCM instance */
+       bool own_chmap;         /* codec driver provides own channel maps */
  };
  
  /* codec information */
@@@ -861,6 -862,7 +862,6 @@@ struct hda_codec 
        unsigned int no_sticky_stream:1; /* no sticky-PCM stream assignment */
        unsigned int pins_shutup:1;     /* pins are shut up */
        unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */
 -      unsigned int ignore_misc_bit:1; /* ignore MISC_NO_PRESENCE bit */
        unsigned int no_jack_detect:1;  /* Machine has no jack-detection */
        unsigned int pcm_format_first:1; /* PCM format must be set first */
        unsigned int epss:1;            /* supporting EPSS? */