~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/usb/stream.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /sound/usb/stream.c (Architecture alpha) and /sound/usb/stream.c (Architecture m68k)


  1 // SPDX-License-Identifier: GPL-2.0-or-later        1 // SPDX-License-Identifier: GPL-2.0-or-later
  2 /*                                                  2 /*
  3  */                                                 3  */
  4                                                     4 
  5                                                     5 
  6 #include <linux/init.h>                             6 #include <linux/init.h>
  7 #include <linux/slab.h>                             7 #include <linux/slab.h>
  8 #include <linux/usb.h>                              8 #include <linux/usb.h>
  9 #include <linux/usb/audio.h>                        9 #include <linux/usb/audio.h>
 10 #include <linux/usb/audio-v2.h>                    10 #include <linux/usb/audio-v2.h>
 11 #include <linux/usb/audio-v3.h>                    11 #include <linux/usb/audio-v3.h>
 12                                                    12 
 13 #include <sound/core.h>                            13 #include <sound/core.h>
 14 #include <sound/pcm.h>                             14 #include <sound/pcm.h>
 15 #include <sound/control.h>                         15 #include <sound/control.h>
 16 #include <sound/tlv.h>                             16 #include <sound/tlv.h>
 17                                                    17 
 18 #include "usbaudio.h"                              18 #include "usbaudio.h"
 19 #include "card.h"                                  19 #include "card.h"
 20 #include "proc.h"                                  20 #include "proc.h"
 21 #include "quirks.h"                                21 #include "quirks.h"
 22 #include "endpoint.h"                              22 #include "endpoint.h"
 23 #include "pcm.h"                                   23 #include "pcm.h"
 24 #include "helper.h"                                24 #include "helper.h"
 25 #include "format.h"                                25 #include "format.h"
 26 #include "clock.h"                                 26 #include "clock.h"
 27 #include "stream.h"                                27 #include "stream.h"
 28 #include "power.h"                                 28 #include "power.h"
 29 #include "media.h"                                 29 #include "media.h"
 30                                                    30 
 31 static void audioformat_free(struct audioforma     31 static void audioformat_free(struct audioformat *fp)
 32 {                                                  32 {
 33         list_del(&fp->list); /* unlink for avo     33         list_del(&fp->list); /* unlink for avoiding double-free */
 34         kfree(fp->rate_table);                     34         kfree(fp->rate_table);
 35         kfree(fp->chmap);                          35         kfree(fp->chmap);
 36         kfree(fp);                                 36         kfree(fp);
 37 }                                                  37 }
 38                                                    38 
 39 /*                                                 39 /*
 40  * free a substream                                40  * free a substream
 41  */                                                41  */
 42 static void free_substream(struct snd_usb_subs     42 static void free_substream(struct snd_usb_substream *subs)
 43 {                                                  43 {
 44         struct audioformat *fp, *n;                44         struct audioformat *fp, *n;
 45                                                    45 
 46         if (!subs->num_formats)                    46         if (!subs->num_formats)
 47                 return; /* not initialized */      47                 return; /* not initialized */
 48         list_for_each_entry_safe(fp, n, &subs-     48         list_for_each_entry_safe(fp, n, &subs->fmt_list, list)
 49                 audioformat_free(fp);              49                 audioformat_free(fp);
 50         kfree(subs->str_pd);                       50         kfree(subs->str_pd);
 51         snd_media_stream_delete(subs);             51         snd_media_stream_delete(subs);
 52 }                                                  52 }
 53                                                    53 
 54                                                    54 
 55 /*                                                 55 /*
 56  * free a usb stream instance                      56  * free a usb stream instance
 57  */                                                57  */
 58 static void snd_usb_audio_stream_free(struct s     58 static void snd_usb_audio_stream_free(struct snd_usb_stream *stream)
 59 {                                                  59 {
 60         free_substream(&stream->substream[0]);     60         free_substream(&stream->substream[0]);
 61         free_substream(&stream->substream[1]);     61         free_substream(&stream->substream[1]);
 62         list_del(&stream->list);                   62         list_del(&stream->list);
 63         kfree(stream);                             63         kfree(stream);
 64 }                                                  64 }
 65                                                    65 
 66 static void snd_usb_audio_pcm_free(struct snd_     66 static void snd_usb_audio_pcm_free(struct snd_pcm *pcm)
 67 {                                                  67 {
 68         struct snd_usb_stream *stream = pcm->p     68         struct snd_usb_stream *stream = pcm->private_data;
 69         if (stream) {                              69         if (stream) {
 70                 stream->pcm = NULL;                70                 stream->pcm = NULL;
 71                 snd_usb_audio_stream_free(stre     71                 snd_usb_audio_stream_free(stream);
 72         }                                          72         }
 73 }                                                  73 }
 74                                                    74 
 75 /*                                                 75 /*
 76  * initialize the substream instance.              76  * initialize the substream instance.
 77  */                                                77  */
 78                                                    78 
 79 static void snd_usb_init_substream(struct snd_     79 static void snd_usb_init_substream(struct snd_usb_stream *as,
 80                                    int stream,     80                                    int stream,
 81                                    struct audi     81                                    struct audioformat *fp,
 82                                    struct snd_     82                                    struct snd_usb_power_domain *pd)
 83 {                                                  83 {
 84         struct snd_usb_substream *subs = &as->     84         struct snd_usb_substream *subs = &as->substream[stream];
 85                                                    85 
 86         INIT_LIST_HEAD(&subs->fmt_list);           86         INIT_LIST_HEAD(&subs->fmt_list);
 87         spin_lock_init(&subs->lock);               87         spin_lock_init(&subs->lock);
 88                                                    88 
 89         subs->stream = as;                         89         subs->stream = as;
 90         subs->direction = stream;                  90         subs->direction = stream;
 91         subs->dev = as->chip->dev;                 91         subs->dev = as->chip->dev;
 92         subs->txfr_quirk = !!(as->chip->quirk_     92         subs->txfr_quirk = !!(as->chip->quirk_flags & QUIRK_FLAG_ALIGN_TRANSFER);
 93         subs->tx_length_quirk = !!(as->chip->q     93         subs->tx_length_quirk = !!(as->chip->quirk_flags & QUIRK_FLAG_TX_LENGTH);
 94         subs->speed = snd_usb_get_speed(subs->     94         subs->speed = snd_usb_get_speed(subs->dev);
 95         subs->pkt_offset_adj = 0;                  95         subs->pkt_offset_adj = 0;
 96         subs->stream_offset_adj = 0;               96         subs->stream_offset_adj = 0;
 97                                                    97 
 98         snd_usb_set_pcm_ops(as->pcm, stream);      98         snd_usb_set_pcm_ops(as->pcm, stream);
 99                                                    99 
100         list_add_tail(&fp->list, &subs->fmt_li    100         list_add_tail(&fp->list, &subs->fmt_list);
101         subs->formats |= fp->formats;             101         subs->formats |= fp->formats;
102         subs->num_formats++;                      102         subs->num_formats++;
103         subs->fmt_type = fp->fmt_type;            103         subs->fmt_type = fp->fmt_type;
104         subs->ep_num = fp->endpoint;              104         subs->ep_num = fp->endpoint;
105         if (fp->channels > subs->channels_max)    105         if (fp->channels > subs->channels_max)
106                 subs->channels_max = fp->chann    106                 subs->channels_max = fp->channels;
107                                                   107 
108         if (pd) {                                 108         if (pd) {
109                 subs->str_pd = pd;                109                 subs->str_pd = pd;
110                 /* Initialize Power Domain to     110                 /* Initialize Power Domain to idle status D1 */
111                 snd_usb_power_domain_set(subs-    111                 snd_usb_power_domain_set(subs->stream->chip, pd,
112                                          UAC3_    112                                          UAC3_PD_STATE_D1);
113         }                                         113         }
114                                                   114 
115         snd_usb_preallocate_buffer(subs);         115         snd_usb_preallocate_buffer(subs);
116 }                                                 116 }
117                                                   117 
118 /* kctl callbacks for usb-audio channel maps *    118 /* kctl callbacks for usb-audio channel maps */
119 static int usb_chmap_ctl_info(struct snd_kcont    119 static int usb_chmap_ctl_info(struct snd_kcontrol *kcontrol,
120                               struct snd_ctl_e    120                               struct snd_ctl_elem_info *uinfo)
121 {                                                 121 {
122         struct snd_pcm_chmap *info = snd_kcont    122         struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
123         struct snd_usb_substream *subs = info-    123         struct snd_usb_substream *subs = info->private_data;
124                                                   124 
125         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTE    125         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
126         uinfo->count = subs->channels_max;        126         uinfo->count = subs->channels_max;
127         uinfo->value.integer.min = 0;             127         uinfo->value.integer.min = 0;
128         uinfo->value.integer.max = SNDRV_CHMAP    128         uinfo->value.integer.max = SNDRV_CHMAP_LAST;
129         return 0;                                 129         return 0;
130 }                                                 130 }
131                                                   131 
132 /* check whether a duplicated entry exists in     132 /* check whether a duplicated entry exists in the audiofmt list */
133 static bool have_dup_chmap(struct snd_usb_subs    133 static bool have_dup_chmap(struct snd_usb_substream *subs,
134                            struct audioformat     134                            struct audioformat *fp)
135 {                                                 135 {
136         struct audioformat *prev = fp;            136         struct audioformat *prev = fp;
137                                                   137 
138         list_for_each_entry_continue_reverse(p    138         list_for_each_entry_continue_reverse(prev, &subs->fmt_list, list) {
139                 if (prev->chmap &&                139                 if (prev->chmap &&
140                     !memcmp(prev->chmap, fp->c    140                     !memcmp(prev->chmap, fp->chmap, sizeof(*fp->chmap)))
141                         return true;              141                         return true;
142         }                                         142         }
143         return false;                             143         return false;
144 }                                                 144 }
145                                                   145 
146 static int usb_chmap_ctl_tlv(struct snd_kcontr    146 static int usb_chmap_ctl_tlv(struct snd_kcontrol *kcontrol, int op_flag,
147                              unsigned int size    147                              unsigned int size, unsigned int __user *tlv)
148 {                                                 148 {
149         struct snd_pcm_chmap *info = snd_kcont    149         struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
150         struct snd_usb_substream *subs = info-    150         struct snd_usb_substream *subs = info->private_data;
151         struct audioformat *fp;                   151         struct audioformat *fp;
152         unsigned int __user *dst;                 152         unsigned int __user *dst;
153         int count = 0;                            153         int count = 0;
154                                                   154 
155         if (size < 8)                             155         if (size < 8)
156                 return -ENOMEM;                   156                 return -ENOMEM;
157         if (put_user(SNDRV_CTL_TLVT_CONTAINER,    157         if (put_user(SNDRV_CTL_TLVT_CONTAINER, tlv))
158                 return -EFAULT;                   158                 return -EFAULT;
159         size -= 8;                                159         size -= 8;
160         dst = tlv + 2;                            160         dst = tlv + 2;
161         list_for_each_entry(fp, &subs->fmt_lis    161         list_for_each_entry(fp, &subs->fmt_list, list) {
162                 int i, ch_bytes;                  162                 int i, ch_bytes;
163                                                   163 
164                 if (!fp->chmap)                   164                 if (!fp->chmap)
165                         continue;                 165                         continue;
166                 if (have_dup_chmap(subs, fp))     166                 if (have_dup_chmap(subs, fp))
167                         continue;                 167                         continue;
168                 /* copy the entry */              168                 /* copy the entry */
169                 ch_bytes = fp->chmap->channels    169                 ch_bytes = fp->chmap->channels * 4;
170                 if (size < 8 + ch_bytes)          170                 if (size < 8 + ch_bytes)
171                         return -ENOMEM;           171                         return -ENOMEM;
172                 if (put_user(SNDRV_CTL_TLVT_CH    172                 if (put_user(SNDRV_CTL_TLVT_CHMAP_FIXED, dst) ||
173                     put_user(ch_bytes, dst + 1    173                     put_user(ch_bytes, dst + 1))
174                         return -EFAULT;           174                         return -EFAULT;
175                 dst += 2;                         175                 dst += 2;
176                 for (i = 0; i < fp->chmap->cha    176                 for (i = 0; i < fp->chmap->channels; i++, dst++) {
177                         if (put_user(fp->chmap    177                         if (put_user(fp->chmap->map[i], dst))
178                                 return -EFAULT    178                                 return -EFAULT;
179                 }                                 179                 }
180                                                   180 
181                 count += 8 + ch_bytes;            181                 count += 8 + ch_bytes;
182                 size -= 8 + ch_bytes;             182                 size -= 8 + ch_bytes;
183         }                                         183         }
184         if (put_user(count, tlv + 1))             184         if (put_user(count, tlv + 1))
185                 return -EFAULT;                   185                 return -EFAULT;
186         return 0;                                 186         return 0;
187 }                                                 187 }
188                                                   188 
189 static int usb_chmap_ctl_get(struct snd_kcontr    189 static int usb_chmap_ctl_get(struct snd_kcontrol *kcontrol,
190                              struct snd_ctl_el    190                              struct snd_ctl_elem_value *ucontrol)
191 {                                                 191 {
192         struct snd_pcm_chmap *info = snd_kcont    192         struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
193         struct snd_usb_substream *subs = info-    193         struct snd_usb_substream *subs = info->private_data;
194         struct snd_pcm_chmap_elem *chmap = NUL    194         struct snd_pcm_chmap_elem *chmap = NULL;
195         int i = 0;                                195         int i = 0;
196                                                   196 
197         if (subs->cur_audiofmt)                   197         if (subs->cur_audiofmt)
198                 chmap = subs->cur_audiofmt->ch    198                 chmap = subs->cur_audiofmt->chmap;
199         if (chmap) {                              199         if (chmap) {
200                 for (i = 0; i < chmap->channel    200                 for (i = 0; i < chmap->channels; i++)
201                         ucontrol->value.intege    201                         ucontrol->value.integer.value[i] = chmap->map[i];
202         }                                         202         }
203         for (; i < subs->channels_max; i++)       203         for (; i < subs->channels_max; i++)
204                 ucontrol->value.integer.value[    204                 ucontrol->value.integer.value[i] = 0;
205         return 0;                                 205         return 0;
206 }                                                 206 }
207                                                   207 
208 /* create a chmap kctl assigned to the given U    208 /* create a chmap kctl assigned to the given USB substream */
209 static int add_chmap(struct snd_pcm *pcm, int     209 static int add_chmap(struct snd_pcm *pcm, int stream,
210                      struct snd_usb_substream     210                      struct snd_usb_substream *subs)
211 {                                                 211 {
212         struct audioformat *fp;                   212         struct audioformat *fp;
213         struct snd_pcm_chmap *chmap;              213         struct snd_pcm_chmap *chmap;
214         struct snd_kcontrol *kctl;                214         struct snd_kcontrol *kctl;
215         int err;                                  215         int err;
216                                                   216 
217         list_for_each_entry(fp, &subs->fmt_lis    217         list_for_each_entry(fp, &subs->fmt_list, list)
218                 if (fp->chmap)                    218                 if (fp->chmap)
219                         goto ok;                  219                         goto ok;
220         /* no chmap is found */                   220         /* no chmap is found */
221         return 0;                                 221         return 0;
222                                                   222 
223  ok:                                              223  ok:
224         err = snd_pcm_add_chmap_ctls(pcm, stre    224         err = snd_pcm_add_chmap_ctls(pcm, stream, NULL, 0, 0, &chmap);
225         if (err < 0)                              225         if (err < 0)
226                 return err;                       226                 return err;
227                                                   227 
228         /* override handlers */                   228         /* override handlers */
229         chmap->private_data = subs;               229         chmap->private_data = subs;
230         kctl = chmap->kctl;                       230         kctl = chmap->kctl;
231         kctl->info = usb_chmap_ctl_info;          231         kctl->info = usb_chmap_ctl_info;
232         kctl->get = usb_chmap_ctl_get;            232         kctl->get = usb_chmap_ctl_get;
233         kctl->tlv.c = usb_chmap_ctl_tlv;          233         kctl->tlv.c = usb_chmap_ctl_tlv;
234                                                   234 
235         return 0;                                 235         return 0;
236 }                                                 236 }
237                                                   237 
238 /* convert from USB ChannelConfig bits to ALSA    238 /* convert from USB ChannelConfig bits to ALSA chmap element */
239 static struct snd_pcm_chmap_elem *convert_chma    239 static struct snd_pcm_chmap_elem *convert_chmap(int channels, unsigned int bits,
240                                                   240                                                 int protocol)
241 {                                                 241 {
242         static const unsigned int uac1_maps[]     242         static const unsigned int uac1_maps[] = {
243                 SNDRV_CHMAP_FL,         /* lef    243                 SNDRV_CHMAP_FL,         /* left front */
244                 SNDRV_CHMAP_FR,         /* rig    244                 SNDRV_CHMAP_FR,         /* right front */
245                 SNDRV_CHMAP_FC,         /* cen    245                 SNDRV_CHMAP_FC,         /* center front */
246                 SNDRV_CHMAP_LFE,        /* LFE    246                 SNDRV_CHMAP_LFE,        /* LFE */
247                 SNDRV_CHMAP_RL,         /* lef    247                 SNDRV_CHMAP_RL,         /* left surround */
248                 SNDRV_CHMAP_RR,         /* rig    248                 SNDRV_CHMAP_RR,         /* right surround */
249                 SNDRV_CHMAP_FLC,        /* lef    249                 SNDRV_CHMAP_FLC,        /* left of center */
250                 SNDRV_CHMAP_FRC,        /* rig    250                 SNDRV_CHMAP_FRC,        /* right of center */
251                 SNDRV_CHMAP_RC,         /* sur    251                 SNDRV_CHMAP_RC,         /* surround */
252                 SNDRV_CHMAP_SL,         /* sid    252                 SNDRV_CHMAP_SL,         /* side left */
253                 SNDRV_CHMAP_SR,         /* sid    253                 SNDRV_CHMAP_SR,         /* side right */
254                 SNDRV_CHMAP_TC,         /* top    254                 SNDRV_CHMAP_TC,         /* top */
255                 0 /* terminator */                255                 0 /* terminator */
256         };                                        256         };
257         static const unsigned int uac2_maps[]     257         static const unsigned int uac2_maps[] = {
258                 SNDRV_CHMAP_FL,         /* fro    258                 SNDRV_CHMAP_FL,         /* front left */
259                 SNDRV_CHMAP_FR,         /* fro    259                 SNDRV_CHMAP_FR,         /* front right */
260                 SNDRV_CHMAP_FC,         /* fro    260                 SNDRV_CHMAP_FC,         /* front center */
261                 SNDRV_CHMAP_LFE,        /* LFE    261                 SNDRV_CHMAP_LFE,        /* LFE */
262                 SNDRV_CHMAP_RL,         /* bac    262                 SNDRV_CHMAP_RL,         /* back left */
263                 SNDRV_CHMAP_RR,         /* bac    263                 SNDRV_CHMAP_RR,         /* back right */
264                 SNDRV_CHMAP_FLC,        /* fro    264                 SNDRV_CHMAP_FLC,        /* front left of center */
265                 SNDRV_CHMAP_FRC,        /* fro    265                 SNDRV_CHMAP_FRC,        /* front right of center */
266                 SNDRV_CHMAP_RC,         /* bac    266                 SNDRV_CHMAP_RC,         /* back center */
267                 SNDRV_CHMAP_SL,         /* sid    267                 SNDRV_CHMAP_SL,         /* side left */
268                 SNDRV_CHMAP_SR,         /* sid    268                 SNDRV_CHMAP_SR,         /* side right */
269                 SNDRV_CHMAP_TC,         /* top    269                 SNDRV_CHMAP_TC,         /* top center */
270                 SNDRV_CHMAP_TFL,        /* top    270                 SNDRV_CHMAP_TFL,        /* top front left */
271                 SNDRV_CHMAP_TFC,        /* top    271                 SNDRV_CHMAP_TFC,        /* top front center */
272                 SNDRV_CHMAP_TFR,        /* top    272                 SNDRV_CHMAP_TFR,        /* top front right */
273                 SNDRV_CHMAP_TRL,        /* top    273                 SNDRV_CHMAP_TRL,        /* top back left */
274                 SNDRV_CHMAP_TRC,        /* top    274                 SNDRV_CHMAP_TRC,        /* top back center */
275                 SNDRV_CHMAP_TRR,        /* top    275                 SNDRV_CHMAP_TRR,        /* top back right */
276                 SNDRV_CHMAP_TFLC,       /* top    276                 SNDRV_CHMAP_TFLC,       /* top front left of center */
277                 SNDRV_CHMAP_TFRC,       /* top    277                 SNDRV_CHMAP_TFRC,       /* top front right of center */
278                 SNDRV_CHMAP_LLFE,       /* lef    278                 SNDRV_CHMAP_LLFE,       /* left LFE */
279                 SNDRV_CHMAP_RLFE,       /* rig    279                 SNDRV_CHMAP_RLFE,       /* right LFE */
280                 SNDRV_CHMAP_TSL,        /* top    280                 SNDRV_CHMAP_TSL,        /* top side left */
281                 SNDRV_CHMAP_TSR,        /* top    281                 SNDRV_CHMAP_TSR,        /* top side right */
282                 SNDRV_CHMAP_BC,         /* bot    282                 SNDRV_CHMAP_BC,         /* bottom center */
283                 SNDRV_CHMAP_RLC,        /* bac    283                 SNDRV_CHMAP_RLC,        /* back left of center */
284                 SNDRV_CHMAP_RRC,        /* bac    284                 SNDRV_CHMAP_RRC,        /* back right of center */
285                 0 /* terminator */                285                 0 /* terminator */
286         };                                        286         };
287         struct snd_pcm_chmap_elem *chmap;         287         struct snd_pcm_chmap_elem *chmap;
288         const unsigned int *maps;                 288         const unsigned int *maps;
289         int c;                                    289         int c;
290                                                   290 
291         if (channels > ARRAY_SIZE(chmap->map))    291         if (channels > ARRAY_SIZE(chmap->map))
292                 return NULL;                      292                 return NULL;
293                                                   293 
294         chmap = kzalloc(sizeof(*chmap), GFP_KE    294         chmap = kzalloc(sizeof(*chmap), GFP_KERNEL);
295         if (!chmap)                               295         if (!chmap)
296                 return NULL;                      296                 return NULL;
297                                                   297 
298         maps = protocol == UAC_VERSION_2 ? uac    298         maps = protocol == UAC_VERSION_2 ? uac2_maps : uac1_maps;
299         chmap->channels = channels;               299         chmap->channels = channels;
300         c = 0;                                    300         c = 0;
301                                                   301 
302         if (bits) {                               302         if (bits) {
303                 for (; bits && *maps; maps++,     303                 for (; bits && *maps; maps++, bits >>= 1) {
304                         if (bits & 1)             304                         if (bits & 1)
305                                 chmap->map[c++    305                                 chmap->map[c++] = *maps;
306                         if (c == chmap->channe    306                         if (c == chmap->channels)
307                                 break;            307                                 break;
308                 }                                 308                 }
309         } else {                                  309         } else {
310                 /* If we're missing wChannelCo    310                 /* If we're missing wChannelConfig, then guess something
311                     to make sure the channel m    311                     to make sure the channel map is not skipped entirely */
312                 if (channels == 1)                312                 if (channels == 1)
313                         chmap->map[c++] = SNDR    313                         chmap->map[c++] = SNDRV_CHMAP_MONO;
314                 else                              314                 else
315                         for (; c < channels &&    315                         for (; c < channels && *maps; maps++)
316                                 chmap->map[c++    316                                 chmap->map[c++] = *maps;
317         }                                         317         }
318                                                   318 
319         for (; c < channels; c++)                 319         for (; c < channels; c++)
320                 chmap->map[c] = SNDRV_CHMAP_UN    320                 chmap->map[c] = SNDRV_CHMAP_UNKNOWN;
321                                                   321 
322         return chmap;                             322         return chmap;
323 }                                                 323 }
324                                                   324 
325 /* UAC3 device stores channels information in     325 /* UAC3 device stores channels information in Cluster Descriptors */
326 static struct                                     326 static struct
327 snd_pcm_chmap_elem *convert_chmap_v3(struct ua    327 snd_pcm_chmap_elem *convert_chmap_v3(struct uac3_cluster_header_descriptor
328                                                   328                                                                 *cluster)
329 {                                                 329 {
330         unsigned int channels = cluster->bNrCh    330         unsigned int channels = cluster->bNrChannels;
331         struct snd_pcm_chmap_elem *chmap;         331         struct snd_pcm_chmap_elem *chmap;
332         void *p = cluster;                        332         void *p = cluster;
333         int len, c;                               333         int len, c;
334                                                   334 
335         if (channels > ARRAY_SIZE(chmap->map))    335         if (channels > ARRAY_SIZE(chmap->map))
336                 return NULL;                      336                 return NULL;
337                                                   337 
338         chmap = kzalloc(sizeof(*chmap), GFP_KE    338         chmap = kzalloc(sizeof(*chmap), GFP_KERNEL);
339         if (!chmap)                               339         if (!chmap)
340                 return NULL;                      340                 return NULL;
341                                                   341 
342         len = le16_to_cpu(cluster->wLength);      342         len = le16_to_cpu(cluster->wLength);
343         c = 0;                                    343         c = 0;
344         p += sizeof(struct uac3_cluster_header    344         p += sizeof(struct uac3_cluster_header_descriptor);
345                                                   345 
346         while (((p - (void *)cluster) < len) &    346         while (((p - (void *)cluster) < len) && (c < channels)) {
347                 struct uac3_cluster_segment_de    347                 struct uac3_cluster_segment_descriptor *cs_desc = p;
348                 u16 cs_len;                       348                 u16 cs_len;
349                 u8 cs_type;                       349                 u8 cs_type;
350                                                   350 
351                 cs_len = le16_to_cpu(cs_desc->    351                 cs_len = le16_to_cpu(cs_desc->wLength);
352                 cs_type = cs_desc->bSegmentTyp    352                 cs_type = cs_desc->bSegmentType;
353                                                   353 
354                 if (cs_type == UAC3_CHANNEL_IN    354                 if (cs_type == UAC3_CHANNEL_INFORMATION) {
355                         struct uac3_cluster_in    355                         struct uac3_cluster_information_segment_descriptor *is = p;
356                         unsigned char map;        356                         unsigned char map;
357                                                   357 
358                         /*                        358                         /*
359                          * TODO: this conversi    359                          * TODO: this conversion is not complete, update it
360                          * after adding UAC3 v    360                          * after adding UAC3 values to asound.h
361                          */                       361                          */
362                         switch (is->bChRelatio    362                         switch (is->bChRelationship) {
363                         case UAC3_CH_MONO:        363                         case UAC3_CH_MONO:
364                                 map = SNDRV_CH    364                                 map = SNDRV_CHMAP_MONO;
365                                 break;            365                                 break;
366                         case UAC3_CH_LEFT:        366                         case UAC3_CH_LEFT:
367                         case UAC3_CH_FRONT_LEF    367                         case UAC3_CH_FRONT_LEFT:
368                         case UAC3_CH_HEADPHONE    368                         case UAC3_CH_HEADPHONE_LEFT:
369                                 map = SNDRV_CH    369                                 map = SNDRV_CHMAP_FL;
370                                 break;            370                                 break;
371                         case UAC3_CH_RIGHT:       371                         case UAC3_CH_RIGHT:
372                         case UAC3_CH_FRONT_RIG    372                         case UAC3_CH_FRONT_RIGHT:
373                         case UAC3_CH_HEADPHONE    373                         case UAC3_CH_HEADPHONE_RIGHT:
374                                 map = SNDRV_CH    374                                 map = SNDRV_CHMAP_FR;
375                                 break;            375                                 break;
376                         case UAC3_CH_FRONT_CEN    376                         case UAC3_CH_FRONT_CENTER:
377                                 map = SNDRV_CH    377                                 map = SNDRV_CHMAP_FC;
378                                 break;            378                                 break;
379                         case UAC3_CH_FRONT_LEF    379                         case UAC3_CH_FRONT_LEFT_OF_CENTER:
380                                 map = SNDRV_CH    380                                 map = SNDRV_CHMAP_FLC;
381                                 break;            381                                 break;
382                         case UAC3_CH_FRONT_RIG    382                         case UAC3_CH_FRONT_RIGHT_OF_CENTER:
383                                 map = SNDRV_CH    383                                 map = SNDRV_CHMAP_FRC;
384                                 break;            384                                 break;
385                         case UAC3_CH_SIDE_LEFT    385                         case UAC3_CH_SIDE_LEFT:
386                                 map = SNDRV_CH    386                                 map = SNDRV_CHMAP_SL;
387                                 break;            387                                 break;
388                         case UAC3_CH_SIDE_RIGH    388                         case UAC3_CH_SIDE_RIGHT:
389                                 map = SNDRV_CH    389                                 map = SNDRV_CHMAP_SR;
390                                 break;            390                                 break;
391                         case UAC3_CH_BACK_LEFT    391                         case UAC3_CH_BACK_LEFT:
392                                 map = SNDRV_CH    392                                 map = SNDRV_CHMAP_RL;
393                                 break;            393                                 break;
394                         case UAC3_CH_BACK_RIGH    394                         case UAC3_CH_BACK_RIGHT:
395                                 map = SNDRV_CH    395                                 map = SNDRV_CHMAP_RR;
396                                 break;            396                                 break;
397                         case UAC3_CH_BACK_CENT    397                         case UAC3_CH_BACK_CENTER:
398                                 map = SNDRV_CH    398                                 map = SNDRV_CHMAP_RC;
399                                 break;            399                                 break;
400                         case UAC3_CH_BACK_LEFT    400                         case UAC3_CH_BACK_LEFT_OF_CENTER:
401                                 map = SNDRV_CH    401                                 map = SNDRV_CHMAP_RLC;
402                                 break;            402                                 break;
403                         case UAC3_CH_BACK_RIGH    403                         case UAC3_CH_BACK_RIGHT_OF_CENTER:
404                                 map = SNDRV_CH    404                                 map = SNDRV_CHMAP_RRC;
405                                 break;            405                                 break;
406                         case UAC3_CH_TOP_CENTE    406                         case UAC3_CH_TOP_CENTER:
407                                 map = SNDRV_CH    407                                 map = SNDRV_CHMAP_TC;
408                                 break;            408                                 break;
409                         case UAC3_CH_TOP_FRONT    409                         case UAC3_CH_TOP_FRONT_LEFT:
410                                 map = SNDRV_CH    410                                 map = SNDRV_CHMAP_TFL;
411                                 break;            411                                 break;
412                         case UAC3_CH_TOP_FRONT    412                         case UAC3_CH_TOP_FRONT_RIGHT:
413                                 map = SNDRV_CH    413                                 map = SNDRV_CHMAP_TFR;
414                                 break;            414                                 break;
415                         case UAC3_CH_TOP_FRONT    415                         case UAC3_CH_TOP_FRONT_CENTER:
416                                 map = SNDRV_CH    416                                 map = SNDRV_CHMAP_TFC;
417                                 break;            417                                 break;
418                         case UAC3_CH_TOP_FRONT    418                         case UAC3_CH_TOP_FRONT_LOC:
419                                 map = SNDRV_CH    419                                 map = SNDRV_CHMAP_TFLC;
420                                 break;            420                                 break;
421                         case UAC3_CH_TOP_FRONT    421                         case UAC3_CH_TOP_FRONT_ROC:
422                                 map = SNDRV_CH    422                                 map = SNDRV_CHMAP_TFRC;
423                                 break;            423                                 break;
424                         case UAC3_CH_TOP_SIDE_    424                         case UAC3_CH_TOP_SIDE_LEFT:
425                                 map = SNDRV_CH    425                                 map = SNDRV_CHMAP_TSL;
426                                 break;            426                                 break;
427                         case UAC3_CH_TOP_SIDE_    427                         case UAC3_CH_TOP_SIDE_RIGHT:
428                                 map = SNDRV_CH    428                                 map = SNDRV_CHMAP_TSR;
429                                 break;            429                                 break;
430                         case UAC3_CH_TOP_BACK_    430                         case UAC3_CH_TOP_BACK_LEFT:
431                                 map = SNDRV_CH    431                                 map = SNDRV_CHMAP_TRL;
432                                 break;            432                                 break;
433                         case UAC3_CH_TOP_BACK_    433                         case UAC3_CH_TOP_BACK_RIGHT:
434                                 map = SNDRV_CH    434                                 map = SNDRV_CHMAP_TRR;
435                                 break;            435                                 break;
436                         case UAC3_CH_TOP_BACK_    436                         case UAC3_CH_TOP_BACK_CENTER:
437                                 map = SNDRV_CH    437                                 map = SNDRV_CHMAP_TRC;
438                                 break;            438                                 break;
439                         case UAC3_CH_BOTTOM_CE    439                         case UAC3_CH_BOTTOM_CENTER:
440                                 map = SNDRV_CH    440                                 map = SNDRV_CHMAP_BC;
441                                 break;            441                                 break;
442                         case UAC3_CH_LOW_FREQU    442                         case UAC3_CH_LOW_FREQUENCY_EFFECTS:
443                                 map = SNDRV_CH    443                                 map = SNDRV_CHMAP_LFE;
444                                 break;            444                                 break;
445                         case UAC3_CH_LFE_LEFT:    445                         case UAC3_CH_LFE_LEFT:
446                                 map = SNDRV_CH    446                                 map = SNDRV_CHMAP_LLFE;
447                                 break;            447                                 break;
448                         case UAC3_CH_LFE_RIGHT    448                         case UAC3_CH_LFE_RIGHT:
449                                 map = SNDRV_CH    449                                 map = SNDRV_CHMAP_RLFE;
450                                 break;            450                                 break;
451                         case UAC3_CH_RELATIONS    451                         case UAC3_CH_RELATIONSHIP_UNDEFINED:
452                         default:                  452                         default:
453                                 map = SNDRV_CH    453                                 map = SNDRV_CHMAP_UNKNOWN;
454                                 break;            454                                 break;
455                         }                         455                         }
456                         chmap->map[c++] = map;    456                         chmap->map[c++] = map;
457                 }                                 457                 }
458                 p += cs_len;                      458                 p += cs_len;
459         }                                         459         }
460                                                   460 
461         if (channels < c)                         461         if (channels < c)
462                 pr_err("%s: channel number mis    462                 pr_err("%s: channel number mismatch\n", __func__);
463                                                   463 
464         chmap->channels = channels;               464         chmap->channels = channels;
465                                                   465 
466         for (; c < channels; c++)                 466         for (; c < channels; c++)
467                 chmap->map[c] = SNDRV_CHMAP_UN    467                 chmap->map[c] = SNDRV_CHMAP_UNKNOWN;
468                                                   468 
469         return chmap;                             469         return chmap;
470 }                                                 470 }
471                                                   471 
472 /*                                                472 /*
473  * add this endpoint to the chip instance.        473  * add this endpoint to the chip instance.
474  * if a stream with the same endpoint already     474  * if a stream with the same endpoint already exists, append to it.
475  * if not, create a new pcm stream. note, fp i    475  * if not, create a new pcm stream. note, fp is added to the substream
476  * fmt_list and will be freed on the chip inst    476  * fmt_list and will be freed on the chip instance release. do not free
477  * fp or do remove it from the substream fmt_l    477  * fp or do remove it from the substream fmt_list to avoid double-free.
478  */                                               478  */
479 static int __snd_usb_add_audio_stream(struct s    479 static int __snd_usb_add_audio_stream(struct snd_usb_audio *chip,
480                                       int stre    480                                       int stream,
481                                       struct a    481                                       struct audioformat *fp,
482                                       struct s    482                                       struct snd_usb_power_domain *pd)
483                                                   483 
484 {                                                 484 {
485         struct snd_usb_stream *as;                485         struct snd_usb_stream *as;
486         struct snd_usb_substream *subs;           486         struct snd_usb_substream *subs;
487         struct snd_pcm *pcm;                      487         struct snd_pcm *pcm;
488         int err;                                  488         int err;
489                                                   489 
490         list_for_each_entry(as, &chip->pcm_lis    490         list_for_each_entry(as, &chip->pcm_list, list) {
491                 if (as->fmt_type != fp->fmt_ty    491                 if (as->fmt_type != fp->fmt_type)
492                         continue;                 492                         continue;
493                 subs = &as->substream[stream];    493                 subs = &as->substream[stream];
494                 if (subs->ep_num == fp->endpoi    494                 if (subs->ep_num == fp->endpoint) {
495                         list_add_tail(&fp->lis    495                         list_add_tail(&fp->list, &subs->fmt_list);
496                         subs->num_formats++;      496                         subs->num_formats++;
497                         subs->formats |= fp->f    497                         subs->formats |= fp->formats;
498                         return 0;                 498                         return 0;
499                 }                                 499                 }
500         }                                         500         }
501                                                   501 
502         if (chip->card->registered)               502         if (chip->card->registered)
503                 chip->need_delayed_register =     503                 chip->need_delayed_register = true;
504                                                   504 
505         /* look for an empty stream */            505         /* look for an empty stream */
506         list_for_each_entry(as, &chip->pcm_lis    506         list_for_each_entry(as, &chip->pcm_list, list) {
507                 if (as->fmt_type != fp->fmt_ty    507                 if (as->fmt_type != fp->fmt_type)
508                         continue;                 508                         continue;
509                 subs = &as->substream[stream];    509                 subs = &as->substream[stream];
510                 if (subs->ep_num)                 510                 if (subs->ep_num)
511                         continue;                 511                         continue;
512                 err = snd_pcm_new_stream(as->p    512                 err = snd_pcm_new_stream(as->pcm, stream, 1);
513                 if (err < 0)                      513                 if (err < 0)
514                         return err;               514                         return err;
515                 snd_usb_init_substream(as, str    515                 snd_usb_init_substream(as, stream, fp, pd);
516                 return add_chmap(as->pcm, stre    516                 return add_chmap(as->pcm, stream, subs);
517         }                                         517         }
518                                                   518 
519         /* create a new pcm */                    519         /* create a new pcm */
520         as = kzalloc(sizeof(*as), GFP_KERNEL);    520         as = kzalloc(sizeof(*as), GFP_KERNEL);
521         if (!as)                                  521         if (!as)
522                 return -ENOMEM;                   522                 return -ENOMEM;
523         as->pcm_index = chip->pcm_devs;           523         as->pcm_index = chip->pcm_devs;
524         as->chip = chip;                          524         as->chip = chip;
525         as->fmt_type = fp->fmt_type;              525         as->fmt_type = fp->fmt_type;
526         err = snd_pcm_new(chip->card, "USB Aud    526         err = snd_pcm_new(chip->card, "USB Audio", chip->pcm_devs,
527                           stream == SNDRV_PCM_    527                           stream == SNDRV_PCM_STREAM_PLAYBACK ? 1 : 0,
528                           stream == SNDRV_PCM_    528                           stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1,
529                           &pcm);                  529                           &pcm);
530         if (err < 0) {                            530         if (err < 0) {
531                 kfree(as);                        531                 kfree(as);
532                 return err;                       532                 return err;
533         }                                         533         }
534         as->pcm = pcm;                            534         as->pcm = pcm;
535         pcm->private_data = as;                   535         pcm->private_data = as;
536         pcm->private_free = snd_usb_audio_pcm_    536         pcm->private_free = snd_usb_audio_pcm_free;
537         pcm->info_flags = 0;                      537         pcm->info_flags = 0;
538         if (chip->pcm_devs > 0)                   538         if (chip->pcm_devs > 0)
539                 sprintf(pcm->name, "USB Audio     539                 sprintf(pcm->name, "USB Audio #%d", chip->pcm_devs);
540         else                                      540         else
541                 strcpy(pcm->name, "USB Audio")    541                 strcpy(pcm->name, "USB Audio");
542                                                   542 
543         snd_usb_init_substream(as, stream, fp,    543         snd_usb_init_substream(as, stream, fp, pd);
544                                                   544 
545         /*                                        545         /*
546          * Keep using head insertion for M-Aud    546          * Keep using head insertion for M-Audio Audiophile USB (tm) which has a
547          * fix to swap capture stream order in    547          * fix to swap capture stream order in conf/cards/USB-audio.conf
548          */                                       548          */
549         if (chip->usb_id == USB_ID(0x0763, 0x2    549         if (chip->usb_id == USB_ID(0x0763, 0x2003))
550                 list_add(&as->list, &chip->pcm    550                 list_add(&as->list, &chip->pcm_list);
551         else                                      551         else
552                 list_add_tail(&as->list, &chip    552                 list_add_tail(&as->list, &chip->pcm_list);
553                                                   553 
554         chip->pcm_devs++;                         554         chip->pcm_devs++;
555                                                   555 
556         snd_usb_proc_pcm_format_add(as);          556         snd_usb_proc_pcm_format_add(as);
557                                                   557 
558         return add_chmap(pcm, stream, &as->sub    558         return add_chmap(pcm, stream, &as->substream[stream]);
559 }                                                 559 }
560                                                   560 
561 int snd_usb_add_audio_stream(struct snd_usb_au    561 int snd_usb_add_audio_stream(struct snd_usb_audio *chip,
562                              int stream,          562                              int stream,
563                              struct audioforma    563                              struct audioformat *fp)
564 {                                                 564 {
565         return __snd_usb_add_audio_stream(chip    565         return __snd_usb_add_audio_stream(chip, stream, fp, NULL);
566 }                                                 566 }
567                                                   567 
568 static int snd_usb_add_audio_stream_v3(struct     568 static int snd_usb_add_audio_stream_v3(struct snd_usb_audio *chip,
569                                        int str    569                                        int stream,
570                                        struct     570                                        struct audioformat *fp,
571                                        struct     571                                        struct snd_usb_power_domain *pd)
572 {                                                 572 {
573         return __snd_usb_add_audio_stream(chip    573         return __snd_usb_add_audio_stream(chip, stream, fp, pd);
574 }                                                 574 }
575                                                   575 
576 static int parse_uac_endpoint_attributes(struc    576 static int parse_uac_endpoint_attributes(struct snd_usb_audio *chip,
577                                          struc    577                                          struct usb_host_interface *alts,
578                                          int p    578                                          int protocol, int iface_no)
579 {                                                 579 {
580         /* parsed with a v1 header here. that'    580         /* parsed with a v1 header here. that's ok as we only look at the
581          * header first which is the same for     581          * header first which is the same for both versions */
582         struct uac_iso_endpoint_descriptor *cs    582         struct uac_iso_endpoint_descriptor *csep;
583         struct usb_interface_descriptor *altsd    583         struct usb_interface_descriptor *altsd = get_iface_desc(alts);
584         int attributes = 0;                       584         int attributes = 0;
585                                                   585 
586         csep = snd_usb_find_desc(alts->endpoin    586         csep = snd_usb_find_desc(alts->endpoint[0].extra, alts->endpoint[0].extralen, NULL, USB_DT_CS_ENDPOINT);
587                                                   587 
588         /* Creamware Noah has this descriptor     588         /* Creamware Noah has this descriptor after the 2nd endpoint */
589         if (!csep && altsd->bNumEndpoints >= 2    589         if (!csep && altsd->bNumEndpoints >= 2)
590                 csep = snd_usb_find_desc(alts-    590                 csep = snd_usb_find_desc(alts->endpoint[1].extra, alts->endpoint[1].extralen, NULL, USB_DT_CS_ENDPOINT);
591                                                   591 
592         /*                                        592         /*
593          * If we can't locate the USB_DT_CS_EN    593          * If we can't locate the USB_DT_CS_ENDPOINT descriptor in the extra
594          * bytes after the first endpoint, go     594          * bytes after the first endpoint, go search the entire interface.
595          * Some devices have it directly *befo    595          * Some devices have it directly *before* the standard endpoint.
596          */                                       596          */
597         if (!csep)                                597         if (!csep)
598                 csep = snd_usb_find_desc(alts-    598                 csep = snd_usb_find_desc(alts->extra, alts->extralen, NULL, USB_DT_CS_ENDPOINT);
599                                                   599 
600         if (!csep || csep->bLength < 7 ||         600         if (!csep || csep->bLength < 7 ||
601             csep->bDescriptorSubtype != UAC_EP    601             csep->bDescriptorSubtype != UAC_EP_GENERAL)
602                 goto error;                       602                 goto error;
603                                                   603 
604         if (protocol == UAC_VERSION_1) {          604         if (protocol == UAC_VERSION_1) {
605                 attributes = csep->bmAttribute    605                 attributes = csep->bmAttributes;
606         } else if (protocol == UAC_VERSION_2)     606         } else if (protocol == UAC_VERSION_2) {
607                 struct uac2_iso_endpoint_descr    607                 struct uac2_iso_endpoint_descriptor *csep2 =
608                         (struct uac2_iso_endpo    608                         (struct uac2_iso_endpoint_descriptor *) csep;
609                                                   609 
610                 if (csep2->bLength < sizeof(*c    610                 if (csep2->bLength < sizeof(*csep2))
611                         goto error;               611                         goto error;
612                 attributes = csep->bmAttribute    612                 attributes = csep->bmAttributes & UAC_EP_CS_ATTR_FILL_MAX;
613                                                   613 
614                 /* emulate the endpoint attrib    614                 /* emulate the endpoint attributes of a v1 device */
615                 if (csep2->bmControls & UAC2_C    615                 if (csep2->bmControls & UAC2_CONTROL_PITCH)
616                         attributes |= UAC_EP_C    616                         attributes |= UAC_EP_CS_ATTR_PITCH_CONTROL;
617         } else { /* UAC_VERSION_3 */              617         } else { /* UAC_VERSION_3 */
618                 struct uac3_iso_endpoint_descr    618                 struct uac3_iso_endpoint_descriptor *csep3 =
619                         (struct uac3_iso_endpo    619                         (struct uac3_iso_endpoint_descriptor *) csep;
620                                                   620 
621                 if (csep3->bLength < sizeof(*c    621                 if (csep3->bLength < sizeof(*csep3))
622                         goto error;               622                         goto error;
623                 /* emulate the endpoint attrib    623                 /* emulate the endpoint attributes of a v1 device */
624                 if (le32_to_cpu(csep3->bmContr    624                 if (le32_to_cpu(csep3->bmControls) & UAC2_CONTROL_PITCH)
625                         attributes |= UAC_EP_C    625                         attributes |= UAC_EP_CS_ATTR_PITCH_CONTROL;
626         }                                         626         }
627                                                   627 
628         return attributes;                        628         return attributes;
629                                                   629 
630  error:                                           630  error:
631         usb_audio_warn(chip,                      631         usb_audio_warn(chip,
632                        "%u:%d : no or invalid     632                        "%u:%d : no or invalid class specific endpoint descriptor\n",
633                        iface_no, altsd->bAlter    633                        iface_no, altsd->bAlternateSetting);
634         return 0;                                 634         return 0;
635 }                                                 635 }
636                                                   636 
637 /* find an input terminal descriptor (either U    637 /* find an input terminal descriptor (either UAC1 or UAC2) with the given
638  * terminal id                                    638  * terminal id
639  */                                               639  */
640 static void *                                     640 static void *
641 snd_usb_find_input_terminal_descriptor(struct     641 snd_usb_find_input_terminal_descriptor(struct usb_host_interface *ctrl_iface,
642                                        int ter    642                                        int terminal_id, int protocol)
643 {                                                 643 {
644         struct uac2_input_terminal_descriptor     644         struct uac2_input_terminal_descriptor *term = NULL;
645                                                   645 
646         while ((term = snd_usb_find_csint_desc    646         while ((term = snd_usb_find_csint_desc(ctrl_iface->extra,
647                                                   647                                                ctrl_iface->extralen,
648                                                   648                                                term, UAC_INPUT_TERMINAL))) {
649                 if (!snd_usb_validate_audio_de    649                 if (!snd_usb_validate_audio_desc(term, protocol))
650                         continue;                 650                         continue;
651                 if (term->bTerminalID == termi    651                 if (term->bTerminalID == terminal_id)
652                         return term;              652                         return term;
653         }                                         653         }
654                                                   654 
655         return NULL;                              655         return NULL;
656 }                                                 656 }
657                                                   657 
658 static void *                                     658 static void *
659 snd_usb_find_output_terminal_descriptor(struct    659 snd_usb_find_output_terminal_descriptor(struct usb_host_interface *ctrl_iface,
660                                         int te    660                                         int terminal_id, int protocol)
661 {                                                 661 {
662         /* OK to use with both UAC2 and UAC3 *    662         /* OK to use with both UAC2 and UAC3 */
663         struct uac2_output_terminal_descriptor    663         struct uac2_output_terminal_descriptor *term = NULL;
664                                                   664 
665         while ((term = snd_usb_find_csint_desc    665         while ((term = snd_usb_find_csint_desc(ctrl_iface->extra,
666                                                   666                                                ctrl_iface->extralen,
667                                                   667                                                term, UAC_OUTPUT_TERMINAL))) {
668                 if (!snd_usb_validate_audio_de    668                 if (!snd_usb_validate_audio_desc(term, protocol))
669                         continue;                 669                         continue;
670                 if (term->bTerminalID == termi    670                 if (term->bTerminalID == terminal_id)
671                         return term;              671                         return term;
672         }                                         672         }
673                                                   673 
674         return NULL;                              674         return NULL;
675 }                                                 675 }
676                                                   676 
677 static struct audioformat *                       677 static struct audioformat *
678 audio_format_alloc_init(struct snd_usb_audio *    678 audio_format_alloc_init(struct snd_usb_audio *chip,
679                        struct usb_host_interfa    679                        struct usb_host_interface *alts,
680                        int protocol, int iface    680                        int protocol, int iface_no, int altset_idx,
681                        int altno, int num_chan    681                        int altno, int num_channels, int clock)
682 {                                                 682 {
683         struct audioformat *fp;                   683         struct audioformat *fp;
684                                                   684 
685         fp = kzalloc(sizeof(*fp), GFP_KERNEL);    685         fp = kzalloc(sizeof(*fp), GFP_KERNEL);
686         if (!fp)                                  686         if (!fp)
687                 return NULL;                      687                 return NULL;
688                                                   688 
689         fp->iface = iface_no;                     689         fp->iface = iface_no;
690         fp->altsetting = altno;                   690         fp->altsetting = altno;
691         fp->altset_idx = altset_idx;              691         fp->altset_idx = altset_idx;
692         fp->endpoint = get_endpoint(alts, 0)->    692         fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress;
693         fp->ep_attr = get_endpoint(alts, 0)->b    693         fp->ep_attr = get_endpoint(alts, 0)->bmAttributes;
694         fp->datainterval = snd_usb_parse_datai    694         fp->datainterval = snd_usb_parse_datainterval(chip, alts);
695         fp->protocol = protocol;                  695         fp->protocol = protocol;
696         fp->maxpacksize = le16_to_cpu(get_endp    696         fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
697         fp->channels = num_channels;              697         fp->channels = num_channels;
698         if (snd_usb_get_speed(chip->dev) == US    698         if (snd_usb_get_speed(chip->dev) == USB_SPEED_HIGH)
699                 fp->maxpacksize = (((fp->maxpa    699                 fp->maxpacksize = (((fp->maxpacksize >> 11) & 3) + 1)
700                                 * (fp->maxpack    700                                 * (fp->maxpacksize & 0x7ff);
701         fp->clock = clock;                        701         fp->clock = clock;
702         INIT_LIST_HEAD(&fp->list);                702         INIT_LIST_HEAD(&fp->list);
703                                                   703 
704         return fp;                                704         return fp;
705 }                                                 705 }
706                                                   706 
707 static struct audioformat *                       707 static struct audioformat *
708 snd_usb_get_audioformat_uac12(struct snd_usb_a    708 snd_usb_get_audioformat_uac12(struct snd_usb_audio *chip,
709                               struct usb_host_    709                               struct usb_host_interface *alts,
710                               int protocol, in    710                               int protocol, int iface_no, int altset_idx,
711                               int altno, int s    711                               int altno, int stream, int bm_quirk)
712 {                                                 712 {
713         struct usb_device *dev = chip->dev;       713         struct usb_device *dev = chip->dev;
714         struct uac_format_type_i_continuous_de    714         struct uac_format_type_i_continuous_descriptor *fmt;
715         unsigned int num_channels = 0, chconfi    715         unsigned int num_channels = 0, chconfig = 0;
716         struct usb_host_interface *ctrl_intf;     716         struct usb_host_interface *ctrl_intf;
717         struct audioformat *fp;                   717         struct audioformat *fp;
718         int clock = 0;                            718         int clock = 0;
719         u64 format;                               719         u64 format;
720                                                   720 
721         ctrl_intf = snd_usb_find_ctrl_interfac    721         ctrl_intf = snd_usb_find_ctrl_interface(chip, iface_no);
722                                                   722 
723         /* get audio formats */                   723         /* get audio formats */
724         if (protocol == UAC_VERSION_1) {          724         if (protocol == UAC_VERSION_1) {
725                 struct uac1_as_header_descript    725                 struct uac1_as_header_descriptor *as =
726                         snd_usb_find_csint_des    726                         snd_usb_find_csint_desc(alts->extra, alts->extralen,
727                                                   727                                                 NULL, UAC_AS_GENERAL);
728                 struct uac_input_terminal_desc    728                 struct uac_input_terminal_descriptor *iterm;
729                                                   729 
730                 if (!as) {                        730                 if (!as) {
731                         dev_err(&dev->dev,        731                         dev_err(&dev->dev,
732                                 "%u:%d : UAC_A    732                                 "%u:%d : UAC_AS_GENERAL descriptor not found\n",
733                                 iface_no, altn    733                                 iface_no, altno);
734                         return NULL;              734                         return NULL;
735                 }                                 735                 }
736                                                   736 
737                 if (as->bLength < sizeof(*as))    737                 if (as->bLength < sizeof(*as)) {
738                         dev_err(&dev->dev,        738                         dev_err(&dev->dev,
739                                 "%u:%d : inval    739                                 "%u:%d : invalid UAC_AS_GENERAL desc\n",
740                                 iface_no, altn    740                                 iface_no, altno);
741                         return NULL;              741                         return NULL;
742                 }                                 742                 }
743                                                   743 
744                 format = le16_to_cpu(as->wForm    744                 format = le16_to_cpu(as->wFormatTag); /* remember the format value */
745                                                   745 
746                 iterm = snd_usb_find_input_ter    746                 iterm = snd_usb_find_input_terminal_descriptor(ctrl_intf,
747                                                   747                                                                as->bTerminalLink,
748                                                   748                                                                protocol);
749                 if (iterm) {                      749                 if (iterm) {
750                         num_channels = iterm->    750                         num_channels = iterm->bNrChannels;
751                         chconfig = le16_to_cpu    751                         chconfig = le16_to_cpu(iterm->wChannelConfig);
752                 }                                 752                 }
753         } else { /* UAC_VERSION_2 */              753         } else { /* UAC_VERSION_2 */
754                 struct uac2_input_terminal_des    754                 struct uac2_input_terminal_descriptor *input_term;
755                 struct uac2_output_terminal_de    755                 struct uac2_output_terminal_descriptor *output_term;
756                 struct uac2_as_header_descript    756                 struct uac2_as_header_descriptor *as =
757                         snd_usb_find_csint_des    757                         snd_usb_find_csint_desc(alts->extra, alts->extralen,
758                                                   758                                                 NULL, UAC_AS_GENERAL);
759                                                   759 
760                 if (!as) {                        760                 if (!as) {
761                         dev_err(&dev->dev,        761                         dev_err(&dev->dev,
762                                 "%u:%d : UAC_A    762                                 "%u:%d : UAC_AS_GENERAL descriptor not found\n",
763                                 iface_no, altn    763                                 iface_no, altno);
764                         return NULL;              764                         return NULL;
765                 }                                 765                 }
766                                                   766 
767                 if (as->bLength < sizeof(*as))    767                 if (as->bLength < sizeof(*as)) {
768                         dev_err(&dev->dev,        768                         dev_err(&dev->dev,
769                                 "%u:%d : inval    769                                 "%u:%d : invalid UAC_AS_GENERAL desc\n",
770                                 iface_no, altn    770                                 iface_no, altno);
771                         return NULL;              771                         return NULL;
772                 }                                 772                 }
773                                                   773 
774                 num_channels = as->bNrChannels    774                 num_channels = as->bNrChannels;
775                 format = le32_to_cpu(as->bmFor    775                 format = le32_to_cpu(as->bmFormats);
776                 chconfig = le32_to_cpu(as->bmC    776                 chconfig = le32_to_cpu(as->bmChannelConfig);
777                                                   777 
778                 /*                                778                 /*
779                  * lookup the terminal associa    779                  * lookup the terminal associated to this interface
780                  * to extract the clock           780                  * to extract the clock
781                  */                               781                  */
782                 input_term = snd_usb_find_inpu    782                 input_term = snd_usb_find_input_terminal_descriptor(ctrl_intf,
783                                                   783                                                                     as->bTerminalLink,
784                                                   784                                                                     protocol);
785                 if (input_term) {                 785                 if (input_term) {
786                         clock = input_term->bC    786                         clock = input_term->bCSourceID;
787                         if (!chconfig && (num_    787                         if (!chconfig && (num_channels == input_term->bNrChannels))
788                                 chconfig = le3    788                                 chconfig = le32_to_cpu(input_term->bmChannelConfig);
789                         goto found_clock;         789                         goto found_clock;
790                 }                                 790                 }
791                                                   791 
792                 output_term = snd_usb_find_out    792                 output_term = snd_usb_find_output_terminal_descriptor(ctrl_intf,
793                                                   793                                                                       as->bTerminalLink,
794                                                   794                                                                       protocol);
795                 if (output_term) {                795                 if (output_term) {
796                         clock = output_term->b    796                         clock = output_term->bCSourceID;
797                         goto found_clock;         797                         goto found_clock;
798                 }                                 798                 }
799                                                   799 
800                 dev_err(&dev->dev,                800                 dev_err(&dev->dev,
801                         "%u:%d : bogus bTermin    801                         "%u:%d : bogus bTerminalLink %d\n",
802                         iface_no, altno, as->b    802                         iface_no, altno, as->bTerminalLink);
803                 return NULL;                      803                 return NULL;
804         }                                         804         }
805                                                   805 
806 found_clock:                                      806 found_clock:
807         /* get format type */                     807         /* get format type */
808         fmt = snd_usb_find_csint_desc(alts->ex    808         fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen,
809                                       NULL, UA    809                                       NULL, UAC_FORMAT_TYPE);
810         if (!fmt) {                               810         if (!fmt) {
811                 dev_err(&dev->dev,                811                 dev_err(&dev->dev,
812                         "%u:%d : no UAC_FORMAT    812                         "%u:%d : no UAC_FORMAT_TYPE desc\n",
813                         iface_no, altno);         813                         iface_no, altno);
814                 return NULL;                      814                 return NULL;
815         }                                         815         }
816         if (((protocol == UAC_VERSION_1) && (f    816         if (((protocol == UAC_VERSION_1) && (fmt->bLength < 8))
817                         || ((protocol == UAC_V    817                         || ((protocol == UAC_VERSION_2) &&
818                                         (fmt->    818                                         (fmt->bLength < 6))) {
819                 dev_err(&dev->dev,                819                 dev_err(&dev->dev,
820                         "%u:%d : invalid UAC_F    820                         "%u:%d : invalid UAC_FORMAT_TYPE desc\n",
821                         iface_no, altno);         821                         iface_no, altno);
822                 return NULL;                      822                 return NULL;
823         }                                         823         }
824                                                   824 
825         /*                                        825         /*
826          * Blue Microphones workaround: The la    826          * Blue Microphones workaround: The last altsetting is
827          * identical with the previous one, ex    827          * identical with the previous one, except for a larger
828          * packet size, but is actually a misl    828          * packet size, but is actually a mislabeled two-channel
829          * setting; ignore it.                    829          * setting; ignore it.
830          *                                        830          *
831          * Part 2: analyze quirk flag and form    831          * Part 2: analyze quirk flag and format
832          */                                       832          */
833         if (bm_quirk && fmt->bNrChannels == 1     833         if (bm_quirk && fmt->bNrChannels == 1 && fmt->bSubframeSize == 2)
834                 return NULL;                      834                 return NULL;
835                                                   835 
836         fp = audio_format_alloc_init(chip, alt    836         fp = audio_format_alloc_init(chip, alts, protocol, iface_no,
837                                      altset_id    837                                      altset_idx, altno, num_channels, clock);
838         if (!fp)                                  838         if (!fp)
839                 return ERR_PTR(-ENOMEM);          839                 return ERR_PTR(-ENOMEM);
840                                                   840 
841         fp->attributes = parse_uac_endpoint_at    841         fp->attributes = parse_uac_endpoint_attributes(chip, alts, protocol,
842                                                   842                                                        iface_no);
843                                                   843 
844         /* some quirks for attributes here */     844         /* some quirks for attributes here */
845         snd_usb_audioformat_attributes_quirk(c    845         snd_usb_audioformat_attributes_quirk(chip, fp, stream);
846                                                   846 
847         /* ok, let's parse further... */          847         /* ok, let's parse further... */
848         if (snd_usb_parse_audio_format(chip, f    848         if (snd_usb_parse_audio_format(chip, fp, format,
849                                         fmt, s    849                                         fmt, stream) < 0) {
850                 audioformat_free(fp);             850                 audioformat_free(fp);
851                 return NULL;                      851                 return NULL;
852         }                                         852         }
853                                                   853 
854         /* Create chmap */                        854         /* Create chmap */
855         if (fp->channels != num_channels)         855         if (fp->channels != num_channels)
856                 chconfig = 0;                     856                 chconfig = 0;
857                                                   857 
858         fp->chmap = convert_chmap(fp->channels    858         fp->chmap = convert_chmap(fp->channels, chconfig, protocol);
859                                                   859 
860         return fp;                                860         return fp;
861 }                                                 861 }
862                                                   862 
863 static struct audioformat *                       863 static struct audioformat *
864 snd_usb_get_audioformat_uac3(struct snd_usb_au    864 snd_usb_get_audioformat_uac3(struct snd_usb_audio *chip,
865                              struct usb_host_i    865                              struct usb_host_interface *alts,
866                              struct snd_usb_po    866                              struct snd_usb_power_domain **pd_out,
867                              int iface_no, int    867                              int iface_no, int altset_idx,
868                              int altno, int st    868                              int altno, int stream)
869 {                                                 869 {
870         struct usb_device *dev = chip->dev;       870         struct usb_device *dev = chip->dev;
871         struct uac3_input_terminal_descriptor     871         struct uac3_input_terminal_descriptor *input_term;
872         struct uac3_output_terminal_descriptor    872         struct uac3_output_terminal_descriptor *output_term;
873         struct uac3_cluster_header_descriptor     873         struct uac3_cluster_header_descriptor *cluster;
874         struct uac3_as_header_descriptor *as =    874         struct uac3_as_header_descriptor *as = NULL;
875         struct uac3_hc_descriptor_header hc_he    875         struct uac3_hc_descriptor_header hc_header;
876         struct usb_host_interface *ctrl_intf;     876         struct usb_host_interface *ctrl_intf;
877         struct snd_pcm_chmap_elem *chmap;         877         struct snd_pcm_chmap_elem *chmap;
878         struct snd_usb_power_domain *pd;          878         struct snd_usb_power_domain *pd;
879         unsigned char badd_profile;               879         unsigned char badd_profile;
880         u64 badd_formats = 0;                     880         u64 badd_formats = 0;
881         unsigned int num_channels;                881         unsigned int num_channels;
882         struct audioformat *fp;                   882         struct audioformat *fp;
883         u16 cluster_id, wLength;                  883         u16 cluster_id, wLength;
884         int clock = 0;                            884         int clock = 0;
885         int err;                                  885         int err;
886                                                   886 
887         badd_profile = chip->badd_profile;        887         badd_profile = chip->badd_profile;
888         ctrl_intf = snd_usb_find_ctrl_interfac    888         ctrl_intf = snd_usb_find_ctrl_interface(chip, iface_no);
889                                                   889 
890         if (badd_profile >= UAC3_FUNCTION_SUBC    890         if (badd_profile >= UAC3_FUNCTION_SUBCLASS_GENERIC_IO) {
891                 unsigned int maxpacksize =        891                 unsigned int maxpacksize =
892                         le16_to_cpu(get_endpoi    892                         le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
893                                                   893 
894                 switch (maxpacksize) {            894                 switch (maxpacksize) {
895                 default:                          895                 default:
896                         dev_err(&dev->dev,        896                         dev_err(&dev->dev,
897                                 "%u:%d : incor    897                                 "%u:%d : incorrect wMaxPacketSize for BADD profile\n",
898                                 iface_no, altn    898                                 iface_no, altno);
899                         return NULL;              899                         return NULL;
900                 case UAC3_BADD_EP_MAXPSIZE_SYN    900                 case UAC3_BADD_EP_MAXPSIZE_SYNC_MONO_16:
901                 case UAC3_BADD_EP_MAXPSIZE_ASY    901                 case UAC3_BADD_EP_MAXPSIZE_ASYNC_MONO_16:
902                         badd_formats = SNDRV_P    902                         badd_formats = SNDRV_PCM_FMTBIT_S16_LE;
903                         num_channels = 1;         903                         num_channels = 1;
904                         break;                    904                         break;
905                 case UAC3_BADD_EP_MAXPSIZE_SYN    905                 case UAC3_BADD_EP_MAXPSIZE_SYNC_MONO_24:
906                 case UAC3_BADD_EP_MAXPSIZE_ASY    906                 case UAC3_BADD_EP_MAXPSIZE_ASYNC_MONO_24:
907                         badd_formats = SNDRV_P    907                         badd_formats = SNDRV_PCM_FMTBIT_S24_3LE;
908                         num_channels = 1;         908                         num_channels = 1;
909                         break;                    909                         break;
910                 case UAC3_BADD_EP_MAXPSIZE_SYN    910                 case UAC3_BADD_EP_MAXPSIZE_SYNC_STEREO_16:
911                 case UAC3_BADD_EP_MAXPSIZE_ASY    911                 case UAC3_BADD_EP_MAXPSIZE_ASYNC_STEREO_16:
912                         badd_formats = SNDRV_P    912                         badd_formats = SNDRV_PCM_FMTBIT_S16_LE;
913                         num_channels = 2;         913                         num_channels = 2;
914                         break;                    914                         break;
915                 case UAC3_BADD_EP_MAXPSIZE_SYN    915                 case UAC3_BADD_EP_MAXPSIZE_SYNC_STEREO_24:
916                 case UAC3_BADD_EP_MAXPSIZE_ASY    916                 case UAC3_BADD_EP_MAXPSIZE_ASYNC_STEREO_24:
917                         badd_formats = SNDRV_P    917                         badd_formats = SNDRV_PCM_FMTBIT_S24_3LE;
918                         num_channels = 2;         918                         num_channels = 2;
919                         break;                    919                         break;
920                 }                                 920                 }
921                                                   921 
922                 chmap = kzalloc(sizeof(*chmap)    922                 chmap = kzalloc(sizeof(*chmap), GFP_KERNEL);
923                 if (!chmap)                       923                 if (!chmap)
924                         return ERR_PTR(-ENOMEM    924                         return ERR_PTR(-ENOMEM);
925                                                   925 
926                 if (num_channels == 1) {          926                 if (num_channels == 1) {
927                         chmap->map[0] = SNDRV_    927                         chmap->map[0] = SNDRV_CHMAP_MONO;
928                 } else {                          928                 } else {
929                         chmap->map[0] = SNDRV_    929                         chmap->map[0] = SNDRV_CHMAP_FL;
930                         chmap->map[1] = SNDRV_    930                         chmap->map[1] = SNDRV_CHMAP_FR;
931                 }                                 931                 }
932                                                   932 
933                 chmap->channels = num_channels    933                 chmap->channels = num_channels;
934                 clock = UAC3_BADD_CS_ID9;         934                 clock = UAC3_BADD_CS_ID9;
935                 goto found_clock;                 935                 goto found_clock;
936         }                                         936         }
937                                                   937 
938         as = snd_usb_find_csint_desc(alts->ext    938         as = snd_usb_find_csint_desc(alts->extra, alts->extralen,
939                                      NULL, UAC    939                                      NULL, UAC_AS_GENERAL);
940         if (!as) {                                940         if (!as) {
941                 dev_err(&dev->dev,                941                 dev_err(&dev->dev,
942                         "%u:%d : UAC_AS_GENERA    942                         "%u:%d : UAC_AS_GENERAL descriptor not found\n",
943                         iface_no, altno);         943                         iface_no, altno);
944                 return NULL;                      944                 return NULL;
945         }                                         945         }
946                                                   946 
947         if (as->bLength < sizeof(*as)) {          947         if (as->bLength < sizeof(*as)) {
948                 dev_err(&dev->dev,                948                 dev_err(&dev->dev,
949                         "%u:%d : invalid UAC_A    949                         "%u:%d : invalid UAC_AS_GENERAL desc\n",
950                         iface_no, altno);         950                         iface_no, altno);
951                 return NULL;                      951                 return NULL;
952         }                                         952         }
953                                                   953 
954         cluster_id = le16_to_cpu(as->wClusterD    954         cluster_id = le16_to_cpu(as->wClusterDescrID);
955         if (!cluster_id) {                        955         if (!cluster_id) {
956                 dev_err(&dev->dev,                956                 dev_err(&dev->dev,
957                         "%u:%d : no cluster de    957                         "%u:%d : no cluster descriptor\n",
958                         iface_no, altno);         958                         iface_no, altno);
959                 return NULL;                      959                 return NULL;
960         }                                         960         }
961                                                   961 
962         /*                                        962         /*
963          * Get number of channels and channel     963          * Get number of channels and channel map through
964          * High Capability Cluster Descriptor     964          * High Capability Cluster Descriptor
965          *                                        965          *
966          * First step: get High Capability hea    966          * First step: get High Capability header and
967          * read size of Cluster Descriptor        967          * read size of Cluster Descriptor
968          */                                       968          */
969         err = snd_usb_ctl_msg(chip->dev,          969         err = snd_usb_ctl_msg(chip->dev,
970                         usb_rcvctrlpipe(chip->    970                         usb_rcvctrlpipe(chip->dev, 0),
971                         UAC3_CS_REQ_HIGH_CAPAB    971                         UAC3_CS_REQ_HIGH_CAPABILITY_DESCRIPTOR,
972                         USB_RECIP_INTERFACE |     972                         USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
973                         cluster_id,               973                         cluster_id,
974                         snd_usb_ctrl_intf(ctrl    974                         snd_usb_ctrl_intf(ctrl_intf),
975                         &hc_header, sizeof(hc_    975                         &hc_header, sizeof(hc_header));
976         if (err < 0)                              976         if (err < 0)
977                 return ERR_PTR(err);              977                 return ERR_PTR(err);
978         else if (err != sizeof(hc_header)) {      978         else if (err != sizeof(hc_header)) {
979                 dev_err(&dev->dev,                979                 dev_err(&dev->dev,
980                         "%u:%d : can't get Hig    980                         "%u:%d : can't get High Capability descriptor\n",
981                         iface_no, altno);         981                         iface_no, altno);
982                 return ERR_PTR(-EIO);             982                 return ERR_PTR(-EIO);
983         }                                         983         }
984                                                   984 
985         /*                                        985         /*
986          * Second step: allocate needed amount    986          * Second step: allocate needed amount of memory
987          * and request Cluster Descriptor         987          * and request Cluster Descriptor
988          */                                       988          */
989         wLength = le16_to_cpu(hc_header.wLengt    989         wLength = le16_to_cpu(hc_header.wLength);
990         cluster = kzalloc(wLength, GFP_KERNEL)    990         cluster = kzalloc(wLength, GFP_KERNEL);
991         if (!cluster)                             991         if (!cluster)
992                 return ERR_PTR(-ENOMEM);          992                 return ERR_PTR(-ENOMEM);
993         err = snd_usb_ctl_msg(chip->dev,          993         err = snd_usb_ctl_msg(chip->dev,
994                         usb_rcvctrlpipe(chip->    994                         usb_rcvctrlpipe(chip->dev, 0),
995                         UAC3_CS_REQ_HIGH_CAPAB    995                         UAC3_CS_REQ_HIGH_CAPABILITY_DESCRIPTOR,
996                         USB_RECIP_INTERFACE |     996                         USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
997                         cluster_id,               997                         cluster_id,
998                         snd_usb_ctrl_intf(ctrl    998                         snd_usb_ctrl_intf(ctrl_intf),
999                         cluster, wLength);        999                         cluster, wLength);
1000         if (err < 0) {                           1000         if (err < 0) {
1001                 kfree(cluster);                  1001                 kfree(cluster);
1002                 return ERR_PTR(err);             1002                 return ERR_PTR(err);
1003         } else if (err != wLength) {             1003         } else if (err != wLength) {
1004                 dev_err(&dev->dev,               1004                 dev_err(&dev->dev,
1005                         "%u:%d : can't get Cl    1005                         "%u:%d : can't get Cluster Descriptor\n",
1006                         iface_no, altno);        1006                         iface_no, altno);
1007                 kfree(cluster);                  1007                 kfree(cluster);
1008                 return ERR_PTR(-EIO);            1008                 return ERR_PTR(-EIO);
1009         }                                        1009         }
1010                                                  1010 
1011         num_channels = cluster->bNrChannels;     1011         num_channels = cluster->bNrChannels;
1012         chmap = convert_chmap_v3(cluster);       1012         chmap = convert_chmap_v3(cluster);
1013         kfree(cluster);                          1013         kfree(cluster);
1014                                                  1014 
1015         /*                                       1015         /*
1016          * lookup the terminal associated to     1016          * lookup the terminal associated to this interface
1017          * to extract the clock                  1017          * to extract the clock
1018          */                                      1018          */
1019         input_term = snd_usb_find_input_termi    1019         input_term = snd_usb_find_input_terminal_descriptor(ctrl_intf,
1020                                                  1020                                                             as->bTerminalLink,
1021                                                  1021                                                             UAC_VERSION_3);
1022         if (input_term) {                        1022         if (input_term) {
1023                 clock = input_term->bCSourceI    1023                 clock = input_term->bCSourceID;
1024                 goto found_clock;                1024                 goto found_clock;
1025         }                                        1025         }
1026                                                  1026 
1027         output_term = snd_usb_find_output_ter    1027         output_term = snd_usb_find_output_terminal_descriptor(ctrl_intf,
1028                                                  1028                                                               as->bTerminalLink,
1029                                                  1029                                                               UAC_VERSION_3);
1030         if (output_term) {                       1030         if (output_term) {
1031                 clock = output_term->bCSource    1031                 clock = output_term->bCSourceID;
1032                 goto found_clock;                1032                 goto found_clock;
1033         }                                        1033         }
1034                                                  1034 
1035         dev_err(&dev->dev, "%u:%d : bogus bTe    1035         dev_err(&dev->dev, "%u:%d : bogus bTerminalLink %d\n",
1036                         iface_no, altno, as->    1036                         iface_no, altno, as->bTerminalLink);
1037         kfree(chmap);                            1037         kfree(chmap);
1038         return NULL;                             1038         return NULL;
1039                                                  1039 
1040 found_clock:                                     1040 found_clock:
1041         fp = audio_format_alloc_init(chip, al    1041         fp = audio_format_alloc_init(chip, alts, UAC_VERSION_3, iface_no,
1042                                      altset_i    1042                                      altset_idx, altno, num_channels, clock);
1043         if (!fp) {                               1043         if (!fp) {
1044                 kfree(chmap);                    1044                 kfree(chmap);
1045                 return ERR_PTR(-ENOMEM);         1045                 return ERR_PTR(-ENOMEM);
1046         }                                        1046         }
1047                                                  1047 
1048         fp->chmap = chmap;                       1048         fp->chmap = chmap;
1049                                                  1049 
1050         if (badd_profile >= UAC3_FUNCTION_SUB    1050         if (badd_profile >= UAC3_FUNCTION_SUBCLASS_GENERIC_IO) {
1051                 fp->attributes = 0; /* No att    1051                 fp->attributes = 0; /* No attributes */
1052                                                  1052 
1053                 fp->fmt_type = UAC_FORMAT_TYP    1053                 fp->fmt_type = UAC_FORMAT_TYPE_I;
1054                 fp->formats = badd_formats;      1054                 fp->formats = badd_formats;
1055                                                  1055 
1056                 fp->nr_rates = 0;       /* SN    1056                 fp->nr_rates = 0;       /* SNDRV_PCM_RATE_CONTINUOUS */
1057                 fp->rate_min = UAC3_BADD_SAMP    1057                 fp->rate_min = UAC3_BADD_SAMPLING_RATE;
1058                 fp->rate_max = UAC3_BADD_SAMP    1058                 fp->rate_max = UAC3_BADD_SAMPLING_RATE;
1059                 fp->rates = SNDRV_PCM_RATE_CO    1059                 fp->rates = SNDRV_PCM_RATE_CONTINUOUS;
1060                                                  1060 
1061                 pd = kzalloc(sizeof(*pd), GFP    1061                 pd = kzalloc(sizeof(*pd), GFP_KERNEL);
1062                 if (!pd) {                       1062                 if (!pd) {
1063                         audioformat_free(fp);    1063                         audioformat_free(fp);
1064                         return NULL;             1064                         return NULL;
1065                 }                                1065                 }
1066                 pd->pd_id = (stream == SNDRV_    1066                 pd->pd_id = (stream == SNDRV_PCM_STREAM_PLAYBACK) ?
1067                                         UAC3_    1067                                         UAC3_BADD_PD_ID10 : UAC3_BADD_PD_ID11;
1068                 pd->pd_d1d0_rec = UAC3_BADD_P    1068                 pd->pd_d1d0_rec = UAC3_BADD_PD_RECOVER_D1D0;
1069                 pd->pd_d2d0_rec = UAC3_BADD_P    1069                 pd->pd_d2d0_rec = UAC3_BADD_PD_RECOVER_D2D0;
1070                 pd->ctrl_iface = ctrl_intf;      1070                 pd->ctrl_iface = ctrl_intf;
1071                                                  1071 
1072         } else {                                 1072         } else {
1073                 fp->attributes = parse_uac_en    1073                 fp->attributes = parse_uac_endpoint_attributes(chip, alts,
1074                                                  1074                                                                UAC_VERSION_3,
1075                                                  1075                                                                iface_no);
1076                                                  1076 
1077                 pd = snd_usb_find_power_domai    1077                 pd = snd_usb_find_power_domain(ctrl_intf,
1078                                                  1078                                                as->bTerminalLink);
1079                                                  1079 
1080                 /* ok, let's parse further...    1080                 /* ok, let's parse further... */
1081                 if (snd_usb_parse_audio_forma    1081                 if (snd_usb_parse_audio_format_v3(chip, fp, as, stream) < 0) {
1082                         kfree(pd);               1082                         kfree(pd);
1083                         audioformat_free(fp);    1083                         audioformat_free(fp);
1084                         return NULL;             1084                         return NULL;
1085                 }                                1085                 }
1086         }                                        1086         }
1087                                                  1087 
1088         if (pd)                                  1088         if (pd)
1089                 *pd_out = pd;                    1089                 *pd_out = pd;
1090                                                  1090 
1091         return fp;                               1091         return fp;
1092 }                                                1092 }
1093                                                  1093 
1094 static int __snd_usb_parse_audio_interface(st    1094 static int __snd_usb_parse_audio_interface(struct snd_usb_audio *chip,
1095                                            in    1095                                            int iface_no,
1096                                            bo    1096                                            bool *has_non_pcm, bool non_pcm)
1097 {                                                1097 {
1098         struct usb_device *dev;                  1098         struct usb_device *dev;
1099         struct usb_interface *iface;             1099         struct usb_interface *iface;
1100         struct usb_host_interface *alts;         1100         struct usb_host_interface *alts;
1101         struct usb_interface_descriptor *alts    1101         struct usb_interface_descriptor *altsd;
1102         int i, altno, err, stream;               1102         int i, altno, err, stream;
1103         struct audioformat *fp = NULL;           1103         struct audioformat *fp = NULL;
1104         struct snd_usb_power_domain *pd = NUL    1104         struct snd_usb_power_domain *pd = NULL;
1105         bool set_iface_first;                    1105         bool set_iface_first;
1106         int num, protocol;                       1106         int num, protocol;
1107                                                  1107 
1108         dev = chip->dev;                         1108         dev = chip->dev;
1109                                                  1109 
1110         /* parse the interface's altsettings     1110         /* parse the interface's altsettings */
1111         iface = usb_ifnum_to_if(dev, iface_no    1111         iface = usb_ifnum_to_if(dev, iface_no);
1112                                                  1112 
1113         num = iface->num_altsetting;             1113         num = iface->num_altsetting;
1114                                                  1114 
1115         /*                                       1115         /*
1116          * Dallas DS4201 workaround: It prese    1116          * Dallas DS4201 workaround: It presents 5 altsettings, but the last
1117          * one misses syncpipe, and does not     1117          * one misses syncpipe, and does not produce any sound.
1118          */                                      1118          */
1119         if (chip->usb_id == USB_ID(0x04fa, 0x    1119         if (chip->usb_id == USB_ID(0x04fa, 0x4201) && num >= 4)
1120                 num = 4;                         1120                 num = 4;
1121                                                  1121 
1122         for (i = 0; i < num; i++) {              1122         for (i = 0; i < num; i++) {
1123                 alts = &iface->altsetting[i];    1123                 alts = &iface->altsetting[i];
1124                 altsd = get_iface_desc(alts);    1124                 altsd = get_iface_desc(alts);
1125                 protocol = altsd->bInterfaceP    1125                 protocol = altsd->bInterfaceProtocol;
1126                 /* skip invalid one */           1126                 /* skip invalid one */
1127                 if (((altsd->bInterfaceClass     1127                 if (((altsd->bInterfaceClass != USB_CLASS_AUDIO ||
1128                       (altsd->bInterfaceSubCl    1128                       (altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIOSTREAMING &&
1129                        altsd->bInterfaceSubCl    1129                        altsd->bInterfaceSubClass != USB_SUBCLASS_VENDOR_SPEC)) &&
1130                      altsd->bInterfaceClass !    1130                      altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) ||
1131                     altsd->bNumEndpoints < 1     1131                     altsd->bNumEndpoints < 1 ||
1132                     le16_to_cpu(get_endpoint(    1132                     le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) == 0)
1133                         continue;                1133                         continue;
1134                 /* must be isochronous */        1134                 /* must be isochronous */
1135                 if ((get_endpoint(alts, 0)->b    1135                 if ((get_endpoint(alts, 0)->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) !=
1136                     USB_ENDPOINT_XFER_ISOC)      1136                     USB_ENDPOINT_XFER_ISOC)
1137                         continue;                1137                         continue;
1138                 /* check direction */            1138                 /* check direction */
1139                 stream = (get_endpoint(alts,     1139                 stream = (get_endpoint(alts, 0)->bEndpointAddress & USB_DIR_IN) ?
1140                         SNDRV_PCM_STREAM_CAPT    1140                         SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;
1141                 altno = altsd->bAlternateSett    1141                 altno = altsd->bAlternateSetting;
1142                                                  1142 
1143                 if (snd_usb_apply_interface_q    1143                 if (snd_usb_apply_interface_quirk(chip, iface_no, altno))
1144                         continue;                1144                         continue;
1145                                                  1145 
1146                 /*                               1146                 /*
1147                  * Roland audio streaming int    1147                  * Roland audio streaming interfaces are marked with protocols
1148                  * 0/1/2, but are UAC 1 compa    1148                  * 0/1/2, but are UAC 1 compatible.
1149                  */                              1149                  */
1150                 if (USB_ID_VENDOR(chip->usb_i    1150                 if (USB_ID_VENDOR(chip->usb_id) == 0x0582 &&
1151                     altsd->bInterfaceClass ==    1151                     altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
1152                     protocol <= 2)               1152                     protocol <= 2)
1153                         protocol = UAC_VERSIO    1153                         protocol = UAC_VERSION_1;
1154                                                  1154 
1155                 switch (protocol) {              1155                 switch (protocol) {
1156                 default:                         1156                 default:
1157                         dev_dbg(&dev->dev, "%    1157                         dev_dbg(&dev->dev, "%u:%d: unknown interface protocol %#02x, assuming v1\n",
1158                                 iface_no, alt    1158                                 iface_no, altno, protocol);
1159                         protocol = UAC_VERSIO    1159                         protocol = UAC_VERSION_1;
1160                         fallthrough;             1160                         fallthrough;
1161                 case UAC_VERSION_1:              1161                 case UAC_VERSION_1:
1162                 case UAC_VERSION_2: {            1162                 case UAC_VERSION_2: {
1163                         int bm_quirk = 0;        1163                         int bm_quirk = 0;
1164                                                  1164 
1165                         /*                       1165                         /*
1166                          * Blue Microphones w    1166                          * Blue Microphones workaround: The last altsetting is
1167                          * identical with the    1167                          * identical with the previous one, except for a larger
1168                          * packet size, but i    1168                          * packet size, but is actually a mislabeled two-channel
1169                          * setting; ignore it    1169                          * setting; ignore it.
1170                          *                       1170                          *
1171                          * Part 1: prepare qu    1171                          * Part 1: prepare quirk flag
1172                          */                      1172                          */
1173                         if (altno == 2 && num    1173                         if (altno == 2 && num == 3 &&
1174                             fp && fp->altsett    1174                             fp && fp->altsetting == 1 && fp->channels == 1 &&
1175                             fp->formats == SN    1175                             fp->formats == SNDRV_PCM_FMTBIT_S16_LE &&
1176                             protocol == UAC_V    1176                             protocol == UAC_VERSION_1 &&
1177                             le16_to_cpu(get_e    1177                             le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) ==
1178                                                  1178                                                         fp->maxpacksize * 2)
1179                                 bm_quirk = 1;    1179                                 bm_quirk = 1;
1180                                                  1180 
1181                         fp = snd_usb_get_audi    1181                         fp = snd_usb_get_audioformat_uac12(chip, alts, protocol,
1182                                                  1182                                                            iface_no, i, altno,
1183                                                  1183                                                            stream, bm_quirk);
1184                         break;                   1184                         break;
1185                 }                                1185                 }
1186                 case UAC_VERSION_3:              1186                 case UAC_VERSION_3:
1187                         fp = snd_usb_get_audi    1187                         fp = snd_usb_get_audioformat_uac3(chip, alts, &pd,
1188                                                  1188                                                 iface_no, i, altno, stream);
1189                         break;                   1189                         break;
1190                 }                                1190                 }
1191                                                  1191 
1192                 if (!fp)                         1192                 if (!fp)
1193                         continue;                1193                         continue;
1194                 else if (IS_ERR(fp))             1194                 else if (IS_ERR(fp))
1195                         return PTR_ERR(fp);      1195                         return PTR_ERR(fp);
1196                                                  1196 
1197                 if (fp->fmt_type != UAC_FORMA    1197                 if (fp->fmt_type != UAC_FORMAT_TYPE_I)
1198                         *has_non_pcm = true;     1198                         *has_non_pcm = true;
1199                 if ((fp->fmt_type == UAC_FORM    1199                 if ((fp->fmt_type == UAC_FORMAT_TYPE_I) == non_pcm) {
1200                         audioformat_free(fp);    1200                         audioformat_free(fp);
1201                         kfree(pd);               1201                         kfree(pd);
1202                         fp = NULL;               1202                         fp = NULL;
1203                         pd = NULL;               1203                         pd = NULL;
1204                         continue;                1204                         continue;
1205                 }                                1205                 }
1206                                                  1206 
1207                 snd_usb_audioformat_set_sync_    1207                 snd_usb_audioformat_set_sync_ep(chip, fp);
1208                                                  1208 
1209                 dev_dbg(&dev->dev, "%u:%d: ad    1209                 dev_dbg(&dev->dev, "%u:%d: add audio endpoint %#x\n", iface_no, altno, fp->endpoint);
1210                 if (protocol == UAC_VERSION_3    1210                 if (protocol == UAC_VERSION_3)
1211                         err = snd_usb_add_aud    1211                         err = snd_usb_add_audio_stream_v3(chip, stream, fp, pd);
1212                 else                             1212                 else
1213                         err = snd_usb_add_aud    1213                         err = snd_usb_add_audio_stream(chip, stream, fp);
1214                                                  1214 
1215                 if (err < 0) {                   1215                 if (err < 0) {
1216                         audioformat_free(fp);    1216                         audioformat_free(fp);
1217                         kfree(pd);               1217                         kfree(pd);
1218                         return err;              1218                         return err;
1219                 }                                1219                 }
1220                                                  1220 
1221                 /* add endpoints */              1221                 /* add endpoints */
1222                 err = snd_usb_add_endpoint(ch    1222                 err = snd_usb_add_endpoint(chip, fp->endpoint,
1223                                            SN    1223                                            SND_USB_ENDPOINT_TYPE_DATA);
1224                 if (err < 0)                     1224                 if (err < 0)
1225                         return err;              1225                         return err;
1226                                                  1226 
1227                 if (fp->sync_ep) {               1227                 if (fp->sync_ep) {
1228                         err = snd_usb_add_end    1228                         err = snd_usb_add_endpoint(chip, fp->sync_ep,
1229                                                  1229                                                    fp->implicit_fb ?
1230                                                  1230                                                    SND_USB_ENDPOINT_TYPE_DATA :
1231                                                  1231                                                    SND_USB_ENDPOINT_TYPE_SYNC);
1232                         if (err < 0)             1232                         if (err < 0)
1233                                 return err;      1233                                 return err;
1234                 }                                1234                 }
1235                                                  1235 
1236                 set_iface_first = false;         1236                 set_iface_first = false;
1237                 if (protocol == UAC_VERSION_1    1237                 if (protocol == UAC_VERSION_1 ||
1238                     (chip->quirk_flags & QUIR    1238                     (chip->quirk_flags & QUIRK_FLAG_SET_IFACE_FIRST))
1239                         set_iface_first = tru    1239                         set_iface_first = true;
1240                                                  1240 
1241                 /* try to set the interface..    1241                 /* try to set the interface... */
1242                 usb_set_interface(chip->dev,     1242                 usb_set_interface(chip->dev, iface_no, 0);
1243                 if (set_iface_first)             1243                 if (set_iface_first)
1244                         usb_set_interface(chi    1244                         usb_set_interface(chip->dev, iface_no, altno);
1245                 snd_usb_init_pitch(chip, fp);    1245                 snd_usb_init_pitch(chip, fp);
1246                 snd_usb_init_sample_rate(chip    1246                 snd_usb_init_sample_rate(chip, fp, fp->rate_max);
1247                 if (!set_iface_first)            1247                 if (!set_iface_first)
1248                         usb_set_interface(chi    1248                         usb_set_interface(chip->dev, iface_no, altno);
1249         }                                        1249         }
1250         return 0;                                1250         return 0;
1251 }                                                1251 }
1252                                                  1252 
1253 int snd_usb_parse_audio_interface(struct snd_    1253 int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no)
1254 {                                                1254 {
1255         int err;                                 1255         int err;
1256         bool has_non_pcm = false;                1256         bool has_non_pcm = false;
1257                                                  1257 
1258         /* parse PCM formats */                  1258         /* parse PCM formats */
1259         err = __snd_usb_parse_audio_interface    1259         err = __snd_usb_parse_audio_interface(chip, iface_no, &has_non_pcm, false);
1260         if (err < 0)                             1260         if (err < 0)
1261                 return err;                      1261                 return err;
1262                                                  1262 
1263         if (has_non_pcm) {                       1263         if (has_non_pcm) {
1264                 /* parse non-PCM formats */      1264                 /* parse non-PCM formats */
1265                 err = __snd_usb_parse_audio_i    1265                 err = __snd_usb_parse_audio_interface(chip, iface_no, &has_non_pcm, true);
1266                 if (err < 0)                     1266                 if (err < 0)
1267                         return err;              1267                         return err;
1268         }                                        1268         }
1269                                                  1269 
1270         return 0;                                1270         return 0;
1271 }                                                1271 }
1272                                                  1272 
1273                                                  1273 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php