Merge branch 'for-linus' into for-next
[linux-2.6-microblaze.git] / sound / usb / stream.c
index ca76ba5..ee9aa1d 100644 (file)
@@ -47,7 +47,6 @@ static void free_substream(struct snd_usb_substream *subs)
                return; /* not initialized */
        list_for_each_entry_safe(fp, n, &subs->fmt_list, list)
                audioformat_free(fp);
-       kfree(subs->rate_list.list);
        kfree(subs->str_pd);
        snd_media_stream_delete(subs);
 }
@@ -193,16 +192,16 @@ static int usb_chmap_ctl_get(struct snd_kcontrol *kcontrol,
        struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
        struct snd_usb_substream *subs = info->private_data;
        struct snd_pcm_chmap_elem *chmap = NULL;
-       int i;
+       int i = 0;
 
-       memset(ucontrol->value.integer.value, 0,
-              sizeof(ucontrol->value.integer.value));
        if (subs->cur_audiofmt)
                chmap = subs->cur_audiofmt->chmap;
        if (chmap) {
                for (i = 0; i < chmap->channels; i++)
                        ucontrol->value.integer.value[i] = chmap->map[i];
        }
+       for (; i < subs->channels_max; i++)
+               ucontrol->value.integer.value[i] = 0;
        return 0;
 }
 
@@ -1194,6 +1193,8 @@ static int __snd_usb_parse_audio_interface(struct snd_usb_audio *chip,
                        continue;
                }
 
+               snd_usb_audioformat_set_sync_ep(chip, fp);
+
                dev_dbg(&dev->dev, "%u:%d: add audio endpoint %#x\n", iface_no, altno, fp->endpoint);
                if (protocol == UAC_VERSION_3)
                        err = snd_usb_add_audio_stream_v3(chip, stream, fp, pd);
@@ -1205,10 +1206,27 @@ static int __snd_usb_parse_audio_interface(struct snd_usb_audio *chip,
                        kfree(pd);
                        return err;
                }
+
+               /* add endpoints */
+               err = snd_usb_add_endpoint(chip, fp->endpoint,
+                                          SND_USB_ENDPOINT_TYPE_DATA);
+               if (err < 0)
+                       return err;
+
+               if (fp->sync_ep) {
+                       err = snd_usb_add_endpoint(chip, fp->sync_ep,
+                                                  fp->implicit_fb ?
+                                                  SND_USB_ENDPOINT_TYPE_DATA :
+                                                  SND_USB_ENDPOINT_TYPE_SYNC);
+                       if (err < 0)
+                               return err;
+               }
+
                /* try to set the interface... */
+               usb_set_interface(chip->dev, iface_no, 0);
+               snd_usb_init_pitch(chip, fp);
+               snd_usb_init_sample_rate(chip, fp, fp->rate_max);
                usb_set_interface(chip->dev, iface_no, altno);
-               snd_usb_init_pitch(chip, iface_no, alts, fp);
-               snd_usb_init_sample_rate(chip, iface_no, alts, fp, fp->rate_max);
        }
        return 0;
 }